@mostajs/subscriptions-plan 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@ import type Stripe from 'stripe';
2
2
  import type { BillingConfig } from '../types/index.js';
3
3
  /**
4
4
  * Create a Stripe Checkout session for subscription billing.
5
+ * Delegates to @mostajs/payment.createBillingSession
5
6
  */
6
7
  export declare function createBillingSession(stripe: Stripe, config: BillingConfig, params: {
7
8
  customerId: string;
@@ -15,11 +16,17 @@ export declare function createBillingSession(stripe: Stripe, config: BillingConf
15
16
  sessionId: string;
16
17
  }>;
17
18
  /**
18
- * Create a Stripe Customer Portal session (manage card, invoices, cancel).
19
+ * Create a Stripe Customer Portal session.
20
+ * Delegates to @mostajs/payment.createPortalSession
19
21
  */
20
22
  export declare function createPortalSession(stripe: Stripe, config: BillingConfig, customerId: string): Promise<{
21
23
  url: string;
22
24
  }>;
25
+ /**
26
+ * Verify a Stripe webhook event.
27
+ * Delegates to @mostajs/payment.handleWebhook
28
+ */
29
+ export declare function verifyWebhookEvent(stripe: Stripe, body: string | Buffer, signature: string, secret: string): Promise<Stripe.Event>;
23
30
  /**
24
31
  * Create a Stripe customer for a new account.
25
32
  */
@@ -29,7 +36,7 @@ export declare function createStripeCustomer(stripe: Stripe, params: {
29
36
  metadata?: Record<string, string>;
30
37
  }): Promise<string>;
31
38
  /**
32
- * Cancel a Stripe subscription (at period end by default).
39
+ * Cancel a Stripe subscription.
33
40
  */
34
41
  export declare function cancelSubscription(stripe: Stripe, stripeSubId: string, immediate?: boolean): Promise<void>;
35
42
  /**
@@ -37,12 +44,7 @@ export declare function cancelSubscription(stripe: Stripe, stripeSubId: string,
37
44
  */
38
45
  export declare function changeSubscriptionPlan(stripe: Stripe, stripeSubId: string, newPriceId: string): Promise<void>;
39
46
  /**
40
- * Verify and parse a Stripe webhook event.
41
- */
42
- export declare function verifyWebhookEvent(stripe: Stripe, body: string | Buffer, signature: string, secret: string): Stripe.Event;
43
- /**
44
- * Handle billing webhook events.
45
- * Returns the action taken for logging/auditing.
47
+ * Parse billing webhook events into structured actions.
46
48
  */
47
49
  export declare function parseBillingEvent(event: Stripe.Event): {
48
50
  type: 'subscription_created' | 'subscription_updated' | 'subscription_deleted' | 'invoice_paid' | 'invoice_failed' | 'checkout_completed' | 'unknown';
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-billing.d.ts","sourceRoot":"","sources":["../../src/lib/stripe-billing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC,GACA,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAepD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAO1B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACzE,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,KAAK,CAEd;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG;IACtD,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,GAAG,sBAAsB,GACxE,cAAc,GAAG,gBAAgB,GAAG,oBAAoB,GAAG,SAAS,CAAA;IAC1E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B,CA4EA"}
1
+ {"version":3,"file":"stripe-billing.d.ts","sourceRoot":"","sources":["../../src/lib/stripe-billing.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC,GACA,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAUpD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAG1B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAGvB;AAID;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACzE,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG;IACtD,IAAI,EAAE,sBAAsB,GAAG,sBAAsB,GAAG,sBAAsB,GACxE,cAAc,GAAG,gBAAgB,GAAG,oBAAoB,GAAG,SAAS,CAAA;IAC1E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B,CAyCA"}
@@ -1,33 +1,39 @@
1
1
  // @mostajs/subscriptions-plan — Stripe Billing integration
2
2
  // Author: Dr Hamid MADANI drmdh@msn.com
3
+ // v0.2.0: delegates to @mostajs/payment for core Stripe operations
4
+ // ─── Delegate to @mostajs/payment ───────────────────────────
3
5
  /**
4
6
  * Create a Stripe Checkout session for subscription billing.
7
+ * Delegates to @mostajs/payment.createBillingSession
5
8
  */
6
9
  export async function createBillingSession(stripe, config, params) {
7
- const session = await stripe.checkout.sessions.create({
8
- customer: params.customerId,
9
- mode: 'subscription',
10
- line_items: [{ price: params.priceId, quantity: 1 }],
11
- success_url: params.successUrl ?? config.successUrl,
12
- cancel_url: params.cancelUrl ?? config.cancelUrl,
13
- subscription_data: {
14
- trial_period_days: params.trialDays,
15
- metadata: params.metadata,
16
- },
10
+ const { createBillingSession: pmBilling } = await import('@mostajs/payment/server');
11
+ return pmBilling(stripe, {
12
+ customerId: params.customerId,
13
+ priceId: params.priceId,
14
+ successUrl: params.successUrl ?? config.successUrl,
15
+ cancelUrl: params.cancelUrl ?? config.cancelUrl,
16
+ trialDays: params.trialDays,
17
17
  metadata: params.metadata,
18
18
  });
19
- return { url: session.url, sessionId: session.id };
20
19
  }
21
20
  /**
22
- * Create a Stripe Customer Portal session (manage card, invoices, cancel).
21
+ * Create a Stripe Customer Portal session.
22
+ * Delegates to @mostajs/payment.createPortalSession
23
23
  */
24
24
  export async function createPortalSession(stripe, config, customerId) {
25
- const session = await stripe.billingPortal.sessions.create({
26
- customer: customerId,
27
- return_url: config.portalReturnUrl,
28
- });
29
- return { url: session.url };
25
+ const { createPortalSession: pmPortal } = await import('@mostajs/payment/server');
26
+ return pmPortal(stripe, customerId, config.portalReturnUrl);
30
27
  }
28
+ /**
29
+ * Verify a Stripe webhook event.
30
+ * Delegates to @mostajs/payment.handleWebhook
31
+ */
32
+ export async function verifyWebhookEvent(stripe, body, signature, secret) {
33
+ const { handleWebhook } = await import('@mostajs/payment/server');
34
+ return handleWebhook(stripe, body, signature, secret);
35
+ }
36
+ // ─── Subscriptions-plan specific ────────────────────────────
31
37
  /**
32
38
  * Create a Stripe customer for a new account.
33
39
  */
@@ -40,16 +46,14 @@ export async function createStripeCustomer(stripe, params) {
40
46
  return customer.id;
41
47
  }
42
48
  /**
43
- * Cancel a Stripe subscription (at period end by default).
49
+ * Cancel a Stripe subscription.
44
50
  */
45
51
  export async function cancelSubscription(stripe, stripeSubId, immediate = false) {
46
52
  if (immediate) {
47
53
  await stripe.subscriptions.cancel(stripeSubId);
48
54
  }
49
55
  else {
50
- await stripe.subscriptions.update(stripeSubId, {
51
- cancel_at_period_end: true,
52
- });
56
+ await stripe.subscriptions.update(stripeSubId, { cancel_at_period_end: true });
53
57
  }
54
58
  }
55
59
  /**
@@ -58,35 +62,18 @@ export async function cancelSubscription(stripe, stripeSubId, immediate = false)
58
62
  export async function changeSubscriptionPlan(stripe, stripeSubId, newPriceId) {
59
63
  const sub = await stripe.subscriptions.retrieve(stripeSubId);
60
64
  await stripe.subscriptions.update(stripeSubId, {
61
- items: [{
62
- id: sub.items.data[0].id,
63
- price: newPriceId,
64
- }],
65
+ items: [{ id: sub.items.data[0].id, price: newPriceId }],
65
66
  proration_behavior: 'always_invoice',
66
67
  });
67
68
  }
68
69
  /**
69
- * Verify and parse a Stripe webhook event.
70
- */
71
- export function verifyWebhookEvent(stripe, body, signature, secret) {
72
- return stripe.webhooks.constructEvent(body, signature, secret);
73
- }
74
- /**
75
- * Handle billing webhook events.
76
- * Returns the action taken for logging/auditing.
70
+ * Parse billing webhook events into structured actions.
77
71
  */
78
72
  export function parseBillingEvent(event) {
79
73
  switch (event.type) {
80
74
  case 'checkout.session.completed': {
81
- const session = event.data.object;
82
- return {
83
- type: 'checkout_completed',
84
- data: {
85
- customerId: session.customer,
86
- subscriptionId: session.subscription,
87
- metadata: session.metadata,
88
- },
89
- };
75
+ const s = event.data.object;
76
+ return { type: 'checkout_completed', data: { customerId: s.customer, subscriptionId: s.subscription, metadata: s.metadata } };
90
77
  }
91
78
  case 'customer.subscription.created':
92
79
  case 'customer.subscription.updated': {
@@ -94,9 +81,7 @@ export function parseBillingEvent(event) {
94
81
  return {
95
82
  type: event.type === 'customer.subscription.created' ? 'subscription_created' : 'subscription_updated',
96
83
  data: {
97
- stripeSubId: sub.id,
98
- customerId: sub.customer,
99
- status: sub.status,
84
+ stripeSubId: sub.id, customerId: sub.customer, status: sub.status,
100
85
  priceId: sub.items.data[0]?.price?.id,
101
86
  currentPeriodStart: new Date(sub.current_period_start * 1000).toISOString(),
102
87
  currentPeriodEnd: new Date(sub.current_period_end * 1000).toISOString(),
@@ -106,42 +91,21 @@ export function parseBillingEvent(event) {
106
91
  }
107
92
  case 'customer.subscription.deleted': {
108
93
  const sub = event.data.object;
109
- return {
110
- type: 'subscription_deleted',
111
- data: {
112
- stripeSubId: sub.id,
113
- customerId: sub.customer,
114
- },
115
- };
94
+ return { type: 'subscription_deleted', data: { stripeSubId: sub.id, customerId: sub.customer } };
116
95
  }
117
96
  case 'invoice.paid': {
118
- const invoice = event.data.object;
97
+ const inv = event.data.object;
119
98
  return {
120
99
  type: 'invoice_paid',
121
100
  data: {
122
- stripeInvoiceId: invoice.id,
123
- customerId: invoice.customer,
124
- subscriptionId: invoice.subscription,
125
- amount: invoice.amount_paid,
126
- currency: invoice.currency,
127
- pdfUrl: invoice.invoice_pdf,
128
- hostedUrl: invoice.hosted_invoice_url,
129
- periodStart: invoice.period_start ? new Date(invoice.period_start * 1000).toISOString() : null,
130
- periodEnd: invoice.period_end ? new Date(invoice.period_end * 1000).toISOString() : null,
101
+ stripeInvoiceId: inv.id, customerId: inv.customer, subscriptionId: inv.subscription,
102
+ amount: inv.amount_paid, currency: inv.currency, pdfUrl: inv.invoice_pdf,
131
103
  },
132
104
  };
133
105
  }
134
106
  case 'invoice.payment_failed': {
135
- const invoice = event.data.object;
136
- return {
137
- type: 'invoice_failed',
138
- data: {
139
- stripeInvoiceId: invoice.id,
140
- customerId: invoice.customer,
141
- subscriptionId: invoice.subscription,
142
- amount: invoice.amount_due,
143
- },
144
- };
107
+ const inv = event.data.object;
108
+ return { type: 'invoice_failed', data: { stripeInvoiceId: inv.id, customerId: inv.customer, amount: inv.amount_due } };
145
109
  }
146
110
  default:
147
111
  return { type: 'unknown', data: { eventType: event.type } };
@@ -1 +1 @@
1
- {"version":3,"file":"stripe-billing.js","sourceRoot":"","sources":["../../src/lib/stripe-billing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stripe-billing.js","sourceRoot":"","sources":["../../src/lib/stripe-billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { IDialect } from '@mostajs/orm';
2
+ export interface SubscribeParams {
3
+ accountId: string;
4
+ planId: string;
5
+ /** Payment provider: 'direct' (free/manual), 'stripe', 'chargily', 'paypal', 'satim' */
6
+ provider?: string;
7
+ /** URLs for payment redirect */
8
+ successUrl?: string;
9
+ cancelUrl?: string;
10
+ /** Customer info (for provider checkout) */
11
+ customerEmail?: string;
12
+ customerName?: string;
13
+ /** Stripe customer ID (if already exists) */
14
+ stripeCustomerId?: string;
15
+ }
16
+ export interface SubscribeResult {
17
+ ok: boolean;
18
+ /** If payment required, redirect URL */
19
+ url?: string | null;
20
+ /** If direct subscription (free plan), the subscription object */
21
+ subscription?: any;
22
+ /** Error message */
23
+ error?: string;
24
+ }
25
+ /**
26
+ * Subscribe to a plan — handles free (direct) and paid (via payment provider).
27
+ *
28
+ * - Free plan (price=0): creates subscription directly in DB
29
+ * - Paid plan: delegates to @mostajs/payment provider for checkout redirect
30
+ * - Falls back to direct subscription if no provider available
31
+ */
32
+ export declare function subscribeToPlan(dialect: IDialect, params: SubscribeParams): Promise<SubscribeResult>;
33
+ //# sourceMappingURL=subscribe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/lib/subscribe.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAG5C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAA;IACX,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,kEAAkE;IAClE,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,eAAe,CAAC,CAuC1B"}
@@ -0,0 +1,105 @@
1
+ // @mostajs/subscriptions-plan — Subscribe to plan (multi-provider)
2
+ // Author: Dr Hamid MADANI drmdh@msn.com
3
+ // Delegates payment to @mostajs/payment providers
4
+ import { getPlanRepo, getSubscriptionRepo } from './plan-factory.js';
5
+ /**
6
+ * Subscribe to a plan — handles free (direct) and paid (via payment provider).
7
+ *
8
+ * - Free plan (price=0): creates subscription directly in DB
9
+ * - Paid plan: delegates to @mostajs/payment provider for checkout redirect
10
+ * - Falls back to direct subscription if no provider available
11
+ */
12
+ export async function subscribeToPlan(dialect, params) {
13
+ const planRepo = getPlanRepo(dialect);
14
+ const subRepo = getSubscriptionRepo(dialect);
15
+ // Verify plan exists
16
+ const plan = await planRepo.findById(params.planId);
17
+ if (!plan)
18
+ return { ok: false, error: 'Plan non trouve' };
19
+ // Free plan or no provider → direct subscription
20
+ if (!plan.price || plan.price === 0 || !params.provider || params.provider === 'direct') {
21
+ return directSubscribe(subRepo, params.accountId, params.planId);
22
+ }
23
+ // Paid plan → try payment provider
24
+ try {
25
+ const { getProvider, registerProvider } = await import('@mostajs/payment/server');
26
+ // Auto-register provider if not done yet
27
+ await ensureProvider(params.provider);
28
+ const provider = getProvider(params.provider);
29
+ const result = await provider.createCheckout({
30
+ orderId: `sub_${params.accountId}_${params.planId}`,
31
+ amount: plan.price / 100, // cents → units
32
+ currency: plan.currency ?? 'usd',
33
+ description: `Abonnement ${plan.name}`,
34
+ successUrl: params.successUrl ?? '/dashboard/billing?success=1',
35
+ cancelUrl: params.cancelUrl ?? '/dashboard/billing?canceled=1',
36
+ customerId: params.stripeCustomerId,
37
+ priceId: plan.stripePriceId,
38
+ metadata: { accountId: params.accountId, planId: params.planId },
39
+ });
40
+ return { ok: true, url: result.url };
41
+ }
42
+ catch (e) {
43
+ console.warn(`[subscribe] Provider ${params.provider} failed:`, e.message);
44
+ // Fallback to direct subscription
45
+ return directSubscribe(subRepo, params.accountId, params.planId);
46
+ }
47
+ }
48
+ /**
49
+ * Direct subscription — no payment required (free plan or fallback).
50
+ */
51
+ async function directSubscribe(subRepo, accountId, planId) {
52
+ // Cancel existing active subscriptions
53
+ const existing = await subRepo.findAll({ account: accountId, status: 'active' });
54
+ for (const sub of existing) {
55
+ await subRepo.update(sub.id, { status: 'canceled' });
56
+ }
57
+ // Create new subscription
58
+ const subscription = await subRepo.create({
59
+ account: accountId,
60
+ plan: planId,
61
+ status: 'active',
62
+ });
63
+ return { ok: true, subscription };
64
+ }
65
+ /**
66
+ * Auto-register a payment provider from environment variables.
67
+ */
68
+ async function ensureProvider(name) {
69
+ const { listProviders } = await import('@mostajs/payment/server');
70
+ if (listProviders().includes(name))
71
+ return;
72
+ switch (name) {
73
+ case 'stripe': {
74
+ if (!process.env.STRIPE_SECRET_KEY)
75
+ throw new Error('STRIPE_SECRET_KEY not configured');
76
+ const { createStripeProvider, registerProvider } = await import('@mostajs/payment/server');
77
+ registerProvider(createStripeProvider());
78
+ break;
79
+ }
80
+ case 'chargily': {
81
+ if (!process.env.CHARGILY_API_KEY)
82
+ throw new Error('CHARGILY_API_KEY not configured');
83
+ const { createChargilyProvider, registerProvider } = await import('@mostajs/payment/server');
84
+ registerProvider(createChargilyProvider());
85
+ break;
86
+ }
87
+ case 'paypal': {
88
+ if (!process.env.PAYPAL_CLIENT_ID)
89
+ throw new Error('PAYPAL_CLIENT_ID not configured');
90
+ const { createPayPalProvider, registerProvider } = await import('@mostajs/payment/server');
91
+ registerProvider(createPayPalProvider());
92
+ break;
93
+ }
94
+ case 'satim': {
95
+ if (!process.env.SATIM_MERCHANT_ID)
96
+ throw new Error('SATIM_MERCHANT_ID not configured');
97
+ const { createSatimProvider, registerProvider } = await import('@mostajs/payment/server');
98
+ registerProvider(createSatimProvider());
99
+ break;
100
+ }
101
+ default:
102
+ throw new Error(`Unknown payment provider: ${name}`);
103
+ }
104
+ }
105
+ //# sourceMappingURL=subscribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/lib/subscribe.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export { getPlanRepo, getSubscriptionRepo, getInvoiceRepo, getUsageLogRepo, resetRepos, } from './lib/plan-factory.js';
2
2
  export { checkQuota, isDialectAllowed, isTransportAllowed, getUsageSummary, incrementUsage, DEFAULT_PLANS, } from './lib/quota-check.js';
3
3
  export { createBillingSession, createPortalSession, createStripeCustomer, cancelSubscription, changeSubscriptionPlan, verifyWebhookEvent, parseBillingEvent, } from './lib/stripe-billing.js';
4
+ export { subscribeToPlan } from './lib/subscribe.js';
5
+ export type { SubscribeParams, SubscribeResult } from './lib/subscribe.js';
4
6
  export { createPlanHandlers } from './api/plans.route.js';
5
7
  export { createSubscriptionHandlers } from './api/subscriptions.route.js';
6
8
  export { createUsageHandlers } from './api/usage.route.js';
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAG7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAG1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAG7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA"}
package/dist/server.js CHANGED
@@ -6,6 +6,8 @@ export { getPlanRepo, getSubscriptionRepo, getInvoiceRepo, getUsageLogRepo, rese
6
6
  export { checkQuota, isDialectAllowed, isTransportAllowed, getUsageSummary, incrementUsage, DEFAULT_PLANS, } from './lib/quota-check.js';
7
7
  // Stripe Billing
8
8
  export { createBillingSession, createPortalSession, createStripeCustomer, cancelSubscription, changeSubscriptionPlan, verifyWebhookEvent, parseBillingEvent, } from './lib/stripe-billing.js';
9
+ // Subscribe (multi-provider via @mostajs/payment)
10
+ export { subscribeToPlan } from './lib/subscribe.js';
9
11
  // API handlers
10
12
  export { createPlanHandlers } from './api/plans.route.js';
11
13
  export { createSubscriptionHandlers } from './api/subscriptions.route.js';
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wCAAwC;AAExC,eAAe;AACf,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,uBAAuB,CAAA;AAE9B,oBAAoB;AACpB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAA;AAE7B,iBAAiB;AACjB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAEhC,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAE7D,eAAe;AACf,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wCAAwC;AAExC,eAAe;AACf,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,uBAAuB,CAAA;AAE9B,oBAAoB;AACpB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,aAAa,GACd,MAAM,sBAAsB,CAAA;AAE7B,iBAAiB;AACjB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAEhC,kDAAkD;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGpD,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,wBAAwB;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAE7D,eAAe;AACf,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/subscriptions-plan",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Subscription plans, billing, invoices and usage tracking for @mostajs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -29,15 +29,30 @@
29
29
  ],
30
30
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
31
31
  "license": "MIT",
32
- "dependencies": {
33
- "stripe": "^17.0.0"
34
- },
35
32
  "peerDependencies": {
36
33
  "@mostajs/orm": "^1.8.0",
34
+ "@mostajs/payment": ">=0.2.0",
37
35
  "next": ">=14.0.0",
38
- "react": ">=18.0.0"
36
+ "react": ">=18.0.0",
37
+ "stripe": ">=17.0.0"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "@mostajs/payment": {
41
+ "optional": true
42
+ },
43
+ "stripe": {
44
+ "optional": true
45
+ },
46
+ "next": {
47
+ "optional": true
48
+ },
49
+ "react": {
50
+ "optional": true
51
+ }
39
52
  },
40
53
  "devDependencies": {
54
+ "@mostajs/orm": "file:../mosta-orm",
55
+ "@mostajs/payment": "file:../mosta-payment",
41
56
  "@types/node": "^22.0.0",
42
57
  "better-sqlite3": "^12.0.0",
43
58
  "tsx": "^4.0.0",