{"version":3,"sources":["../src/index.ts","../src/platform/index.ts","../src/shared/types/subscription.ts","../src/shared/types/errors.ts","../src/shared/constants.ts","../src/shared/utils/validation.ts","../src/shared/utils/formatting.ts","../src/shared/utils/env.ts","../src/providers/base/index.ts","../src/providers/stripe/index.ts","../src/providers/mock/index.ts","../src/providers/index.ts"],"sourcesContent":["// ═══════════════════════════════════════════════════════════════\n// PLATFORM CORE RE-EXPORTS (IPayment interface and adapters)\n// These provide the unified platform-core payment abstraction\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n  // IPayment interface and types\n  type IPayment,\n  type PaymentIntent,\n  type PaymentStatus,\n  type PaymentMethod,\n  type PaymentMethodType,\n  type CardDetails,\n  type CardBrand,\n  type BankAccountDetails,\n  type BillingDetails,\n  type Address,\n  type PaymentError,\n  type PaymentErrorCode,\n  type CreatePaymentIntentOptions,\n  type UpdatePaymentIntentOptions,\n  type ConfirmPaymentIntentOptions,\n  type CapturePaymentIntentOptions,\n  type Refund,\n  type RefundStatus,\n  type RefundReason,\n  type CreateRefundOptions,\n  type Transfer,\n  type TransferStatus,\n  type CreateTransferOptions,\n  type Payout,\n  type PayoutStatus,\n  type CreatePayoutOptions,\n  type ConnectedAccount,\n  type AccountType,\n  type BusinessProfile,\n  type ConnectedAccountStatus,\n  type CreateConnectedAccountOptions,\n  type AccountCapabilities,\n  type TosAcceptance,\n  type CreateAccountLinkOptions,\n  type AccountLink,\n  type Customer,\n  type CreateCustomerOptions,\n  type UpdateCustomerOptions,\n  type Balance,\n  type BalanceAmount,\n  type PaymentWebhookEvent,\n  type PaymentEventType,\n  type VerifyWebhookOptions,\n  type PaymentConfig,\n  // Helpers\n  createPaymentError,\n  isPaymentError,\n  PaymentErrorMessages,\n  formatAmount,\n  generatePaymentId,\n  // Memory adapter for testing\n  MemoryPayment,\n} from '@digilogiclabs/platform-core';\n\n// Production adapters\nexport {\n  StripePayment,\n  type StripePaymentConfig,\n} from '@digilogiclabs/platform-core';\n\n// ═══════════════════════════════════════════════════════════════\n// PLATFORM CORE INTEGRATION (observability)\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n  setPlatform,\n  clearPlatform,\n  hasPlatform,\n  logPaymentEvent,\n  trackPaymentMetric,\n  trackRevenue,\n  trackCheckoutSession,\n  trackSubscriptionEvent,\n  trackWebhookEvent,\n  cacheSubscriptionStatus,\n  getCachedSubscriptionStatus,\n} from './platform/index.js';\n\n// ═══════════════════════════════════════════════════════════════\n// CORE SHARED EXPORTS (safe for server-side)\n// ═══════════════════════════════════════════════════════════════\n\nexport * from './shared/types';\nexport * from './shared/constants';\nexport * from './shared/utils/validation';\nexport * from './shared/utils/formatting';\nexport * from './shared/utils/env';\n\n// Utils that templates expect\nexport {\n  formatCurrency,\n  formatDate,\n  calculateTax,\n  formatTaxRate,\n  formatAmountWithTax,\n} from './shared/utils/formatting';\nexport {\n  validateCard,\n  validateEmail,\n  validateAmount,\n  validatePricingPlan,\n  validatePaymentsConfig,\n} from './shared/utils/validation';\n\n// Server-safe provider exports (no React components)\nexport { PaymentProviderFactory } from './providers';\nexport * from './providers/stripe';\nexport * from './providers/mock';\n\n// New providers (temporarily commented out due to build issues)\n// export * from './providers/paypal';\n// export * from './providers/applepay';\n\n// Platform-specific exports are handled by package.json exports field\n// Users should import from:\n// - '@digilogiclabs/saas-factory-payments/web' for web components and hooks\n// - '@digilogiclabs/saas-factory-payments/native' for React Native components\n// - '@digilogiclabs/saas-factory-payments/server' for server-side utilities\n\n// Note: React components and hooks have been moved to platform-specific exports\n// to prevent Turbopack bundling conflicts in server-side imports\n","/**\n * Platform Core Integration\n *\n * Optional integration with @digilogiclabs/platform-core for:\n * - Logging (payment events, webhook processing)\n * - Metrics (payment success/failure tracking, revenue metrics)\n * - Cache (subscription status caching)\n */\n\nimport type { ILogger, IMetrics, ICache } from '@digilogiclabs/platform-core';\n\ninterface PlatformServices {\n  logger?: ILogger;\n  metrics?: IMetrics;\n  cache?: ICache;\n}\n\nlet platformServices: PlatformServices = {};\n\n/**\n * Set the platform services for payments package to use\n *\n * @example\n * ```typescript\n * import { createPlatform } from '@digilogiclabs/platform-core';\n * import { setPlatform } from '@digilogiclabs/saas-factory-payments';\n *\n * const platform = createPlatform();\n * setPlatform({\n *   logger: platform.logger,\n *   metrics: platform.metrics,\n *   cache: platform.cache,\n * });\n * ```\n */\nexport function setPlatform(services: PlatformServices): void {\n  platformServices = { ...platformServices, ...services };\n}\n\n/**\n * Clear platform services (useful for testing)\n */\nexport function clearPlatform(): void {\n  platformServices = {};\n}\n\n/**\n * Get the configured logger\n */\nexport function getLogger(): ILogger | undefined {\n  return platformServices.logger;\n}\n\n/**\n * Get the configured metrics\n */\nexport function getMetrics(): IMetrics | undefined {\n  return platformServices.metrics;\n}\n\n/**\n * Get the configured cache\n */\nexport function getCache(): ICache | undefined {\n  return platformServices.cache;\n}\n\n/**\n * Check if platform services are configured\n */\nexport function hasPlatform(): boolean {\n  return Object.keys(platformServices).length > 0;\n}\n\n/**\n * Log a payment event if logger is configured\n */\nexport function logPaymentEvent(\n  level: 'debug' | 'info' | 'warn' | 'error',\n  message: string,\n  meta?: Record<string, unknown>\n): void {\n  const logger = platformServices.logger;\n  if (logger) {\n    logger[level](message, meta);\n  }\n}\n\n/**\n * Track a payment metric if metrics are configured\n */\nexport function trackPaymentMetric(\n  name: string,\n  value: number = 1,\n  tags?: Record<string, string | number | boolean>\n): void {\n  const metrics = platformServices.metrics;\n  if (metrics) {\n    metrics.increment(`payments.${name}`, value, tags);\n  }\n}\n\n/**\n * Track payment revenue\n */\nexport function trackRevenue(\n  amount: number,\n  currency: string,\n  tags?: Record<string, string | number | boolean>\n): void {\n  const metrics = platformServices.metrics;\n  if (metrics) {\n    metrics.gauge('payments.revenue', amount, { currency, ...tags });\n  }\n}\n\n/**\n * Cache subscription status\n */\nexport async function cacheSubscriptionStatus(\n  customerId: string,\n  status: string,\n  ttl: number = 300\n): Promise<void> {\n  const cache = platformServices.cache;\n  if (cache) {\n    try {\n      await cache.set(`subscription:${customerId}`, status, ttl);\n      logPaymentEvent('debug', 'Cached subscription status', {\n        customerId,\n        status,\n      });\n    } catch (error) {\n      logPaymentEvent('warn', 'Failed to cache subscription status', {\n        customerId,\n        error,\n      });\n    }\n  }\n}\n\n/**\n * Get cached subscription status\n */\nexport async function getCachedSubscriptionStatus(\n  customerId: string\n): Promise<string | null> {\n  const cache = platformServices.cache;\n  if (cache) {\n    try {\n      return await cache.get<string>(`subscription:${customerId}`);\n    } catch (error) {\n      logPaymentEvent('warn', 'Failed to get cached subscription status', {\n        customerId,\n        error,\n      });\n    }\n  }\n  return null;\n}\n\n/**\n * Track webhook processing\n */\nexport function trackWebhookEvent(\n  eventType: string,\n  success: boolean,\n  duration?: number\n): void {\n  const metrics = platformServices.metrics;\n  if (metrics) {\n    metrics.increment(\n      success ? 'payments.webhook.success' : 'payments.webhook.failure',\n      1,\n      { event_type: eventType }\n    );\n    if (duration !== undefined) {\n      metrics.timing('payments.webhook.duration', duration, {\n        event_type: eventType,\n      });\n    }\n  }\n}\n\n/**\n * Track checkout session\n */\nexport function trackCheckoutSession(\n  success: boolean,\n  tags?: Record<string, string | number | boolean>\n): void {\n  trackPaymentMetric(\n    success ? 'checkout.success' : 'checkout.failure',\n    1,\n    tags\n  );\n}\n\n/**\n * Track subscription events\n */\nexport function trackSubscriptionEvent(\n  event: 'created' | 'updated' | 'canceled' | 'renewed',\n  tags?: Record<string, string | number | boolean>\n): void {\n  trackPaymentMetric(`subscription.${event}`, 1, tags);\n}\n","export enum SubscriptionStatus {\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  ENDED = 'ended', // Custom status for ended subscriptions\n  ALL = 'all', // For filtering purposes\n}\n\nexport interface SubscriptionItem {\n  id: string;\n  priceId: string;\n  quantity: number;\n  metadata?: Record<string, string>;\n}\n\nexport interface Subscription {\n  id: string;\n  customerId: string;\n  customer_id?: string; // For compatibility\n  status: SubscriptionStatus;\n  items?: SubscriptionItem[];\n  price_id?: string; // For single-item subscriptions\n  currentPeriodStart: Date;\n  current_period_start?: Date; // For compatibility\n  currentPeriodEnd: Date;\n  current_period_end?: Date; // For compatibility\n  cancelAtPeriodEnd: boolean;\n  cancel_at_period_end?: boolean; // For compatibility\n  trialEnd?: Date;\n  trial_end?: Date; // For compatibility\n  trialStart?: Date;\n  trial_start?: Date; // For compatibility\n  canceledAt?: Date;\n  canceled_at?: Date; // For compatibility\n  endedAt?: Date;\n  metadata?: Record<string, string>;\n  created: Date;\n  updated?: Date;\n  // Additional fields for analytics\n  amount?: number;\n  currency?: string;\n  interval?: string;\n  interval_unit?: string;\n  planName?: string;\n  planId?: string;\n}\n\nexport interface SubscriptionCreateParams {\n  customerId: string;\n  items?: { priceId: string; quantity?: number }[];\n  priceId?: string; // For single-item subscriptions\n  trialPeriodDays?: number;\n  metadata?: Record<string, string>;\n  paymentBehavior?:\n    | 'default_incomplete'\n    | 'error_if_incomplete'\n    | 'allow_incomplete';\n  // Additional fields for multi-provider support\n  customerEmail?: string;\n  customerName?: string;\n  successUrl?: string;\n  cancelUrl?: string;\n}\n\nexport interface SubscriptionUpdateParams {\n  items?: { priceId: string; quantity?: number }[];\n  priceId?: string; // For single-item subscriptions\n  quantity?: number;\n  cancelAtPeriodEnd?: boolean;\n  metadata?: Record<string, string>;\n}\n\n// More specific status type unions for better TypeScript support\nexport type ActiveSubscriptionStatus =\n  | SubscriptionStatus.ACTIVE\n  | SubscriptionStatus.TRIALING;\nexport type InactiveSubscriptionStatus =\n  | SubscriptionStatus.CANCELED\n  | SubscriptionStatus.ENDED;\nexport type ProblematicSubscriptionStatus =\n  | SubscriptionStatus.PAST_DUE\n  | SubscriptionStatus.UNPAID;\nexport type IncompleteSubscriptionStatus =\n  | SubscriptionStatus.INCOMPLETE\n  | SubscriptionStatus.INCOMPLETE_EXPIRED;\n\n// Status groups for filtering and UI logic\nexport const ACTIVE_STATUSES: ActiveSubscriptionStatus[] = [\n  SubscriptionStatus.ACTIVE,\n  SubscriptionStatus.TRIALING,\n];\n\nexport const INACTIVE_STATUSES: InactiveSubscriptionStatus[] = [\n  SubscriptionStatus.CANCELED,\n  SubscriptionStatus.ENDED,\n];\n\nexport const PROBLEMATIC_STATUSES: ProblematicSubscriptionStatus[] = [\n  SubscriptionStatus.PAST_DUE,\n  SubscriptionStatus.UNPAID,\n];\n\nexport const INCOMPLETE_STATUSES: IncompleteSubscriptionStatus[] = [\n  SubscriptionStatus.INCOMPLETE,\n  SubscriptionStatus.INCOMPLETE_EXPIRED,\n];\n\n// Helper functions for subscription status checks\nexport const isActiveSubscription = (\n  status: SubscriptionStatus\n): status is ActiveSubscriptionStatus => {\n  return ACTIVE_STATUSES.includes(status as ActiveSubscriptionStatus);\n};\n\nexport const isInactiveSubscription = (\n  status: SubscriptionStatus\n): status is InactiveSubscriptionStatus => {\n  return INACTIVE_STATUSES.includes(status as InactiveSubscriptionStatus);\n};\n\nexport const isProblematicSubscription = (\n  status: SubscriptionStatus\n): status is ProblematicSubscriptionStatus => {\n  return PROBLEMATIC_STATUSES.includes(status as ProblematicSubscriptionStatus);\n};\n\nexport const isIncompleteSubscription = (\n  status: SubscriptionStatus\n): status is IncompleteSubscriptionStatus => {\n  return INCOMPLETE_STATUSES.includes(status as IncompleteSubscriptionStatus);\n};\n","export enum PaymentErrorType {\n  CARD_DECLINED = 'CARD_DECLINED',\n  INSUFFICIENT_FUNDS = 'INSUFFICIENT_FUNDS',\n  CUSTOMER_NOT_FOUND = 'CUSTOMER_NOT_FOUND',\n  SUBSCRIPTION_NOT_FOUND = 'SUBSCRIPTION_NOT_FOUND',\n  NETWORK_ERROR = 'NETWORK_ERROR',\n  CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\n  WEBHOOK_ERROR = 'WEBHOOK_ERROR',\n  VALIDATION_ERROR = 'VALIDATION_ERROR',\n  PROVIDER_NOT_CONFIGURED = 'PROVIDER_NOT_CONFIGURED',\n  UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n  INITIALIZATION_ERROR = 'INITIALIZATION_ERROR',\n  AUTHENTICATION_ERROR = 'AUTHENTICATION_ERROR',\n  NOT_FOUND = 'NOT_FOUND',\n  INVALID_REQUEST = 'INVALID_REQUEST',\n  API_ERROR = 'API_ERROR',\n  PERMISSION_DENIED = 'PERMISSION_DENIED',\n  WEBHOOK_VERIFICATION_FAILED = 'WEBHOOK_VERIFICATION_FAILED',\n}\n\nexport interface PaymentError extends Error {\n  type: PaymentErrorType;\n  code?: string;\n  details?: Record<string, unknown>;\n}\n\nexport class PaymentsError extends Error implements PaymentError {\n  public type: PaymentErrorType;\n  public code?: string;\n  public details?: Record<string, unknown>;\n\n  constructor(\n    type: PaymentErrorType,\n    message: string,\n    code?: string,\n    details?: Record<string, unknown>\n  ) {\n    super(message);\n    this.name = 'PaymentsError';\n    this.type = type;\n    this.code = code;\n    this.details = details;\n    Object.setPrototypeOf(this, PaymentsError.prototype);\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 { PaymentsConfig, PricingPlan } from '../types';\n\nexport const validateEmail = (email: string): boolean => {\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(email);\n};\n\nexport const validatePhoneNumber = (phone: string): boolean => {\n  // Basic phone number validation - can be enhanced based on requirements\n  const phoneRegex = /^\\+?[\\d\\s-()]{10,}$/;\n  return phoneRegex.test(phone);\n};\n\nexport const validatePaymentsConfig = (\n  config: PaymentsConfig\n): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  if (!config.publishableKey) {\n    errors.push('publishableKey is required');\n  }\n\n  if (!config.provider) {\n    errors.push('provider is required');\n  }\n\n  if (config.provider !== 'stripe') {\n    errors.push('Only stripe provider is currently supported');\n  }\n\n  if (!config.environment) {\n    errors.push('environment is required');\n  }\n\n  if (\n    config.environment &&\n    !['development', 'production'].includes(config.environment)\n  ) {\n    errors.push('environment must be either \"development\" or \"production\"');\n  }\n\n  if (config.publishableKey && !config.publishableKey.startsWith('pk_')) {\n    errors.push('publishableKey must start with \"pk_\"');\n  }\n\n  if (config.secretKey && !config.secretKey.startsWith('sk_')) {\n    errors.push('secretKey must start with \"sk_\"');\n  }\n\n  if (config.webhookSecret && !config.webhookSecret.startsWith('whsec_')) {\n    errors.push('webhookSecret must start with \"whsec_\"');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\nexport const validatePricingPlan = (\n  plan: PricingPlan\n): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  if (!plan.id) {\n    errors.push('id is required');\n  }\n\n  if (!plan.name) {\n    errors.push('name is required');\n  }\n\n  if (typeof plan.price !== 'number' || plan.price < 0) {\n    errors.push('price must be a non-negative number');\n  }\n\n  if (!plan.currency) {\n    errors.push('currency is required');\n  }\n\n  if (!plan.interval) {\n    errors.push('interval is required');\n  }\n\n  if (!['day', 'week', 'month', 'year'].includes(plan.interval)) {\n    errors.push('interval must be one of: day, week, month, year');\n  }\n\n  if (!plan.stripePriceId) {\n    errors.push('stripePriceId is required');\n  }\n\n  if (plan.stripePriceId && !plan.stripePriceId.startsWith('price_')) {\n    errors.push('stripePriceId must start with \"price_\"');\n  }\n\n  if (!Array.isArray(plan.features)) {\n    errors.push('features must be an array');\n  }\n\n  if (\n    plan.intervalCount &&\n    (typeof plan.intervalCount !== 'number' || plan.intervalCount < 1)\n  ) {\n    errors.push('intervalCount must be a positive number');\n  }\n\n  if (\n    plan.trialPeriodDays &&\n    (typeof plan.trialPeriodDays !== 'number' || plan.trialPeriodDays < 0)\n  ) {\n    errors.push('trialPeriodDays must be a non-negative number');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\nexport const validateStripeId = (\n  id: string,\n  type: 'customer' | 'subscription' | 'price' | 'product' | 'payment_intent'\n): boolean => {\n  const prefixes = {\n    customer: 'cus_',\n    subscription: 'sub_',\n    price: 'price_',\n    product: 'prod_',\n    payment_intent: 'pi_',\n  };\n\n  return id.startsWith(prefixes[type]);\n};\n\nexport const validateAmount = (\n  amount: number,\n  currency: string\n): { isValid: boolean; error?: string } => {\n  if (typeof amount !== 'number') {\n    return { isValid: false, error: 'Amount must be a number' };\n  }\n\n  if (amount < 0) {\n    return { isValid: false, error: 'Amount must be non-negative' };\n  }\n\n  // Stripe minimum amounts by currency\n  const minimumAmounts: Record<string, number> = {\n    USD: 50, // $0.50\n    EUR: 50, // €0.50\n    GBP: 30, // £0.30\n    JPY: 50, // ¥50\n    CAD: 50, // C$0.50\n    AUD: 50, // A$0.50\n  };\n\n  const minAmount = minimumAmounts[currency.toUpperCase()] || 50;\n\n  if (amount < minAmount) {\n    return {\n      isValid: false,\n      error: `Amount must be at least ${minAmount} ${currency.toLowerCase()} cents`,\n    };\n  }\n\n  return { isValid: true };\n};\n\nexport const validateCard = (cardDetails: {\n  number: string;\n  expMonth: number;\n  expYear: number;\n  cvc: string;\n}): { isValid: boolean; errors: string[] } => {\n  const errors: string[] = [];\n\n  // Validate card number (basic Luhn algorithm)\n  const cleanNumber = cardDetails.number.replace(/\\s/g, '');\n  if (!cleanNumber || cleanNumber.length < 13 || cleanNumber.length > 19) {\n    errors.push('Card number must be between 13 and 19 digits');\n  } else if (!luhnCheck(cleanNumber)) {\n    errors.push('Invalid card number');\n  }\n\n  // Validate expiration month\n  if (\n    !cardDetails.expMonth ||\n    cardDetails.expMonth < 1 ||\n    cardDetails.expMonth > 12\n  ) {\n    errors.push('Expiration month must be between 1 and 12');\n  }\n\n  // Validate expiration year\n  const currentYear = new Date().getFullYear();\n  if (\n    !cardDetails.expYear ||\n    cardDetails.expYear < currentYear ||\n    cardDetails.expYear > currentYear + 20\n  ) {\n    errors.push('Invalid expiration year');\n  }\n\n  // Check if card is expired\n  if (cardDetails.expMonth && cardDetails.expYear) {\n    const expirationDate = new Date(\n      cardDetails.expYear,\n      cardDetails.expMonth - 1,\n      1\n    );\n    const currentDate = new Date();\n    if (expirationDate < currentDate) {\n      errors.push('Card has expired');\n    }\n  }\n\n  // Validate CVC\n  if (\n    !cardDetails.cvc ||\n    cardDetails.cvc.length < 3 ||\n    cardDetails.cvc.length > 4\n  ) {\n    errors.push('CVC must be 3 or 4 digits');\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n  };\n};\n\n// Luhn algorithm for credit card validation\nconst luhnCheck = (cardNumber: string): boolean => {\n  let sum = 0;\n  let alternate = false;\n\n  for (let i = cardNumber.length - 1; i >= 0; i--) {\n    let n = parseInt(cardNumber.charAt(i), 10);\n\n    if (alternate) {\n      n *= 2;\n      if (n > 9) {\n        n = (n % 10) + 1;\n      }\n    }\n\n    sum += n;\n    alternate = !alternate;\n  }\n\n  return sum % 10 === 0;\n};\n","import { CURRENCY_SYMBOLS, DEFAULT_CURRENCY } from '../constants';\nimport { PricingPlan, SubscriptionStatus } from '../types';\n\nexport const formatCurrency = (\n  amount: number,\n  currency: string = DEFAULT_CURRENCY,\n  options: {\n    showSymbol?: boolean;\n    showCents?: boolean;\n    locale?: string;\n  } = {}\n): string => {\n  const { showSymbol = true, showCents = true, locale = 'en-US' } = options;\n\n  const currencyCode = currency.toUpperCase();\n\n  // Convert from cents to dollars for most currencies\n  const isZeroDecimalCurrency = ['JPY', 'KRW', 'VND', 'CLP'].includes(\n    currencyCode\n  );\n  const displayAmount = isZeroDecimalCurrency ? amount : amount / 100;\n\n  if (showSymbol) {\n    try {\n      return new Intl.NumberFormat(locale, {\n        style: 'currency',\n        currency: currencyCode,\n        minimumFractionDigits: showCents && !isZeroDecimalCurrency ? 2 : 0,\n        maximumFractionDigits: showCents && !isZeroDecimalCurrency ? 2 : 0,\n      }).format(displayAmount);\n    } catch {\n      // Fallback to manual formatting if Intl.NumberFormat fails\n      const symbol =\n        CURRENCY_SYMBOLS[currencyCode as keyof typeof CURRENCY_SYMBOLS] ||\n        currencyCode;\n      const formattedAmount =\n        showCents && !isZeroDecimalCurrency\n          ? displayAmount.toFixed(2)\n          : Math.round(displayAmount).toString();\n      return `${symbol}${formattedAmount}`;\n    }\n  }\n\n  return showCents && !isZeroDecimalCurrency\n    ? displayAmount.toFixed(2)\n    : Math.round(displayAmount).toString();\n};\n\nexport const formatPricingPlan = (plan: PricingPlan): string => {\n  const price = formatCurrency(plan.price, plan.currency);\n  const interval =\n    plan.intervalCount && plan.intervalCount > 1\n      ? `${plan.intervalCount} ${plan.interval}s`\n      : plan.interval;\n\n  return `${price}/${interval}`;\n};\n\nexport const formatSubscriptionStatus = (\n  status: SubscriptionStatus\n): string => {\n  const statusMap: Record<SubscriptionStatus, string> = {\n    [SubscriptionStatus.ACTIVE]: 'Active',\n    [SubscriptionStatus.CANCELED]: 'Canceled',\n    [SubscriptionStatus.PAST_DUE]: 'Past Due',\n    [SubscriptionStatus.UNPAID]: 'Unpaid',\n    [SubscriptionStatus.INCOMPLETE]: 'Incomplete',\n    [SubscriptionStatus.INCOMPLETE_EXPIRED]: 'Incomplete (Expired)',\n    [SubscriptionStatus.TRIALING]: 'Trial',\n    [SubscriptionStatus.ENDED]: 'Ended',\n    [SubscriptionStatus.ALL]: 'All',\n  };\n\n  return statusMap[status] || status;\n};\n\nexport const formatDate = (\n  date: Date | string | number,\n  options: {\n    format?: 'short' | 'medium' | 'long' | 'full';\n    locale?: string;\n    timeZone?: string;\n  } = {}\n): string => {\n  const { format = 'medium', locale = 'en-US', timeZone } = options;\n\n  const dateObj =\n    typeof date === 'string' || typeof date === 'number'\n      ? new Date(date)\n      : date;\n\n  const formatOptions: Intl.DateTimeFormatOptions = {\n    timeZone,\n  };\n\n  switch (format) {\n    case 'short':\n      formatOptions.dateStyle = 'short';\n      break;\n    case 'medium':\n      formatOptions.dateStyle = 'medium';\n      break;\n    case 'long':\n      formatOptions.dateStyle = 'long';\n      break;\n    case 'full':\n      formatOptions.dateStyle = 'full';\n      break;\n  }\n\n  try {\n    return new Intl.DateTimeFormat(locale, formatOptions).format(dateObj);\n  } catch {\n    // Fallback to basic formatting\n    return dateObj.toLocaleDateString();\n  }\n};\n\nexport const formatRelativeTime = (\n  date: Date | string | number,\n  options: {\n    locale?: string;\n    numeric?: 'always' | 'auto';\n  } = {}\n): string => {\n  const { locale = 'en-US', numeric = 'auto' } = options;\n\n  const dateObj =\n    typeof date === 'string' || typeof date === 'number'\n      ? new Date(date)\n      : date;\n  const now = new Date();\n  const diffInSeconds = Math.floor((now.getTime() - dateObj.getTime()) / 1000);\n\n  try {\n    const rtf = new Intl.RelativeTimeFormat(locale, { numeric });\n\n    if (Math.abs(diffInSeconds) < 60) {\n      return rtf.format(-diffInSeconds, 'second');\n    } else if (Math.abs(diffInSeconds) < 3600) {\n      return rtf.format(-Math.floor(diffInSeconds / 60), 'minute');\n    } else if (Math.abs(diffInSeconds) < 86400) {\n      return rtf.format(-Math.floor(diffInSeconds / 3600), 'hour');\n    } else if (Math.abs(diffInSeconds) < 2592000) {\n      return rtf.format(-Math.floor(diffInSeconds / 86400), 'day');\n    } else if (Math.abs(diffInSeconds) < 31536000) {\n      return rtf.format(-Math.floor(diffInSeconds / 2592000), 'month');\n    } else {\n      return rtf.format(-Math.floor(diffInSeconds / 31536000), 'year');\n    }\n  } catch {\n    // Fallback to basic relative time\n    if (Math.abs(diffInSeconds) < 60) {\n      return 'just now';\n    } else if (Math.abs(diffInSeconds) < 3600) {\n      const minutes = Math.floor(Math.abs(diffInSeconds) / 60);\n      return diffInSeconds < 0\n        ? `in ${minutes} minutes`\n        : `${minutes} minutes ago`;\n    } else if (Math.abs(diffInSeconds) < 86400) {\n      const hours = Math.floor(Math.abs(diffInSeconds) / 3600);\n      return diffInSeconds < 0 ? `in ${hours} hours` : `${hours} hours ago`;\n    } else {\n      const days = Math.floor(Math.abs(diffInSeconds) / 86400);\n      return diffInSeconds < 0 ? `in ${days} days` : `${days} days ago`;\n    }\n  }\n};\n\nexport const formatBillingInterval = (\n  interval: string,\n  count: number = 1\n): string => {\n  const intervalMap: Record<string, string> = {\n    day: count === 1 ? 'daily' : `every ${count} days`,\n    week: count === 1 ? 'weekly' : `every ${count} weeks`,\n    month: count === 1 ? 'monthly' : `every ${count} months`,\n    year: count === 1 ? 'yearly' : `every ${count} years`,\n  };\n\n  return intervalMap[interval] || interval;\n};\n\nexport const formatTrialPeriod = (days: number): string => {\n  if (days === 0) return 'No trial';\n  if (days === 1) return '1 day trial';\n  if (days < 7) return `${days} days trial`;\n  if (days === 7) return '1 week trial';\n  if (days < 30) return `${Math.floor(days / 7)} weeks trial`;\n  if (days === 30) return '1 month trial';\n  return `${Math.floor(days / 30)} months trial`;\n};\n\nexport const truncateText = (text: string, maxLength: number): string => {\n  if (text.length <= maxLength) return text;\n  return `${text.substring(0, maxLength - 3)}...`;\n};\n\nexport const formatCardBrand = (brand: string): string => {\n  const brandMap: Record<string, string> = {\n    visa: 'Visa',\n    mastercard: 'Mastercard',\n    amex: 'American Express',\n    discover: 'Discover',\n    jcb: 'JCB',\n    diners: 'Diners Club',\n    unionpay: 'UnionPay',\n  };\n\n  return brandMap[brand.toLowerCase()] || brand;\n};\n\nexport const formatPaymentMethodDisplay = (paymentMethod: {\n  type: string;\n  card?: { brand: string; last4: string };\n  bankAccount?: { last4: string; bankName?: string };\n}): string => {\n  if (paymentMethod.type === 'card' && paymentMethod.card) {\n    return `${formatCardBrand(paymentMethod.card.brand)} •••• ${paymentMethod.card.last4}`;\n  }\n\n  if (paymentMethod.type === 'bank_account' && paymentMethod.bankAccount) {\n    const bankName = paymentMethod.bankAccount.bankName || 'Bank';\n    return `${bankName} •••• ${paymentMethod.bankAccount.last4}`;\n  }\n\n  return paymentMethod.type;\n};\n\nexport const calculateTax = (\n  amount: number,\n  taxRate: number,\n  options: {\n    inclusive?: boolean;\n    roundTo?: number;\n  } = {}\n): { subtotal: number; tax: number; total: number } => {\n  const { inclusive = false, roundTo = 2 } = options;\n\n  let subtotal: number;\n  let tax: number;\n  let total: number;\n\n  if (inclusive) {\n    // Tax is included in the amount\n    total = amount;\n    subtotal = amount / (1 + taxRate / 100);\n    tax = amount - subtotal;\n  } else {\n    // Tax is added to the amount\n    subtotal = amount;\n    tax = amount * (taxRate / 100);\n    total = amount + tax;\n  }\n\n  // Round to specified decimal places\n  const multiplier = Math.pow(10, roundTo);\n  return {\n    subtotal: Math.round(subtotal * multiplier) / multiplier,\n    tax: Math.round(tax * multiplier) / multiplier,\n    total: Math.round(total * multiplier) / multiplier,\n  };\n};\n\nexport const formatTaxRate = (rate: number): string => {\n  return `${rate.toFixed(2)}%`;\n};\n\nexport const formatAmountWithTax = (\n  amount: number,\n  taxRate: number,\n  currency: string = DEFAULT_CURRENCY,\n  options: {\n    inclusive?: boolean;\n    showBreakdown?: boolean;\n    locale?: string;\n  } = {}\n): string => {\n  const {\n    inclusive = false,\n    showBreakdown = false,\n    locale = 'en-US',\n  } = options;\n  const taxCalculation = calculateTax(amount, taxRate, { inclusive });\n\n  if (showBreakdown) {\n    const subtotalFormatted = formatCurrency(\n      taxCalculation.subtotal,\n      currency,\n      { locale }\n    );\n    const taxFormatted = formatCurrency(taxCalculation.tax, currency, {\n      locale,\n    });\n    const totalFormatted = formatCurrency(taxCalculation.total, currency, {\n      locale,\n    });\n\n    return `${subtotalFormatted} + ${taxFormatted} tax = ${totalFormatted}`;\n  }\n\n  return formatCurrency(taxCalculation.total, currency, { locale });\n};\n","/**\n * Environment validation utilities for SaaS Factory Payments\n */\n\nexport interface EnvironmentConfig {\n  stripePublishableKey: string;\n  stripeSecretKey?: string;\n  stripeWebhookSecret?: string;\n  environment: 'development' | 'production';\n  appUrl?: string;\n}\n\nexport const validateEnvironment = (\n  config: Partial<EnvironmentConfig>\n): {\n  isValid: boolean;\n  errors: string[];\n  warnings: string[];\n} => {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  // Required fields\n  if (!config.stripePublishableKey) {\n    errors.push('STRIPE_PUBLISHABLE_KEY is required');\n  } else if (!config.stripePublishableKey.startsWith('pk_')) {\n    errors.push('STRIPE_PUBLISHABLE_KEY must start with \"pk_\"');\n  }\n\n  if (!config.environment) {\n    errors.push('Environment must be specified (development or production)');\n  } else if (!['development', 'production'].includes(config.environment)) {\n    errors.push('Environment must be either \"development\" or \"production\"');\n  }\n\n  // Environment-specific validation\n  if (config.environment === 'production') {\n    if (config.stripePublishableKey?.includes('test')) {\n      warnings.push('Using test keys in production environment');\n    }\n\n    if (!config.appUrl) {\n      warnings.push('APP_URL should be set in production for proper redirects');\n    } else if (!config.appUrl.startsWith('https://')) {\n      warnings.push('APP_URL should use HTTPS in production');\n    }\n  }\n\n  // Server-side validation\n  if (typeof window === 'undefined') {\n    if (!config.stripeSecretKey) {\n      warnings.push(\n        'STRIPE_SECRET_KEY is recommended for server-side operations'\n      );\n    } else if (!config.stripeSecretKey.startsWith('sk_')) {\n      errors.push('STRIPE_SECRET_KEY must start with \"sk_\"');\n    }\n\n    if (!config.stripeWebhookSecret) {\n      warnings.push(\n        'STRIPE_WEBHOOK_SECRET is recommended for webhook verification'\n      );\n    } else if (!config.stripeWebhookSecret.startsWith('whsec_')) {\n      errors.push('STRIPE_WEBHOOK_SECRET must start with \"whsec_\"');\n    }\n  }\n\n  return {\n    isValid: errors.length === 0,\n    errors,\n    warnings,\n  };\n};\n\nexport const getEnvironmentConfig = (): EnvironmentConfig => {\n  const isServer = typeof window === 'undefined';\n\n  // Client-side configuration\n  const config: EnvironmentConfig = {\n    stripePublishableKey:\n      process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY ||\n      process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY ||\n      '',\n    environment:\n      (process.env.NODE_ENV as 'development' | 'production') || 'development',\n    appUrl: process.env.NEXT_PUBLIC_APP_URL,\n  };\n\n  // Server-side configuration\n  if (isServer) {\n    config.stripeSecretKey = process.env.STRIPE_SECRET_KEY;\n    config.stripeWebhookSecret = process.env.STRIPE_WEBHOOK_SECRET;\n  }\n\n  return config;\n};\n\nexport const validateCurrentEnvironment = () => {\n  const config = getEnvironmentConfig();\n  const validation = validateEnvironment(config);\n\n  if (!validation.isValid) {\n    console.error('❌ Environment validation failed:');\n    validation.errors.forEach(error => console.error(`  - ${error}`));\n\n    if (typeof window === 'undefined') {\n      // Server-side: throw error\n      throw new Error(\n        `Environment validation failed: ${validation.errors.join(', ')}`\n      );\n    }\n  }\n\n  if (validation.warnings.length > 0) {\n    console.warn('⚠️ Environment warnings:');\n    validation.warnings.forEach(warning => console.warn(`  - ${warning}`));\n  }\n\n  return validation;\n};\n\n// Helper to check if we're in development mode\nexport const isDevelopment = () => {\n  return process.env.NODE_ENV === 'development';\n};\n\n// Helper to check if we're in production mode\nexport const isProduction = () => {\n  return process.env.NODE_ENV === 'production';\n};\n\n// Helper to check if we're on the server\nexport const isServer = () => {\n  return typeof window === 'undefined';\n};\n\n// Helper to check if we're on the client\nexport const isClient = () => {\n  return typeof window !== 'undefined';\n};\n","import { PaymentProvider } from '../../shared/types/provider';\nimport { PaymentsConfig } from '../../shared/types/config';\nimport { PaymentsError, PaymentErrorType } from '../../shared/types/errors';\nimport { CheckoutParams, CheckoutSession } from '../../shared/types/checkout';\nimport { Customer, CustomerCreateParams } from '../../shared/types/customer';\nimport {\n  Subscription,\n  SubscriptionCreateParams,\n  SubscriptionUpdateParams,\n  SubscriptionStatus,\n} from '../../shared/types/subscription';\n\nexport abstract class BasePaymentProvider implements PaymentProvider {\n  public abstract name: string;\n  protected config: PaymentsConfig;\n\n  constructor(config: PaymentsConfig) {\n    this.config = config;\n  }\n\n  public abstract initialize(): Promise<void>;\n  public abstract createCheckoutSession(\n    params: CheckoutParams\n  ): Promise<CheckoutSession>;\n  public abstract retrieveCheckoutSession(\n    sessionId: string\n  ): Promise<CheckoutSession>;\n  public abstract createCustomer(\n    params: CustomerCreateParams\n  ): Promise<Customer>;\n  public abstract retrieveCustomer(\n    customerId: string\n  ): Promise<Customer | null>;\n  public abstract createSubscription(\n    params: SubscriptionCreateParams\n  ): Promise<Subscription>;\n  public abstract cancelSubscription(subscriptionId: string): Promise<void>;\n  public abstract reactivateSubscription(subscriptionId: string): Promise<void>;\n  public abstract listSubscriptions(\n    customerId: string,\n    status?: SubscriptionStatus\n  ): Promise<Subscription[]>;\n  public abstract retrieveSubscription(\n    subscriptionId: string\n  ): Promise<Subscription | null>;\n  public abstract updateSubscription(\n    subscriptionId: string,\n    params: SubscriptionUpdateParams\n  ): Promise<Subscription>;\n\n  protected handleError(\n    error: unknown,\n    type: PaymentErrorType = PaymentErrorType.UNKNOWN_ERROR\n  ): PaymentsError {\n    if (error instanceof PaymentsError) {\n      return error;\n    }\n\n    let message = 'An unknown error occurred';\n    let code: string | undefined;\n    let details: Record<string, unknown> | undefined;\n\n    if (typeof error === 'object' && error !== null) {\n      if (\n        'message' in error &&\n        typeof (error as { message: unknown }).message === 'string'\n      ) {\n        message = (error as { message: string }).message;\n      }\n      if (\n        'code' in error &&\n        typeof (error as { code: unknown }).code === 'string'\n      ) {\n        code = (error as { code: string }).code;\n      }\n      details = { ...(error as Record<string, unknown>) };\n    }\n\n    return new PaymentsError(type, message, code, details);\n  }\n}\n","import { BasePaymentProvider } from '../base';\nimport { PaymentsConfig } from '../../shared/types/config';\nimport { CheckoutParams, CheckoutSession } from '../../shared/types/checkout';\nimport { Customer, CustomerCreateParams } from '../../shared/types/customer';\nimport {\n  Subscription,\n  SubscriptionCreateParams,\n  SubscriptionUpdateParams,\n  SubscriptionStatus,\n} from '../../shared/types/subscription';\nimport { PaymentsError, PaymentErrorType } from '../../shared/types/errors';\nimport Stripe from 'stripe';\n\nexport class StripePaymentProvider extends BasePaymentProvider {\n  public name = 'stripe';\n  private stripeClient: Stripe;\n\n  constructor(config: PaymentsConfig) {\n    super(config);\n    if (!config.stripeConfig?.publishableKey) {\n      throw new PaymentsError(\n        PaymentErrorType.CONFIGURATION_ERROR,\n        'Stripe publishable key is missing in config.'\n      );\n    }\n    if (!process.env.STRIPE_SECRET_KEY) {\n      throw new PaymentsError(\n        PaymentErrorType.CONFIGURATION_ERROR,\n        'STRIPE_SECRET_KEY environment variable is not set.'\n      );\n    }\n    this.stripeClient = new Stripe(process.env.STRIPE_SECRET_KEY, {\n      apiVersion: '2025-02-24.acacia',\n    });\n  }\n\n  public async initialize(): Promise<void> {\n    // No specific client-side initialization needed for server-side Stripe operations\n\n    console.log('StripePaymentProvider initialized (server-side)');\n  }\n\n  public async createCheckoutSession(\n    params: CheckoutParams\n  ): Promise<CheckoutSession> {\n    try {\n      const session = await this.stripeClient.checkout.sessions.create({\n        payment_method_types: ['card'],\n        line_items: [\n          {\n            price: params.priceId,\n            quantity: 1,\n          },\n        ],\n        mode: params.mode || 'payment',\n        success_url:\n          params.successUrl ||\n          `${process.env.NEXT_PUBLIC_BASE_URL}/success?session_id={CHECKOUT_SESSION_ID}`,\n        cancel_url:\n          params.cancelUrl || `${process.env.NEXT_PUBLIC_BASE_URL}/cancel`,\n        customer_email: params.customerEmail,\n        allow_promotion_codes: params.allowPromotionCodes,\n        metadata: params.metadata,\n      });\n\n      if (!session.url) {\n        throw new PaymentsError(\n          PaymentErrorType.UNKNOWN_ERROR,\n          'Stripe checkout session URL is missing.'\n        );\n      }\n\n      return {\n        id: session.id,\n        url: session.url,\n        status: session.status as CheckoutSession['status'],\n        amountTotal: session.amount_total || undefined,\n        currency: session.currency || undefined,\n        customerEmail: session.customer_details?.email || undefined,\n        subscriptionId: session.subscription?.toString() || undefined,\n      };\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async createCustomer(params: CustomerCreateParams): Promise<Customer> {\n    try {\n      const customer = await this.stripeClient.customers.create({\n        email: params.email,\n        name: params.name,\n        metadata: params.metadata,\n      });\n      return {\n        id: customer.id,\n        email: customer.email || params.email,\n        name: customer.name || params.name,\n        phone: null, // Stripe API does not directly return phone for customer creation\n        stripeCustomerId: customer.id,\n        subscriptions: [], // Subscriptions are fetched separately\n        paymentMethods: [], // Payment methods are fetched separately\n        defaultPaymentMethodId: null, // Default payment method is set separately\n        metadata: customer.metadata,\n        created: new Date(customer.created * 1000),\n        updated: new Date(customer.created * 1000), // Stripe customer object doesn't have an 'updated' timestamp directly\n      };\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async retrieveCustomer(customerId: string): Promise<Customer | null> {\n    try {\n      const customer = await this.stripeClient.customers.retrieve(customerId);\n      if (customer.deleted) {\n        return null;\n      }\n      return {\n        id: customer.id,\n        email: customer.email || '',\n        name: customer.name || undefined,\n        phone: customer.phone || undefined,\n        stripeCustomerId: customer.id,\n        subscriptions: [], // Subscriptions are fetched separately\n        paymentMethods: [], // Payment methods are fetched separately\n        defaultPaymentMethodId:\n          customer.invoice_settings?.default_payment_method?.toString() ||\n          undefined,\n        metadata: customer.metadata,\n        created: new Date(customer.created * 1000),\n        updated: new Date(customer.created * 1000), // Stripe customer object doesn't have an 'updated' timestamp directly\n      };\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async createSubscription(\n    params: SubscriptionCreateParams\n  ): Promise<Subscription> {\n    try {\n      const subscription = await this.stripeClient.subscriptions.create({\n        customer: params.customerId,\n        items: (\n          params.items ||\n          (params.priceId ? [{ priceId: params.priceId, quantity: 1 }] : [])\n        ).map((item: { priceId: string; quantity?: number }) => ({\n          price: item.priceId,\n          quantity: item.quantity || 1,\n        })),\n        trial_period_days: params.trialPeriodDays,\n        metadata: params.metadata,\n        expand: ['latest_invoice.payment_intent'],\n      });\n\n      return this.mapStripeSubscriptionToSubscription(subscription);\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async cancelSubscription(subscriptionId: string): Promise<void> {\n    try {\n      await this.stripeClient.subscriptions.cancel(subscriptionId);\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async reactivateSubscription(subscriptionId: string): Promise<void> {\n    try {\n      const subscription =\n        await this.stripeClient.subscriptions.retrieve(subscriptionId);\n      if (\n        subscription.status === SubscriptionStatus.CANCELED &&\n        subscription.cancel_at_period_end\n      ) {\n        await this.stripeClient.subscriptions.update(subscriptionId, {\n          cancel_at_period_end: false,\n        });\n      } else {\n        throw new PaymentsError(\n          PaymentErrorType.VALIDATION_ERROR,\n          'Subscription cannot be reactivated.'\n        );\n      }\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async retrieveCheckoutSession(\n    sessionId: string\n  ): Promise<CheckoutSession> {\n    try {\n      const session =\n        await this.stripeClient.checkout.sessions.retrieve(sessionId);\n      if (!session.url) {\n        throw new PaymentsError(\n          PaymentErrorType.UNKNOWN_ERROR,\n          'Stripe checkout session URL is missing.'\n        );\n      }\n      return {\n        id: session.id,\n        url: session.url,\n        status: session.status as CheckoutSession['status'],\n        amountTotal: session.amount_total || undefined,\n        currency: session.currency || undefined,\n        customerEmail: session.customer_details?.email || undefined,\n        subscriptionId: session.subscription?.toString() || undefined,\n      };\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async listSubscriptions(\n    customerId: string,\n    status?: SubscriptionStatus\n  ): Promise<Subscription[]> {\n    try {\n      const subscriptions = await this.stripeClient.subscriptions.list({\n        customer: customerId,\n        status: status === SubscriptionStatus.ALL ? undefined : status,\n      });\n      return subscriptions.data.map(this.mapStripeSubscriptionToSubscription);\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async retrieveSubscription(\n    subscriptionId: string\n  ): Promise<Subscription | null> {\n    try {\n      const subscription =\n        await this.stripeClient.subscriptions.retrieve(subscriptionId);\n      return this.mapStripeSubscriptionToSubscription(subscription);\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  public async updateSubscription(\n    subscriptionId: string,\n    params: Partial<SubscriptionUpdateParams>\n  ): Promise<Subscription> {\n    try {\n      const currentSubscription =\n        await this.stripeClient.subscriptions.retrieve(subscriptionId);\n      const items = params.items\n        ? params.items.map((item: { priceId: string; quantity?: number }) => ({\n            id: currentSubscription.items.data.find(\n              i => i.price?.id === item.priceId\n            )?.id,\n            price: item.priceId,\n            quantity: item.quantity || 1,\n          }))\n        : undefined;\n\n      const subscription = await this.stripeClient.subscriptions.update(\n        subscriptionId,\n        {\n          items,\n          metadata: params.metadata,\n        }\n      );\n      return this.mapStripeSubscriptionToSubscription(subscription);\n    } catch (error: unknown) {\n      throw this.handleError(error, PaymentErrorType.NETWORK_ERROR);\n    }\n  }\n\n  private mapStripeSubscriptionToSubscription(\n    stripeSubscription: Stripe.Subscription\n  ): Subscription {\n    return {\n      id: stripeSubscription.id,\n      customerId: stripeSubscription.customer.toString(),\n      status: stripeSubscription.status as SubscriptionStatus,\n      items: stripeSubscription.items.data.map(item => ({\n        id: item.id,\n        priceId: item.price?.id || '',\n        quantity: item.quantity || 1,\n      })),\n      currentPeriodStart: new Date(\n        stripeSubscription.current_period_start * 1000\n      ),\n      currentPeriodEnd: new Date(stripeSubscription.current_period_end * 1000),\n      cancelAtPeriodEnd: stripeSubscription.cancel_at_period_end,\n      trialStart: stripeSubscription.trial_start\n        ? new Date(stripeSubscription.trial_start * 1000)\n        : undefined,\n      trialEnd: stripeSubscription.trial_end\n        ? new Date(stripeSubscription.trial_end * 1000)\n        : undefined,\n      metadata: stripeSubscription.metadata,\n      created: new Date(stripeSubscription.created * 1000),\n      updated: new Date(stripeSubscription.created * 1000), // Stripe subscription object doesn't have an 'updated' timestamp directly\n    };\n  }\n}\n","import { CheckoutParams, CheckoutSession } from '../../shared/types/checkout';\nimport {\n  Customer,\n  CustomerCreateParams,\n  PaymentMethod,\n} from '../../shared/types/customer';\nimport {\n  Subscription,\n  SubscriptionCreateParams,\n  SubscriptionUpdateParams,\n  SubscriptionStatus,\n} from '../../shared/types/subscription';\nimport { PaymentProvider } from '../../shared/types/provider';\nimport { PaymentsError, PaymentErrorType } from '../../shared/types/errors';\nimport { PaymentsConfig } from '../../shared/types/config';\nimport { BasePaymentProvider } from '../base';\n\n/**\n * A mock payment provider for testing and development purposes.\n * It simulates payment operations without actual API calls.\n */\nexport class MockPaymentProvider\n  extends BasePaymentProvider\n  implements PaymentProvider\n{\n  name = 'MockPaymentProvider';\n  private customers: Customer[] = [];\n  private subscriptions: Subscription[] = [];\n  private nextCustomerId = 1;\n  private nextSubscriptionId = 1;\n\n  constructor(config: Omit<PaymentsConfig, 'provider'>) {\n    super({ ...config, provider: 'mock' });\n\n    console.log('MockPaymentProvider initialized');\n  }\n\n  async initialize(): Promise<void> {\n    console.log('MockPaymentProvider initialized');\n  }\n\n  async createCheckoutSession(\n    params: CheckoutParams\n  ): Promise<CheckoutSession> {\n    console.log('Mock: createCheckoutSession', params);\n    return {\n      id: 'mock_cs_123',\n      clientSecret: 'mock_client_secret',\n      url: 'https://mock-checkout.example.com/success', // Changed from redirectUrl to url\n      status: 'open', // Changed from 'pending' to 'open'\n    };\n  }\n\n  async retrieveCheckoutSession(id: string): Promise<CheckoutSession> {\n    console.log('Mock: retrieveCheckoutSession', id);\n    if (id === 'mock_cs_123') {\n      return {\n        id: 'mock_cs_123',\n        clientSecret: 'mock_client_secret',\n        url: 'https://mock-checkout.example.com/success', // Changed from redirectUrl to url\n        status: 'complete',\n      };\n    }\n    throw new PaymentsError(\n      PaymentErrorType.CUSTOMER_NOT_FOUND,\n      `Mock checkout session ${id} not found`\n    );\n  }\n\n  async createCustomer(params: CustomerCreateParams): Promise<Customer> {\n    console.log('Mock: createCustomer', params);\n    const newCustomer: Customer = {\n      id: `mock_cus_${this.nextCustomerId++}`,\n      email: params.email,\n      name: params.name || null,\n      phone: params.phone || null,\n      stripeCustomerId: null,\n      subscriptions: [],\n      defaultPaymentMethodId: null,\n      paymentMethods: [], // Added paymentMethods\n      metadata: params.metadata || {},\n      created: new Date(),\n      updated: new Date(),\n    };\n    this.customers.push(newCustomer);\n    return newCustomer;\n  }\n\n  async retrieveCustomer(id: string): Promise<Customer> {\n    console.log('Mock: retrieveCustomer', id);\n    const customer = this.customers.find(c => c.id === id);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${id} not found`\n      );\n    }\n    return customer;\n  }\n\n  async updateCustomer(\n    id: string,\n    params: CustomerCreateParams\n  ): Promise<Customer> {\n    console.log('Mock: updateCustomer', id, params);\n    const customer = this.customers.find(c => c.id === id);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${id} not found`\n      );\n    }\n    if (params.email) customer.email = params.email;\n    if (params.name) customer.name = params.name;\n    if (params.phone) customer.phone = params.phone;\n    if (params.metadata)\n      customer.metadata = { ...customer.metadata, ...params.metadata };\n    customer.updated = new Date();\n    return customer;\n  }\n\n  async deleteCustomer(id: string): Promise<void> {\n    console.log('Mock: deleteCustomer', id);\n    const initialLength = this.customers.length;\n    this.customers = this.customers.filter(c => c.id !== id);\n    if (this.customers.length === initialLength) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${id} not found`\n      );\n    }\n  }\n\n  async listPaymentMethods(customerId: string): Promise<PaymentMethod[]> {\n    console.log('Mock: listPaymentMethods', customerId);\n    const customer = this.customers.find(c => c.id === customerId);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${customerId} not found`\n      );\n    }\n    return customer.paymentMethods || [];\n  }\n\n  async attachPaymentMethod(\n    customerId: string,\n    paymentMethodId: string\n  ): Promise<PaymentMethod> {\n    console.log('Mock: attachPaymentMethod', customerId, paymentMethodId);\n    const customer = this.customers.find(c => c.id === customerId);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${customerId} not found`\n      );\n    }\n    const newPaymentMethod: PaymentMethod = {\n      id: paymentMethodId,\n      type: 'card',\n      card: {\n        brand: 'visa',\n        last4: '4242',\n        expMonth: 12,\n        expYear: 2025,\n        country: 'US',\n      },\n      isDefault: false,\n      created: new Date(),\n    };\n    customer.paymentMethods.push(newPaymentMethod);\n    return newPaymentMethod;\n  }\n\n  async detachPaymentMethod(\n    customerId: string,\n    paymentMethodId: string\n  ): Promise<void> {\n    console.log('Mock: detachPaymentMethod', customerId, paymentMethodId);\n    const customer = this.customers.find(c => c.id === customerId);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${customerId} not found`\n      );\n    }\n    const initialLength = customer.paymentMethods.length;\n    customer.paymentMethods = customer.paymentMethods.filter(\n      (pm: PaymentMethod) => pm.id !== paymentMethodId\n    );\n    if (customer.paymentMethods.length === initialLength) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock payment method ${paymentMethodId} not found for customer ${customerId}`\n      );\n    }\n  }\n\n  async createSubscription(\n    params: SubscriptionCreateParams\n  ): Promise<Subscription> {\n    console.log('Mock: createSubscription', params);\n    const customer = this.customers.find(c => c.id === params.customerId);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${params.customerId} not found`\n      );\n    }\n    const newSubscription: Subscription = {\n      id: `mock_sub_${this.nextSubscriptionId++}`,\n      customerId: params.customerId,\n      status: SubscriptionStatus.ACTIVE,\n      items: (\n        params.items ||\n        (params.priceId ? [{ priceId: params.priceId, quantity: 1 }] : [])\n      ).map((item: { priceId: string; quantity?: number }) => ({\n        id: `mock_sub_item_${Math.random().toString(36).substring(7)}`,\n        priceId: item.priceId,\n        quantity: item.quantity || 1,\n      })),\n      currentPeriodStart: new Date(),\n      currentPeriodEnd: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days from now\n      cancelAtPeriodEnd: false,\n      created: new Date(),\n      updated: new Date(),\n    };\n    this.subscriptions.push(newSubscription);\n    customer.subscriptions.push(newSubscription);\n    return newSubscription;\n  }\n\n  async retrieveSubscription(id: string): Promise<Subscription> {\n    console.log('Mock: retrieveSubscription', id);\n    const subscription = this.subscriptions.find(s => s.id === id);\n    if (!subscription) {\n      throw new PaymentsError(\n        PaymentErrorType.SUBSCRIPTION_NOT_FOUND,\n        `Mock subscription ${id} not found`\n      );\n    }\n    return subscription;\n  }\n\n  async updateSubscription(\n    id: string,\n    params: SubscriptionUpdateParams\n  ): Promise<Subscription> {\n    console.log('Mock: updateSubscription', id, params);\n    const subscription = this.subscriptions.find(s => s.id === id);\n    if (!subscription) {\n      throw new PaymentsError(\n        PaymentErrorType.SUBSCRIPTION_NOT_FOUND,\n        `Mock subscription ${id} not found`\n      );\n    }\n    if (params.cancelAtPeriodEnd !== undefined) {\n      subscription.cancelAtPeriodEnd = params.cancelAtPeriodEnd;\n      subscription.status = params.cancelAtPeriodEnd\n        ? SubscriptionStatus.CANCELED\n        : SubscriptionStatus.ACTIVE;\n    }\n    if (params.items) {\n      subscription.items = params.items.map(\n        (item: { priceId: string; quantity?: number }) => ({\n          id: `mock_sub_item_${Math.random().toString(36).substring(7)}`,\n          priceId: item.priceId,\n          quantity: item.quantity || 1,\n        })\n      );\n    }\n    subscription.updated = new Date();\n    return subscription;\n  }\n\n  async cancelSubscription(id: string): Promise<void> {\n    console.log('Mock: cancelSubscription', id);\n    const subscription = this.subscriptions.find(s => s.id === id);\n    if (!subscription) {\n      throw new PaymentsError(\n        PaymentErrorType.SUBSCRIPTION_NOT_FOUND,\n        `Mock subscription ${id} not found`\n      );\n    }\n    subscription.status = SubscriptionStatus.CANCELED;\n    subscription.cancelAtPeriodEnd = true;\n    subscription.updated = new Date();\n  }\n\n  async reactivateSubscription(id: string): Promise<void> {\n    console.log('Mock: reactivateSubscription', id);\n    const subscription = this.subscriptions.find(s => s.id === id);\n    if (!subscription) {\n      throw new PaymentsError(\n        PaymentErrorType.SUBSCRIPTION_NOT_FOUND,\n        `Mock subscription ${id} not found`\n      );\n    }\n    subscription.status = SubscriptionStatus.ACTIVE;\n    subscription.cancelAtPeriodEnd = false;\n    subscription.updated = new Date();\n  }\n\n  async listSubscriptions(\n    customerId: string,\n    status?: SubscriptionStatus\n  ): Promise<Subscription[]> {\n    console.log('Mock: listSubscriptions', customerId, status);\n    const customer = this.customers.find(c => c.id === customerId);\n    if (!customer) {\n      throw new PaymentsError(\n        PaymentErrorType.CUSTOMER_NOT_FOUND,\n        `Mock customer ${customerId} not found`\n      );\n    }\n    let subs = customer.subscriptions;\n    if (status && status !== SubscriptionStatus.ALL) {\n      subs = subs.filter(s => s.status === status);\n    }\n    return subs;\n  }\n}\n","import { PaymentsConfig, PaymentProviderType } from '../shared/types/config';\nimport { PaymentsError, PaymentErrorType } from '../shared/types/errors';\nimport { PaymentProvider } from '../shared/types/provider';\nimport { StripePaymentProvider } from './stripe';\n// import { PayPalPaymentProvider } from './paypal';\n// import { ApplePayPaymentProvider } from './applepay';\nimport { MockPaymentProvider } from './mock';\n\nexport class PaymentProviderFactory {\n  public static create(config: PaymentsConfig): PaymentProvider {\n    switch (config.provider) {\n      case 'stripe':\n        return new StripePaymentProvider(config);\n      case 'paypal':\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          'PayPal provider is not yet available in this build'\n        );\n      case 'applepay':\n        throw new PaymentsError(\n          PaymentErrorType.PROVIDER_NOT_CONFIGURED,\n          'Apple Pay provider is not yet available in this build'\n        );\n      case 'mock':\n        return new MockPaymentProvider(config);\n      default:\n        throw new PaymentsError(\n          PaymentErrorType.CONFIGURATION_ERROR,\n          `Unsupported payment provider: ${config.provider}`\n        );\n    }\n  }\n\n  public static autodetect(): PaymentsConfig {\n    // Check for Stripe configuration first (most common)\n    if (\n      process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY &&\n      process.env.STRIPE_SECRET_KEY\n    ) {\n      return {\n        provider: 'stripe',\n        publishableKey: process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,\n        environment:\n          process.env.NODE_ENV === 'production' ? 'production' : 'development',\n        stripeConfig: {\n          publishableKey: process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,\n        },\n      };\n    }\n\n    // Check for PayPal configuration\n    if (\n      process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID &&\n      process.env.PAYPAL_CLIENT_SECRET\n    ) {\n      return {\n        provider: 'paypal',\n        publishableKey: process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID,\n        environment:\n          process.env.NODE_ENV === 'production' ? 'production' : 'development',\n        paypalConfig: {\n          clientId: process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID,\n          clientSecret: process.env.PAYPAL_CLIENT_SECRET,\n          environment:\n            process.env.NODE_ENV === 'production' ? 'production' : 'sandbox',\n          currency: process.env.PAYPAL_CURRENCY || 'USD',\n        },\n      };\n    }\n\n    // Check for Apple Pay configuration\n    if (\n      process.env.NEXT_PUBLIC_APPLE_PAY_MERCHANT_ID &&\n      typeof window !== 'undefined' &&\n      window.ApplePaySession\n    ) {\n      return {\n        provider: 'applepay',\n        environment:\n          process.env.NODE_ENV === 'production' ? 'production' : 'development',\n        applePayConfig: {\n          merchantId: process.env.NEXT_PUBLIC_APPLE_PAY_MERCHANT_ID,\n          merchantName:\n            process.env.NEXT_PUBLIC_APPLE_PAY_MERCHANT_NAME || 'Your Store',\n          countryCode: process.env.NEXT_PUBLIC_APPLE_PAY_COUNTRY_CODE || 'US',\n          currencyCode:\n            process.env.NEXT_PUBLIC_APPLE_PAY_CURRENCY_CODE || 'USD',\n          environment:\n            process.env.NODE_ENV === 'production' ? 'production' : 'sandbox',\n        },\n      };\n    }\n\n    // For development/testing, allow mock provider if no other is detected\n    if (\n      process.env.NODE_ENV !== 'production' ||\n      process.env.VERCEL_ENV === 'preview'\n    ) {\n      console.warn(\n        'No payment provider detected, defaulting to MockPaymentProvider for development/preview environment.'\n      );\n      return {\n        provider: 'mock',\n        environment: 'development',\n      };\n    }\n\n    throw new PaymentsError(\n      PaymentErrorType.CONFIGURATION_ERROR,\n      'Could not auto-detect payment provider. Please provide explicit configuration.'\n    );\n  }\n\n  // Helper method to get all available providers based on environment\n  public static getAvailableProviders(): PaymentProviderType[] {\n    const providers: PaymentProviderType[] = [];\n\n    // Check Stripe\n    if (process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY) {\n      providers.push('stripe');\n    }\n\n    // Check PayPal\n    if (process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID) {\n      providers.push('paypal');\n    }\n\n    // Check Apple Pay (client-side only)\n    if (\n      typeof window !== 'undefined' &&\n      window.ApplePaySession?.canMakePayments()\n    ) {\n      providers.push('applepay');\n    }\n\n    // Always include mock for development\n    if (process.env.NODE_ENV !== 'production') {\n      providers.push('mock');\n    }\n\n    return providers;\n  }\n\n  // Method to create multiple providers for fallback scenarios\n  public static createMultiple(configs: PaymentsConfig[]): PaymentProvider[] {\n    return configs.map(config => this.create(config));\n  }\n}\n"],"mappings":"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","names":["SubscriptionStatus","PaymentErrorType","isServer"]}