UNPKG

vue3-stripe-kit

Version:

Complete Vue 3 Stripe integration with Payment Elements, Checkout, Subscriptions. TypeScript support, composables, components, modular architecture for payments, billing, and e-commerce

1 lines 31 kB
{"version":3,"file":"useSubscriptions-CBvvKCuf.mjs","sources":["../src/composables/useSubscriptions.ts"],"sourcesContent":["import { ref } from 'vue'\nimport type { \n UseSubscriptionsReturn,\n SubscriptionConfig,\n CreateSubscriptionData,\n UpdateSubscriptionData,\n SubscriptionStatus,\n StripeError \n} from '../types/index'\nimport { getGlobalConfig, buildRequestHeaders } from '../utils/config'\n\nexport function useSubscriptions(config: Partial<SubscriptionConfig> = {}): UseSubscriptionsReturn {\n const loading = ref(false)\n const error = ref<StripeError | null>(null)\n\n // Get global configuration and merge with local config\n const globalConfig = getGlobalConfig()\n const mergedConfig = { ...globalConfig, ...config }\n\n // Default endpoints (configurable)\n const getEndpoint = (key: keyof SubscriptionConfig, defaultPath: string, subscriptionConfig?: Partial<SubscriptionConfig>) => {\n const finalConfig = { ...mergedConfig, ...subscriptionConfig }\n const endpoint = finalConfig[key]\n \n if (typeof endpoint === 'string') {\n return endpoint\n }\n \n // Build URL from base URL + path\n if (finalConfig.apiBaseUrl) {\n return `${finalConfig.apiBaseUrl}${defaultPath}`\n }\n \n // Fallback to just the path (assume full URL provided elsewhere)\n return defaultPath\n }\n\n // Generic API request handler with retry logic\n const makeRequest = async <T>(\n endpoint: string,\n options: RequestInit,\n retries = 3\n ): Promise<T> => {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), mergedConfig.requestTimeout || 30000)\n\n try {\n const response = await fetch(endpoint, {\n ...options,\n signal: controller.signal,\n headers: buildRequestHeaders(mergedConfig, options.headers as Record<string, string>)\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ message: 'Request failed' }))\n throw {\n type: 'api_error',\n code: response.status.toString(),\n message: errorData.message || `HTTP ${response.status}`,\n } as StripeError\n }\n\n return await response.json()\n } catch (err: any) {\n clearTimeout(timeoutId)\n \n if (err.name === 'AbortError') {\n throw {\n type: 'timeout_error',\n message: 'Request timeout',\n } as StripeError\n }\n\n if (retries > 0 && !err.type) {\n await new Promise(resolve => setTimeout(resolve, 1000 * (4 - retries)))\n return makeRequest(endpoint, options, retries - 1)\n }\n\n throw err\n }\n }\n\n // Subscription Management Functions\n const createSubscription = async (\n data: CreateSubscriptionData,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('createEndpoint', '/api/stripe/subscriptions', subscriptionConfig)\n \n // Apply defaults\n const finalConfig = { ...mergedConfig, ...subscriptionConfig }\n const payload = {\n ...data,\n payment_behavior: data.payment_behavior || finalConfig.defaultPaymentBehavior || 'default_incomplete',\n collection_method: data.collection_method || finalConfig.defaultCollectionMethod || 'charge_automatically',\n proration_behavior: data.proration_behavior || finalConfig.defaultProrationBehavior || 'create_prorations',\n }\n\n // Add trial defaults if not specified\n if (finalConfig.defaultTrialDays && !payload.trial_period_days) {\n payload.trial_period_days = finalConfig.defaultTrialDays\n }\n\n const result = await makeRequest<SubscriptionStatus>(endpoint, {\n method: 'POST',\n body: JSON.stringify(payload)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const updateSubscription = async (\n subscriptionId: string,\n data: UpdateSubscriptionData,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('updateEndpoint', `/api/stripe/subscriptions/${subscriptionId}`, subscriptionConfig)\n \n const finalConfig = { ...mergedConfig, ...subscriptionConfig }\n const payload = {\n ...data,\n payment_behavior: data.payment_behavior || finalConfig.defaultPaymentBehavior || 'default_incomplete',\n proration_behavior: data.proration_behavior || finalConfig.defaultProrationBehavior || 'create_prorations',\n }\n\n const result = await makeRequest<SubscriptionStatus>(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(payload)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const cancelSubscription = async (\n subscriptionId: string,\n subscriptionConfig?: { cancelAtPeriodEnd?: boolean; cancellationReason?: string } & Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('cancelEndpoint', `/api/stripe/subscriptions/${subscriptionId}/cancel`, subscriptionConfig)\n \n const finalConfig = { ...mergedConfig, ...subscriptionConfig }\n const payload = {\n cancel_at_period_end: subscriptionConfig?.cancelAtPeriodEnd ?? finalConfig.cancelAtPeriodEnd ?? false,\n cancellation_reason: subscriptionConfig?.cancellationReason || finalConfig.cancellationReason,\n metadata: {\n canceled_by: 'customer',\n canceled_at: new Date().toISOString(),\n ...(subscriptionConfig?.cancellationReason && { reason: subscriptionConfig.cancellationReason })\n }\n }\n\n const result = await makeRequest<SubscriptionStatus>(endpoint, {\n method: 'POST',\n body: JSON.stringify(payload)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const retrieveSubscription = async (\n subscriptionId: string,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('retrieveEndpoint', `/api/stripe/subscriptions/${subscriptionId}`, subscriptionConfig)\n \n const result = await makeRequest<SubscriptionStatus>(endpoint, {\n method: 'GET'\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const listSubscriptions = async (\n params?: { customer?: string; price?: string; status?: string; limit?: number },\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<{ data: SubscriptionStatus[]; has_more: boolean }> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('listEndpoint', '/api/stripe/subscriptions', subscriptionConfig)\n const queryParams = new URLSearchParams()\n \n if (params?.customer) queryParams.append('customer', params.customer)\n if (params?.price) queryParams.append('price', params.price)\n if (params?.status) queryParams.append('status', params.status)\n if (params?.limit) queryParams.append('limit', params.limit.toString())\n\n const finalEndpoint = queryParams.toString() ? `${endpoint}?${queryParams}` : endpoint\n\n const result = await makeRequest<{ data: SubscriptionStatus[]; has_more: boolean }>(finalEndpoint, {\n method: 'GET'\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n // Trial Management Functions\n const startTrial = async (\n subscriptionId: string,\n trialEnd: number | Date,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n const trialEndTimestamp = trialEnd instanceof Date ? Math.floor(trialEnd.getTime() / 1000) : trialEnd\n \n return updateSubscription(subscriptionId, {\n trial_end: trialEndTimestamp,\n proration_behavior: 'none' // Don't charge during trial start\n }, subscriptionConfig)\n }\n\n const endTrial = async (\n subscriptionId: string,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n return updateSubscription(subscriptionId, {\n trial_end: 'now'\n }, subscriptionConfig)\n }\n\n const extendTrial = async (\n subscriptionId: string,\n additionalDays: number,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n const finalConfig = { ...mergedConfig, ...subscriptionConfig }\n \n if (!finalConfig.allowTrialExtension) {\n throw {\n type: 'invalid_request_error',\n message: 'Trial extension is not allowed in current configuration'\n } as StripeError\n }\n\n // Get current subscription to calculate new trial end\n const currentSubscription = await retrieveSubscription(subscriptionId, subscriptionConfig)\n \n if (!currentSubscription.trial_end) {\n throw {\n type: 'invalid_request_error',\n message: 'Subscription is not currently in trial'\n } as StripeError\n }\n\n const newTrialEnd = currentSubscription.trial_end + (additionalDays * 24 * 60 * 60)\n \n return updateSubscription(subscriptionId, {\n trial_end: newTrialEnd,\n proration_behavior: 'none'\n }, subscriptionConfig)\n }\n\n // Plan Change Functions\n const changePlan = async (\n subscriptionId: string,\n newPriceId: string,\n subscriptionConfig?: { prorationBehavior?: 'create_prorations' | 'none' | 'always_invoice' } & Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n // Get current subscription to update items\n const currentSubscription = await retrieveSubscription(subscriptionId, subscriptionConfig)\n \n const updatedItems = currentSubscription.items.data.map(item => ({\n id: item.id,\n price: newPriceId,\n quantity: item.quantity\n }))\n\n return updateSubscription(subscriptionId, {\n items: updatedItems,\n proration_behavior: subscriptionConfig?.prorationBehavior || 'create_prorations'\n }, subscriptionConfig)\n }\n\n const addItem = async (\n subscriptionId: string,\n priceId: string,\n quantity = 1,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n // Get current subscription items\n const currentSubscription = await retrieveSubscription(subscriptionId, subscriptionConfig)\n \n const existingItems = currentSubscription.items.data.map(item => ({\n id: item.id,\n quantity: item.quantity\n }))\n\n const newItems = [\n ...existingItems,\n { price: priceId, quantity }\n ]\n\n return updateSubscription(subscriptionId, {\n items: newItems\n }, subscriptionConfig)\n }\n\n const removeItem = async (\n subscriptionId: string,\n itemId: string,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n return updateSubscription(subscriptionId, {\n items: [{ id: itemId, deleted: true }]\n }, subscriptionConfig)\n }\n\n const updateQuantity = async (\n subscriptionId: string,\n itemId: string,\n quantity: number,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n return updateSubscription(subscriptionId, {\n items: [{ id: itemId, quantity }]\n }, subscriptionConfig)\n }\n\n // Renewal Management\n const resumeSubscription = async (\n subscriptionId: string,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n return updateSubscription(subscriptionId, {\n cancel_at_period_end: false,\n cancel_at: undefined\n }, subscriptionConfig)\n }\n\n const pauseSubscription = async (\n subscriptionId: string,\n pauseBehavior?: { behavior: 'mark_uncollectible' | 'keep_as_draft' | 'void' },\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<SubscriptionStatus> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('pauseEndpoint', `/api/stripe/subscriptions/${subscriptionId}/pause`, subscriptionConfig)\n \n const payload = {\n behavior: pauseBehavior?.behavior || 'mark_uncollectible'\n }\n\n const result = await makeRequest<SubscriptionStatus>(endpoint, {\n method: 'POST',\n body: JSON.stringify(payload)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n // Invoice Management\n const getUpcomingInvoice = async (\n customerId: string,\n subscriptionId?: string,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<any> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('retrieveUpcomingInvoiceEndpoint', '/api/stripe/invoices/upcoming', subscriptionConfig)\n const queryParams = new URLSearchParams({ customer: customerId })\n if (subscriptionId) queryParams.append('subscription', subscriptionId)\n\n const result = await makeRequest<any>(`${endpoint}?${queryParams}`, {\n method: 'GET'\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const payInvoice = async (\n invoiceId: string,\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<any> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('payInvoiceEndpoint', `/api/stripe/invoices/${invoiceId}/pay`, subscriptionConfig)\n \n const result = await makeRequest<any>(endpoint, {\n method: 'POST'\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n // Customer Management\n const createCustomer = async (\n data: { email?: string; name?: string; payment_method?: string; metadata?: Record<string, string> },\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<any> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('createCustomerEndpoint', '/api/stripe/customers', subscriptionConfig)\n \n const result = await makeRequest<any>(endpoint, {\n method: 'POST',\n body: JSON.stringify(data)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n const updateCustomer = async (\n customerId: string,\n data: { email?: string; name?: string; metadata?: Record<string, string> },\n subscriptionConfig?: Partial<SubscriptionConfig>\n ): Promise<any> => {\n loading.value = true\n error.value = null\n\n try {\n const endpoint = getEndpoint('updateCustomerEndpoint', `/api/stripe/customers/${customerId}`, subscriptionConfig)\n \n const result = await makeRequest<any>(endpoint, {\n method: 'PATCH',\n body: JSON.stringify(data)\n })\n\n return result\n } catch (err: any) {\n error.value = err\n throw err\n } finally {\n loading.value = false\n }\n }\n\n // Utility Functions\n const isTrialing = (subscription: SubscriptionStatus): boolean => {\n return subscription.status === 'trialing'\n }\n\n const isActive = (subscription: SubscriptionStatus): boolean => {\n return ['active', 'trialing'].includes(subscription.status)\n }\n\n const isCanceled = (subscription: SubscriptionStatus): boolean => {\n return subscription.status === 'canceled'\n }\n\n const isPastDue = (subscription: SubscriptionStatus): boolean => {\n return subscription.status === 'past_due'\n }\n\n const daysUntilRenewal = (subscription: SubscriptionStatus): number => {\n const now = Math.floor(Date.now() / 1000)\n const periodEnd = subscription.current_period_end\n const diffInSeconds = periodEnd - now\n return Math.max(0, Math.ceil(diffInSeconds / (24 * 60 * 60)))\n }\n\n const daysRemainingInTrial = (subscription: SubscriptionStatus): number => {\n if (!subscription.trial_end || subscription.status !== 'trialing') {\n return 0\n }\n \n const now = Math.floor(Date.now() / 1000)\n const diffInSeconds = subscription.trial_end - now\n return Math.max(0, Math.ceil(diffInSeconds / (24 * 60 * 60)))\n }\n\n return {\n // State\n loading,\n error,\n\n // Subscription management\n createSubscription,\n updateSubscription,\n cancelSubscription,\n retrieveSubscription,\n listSubscriptions,\n\n // Trial management\n startTrial,\n endTrial,\n extendTrial,\n\n // Plan changes\n changePlan,\n addItem,\n removeItem,\n updateQuantity,\n\n // Renewal management\n resumeSubscription,\n pauseSubscription,\n\n // Invoice management\n getUpcomingInvoice,\n payInvoice,\n\n // Customer management\n createCustomer,\n updateCustomer,\n\n // Utility functions\n isTrialing,\n isActive,\n isCanceled,\n isPastDue,\n daysUntilRenewal,\n daysRemainingInTrial\n }\n}"],"names":[],"mappings":"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"}