{"version":3,"sources":["../src/server/api/stripe-server.ts","../src/shared/constants.ts","../src/server/webhooks/stripe.ts","../src/server/utils/stripe-helpers.ts"],"sourcesContent":["import Stripe from 'stripe';\nimport { STRIPE_API_VERSION } from '../../shared/constants';\n\nexport class StripeServerAPI {\n  private stripe: Stripe;\n\n  constructor(\n    secretKey: string,\n    options?: {\n      apiVersion?: string;\n      typescript?: boolean;\n    }\n  ) {\n    this.stripe = new Stripe(secretKey, {\n      apiVersion:\n        (options?.apiVersion as Stripe.LatestApiVersion) || STRIPE_API_VERSION,\n      typescript: true,\n    });\n  }\n\n  // Customer methods\n  async createCustomer(params: {\n    email: string;\n    name?: string;\n    phone?: string;\n    metadata?: Record<string, string>;\n  }) {\n    return this.stripe.customers.create({\n      email: params.email,\n      name: params.name,\n      phone: params.phone,\n      metadata: params.metadata,\n    });\n  }\n\n  async getCustomer(customerId: string) {\n    return this.stripe.customers.retrieve(customerId);\n  }\n\n  async updateCustomer(\n    customerId: string,\n    params: {\n      email?: string;\n      name?: string;\n      phone?: string;\n      metadata?: Record<string, string>;\n    }\n  ) {\n    return this.stripe.customers.update(customerId, params);\n  }\n\n  async deleteCustomer(customerId: string) {\n    return this.stripe.customers.del(customerId);\n  }\n\n  // Subscription methods\n  async createSubscription(params: {\n    customerId: string;\n    priceId: string;\n    quantity?: number;\n    trialPeriodDays?: number;\n    metadata?: Record<string, string>;\n    paymentBehavior?:\n      | 'default_incomplete'\n      | 'error_if_incomplete'\n      | 'allow_incomplete';\n  }) {\n    return this.stripe.subscriptions.create({\n      customer: params.customerId,\n      items: [\n        {\n          price: params.priceId,\n          quantity: params.quantity || 1,\n        },\n      ],\n      trial_period_days: params.trialPeriodDays,\n      metadata: params.metadata,\n      payment_behavior: params.paymentBehavior || 'default_incomplete',\n      payment_settings: {\n        save_default_payment_method: 'on_subscription',\n      },\n      expand: ['latest_invoice.payment_intent'],\n    });\n  }\n\n  async getSubscription(subscriptionId: string) {\n    return this.stripe.subscriptions.retrieve(subscriptionId, {\n      expand: ['default_payment_method'],\n    });\n  }\n\n  async updateSubscription(\n    subscriptionId: string,\n    params: {\n      priceId?: string;\n      quantity?: number;\n      metadata?: Record<string, string>;\n      cancelAtPeriodEnd?: boolean;\n    }\n  ) {\n    const updateData: Stripe.SubscriptionUpdateParams = {};\n\n    if (params.priceId) {\n      // Get current subscription to update items\n      const subscription = await this.getSubscription(subscriptionId);\n      const currentItem = subscription.items.data[0]!;\n\n      updateData.items = [\n        {\n          id: currentItem.id,\n          price: params.priceId,\n          quantity: params.quantity || currentItem.quantity,\n        },\n      ];\n    }\n\n    if (params.metadata) {\n      updateData.metadata = params.metadata;\n    }\n\n    if (typeof params.cancelAtPeriodEnd === 'boolean') {\n      updateData.cancel_at_period_end = params.cancelAtPeriodEnd;\n    }\n\n    return this.stripe.subscriptions.update(subscriptionId, updateData);\n  }\n\n  async cancelSubscription(\n    subscriptionId: string,\n    immediately: boolean = false\n  ) {\n    if (immediately) {\n      return this.stripe.subscriptions.cancel(subscriptionId);\n    } else {\n      return this.stripe.subscriptions.update(subscriptionId, {\n        cancel_at_period_end: true,\n      });\n    }\n  }\n\n  async reactivateSubscription(subscriptionId: string) {\n    return this.stripe.subscriptions.update(subscriptionId, {\n      cancel_at_period_end: false,\n    });\n  }\n\n  async getCustomerSubscriptions(customerId: string) {\n    return this.stripe.subscriptions.list({\n      customer: customerId,\n      expand: ['data.default_payment_method'],\n    });\n  }\n\n  // Checkout methods\n  async createCheckoutSession(params: {\n    priceId: string;\n    customerId?: string;\n    customerEmail?: string;\n    successUrl: string;\n    cancelUrl: string;\n    mode?: 'payment' | 'subscription' | 'setup';\n    allowPromotionCodes?: boolean;\n    billingAddressCollection?: 'auto' | 'required';\n    metadata?: Record<string, string>;\n    trialPeriodDays?: number;\n  }) {\n    const sessionParams: Stripe.Checkout.SessionCreateParams = {\n      payment_method_types: ['card'],\n      line_items: [\n        {\n          price: params.priceId,\n          quantity: 1,\n        },\n      ],\n      mode: params.mode || 'subscription',\n      success_url: params.successUrl,\n      cancel_url: params.cancelUrl,\n      allow_promotion_codes: params.allowPromotionCodes,\n      billing_address_collection: params.billingAddressCollection,\n      metadata: params.metadata,\n    };\n\n    if (params.customerId) {\n      sessionParams.customer = params.customerId;\n    } else if (params.customerEmail) {\n      sessionParams.customer_email = params.customerEmail;\n    }\n\n    if (params.mode === 'subscription' && params.trialPeriodDays) {\n      sessionParams.subscription_data = {\n        trial_period_days: params.trialPeriodDays,\n      };\n    }\n\n    return this.stripe.checkout.sessions.create(sessionParams);\n  }\n\n  // Payment Intent methods\n  async getPaymentIntent(paymentIntentId: string) {\n    return this.stripe.paymentIntents.retrieve(paymentIntentId);\n  }\n\n  async createPaymentIntent(params: {\n    amount: number;\n    currency: string;\n    customerId?: string;\n    paymentMethodTypes?: string[];\n    metadata?: Record<string, string>;\n    description?: string;\n  }) {\n    return this.stripe.paymentIntents.create({\n      amount: params.amount,\n      currency: params.currency,\n      customer: params.customerId,\n      payment_method_types: params.paymentMethodTypes || ['card'],\n      metadata: params.metadata,\n      description: params.description,\n    });\n  }\n\n  async confirmPaymentIntent(\n    paymentIntentId: string,\n    params?: {\n      paymentMethod?: string;\n    }\n  ) {\n    return this.stripe.paymentIntents.confirm(paymentIntentId, {\n      payment_method: params?.paymentMethod,\n    });\n  }\n\n  // Setup Intent methods (for subscriptions without immediate payment)\n  async createSetupIntent(params: {\n    customerId: string;\n    paymentMethodTypes?: string[];\n    metadata?: Record<string, string>;\n  }) {\n    return this.stripe.setupIntents.create({\n      customer: params.customerId,\n      payment_method_types: params.paymentMethodTypes || ['card'],\n      metadata: params.metadata,\n      usage: 'off_session',\n    });\n  }\n\n  // Customer Portal methods\n  async createPortalSession(params: { customerId: string; returnUrl: string }) {\n    return this.stripe.billingPortal.sessions.create({\n      customer: params.customerId,\n      return_url: params.returnUrl,\n    });\n  }\n\n  // Payment Method methods\n  async getCustomerPaymentMethods(\n    customerId: string,\n    type: Stripe.PaymentMethodListParams.Type = 'card'\n  ) {\n    return this.stripe.paymentMethods.list({\n      customer: customerId,\n      type,\n    });\n  }\n\n  async attachPaymentMethod(paymentMethodId: string, customerId: string) {\n    return this.stripe.paymentMethods.attach(paymentMethodId, {\n      customer: customerId,\n    });\n  }\n\n  async detachPaymentMethod(paymentMethodId: string) {\n    return this.stripe.paymentMethods.detach(paymentMethodId);\n  }\n\n  async setDefaultPaymentMethod(customerId: string, paymentMethodId: string) {\n    return this.stripe.customers.update(customerId, {\n      invoice_settings: {\n        default_payment_method: paymentMethodId,\n      },\n    });\n  }\n\n  // Invoice methods\n  async getCustomerInvoices(customerId: string, limit: number = 10) {\n    return this.stripe.invoices.list({\n      customer: customerId,\n      limit,\n    });\n  }\n\n  async getInvoice(invoiceId: string) {\n    return this.stripe.invoices.retrieve(invoiceId);\n  }\n\n  // Webhook methods\n  constructWebhookEvent(\n    payload: string | Buffer,\n    signature: string,\n    webhookSecret: string\n  ) {\n    return this.stripe.webhooks.constructEvent(\n      payload,\n      signature,\n      webhookSecret\n    );\n  }\n\n  // Price and Product methods\n  async getPrice(priceId: string) {\n    return this.stripe.prices.retrieve(priceId, {\n      expand: ['product'],\n    });\n  }\n\n  async getPrices(params?: {\n    active?: boolean;\n    limit?: number;\n    product?: string;\n  }) {\n    return this.stripe.prices.list({\n      active: params?.active,\n      limit: params?.limit || 10,\n      product: params?.product,\n      expand: ['data.product'],\n    });\n  }\n\n  async getProduct(productId: string) {\n    return this.stripe.products.retrieve(productId);\n  }\n\n  // Ephemeral Key methods (for mobile)\n  async createEphemeralKey(customerId: string, apiVersion: string) {\n    return this.stripe.ephemeralKeys.create(\n      { customer: customerId },\n      { apiVersion }\n    );\n  }\n}\n","export const STRIPE_API_VERSION = '2023-10-16';\n\nexport const PAYMENT_METHODS = {\n  CARD: 'card',\n  BANK_ACCOUNT: 'bank_account',\n  SEPA_DEBIT: 'sepa_debit',\n  IDEAL: 'ideal',\n  SOFORT: 'sofort',\n} as const;\n\nexport const SUBSCRIPTION_STATUS = {\n  ACTIVE: 'active',\n  CANCELED: 'canceled',\n  PAST_DUE: 'past_due',\n  UNPAID: 'unpaid',\n  INCOMPLETE: 'incomplete',\n  INCOMPLETE_EXPIRED: 'incomplete_expired',\n  TRIALING: 'trialing',\n} as const;\n\nexport const INVOICE_STATUS = {\n  DRAFT: 'draft',\n  OPEN: 'open',\n  PAID: 'paid',\n  UNCOLLECTIBLE: 'uncollectible',\n  VOID: 'void',\n} as const;\n\nexport const CHECKOUT_MODE = {\n  PAYMENT: 'payment',\n  SUBSCRIPTION: 'subscription',\n  SETUP: 'setup',\n} as const;\n\nexport const BILLING_INTERVALS = {\n  DAY: 'day',\n  WEEK: 'week',\n  MONTH: 'month',\n  YEAR: 'year',\n} as const;\n\nexport const CURRENCY_SYMBOLS = {\n  USD: '$',\n  EUR: '€',\n  GBP: '£',\n  JPY: '¥',\n  CAD: 'C$',\n  AUD: 'A$',\n  CHF: 'CHF',\n  CNY: '¥',\n  SEK: 'kr',\n  NZD: 'NZ$',\n} as const;\n\nexport const DEFAULT_CURRENCY = 'USD';\n\nexport const WEBHOOK_EVENTS = {\n  CUSTOMER_SUBSCRIPTION_CREATED: 'customer.subscription.created',\n  CUSTOMER_SUBSCRIPTION_UPDATED: 'customer.subscription.updated',\n  CUSTOMER_SUBSCRIPTION_DELETED: 'customer.subscription.deleted',\n  INVOICE_PAYMENT_SUCCEEDED: 'invoice.payment_succeeded',\n  INVOICE_PAYMENT_FAILED: 'invoice.payment_failed',\n  CHECKOUT_SESSION_COMPLETED: 'checkout.session.completed',\n  PAYMENT_INTENT_SUCCEEDED: 'payment_intent.succeeded',\n  PAYMENT_INTENT_PAYMENT_FAILED: 'payment_intent.payment_failed',\n} as const;\n\nexport const ERROR_MESSAGES = {\n  PROVIDER_NOT_CONFIGURED: 'Payments provider is not properly configured',\n  STRIPE_NOT_LOADED: 'Stripe has not been loaded yet',\n  INVALID_PRICE_ID: 'Invalid price ID provided',\n  INVALID_CUSTOMER_ID: 'Invalid customer ID provided',\n  CHECKOUT_FAILED: 'Checkout session creation failed',\n  PAYMENT_FAILED: 'Payment processing failed',\n  SUBSCRIPTION_NOT_FOUND: 'Subscription not found',\n  CUSTOMER_NOT_FOUND: 'Customer not found',\n} as const;\n","import Stripe from 'stripe';\nimport { StripeServerAPI } from '../api/stripe-server';\nimport { WEBHOOK_EVENTS } from '../../shared/constants';\nimport type {\n  Request as ExpressRequest,\n  Response as ExpressResponse,\n} from 'express';\n// Inline Next.js Pages Router types to avoid requiring `next` as a dependency.\n// These match the subset used by createNextJSWebhookHandler (legacy).\ninterface NextApiRequest {\n  method?: string;\n  headers: Record<string, string | string[] | undefined>;\n  body: any;\n}\ninterface NextApiResponse {\n  setHeader(name: string, value: string): void;\n  status(code: number): NextApiResponse;\n  json(body: unknown): void;\n}\n\nexport interface WebhookHandlers {\n  onCustomerSubscriptionCreated?: (\n    subscription: Stripe.Subscription\n  ) => Promise<void>;\n  onCustomerSubscriptionUpdated?: (\n    subscription: Stripe.Subscription\n  ) => Promise<void>;\n  onCustomerSubscriptionDeleted?: (\n    subscription: Stripe.Subscription\n  ) => Promise<void>;\n  onInvoicePaymentSucceeded?: (invoice: Stripe.Invoice) => Promise<void>;\n  onInvoicePaymentFailed?: (invoice: Stripe.Invoice) => Promise<void>;\n  onCheckoutSessionCompleted?: (\n    session: Stripe.Checkout.Session\n  ) => Promise<void>;\n  onPaymentIntentSucceeded?: (\n    paymentIntent: Stripe.PaymentIntent\n  ) => Promise<void>;\n  onPaymentIntentPaymentFailed?: (\n    paymentIntent: Stripe.PaymentIntent\n  ) => Promise<void>;\n}\n\nexport class StripeWebhookHandler {\n  private stripeAPI: StripeServerAPI;\n  private handlers: WebhookHandlers;\n\n  constructor(secretKey: string, handlers: WebhookHandlers = {}) {\n    this.stripeAPI = new StripeServerAPI(secretKey);\n    this.handlers = handlers;\n  }\n\n  async handleWebhook(\n    payload: string | Buffer,\n    signature: string,\n    webhookSecret: string\n  ): Promise<{ success: boolean; error?: string }> {\n    try {\n      const event = this.stripeAPI.constructWebhookEvent(\n        payload,\n        signature,\n        webhookSecret\n      );\n\n      console.log(`Received webhook event: ${event.type}`);\n\n      await this.processEvent(event);\n\n      return { success: true };\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : 'Unknown webhook error';\n      console.error('Webhook error:', errorMessage);\n      return { success: false, error: errorMessage };\n    }\n  }\n\n  private async processEvent(event: Stripe.Event): Promise<void> {\n    switch (event.type) {\n      case WEBHOOK_EVENTS.CUSTOMER_SUBSCRIPTION_CREATED:\n        await this.handleSubscriptionCreated(\n          event.data.object as Stripe.Subscription\n        );\n        break;\n\n      case WEBHOOK_EVENTS.CUSTOMER_SUBSCRIPTION_UPDATED:\n        await this.handleSubscriptionUpdated(\n          event.data.object as Stripe.Subscription\n        );\n        break;\n\n      case WEBHOOK_EVENTS.CUSTOMER_SUBSCRIPTION_DELETED:\n        await this.handleSubscriptionDeleted(\n          event.data.object as Stripe.Subscription\n        );\n        break;\n\n      case WEBHOOK_EVENTS.INVOICE_PAYMENT_SUCCEEDED:\n        await this.handleInvoicePaymentSucceeded(\n          event.data.object as Stripe.Invoice\n        );\n        break;\n\n      case WEBHOOK_EVENTS.INVOICE_PAYMENT_FAILED:\n        await this.handleInvoicePaymentFailed(\n          event.data.object as Stripe.Invoice\n        );\n        break;\n\n      case WEBHOOK_EVENTS.CHECKOUT_SESSION_COMPLETED:\n        await this.handleCheckoutSessionCompleted(\n          event.data.object as Stripe.Checkout.Session\n        );\n        break;\n\n      case WEBHOOK_EVENTS.PAYMENT_INTENT_SUCCEEDED:\n        await this.handlePaymentIntentSucceeded(\n          event.data.object as Stripe.PaymentIntent\n        );\n        break;\n\n      case WEBHOOK_EVENTS.PAYMENT_INTENT_PAYMENT_FAILED:\n        await this.handlePaymentIntentFailed(\n          event.data.object as Stripe.PaymentIntent\n        );\n        break;\n\n      default:\n        console.log(`Unhandled event type: ${event.type}`);\n    }\n  }\n\n  private async handleSubscriptionCreated(\n    subscription: Stripe.Subscription\n  ): Promise<void> {\n    console.log(`Subscription created: ${subscription.id}`);\n\n    if (this.handlers.onCustomerSubscriptionCreated) {\n      await this.handlers.onCustomerSubscriptionCreated(subscription);\n    }\n\n    // Default behavior: Log subscription details\n\n    console.log(\n      `Customer ${subscription.customer} subscribed to ${subscription.items.data[0]?.price.id}`\n    );\n  }\n\n  private async handleSubscriptionUpdated(\n    subscription: Stripe.Subscription\n  ): Promise<void> {\n    console.log(`Subscription updated: ${subscription.id}`);\n\n    if (this.handlers.onCustomerSubscriptionUpdated) {\n      await this.handlers.onCustomerSubscriptionUpdated(subscription);\n    }\n\n    // Default behavior: Log status changes\n\n    console.log(\n      `Subscription ${subscription.id} status: ${subscription.status}`\n    );\n  }\n\n  private async handleSubscriptionDeleted(\n    subscription: Stripe.Subscription\n  ): Promise<void> {\n    console.log(`Subscription deleted: ${subscription.id}`);\n\n    if (this.handlers.onCustomerSubscriptionDeleted) {\n      await this.handlers.onCustomerSubscriptionDeleted(subscription);\n    }\n\n    // Default behavior: Log cancellation\n\n    console.log(\n      `Customer ${subscription.customer} cancelled subscription ${subscription.id}`\n    );\n  }\n\n  private async handleInvoicePaymentSucceeded(\n    invoice: Stripe.Invoice\n  ): Promise<void> {\n    console.log(`Invoice payment succeeded: ${invoice.id}`);\n\n    if (this.handlers.onInvoicePaymentSucceeded) {\n      await this.handlers.onInvoicePaymentSucceeded(invoice);\n    }\n\n    // Default behavior: Log successful payment\n    const subscriptionId = (\n      invoice as Stripe.Invoice & { subscription?: string }\n    ).subscription;\n    if (subscriptionId) {\n      console.log(`Payment succeeded for subscription ${subscriptionId}`);\n    }\n  }\n\n  private async handleInvoicePaymentFailed(\n    invoice: Stripe.Invoice\n  ): Promise<void> {\n    console.log(`Invoice payment failed: ${invoice.id}`);\n\n    if (this.handlers.onInvoicePaymentFailed) {\n      await this.handlers.onInvoicePaymentFailed(invoice);\n    }\n\n    // Default behavior: Log failed payment\n    const subscriptionId = (\n      invoice as Stripe.Invoice & { subscription?: string }\n    ).subscription;\n    if (subscriptionId) {\n      console.log(`Payment failed for subscription ${subscriptionId}`);\n    }\n  }\n\n  private async handleCheckoutSessionCompleted(\n    session: Stripe.Checkout.Session\n  ): Promise<void> {\n    console.log(`Checkout session completed: ${session.id}`);\n\n    if (this.handlers.onCheckoutSessionCompleted) {\n      await this.handlers.onCheckoutSessionCompleted(session);\n    }\n\n    // Default behavior: Log successful checkout\n    if (session.mode === 'subscription') {\n      console.log(\n        `Subscription checkout completed for customer ${session.customer}`\n      );\n    } else {\n      console.log(\n        `Payment checkout completed for customer ${session.customer}`\n      );\n    }\n  }\n\n  private async handlePaymentIntentSucceeded(\n    paymentIntent: Stripe.PaymentIntent\n  ): Promise<void> {\n    console.log(`Payment intent succeeded: ${paymentIntent.id}`);\n\n    if (this.handlers.onPaymentIntentSucceeded) {\n      await this.handlers.onPaymentIntentSucceeded(paymentIntent);\n    }\n\n    // Default behavior: Log successful payment\n\n    console.log(\n      `Payment of ${paymentIntent.amount} ${paymentIntent.currency} succeeded`\n    );\n  }\n\n  private async handlePaymentIntentFailed(\n    paymentIntent: Stripe.PaymentIntent\n  ): Promise<void> {\n    console.log(`Payment intent failed: ${paymentIntent.id}`);\n\n    if (this.handlers.onPaymentIntentPaymentFailed) {\n      await this.handlers.onPaymentIntentPaymentFailed(paymentIntent);\n    }\n\n    // Default behavior: Log failed payment\n\n    console.log(\n      `Payment of ${paymentIntent.amount} ${paymentIntent.currency} failed`\n    );\n  }\n}\n\n// Utility function to create a webhook handler with custom handlers\nexport const createStripeWebhookHandler = (\n  secretKey: string,\n  handlers: WebhookHandlers = {}\n): StripeWebhookHandler => {\n  return new StripeWebhookHandler(secretKey, handlers);\n};\n\n// Express.js middleware for handling Stripe webhooks\nexport const createStripeWebhookMiddleware = (\n  secretKey: string,\n  webhookSecret: string,\n  handlers: WebhookHandlers = {}\n) => {\n  const webhookHandler = new StripeWebhookHandler(secretKey, handlers);\n\n  return async (req: ExpressRequest, res: ExpressResponse) => {\n    try {\n      const signature = req.headers['stripe-signature'];\n\n      if (!signature) {\n        return res\n          .status(400)\n          .json({ error: 'Missing stripe-signature header' });\n      }\n\n      const sig = Array.isArray(signature) ? signature[0] : signature;\n      if (!sig) {\n        return res\n          .status(400)\n          .json({ error: 'Invalid stripe-signature header' });\n      }\n\n      const result = await webhookHandler.handleWebhook(\n        req.body,\n        sig,\n        webhookSecret\n      );\n\n      if (result.success) {\n        res.status(200).json({ received: true });\n      } else {\n        res.status(400).json({ error: result.error });\n      }\n    } catch (error) {\n      console.error('Webhook middleware error:', error);\n      res.status(500).json({ error: 'Internal server error' });\n    }\n  };\n};\n\n/**\n * Next.js App Router webhook handler (Next.js 13+ with `app/` directory).\n *\n * Returns a `POST` function suitable for use in `app/api/.../route.ts` files.\n * Uses the Web-standard `Request`/`Response` API instead of Pages Router types.\n *\n * @example\n * ```ts\n * // app/api/stripe-webhook/route.ts\n * import { createAppRouterWebhookHandler } from '@digilogiclabs/saas-factory-payments/server';\n *\n * export const POST = createAppRouterWebhookHandler(\n *   process.env.STRIPE_SECRET_KEY!,\n *   process.env.STRIPE_WEBHOOK_SECRET!,\n *   {\n *     onCheckoutSessionCompleted: async (session) => {\n *       if (session.metadata?.product_type === 'donation') {\n *         // Handle donation...\n *       }\n *     },\n *   },\n * );\n * ```\n */\nexport const createAppRouterWebhookHandler = (\n  secretKey: string,\n  webhookSecret: string,\n  handlers: WebhookHandlers = {}\n) => {\n  const webhookHandler = new StripeWebhookHandler(secretKey, handlers);\n\n  return async (request: Request): Promise<Response> => {\n    try {\n      const signature = request.headers.get('stripe-signature');\n\n      if (!signature) {\n        return Response.json(\n          { error: 'Missing stripe-signature header' },\n          { status: 400 }\n        );\n      }\n\n      const rawBody = await request.text();\n\n      const result = await webhookHandler.handleWebhook(\n        rawBody,\n        signature,\n        webhookSecret\n      );\n\n      if (result.success) {\n        return Response.json({ received: true });\n      } else {\n        return Response.json({ error: result.error }, { status: 400 });\n      }\n    } catch (error) {\n      console.error('Webhook handler error:', error);\n      return Response.json({ error: 'Internal server error' }, { status: 500 });\n    }\n  };\n};\n\n/** @deprecated Use `createAppRouterWebhookHandler` for Next.js 13+ App Router. */\n// Next.js Pages Router API route handler (legacy)\nexport const createNextJSWebhookHandler = (\n  secretKey: string,\n  webhookSecret: string,\n  handlers: WebhookHandlers = {}\n) => {\n  const webhookHandler = new StripeWebhookHandler(secretKey, handlers);\n\n  return async (req: NextApiRequest, res: NextApiResponse) => {\n    if (req.method !== 'POST') {\n      res.setHeader('Allow', 'POST');\n      return res.status(405).json({ error: 'Method not allowed' });\n    }\n\n    try {\n      const signature = req.headers['stripe-signature'];\n\n      if (!signature) {\n        return res\n          .status(400)\n          .json({ error: 'Missing stripe-signature header' });\n      }\n\n      const sig = Array.isArray(signature) ? signature[0] : signature;\n      if (!sig) {\n        return res\n          .status(400)\n          .json({ error: 'Invalid stripe-signature header' });\n      }\n\n      const result = await webhookHandler.handleWebhook(\n        req.body,\n        sig,\n        webhookSecret\n      );\n\n      if (result.success) {\n        res.status(200).json({ received: true });\n      } else {\n        res.status(400).json({ error: result.error });\n      }\n    } catch (error) {\n      console.error('Webhook handler error:', error);\n      res.status(500).json({ error: 'Internal server error' });\n    }\n  };\n};\n","import Stripe from 'stripe';\nimport type {\n  DonationTier,\n  DonationCheckoutOptions,\n  DonationCheckoutResult,\n} from '../../shared/types/donation';\n\nexport interface CreateCheckoutSessionOptions {\n  priceId: string;\n  customerId?: string;\n  successUrl: string;\n  cancelUrl: string;\n  mode?: 'payment' | 'subscription' | 'setup';\n  metadata?: Record<string, string>;\n}\n\nexport interface ProcessPaymentOptions {\n  amount: number;\n  currency: string;\n  paymentMethodId: string;\n  customerId?: string;\n  description?: string;\n  metadata?: Record<string, string>;\n}\n\nexport interface CreateSubscriptionOptions {\n  customerId: string;\n  priceId: string;\n  paymentMethodId?: string;\n  trialPeriodDays?: number;\n  metadata?: Record<string, string>;\n}\n\nexport interface UpdateSubscriptionOptions {\n  subscriptionId: string;\n  priceId?: string;\n  quantity?: number;\n  metadata?: Record<string, string>;\n}\n\n/**\n * Create a Stripe checkout session\n */\nexport const createStripeCheckoutSession = async (\n  stripe: Stripe,\n  options: CreateCheckoutSessionOptions\n): Promise<Stripe.Checkout.Session> => {\n  const {\n    priceId,\n    customerId,\n    successUrl,\n    cancelUrl,\n    mode = 'subscription',\n    metadata = {},\n  } = options;\n\n  const sessionParams: Stripe.Checkout.SessionCreateParams = {\n    mode,\n    success_url: successUrl,\n    cancel_url: cancelUrl,\n    line_items: [\n      {\n        price: priceId,\n        quantity: 1,\n      },\n    ],\n    metadata,\n  };\n\n  if (customerId) {\n    sessionParams.customer = customerId;\n  } else {\n    sessionParams.customer_creation = 'always';\n  }\n\n  if (mode === 'subscription') {\n    sessionParams.subscription_data = {\n      metadata,\n    };\n  }\n\n  return await stripe.checkout.sessions.create(sessionParams);\n};\n\n/**\n * Process a one-time payment\n */\nexport const processPayment = async (\n  stripe: Stripe,\n  options: ProcessPaymentOptions\n): Promise<Stripe.PaymentIntent> => {\n  const {\n    amount,\n    currency,\n    paymentMethodId,\n    customerId,\n    description,\n    metadata = {},\n  } = options;\n\n  const paymentIntentParams: Stripe.PaymentIntentCreateParams = {\n    amount,\n    currency,\n    payment_method: paymentMethodId,\n    confirmation_method: 'manual',\n    confirm: true,\n    return_url: 'https://your-website.com/return',\n    metadata,\n  };\n\n  if (customerId) {\n    paymentIntentParams.customer = customerId;\n  }\n\n  if (description) {\n    paymentIntentParams.description = description;\n  }\n\n  return await stripe.paymentIntents.create(paymentIntentParams);\n};\n\n/**\n * Create a subscription\n */\nexport const createSubscription = async (\n  stripe: Stripe,\n  options: CreateSubscriptionOptions\n): Promise<Stripe.Subscription> => {\n  const {\n    customerId,\n    priceId,\n    paymentMethodId,\n    trialPeriodDays,\n    metadata = {},\n  } = options;\n\n  const subscriptionParams: Stripe.SubscriptionCreateParams = {\n    customer: customerId,\n    items: [\n      {\n        price: priceId,\n      },\n    ],\n    metadata,\n  };\n\n  if (paymentMethodId) {\n    subscriptionParams.default_payment_method = paymentMethodId;\n  }\n\n  if (trialPeriodDays) {\n    subscriptionParams.trial_period_days = trialPeriodDays;\n  }\n\n  return await stripe.subscriptions.create(subscriptionParams);\n};\n\n/**\n * Update a subscription\n */\nexport const updateSubscription = async (\n  stripe: Stripe,\n  options: UpdateSubscriptionOptions\n): Promise<Stripe.Subscription> => {\n  const { subscriptionId, priceId, quantity, metadata } = options;\n\n  const subscription = await stripe.subscriptions.retrieve(subscriptionId);\n\n  const updateParams: Stripe.SubscriptionUpdateParams = {};\n\n  if (priceId) {\n    updateParams.items = [\n      {\n        id: subscription.items.data[0]?.id || '',\n        price: priceId,\n        quantity: quantity || 1,\n      },\n    ];\n  }\n\n  if (metadata) {\n    updateParams.metadata = metadata;\n  }\n\n  return await stripe.subscriptions.update(subscriptionId, updateParams);\n};\n\n/**\n * Cancel a subscription\n */\nexport const cancelSubscription = async (\n  stripe: Stripe,\n  subscriptionId: string,\n  cancelAtPeriodEnd: boolean = true\n): Promise<Stripe.Subscription> => {\n  if (cancelAtPeriodEnd) {\n    return await stripe.subscriptions.update(subscriptionId, {\n      cancel_at_period_end: true,\n    });\n  } else {\n    return await stripe.subscriptions.cancel(subscriptionId);\n  }\n};\n\n// ═══════════════════════════════════════════════════════════════\n// DONATION CHECKOUT — inline price_data, zero Stripe Dashboard setup\n// ═══════════════════════════════════════════════════════════════\n\n/**\n * Create a donation checkout session using inline price_data.\n *\n * Unlike `createStripeCheckoutSession` which requires a pre-created Price ID,\n * this uses Stripe's inline `price_data` so apps don't need any Stripe\n * Dashboard setup. Stripe auto-creates the products on first use.\n *\n * Supports:\n * - Named tiers with fixed amounts (one-time or monthly)\n * - Custom amounts with configurable recurrence\n * - Metadata tagging for webhook identification\n *\n * @example\n * ```ts\n * const tiers: DonationTier[] = [\n *   { id: 'fan', name: 'Fan', description: 'Monthly $3 support', amountCents: 300, recurring: true },\n *   { id: 'gold', name: 'Gold', description: 'One-time $25 donation', amountCents: 2500 },\n * ];\n *\n * const result = await createDonationCheckout(stripe, tiers, {\n *   tier: 'fan',\n *   successUrl: 'https://example.com/thank-you?session_id={CHECKOUT_SESSION_ID}',\n *   cancelUrl: 'https://example.com/support',\n * });\n * // result.url → redirect user here\n * ```\n */\nexport const createDonationCheckout = async (\n  stripe: Stripe,\n  tiers: DonationTier[],\n  options: DonationCheckoutOptions\n): Promise<DonationCheckoutResult> => {\n  const {\n    tier,\n    customAmountCents,\n    customRecurring = false,\n    successUrl,\n    cancelUrl,\n    metadata = {},\n    customerId,\n    allowPromotionCodes = true,\n    billingAddressCollection = 'auto',\n  } = options;\n\n  let amountCents: number;\n  let isRecurring: boolean;\n  let productName: string;\n  let productDescription: string;\n\n  if (tier === 'custom') {\n    if (!customAmountCents || customAmountCents < 100) {\n      throw new Error(\n        'Custom donations require an amount of at least $1.00 (100 cents)'\n      );\n    }\n    amountCents = customAmountCents;\n    isRecurring = customRecurring;\n    productName = 'Custom Donation';\n    productDescription = `Custom ${isRecurring ? 'monthly ' : ''}donation — $${(amountCents / 100).toFixed(2)}`;\n  } else {\n    const tierDef = tiers.find(t => t.id === tier);\n    if (!tierDef) {\n      throw new Error(`Unknown donation tier: ${tier}`);\n    }\n    amountCents = tierDef.amountCents;\n    isRecurring = tierDef.recurring ?? false;\n    productName = tierDef.name;\n    productDescription = tierDef.description;\n  }\n\n  const priceData: Stripe.Checkout.SessionCreateParams.LineItem.PriceData = {\n    currency: 'usd',\n    product_data: {\n      name: productName,\n      description: productDescription,\n    },\n    unit_amount: amountCents,\n    ...(isRecurring ? { recurring: { interval: 'month' as const } } : {}),\n  };\n\n  const sessionParams: Stripe.Checkout.SessionCreateParams = {\n    mode: isRecurring ? 'subscription' : 'payment',\n    ...(isRecurring ? {} : { submit_type: 'donate' as const }),\n    line_items: [{ price_data: priceData, quantity: 1 }],\n    success_url: successUrl,\n    cancel_url: cancelUrl,\n    metadata: {\n      product_type: 'donation',\n      tier,\n      ...(tier === 'custom' ? { amount_cents: String(amountCents) } : {}),\n      ...metadata,\n    },\n    billing_address_collection: billingAddressCollection,\n    allow_promotion_codes: allowPromotionCodes,\n  };\n\n  if (customerId) {\n    sessionParams.customer = customerId;\n  }\n\n  if (isRecurring) {\n    sessionParams.subscription_data = {\n      metadata: {\n        product_type: 'donation',\n        tier,\n        ...metadata,\n      },\n    };\n  }\n\n  const session = await stripe.checkout.sessions.create(sessionParams);\n\n  return {\n    sessionId: session.id,\n    url: session.url,\n  };\n};\n\n/**\n * Validate Stripe webhook signature\n */\nexport const validateStripeSignature = (\n  payload: string | Buffer,\n  signature: string,\n  endpointSecret: string\n): Stripe.Event => {\n  const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n\n  return stripe.webhooks.constructEvent(payload, signature, endpointSecret);\n};\n\n/**\n * Handle common Stripe webhook events\n */\nexport const handleStripeWebhook = async (\n  event: Stripe.Event,\n  handlers: {\n    onPaymentSucceeded?: (paymentIntent: Stripe.PaymentIntent) => Promise<void>;\n    onPaymentFailed?: (paymentIntent: Stripe.PaymentIntent) => Promise<void>;\n    onSubscriptionCreated?: (\n      subscription: Stripe.Subscription\n    ) => Promise<void>;\n    onSubscriptionUpdated?: (\n      subscription: Stripe.Subscription\n    ) => Promise<void>;\n    onSubscriptionDeleted?: (\n      subscription: Stripe.Subscription\n    ) => Promise<void>;\n    onInvoicePaid?: (invoice: Stripe.Invoice) => Promise<void>;\n    onInvoicePaymentFailed?: (invoice: Stripe.Invoice) => Promise<void>;\n  }\n): Promise<void> => {\n  switch (event.type) {\n    case 'payment_intent.succeeded':\n      if (handlers.onPaymentSucceeded) {\n        await handlers.onPaymentSucceeded(\n          event.data.object as Stripe.PaymentIntent\n        );\n      }\n      break;\n\n    case 'payment_intent.payment_failed':\n      if (handlers.onPaymentFailed) {\n        await handlers.onPaymentFailed(\n          event.data.object as Stripe.PaymentIntent\n        );\n      }\n      break;\n\n    case 'customer.subscription.created':\n      if (handlers.onSubscriptionCreated) {\n        await handlers.onSubscriptionCreated(\n          event.data.object as Stripe.Subscription\n        );\n      }\n      break;\n\n    case 'customer.subscription.updated':\n      if (handlers.onSubscriptionUpdated) {\n        await handlers.onSubscriptionUpdated(\n          event.data.object as Stripe.Subscription\n        );\n      }\n      break;\n\n    case 'customer.subscription.deleted':\n      if (handlers.onSubscriptionDeleted) {\n        await handlers.onSubscriptionDeleted(\n          event.data.object as Stripe.Subscription\n        );\n      }\n      break;\n\n    case 'invoice.paid':\n      if (handlers.onInvoicePaid) {\n        await handlers.onInvoicePaid(event.data.object as Stripe.Invoice);\n      }\n      break;\n\n    case 'invoice.payment_failed':\n      if (handlers.onInvoicePaymentFailed) {\n        await handlers.onInvoicePaymentFailed(\n          event.data.object as Stripe.Invoice\n        );\n      }\n      break;\n\n    default:\n      console.log(`Unhandled event type: ${event.type}`);\n  }\n};\n"],"mappings":"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","names":["Stripe"]}