@paykit-sdk/stripe
Version:
Stripe provider for PayKit
135 lines (131 loc) • 5.72 kB
JavaScript
// src/stripe-provider.ts
import {
toPaykitEvent
} from "@paykit-sdk/core/src/resources";
import Stripe from "stripe";
// lib/mapper.ts
import { toPaykitSubscriptionStatus } from "@paykit-sdk/core/src/resources";
var toPaykitCheckout = (checkout) => {
return {
id: checkout.id,
customer_id: checkout.customer,
mode: checkout.mode,
success_url: checkout.success_url,
cancel_url: checkout.cancel_url,
products: checkout.line_items.data.map((item) => ({ id: item.price.id, quantity: item.quantity })),
url: checkout.url,
...checkout.metadata && { metadata: checkout.metadata }
};
};
var toPaykitCustomer = (customer) => {
return { id: customer.id, email: customer.email ?? void 0, name: customer.name ?? void 0 };
};
var toPaykitSubscription = (subscription) => {
return {
id: subscription.id,
customer_id: subscription.customer,
status: toPaykitSubscriptionStatus(subscription.status),
current_period_start: new Date(subscription.start_date),
current_period_end: new Date(subscription.cancel_at)
};
};
// src/stripe-provider.ts
var StripeProvider = class {
constructor(config) {
/**
* Checkout management
*/
this.createCheckout = async (params) => {
const { customer_id, price_id, quantity, ...rest } = params;
const checkout = await this.stripe.checkout.sessions.create({ customer: customer_id, line_items: [{ price: price_id, quantity }], ...rest });
return toPaykitCheckout(checkout);
};
this.retrieveCheckout = async (id) => {
const checkout = await this.stripe.checkout.sessions.retrieve(id);
return toPaykitCheckout(checkout);
};
/**
* Customer management
*/
this.createCustomer = async (params) => {
const customer = await this.stripe.customers.create(params);
return toPaykitCustomer(customer);
};
this.updateCustomer = async (id, params) => {
const customer = await this.stripe.customers.update(id, params);
return toPaykitCustomer(customer);
};
this.deleteCustomer = async (id) => {
await this.stripe.customers.del(id);
};
this.retrieveCustomer = async (id) => {
const customer = await this.stripe.customers.retrieve(id);
if ("deleted" in customer) return null;
return toPaykitCustomer(customer);
};
/**
* Subscription management
*/
this.cancelSubscription = async (id) => {
const subscription = await this.stripe.subscriptions.cancel(id);
return toPaykitSubscription(subscription);
};
this.updateSubscription = async (id, params) => {
const subscription = await this.stripe.subscriptions.update(id, { metadata: params.metadata });
return toPaykitSubscription(subscription);
};
this.retrieveSubscription = async (id) => {
const subscription = await this.stripe.subscriptions.retrieve(id);
return toPaykitSubscription(subscription);
};
/**
* Webhook management
*/
this.handleWebhook = async (payload, signature, secret) => {
const event = this.stripe.webhooks.constructEvent(payload, signature, secret);
if (event.type === "checkout.session.completed") {
const checkout = await this.retrieveCheckout(event.data.object.id);
return toPaykitEvent({ type: "checkout.created", created: event.created, id: event.id, data: checkout });
} else if (event.type === "customer.created") {
const customer = await this.retrieveCustomer(event.data.object.id);
return toPaykitEvent({ type: "customer.created", created: event.created, id: event.id, data: customer });
} else if (event.type === "customer.updated") {
const customer = await this.retrieveCustomer(event.data.object.id);
return toPaykitEvent({ type: "customer.updated", created: event.created, id: event.id, data: customer });
} else if (event.type === "customer.deleted") {
return toPaykitEvent({ type: "customer.deleted", created: event.created, id: event.id, data: null });
} else if (event.type === "customer.subscription.created") {
const subscription = await this.retrieveSubscription(event.data.object.id);
return toPaykitEvent({ type: "subscription.created", created: event.created, id: event.id, data: subscription });
} else if (event.type === "customer.subscription.updated") {
const subscription = await this.retrieveSubscription(event.data.object.id);
return toPaykitEvent({ type: "subscription.updated", created: event.created, id: event.id, data: subscription });
} else if (event.type === "customer.subscription.deleted") {
const subscription = await this.retrieveSubscription(event.data.object.id);
return toPaykitEvent({ type: "subscription.canceled", created: event.created, id: event.id, data: subscription });
} else if (event.type === "customer.subscription.paused") {
const subscription = await this.retrieveSubscription(event.data.object.id);
return toPaykitEvent({ type: "subscription.updated", created: event.created, id: event.id, data: subscription });
}
throw new Error(`Unknown event type: ${event.type}`);
};
const { apiKey, ...rest } = config;
this.stripe = new Stripe(apiKey, rest);
}
};
// src/index.ts
var createStripe = (config) => {
return new StripeProvider(config);
};
var stripe = () => {
const apiKey = process.env.STRIPE_API_KEY;
const isDev = process.env.NODE_ENV === "development";
if (!apiKey) {
throw new Error("STRIPE_API_KEY is not set");
}
return createStripe({ apiKey, apiVersion: "2025-05-28.basil", environment: isDev ? "test" : "live" });
};
export {
createStripe,
stripe
};