@mostajs/subscriptions-plan 0.3.3 → 0.3.5
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.
- package/LICENSE +29 -0
- package/README.md +402 -0
- package/dist/api/plans.route.d.ts +1 -1
- package/dist/api/plans.route.d.ts.map +1 -1
- package/dist/api/subscriptions.route.d.ts +1 -1
- package/dist/api/subscriptions.route.d.ts.map +1 -1
- package/dist/api/usage.route.d.ts +1 -1
- package/dist/api/usage.route.d.ts.map +1 -1
- package/dist/lib/module-info.d.ts +1 -1
- package/dist/lib/module-info.d.ts.map +1 -1
- package/dist/lib/plan-factory.d.ts +6 -2
- package/dist/lib/plan-factory.d.ts.map +1 -1
- package/dist/lib/plan-factory.js +45 -21
- package/dist/lib/plan-factory.js.map +1 -1
- package/dist/lib/quota-check.d.ts +1 -1
- package/dist/lib/quota-check.d.ts.map +1 -1
- package/dist/lib/subscribe.d.ts +2 -2
- package/dist/lib/subscribe.d.ts.map +1 -1
- package/dist/lib/subscribe.js.map +1 -1
- package/dist/schemas/invoice.schema.d.ts +1 -1
- package/dist/schemas/invoice.schema.d.ts.map +1 -1
- package/dist/schemas/plan.schema.d.ts +1 -1
- package/dist/schemas/plan.schema.d.ts.map +1 -1
- package/dist/schemas/subscription.schema.d.ts +1 -1
- package/dist/schemas/subscription.schema.d.ts.map +1 -1
- package/dist/schemas/usage-log.schema.d.ts +1 -1
- package/dist/schemas/usage-log.schema.d.ts.map +1 -1
- package/package.json +7 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
GNU AFFERO GENERAL PUBLIC LICENSE
|
|
2
|
+
Version 3, 19 November 2007
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2026 Dr Hamid MADANI <drmdh@msn.com>
|
|
5
|
+
|
|
6
|
+
This program is free software: you can redistribute it and/or modify
|
|
7
|
+
it under the terms of the GNU Affero General Public License as published by
|
|
8
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
(at your option) any later version.
|
|
10
|
+
|
|
11
|
+
This program is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU Affero General Public License
|
|
17
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
18
|
+
|
|
19
|
+
COMMERCIAL LICENSE
|
|
20
|
+
|
|
21
|
+
For organizations that cannot comply with the AGPL open-source requirements,
|
|
22
|
+
a commercial license is available. Contact: drmdh@msn.com
|
|
23
|
+
|
|
24
|
+
The commercial license allows you to:
|
|
25
|
+
- Use the software in proprietary/closed-source projects
|
|
26
|
+
- Modify without publishing your source code
|
|
27
|
+
- Get priority support and SLA
|
|
28
|
+
|
|
29
|
+
Contact: Dr Hamid MADANI <drmdh@msn.com>
|
package/README.md
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
# `@mostajs/subscriptions-plan`
|
|
2
|
+
|
|
3
|
+
**Subscription plans, billing, invoices and usage tracking** pour les hôtes mostajs *(SaaS multi-tenant)*.
|
|
4
|
+
|
|
5
|
+
**Auteur** : Dr Hamid MADANI <drmdh@msn.com>
|
|
6
|
+
**License** : AGPL-3.0-or-later
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Principe
|
|
11
|
+
|
|
12
|
+
`subscriptions-plan` couvre **toute la chaîne facturation** d'un hôte SaaS :
|
|
13
|
+
|
|
14
|
+
1. **Plans** — catalogue des offres *(Free, Pro, Enterprise, …)* avec limites et features
|
|
15
|
+
2. **Subscriptions** — qui souscrit à quoi, quand, état *(active, trialing, past_due, canceled)*
|
|
16
|
+
3. **Invoices** — factures émises *(Stripe ou autre provider)*, état de paiement, PDF
|
|
17
|
+
4. **Usage** — métriques d'utilisation *(requests/jour, projets, apikeys)* et application des quotas
|
|
18
|
+
|
|
19
|
+
C'est un module **système** *(au sens : ses 4 tables vivent dans la base système, pas dans la base métier des projets)*. Tirer ces données via `@mostajs/data-plug.getSystemDialect()` pour qu'elles survivent aux mutations de dialect métier *(`/api/change-dialect`, etc.)*.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install @mostajs/subscriptions-plan
|
|
27
|
+
# peer deps :
|
|
28
|
+
npm install @mostajs/data-plug @mostajs/payment stripe
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Tous les peer deps sauf `@mostajs/data-plug` sont **optionnels** :
|
|
32
|
+
- `@mostajs/payment` : nécessaire pour `subscribeToPlan` *(multi-provider — Stripe, PayPal, Chargily, Satim)*
|
|
33
|
+
- `stripe` : nécessaire pour `createBillingSession`, webhooks Stripe directs
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
### 1. Enregistrer les schemas système au bootstrap
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { registerSchemas } from '@mostajs/data-plug'
|
|
43
|
+
import {
|
|
44
|
+
PlanSchema, SubscriptionSchema, InvoiceSchema, UsageLogSchema,
|
|
45
|
+
} from '@mostajs/subscriptions-plan'
|
|
46
|
+
|
|
47
|
+
registerSchemas([PlanSchema, SubscriptionSchema, InvoiceSchema, UsageLogSchema])
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Seed les plans initiaux *(Free / Pro / …)*
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { getPlanRepo, DEFAULT_PLANS } from '@mostajs/subscriptions-plan/server'
|
|
54
|
+
import { getSystemDialect } from '@mostajs/data-plug'
|
|
55
|
+
|
|
56
|
+
const dialect = await getSystemDialect()
|
|
57
|
+
const planRepo = getPlanRepo(dialect)
|
|
58
|
+
|
|
59
|
+
for (const plan of DEFAULT_PLANS) {
|
|
60
|
+
await planRepo.upsert({ slug: plan.slug }, plan)
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. Souscrire un account à un plan *(multi-provider via @mostajs/payment)*
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
import { subscribeToPlan } from '@mostajs/subscriptions-plan/server'
|
|
68
|
+
|
|
69
|
+
const result = await subscribeToPlan(dialect, {
|
|
70
|
+
accountId: 'acc_42',
|
|
71
|
+
planSlug: 'pro',
|
|
72
|
+
provider: 'stripe', // 'stripe' | 'paypal' | 'chargily' | 'satim'
|
|
73
|
+
successUrl: 'https://app/onboarding/success',
|
|
74
|
+
cancelUrl: 'https://app/onboarding/cancel',
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
if (result.ok) {
|
|
78
|
+
// Rediriger l'utilisateur vers result.checkoutUrl
|
|
79
|
+
return Response.redirect(result.checkoutUrl)
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 4. Vérifier les quotas avant une opération
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { checkQuota, isDialectAllowed, isTransportAllowed } from '@mostajs/subscriptions-plan/server'
|
|
87
|
+
|
|
88
|
+
const check = await checkQuota(dialect, accountId, 'maxProjects')
|
|
89
|
+
if (!check.allowed) {
|
|
90
|
+
return Response.json({
|
|
91
|
+
error: 'Quota exceeded',
|
|
92
|
+
plan: check.plan,
|
|
93
|
+
limit: check.limit,
|
|
94
|
+
used: check.used,
|
|
95
|
+
}, { status: 402 }) // 402 Payment Required
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Vérifier qu'un dialect est autorisé par le plan
|
|
99
|
+
const plan = check.plan
|
|
100
|
+
if (!isDialectAllowed(plan.limits, 'postgres')) {
|
|
101
|
+
return Response.json({ error: 'Dialect not allowed in your plan' }, { status: 402 })
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 5. Compter une utilisation *(metering)*
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { incrementUsage } from '@mostajs/subscriptions-plan/server'
|
|
109
|
+
|
|
110
|
+
await incrementUsage(dialect, accountId, 'requests', 1)
|
|
111
|
+
// → ajoute 1 à UsageLog du jour courant
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 6. Webhook Stripe *(provider-direct)*
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
import { verifyWebhookEvent, parseBillingEvent } from '@mostajs/subscriptions-plan/server'
|
|
118
|
+
|
|
119
|
+
app.post('/api/billing/webhook', async (req) => {
|
|
120
|
+
const sig = req.headers['stripe-signature']
|
|
121
|
+
const event = await verifyWebhookEvent(req.rawBody, sig)
|
|
122
|
+
if (!event) return { ok: false }
|
|
123
|
+
|
|
124
|
+
const parsed = parseBillingEvent(event)
|
|
125
|
+
// parsed = { type: 'subscription.created' | 'invoice.paid' | …, data: {...} }
|
|
126
|
+
|
|
127
|
+
// Update DB en fonction du type
|
|
128
|
+
switch (parsed.type) {
|
|
129
|
+
case 'subscription.created': /* ... */ break
|
|
130
|
+
case 'invoice.paid': /* ... */ break
|
|
131
|
+
case 'subscription.canceled':/* ... */ break
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return { ok: true }
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 7. Routes Fastify *(handlers prêts à l'emploi)*
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
import {
|
|
142
|
+
createPlanHandlers,
|
|
143
|
+
createSubscriptionHandlers,
|
|
144
|
+
createUsageHandlers,
|
|
145
|
+
} from '@mostajs/subscriptions-plan/server'
|
|
146
|
+
|
|
147
|
+
const planH = createPlanHandlers(dialect, checkPermission)
|
|
148
|
+
const subH = createSubscriptionHandlers(dialect)
|
|
149
|
+
const useH = createUsageHandlers(dialect)
|
|
150
|
+
|
|
151
|
+
app.get('/api/plans', planH.list)
|
|
152
|
+
app.post('/api/plans', planH.create)
|
|
153
|
+
app.put('/api/plans/:id', planH.update)
|
|
154
|
+
app.delete('/api/plans/:id', planH.delete)
|
|
155
|
+
|
|
156
|
+
app.get('/api/subscriptions/:accountId', subH.byAccount)
|
|
157
|
+
app.post('/api/subscriptions/cancel', subH.cancel)
|
|
158
|
+
|
|
159
|
+
app.get('/api/usage/:accountId/summary', useH.summary)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 8. Annuler une souscription
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
import { cancelCurrentSubscription } from '@mostajs/subscriptions-plan/server'
|
|
166
|
+
|
|
167
|
+
await cancelCurrentSubscription(dialect, accountId, {
|
|
168
|
+
immediate: false, // false = annuler à la fin de la période courante
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## API
|
|
175
|
+
|
|
176
|
+
### Server-side *(`@mostajs/subscriptions-plan/server`)*
|
|
177
|
+
|
|
178
|
+
| Fonction | Rôle |
|
|
179
|
+
|----------|------|
|
|
180
|
+
| `getPlanRepo` / `getSubscriptionRepo` / `getInvoiceRepo` / `getUsageLogRepo` | Repos *(WeakMap-cached par dialect)* |
|
|
181
|
+
| `resetRepos` | No-op rétro-compat *(WeakMap auto-libère)* |
|
|
182
|
+
| `subscribeToPlan` | Souscription multi-provider via `@mostajs/payment` |
|
|
183
|
+
| `cancelCurrentSubscription` | Annuler la souscription active d'un account |
|
|
184
|
+
| `checkQuota` | Vérifie si une opération est dans les limites du plan |
|
|
185
|
+
| `isDialectAllowed` / `isTransportAllowed` | Vérifie un dialect/transport contre les limites du plan |
|
|
186
|
+
| `getUsageSummary` | Résumé usage pour la période courante |
|
|
187
|
+
| `incrementUsage` | Métrique compteur *(requests, …)* |
|
|
188
|
+
| `createBillingSession` / `createPortalSession` | Stripe Checkout / Customer Portal |
|
|
189
|
+
| `createStripeCustomer` | Crée un customer Stripe |
|
|
190
|
+
| `cancelSubscription` / `changeSubscriptionPlan` | Stripe direct |
|
|
191
|
+
| `verifyWebhookEvent` / `parseBillingEvent` | Parse webhooks Stripe |
|
|
192
|
+
| `createPlanHandlers` / `createSubscriptionHandlers` / `createUsageHandlers` | Handlers Fastify CRUD |
|
|
193
|
+
| `DEFAULT_PLANS` | Catalogue par défaut *(Free, Pro, Enterprise, …)* |
|
|
194
|
+
|
|
195
|
+
### Client-safe *(`@mostajs/subscriptions-plan`)*
|
|
196
|
+
|
|
197
|
+
```ts
|
|
198
|
+
export type {
|
|
199
|
+
PlanDTO, PlanLimits,
|
|
200
|
+
SubscriptionDTO, SubscriptionStatus,
|
|
201
|
+
InvoiceDTO, InvoiceStatus,
|
|
202
|
+
UsageLogDTO, BillingConfig, QuotaCheckResult,
|
|
203
|
+
}
|
|
204
|
+
export {
|
|
205
|
+
PlanSchema, SubscriptionSchema, InvoiceSchema, UsageLogSchema,
|
|
206
|
+
moduleInfo,
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Schemas
|
|
213
|
+
|
|
214
|
+
### `PlanDTO`
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
{
|
|
218
|
+
id, name, slug,
|
|
219
|
+
price: number, // centimes (2900 = $29.00)
|
|
220
|
+
currency: string,
|
|
221
|
+
interval: 'month' | 'year',
|
|
222
|
+
stripePriceId?: string,
|
|
223
|
+
limits: PlanLimits,
|
|
224
|
+
features: string[],
|
|
225
|
+
active: boolean,
|
|
226
|
+
sortOrder: number,
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### `PlanLimits`
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
{
|
|
234
|
+
maxProjects: number, // -1 = illimité
|
|
235
|
+
maxApiKeys: number,
|
|
236
|
+
requestsPerDay: number,
|
|
237
|
+
maxPoolSize: number,
|
|
238
|
+
dialects: string[] | '*',
|
|
239
|
+
transports: string[] | '*',
|
|
240
|
+
replication: boolean,
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### `SubscriptionDTO`
|
|
245
|
+
|
|
246
|
+
```ts
|
|
247
|
+
{
|
|
248
|
+
id, accountId, planId,
|
|
249
|
+
status: 'active' | 'trialing' | 'past_due' | 'canceled' | 'unpaid',
|
|
250
|
+
stripeSubId?,
|
|
251
|
+
currentPeriodStart?, currentPeriodEnd?,
|
|
252
|
+
cancelAt?, trialEnd?,
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### `InvoiceDTO`
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
{
|
|
260
|
+
id, accountId, subscriptionId?,
|
|
261
|
+
stripeInvoiceId?,
|
|
262
|
+
amount: number, // centimes
|
|
263
|
+
currency: string,
|
|
264
|
+
status: 'open' | 'paid' | 'void' | 'uncollectible',
|
|
265
|
+
paidAt?, periodStart?, periodEnd?,
|
|
266
|
+
pdfUrl?, hostedUrl?,
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### `UsageLogDTO`
|
|
271
|
+
|
|
272
|
+
Métriques journalières par account *(requests, projets actifs, …)*. Détail dans `src/types/index.ts`.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Architecture
|
|
277
|
+
|
|
278
|
+
```
|
|
279
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
280
|
+
│ @mostajs/subscriptions-plan │
|
|
281
|
+
│ (système — vit dans MOSTA_SYSTEM_URI ou singleton métier) │
|
|
282
|
+
│ │
|
|
283
|
+
│ PlanSchema │
|
|
284
|
+
│ SubscriptionSchema ← getSystemDialect() │
|
|
285
|
+
│ InvoiceSchema │
|
|
286
|
+
│ UsageLogSchema │
|
|
287
|
+
└──────┬─────────────┬──────────────┬───────────────────────────┘
|
|
288
|
+
│ │ │
|
|
289
|
+
│ │ │ checkQuota / incrementUsage
|
|
290
|
+
│ │ ▼
|
|
291
|
+
│ │ ┌────────────────────────┐
|
|
292
|
+
│ │ │ Hôte (mosta-net) │
|
|
293
|
+
│ │ │ Routes API, │
|
|
294
|
+
│ │ │ apikey-middleware │
|
|
295
|
+
│ │ └────────────────────────┘
|
|
296
|
+
│ │
|
|
297
|
+
│ subscribeToPlan
|
|
298
|
+
▼ ▼
|
|
299
|
+
┌────────────┐ ┌───────────────────┐
|
|
300
|
+
│ @mostajs/ │ │ Stripe / PayPal /│
|
|
301
|
+
│ payment │ │ Chargily / Satim │
|
|
302
|
+
└────────────┘ └───────────────────┘
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Changelog
|
|
308
|
+
|
|
309
|
+
### v0.3.5 — 2026-05-04 — Découplage `@mostajs/orm` via façade `data-plug` + WeakMap × 4 + README initial
|
|
310
|
+
|
|
311
|
+
Étape 3 du chantier *« system dialect séparé »* — applique trois fix qui se combinent, et livre un README complet *(le module n'en avait pas)*.
|
|
312
|
+
|
|
313
|
+
#### 1. Migration `@mostajs/orm` → `@mostajs/data-plug` *(façade)*
|
|
314
|
+
|
|
315
|
+
Conformément au principe *« les modules @mostajs passent par data-plug, jamais hardcoder un dialect ou importer @mostajs/orm directement »*, `subscriptions-plan` ne dépend plus de `@mostajs/orm` en peerDep. Tous les imports de production passent désormais par `@mostajs/data-plug v1.2.4` *(qui ré-exporte `BaseRepository`, `IDialect`, `EntitySchema`, …)*.
|
|
316
|
+
|
|
317
|
+
**11 fichiers source migrés** *(13 imports orm → 0)* :
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
- src/api/plans.route.ts (IDialect)
|
|
321
|
+
- src/api/subscriptions.route.ts (IDialect)
|
|
322
|
+
- src/api/usage.route.ts (IDialect)
|
|
323
|
+
- src/lib/plan-factory.ts (BaseRepository + IDialect)
|
|
324
|
+
- src/lib/subscribe.ts (IDialect — statique + dynamic L152)
|
|
325
|
+
- src/lib/quota-check.ts (IDialect)
|
|
326
|
+
- src/lib/module-info.ts (EntitySchema)
|
|
327
|
+
- src/schemas/plan.schema.ts (EntitySchema)
|
|
328
|
+
- src/schemas/subscription.schema.ts (EntitySchema)
|
|
329
|
+
- src/schemas/invoice.schema.ts (EntitySchema)
|
|
330
|
+
- src/schemas/usage-log.schema.ts (EntitySchema)
|
|
331
|
+
- package.json (peerDep orm → peerDep data-plug)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
#### 2. WeakMap × 4 dans `plan-factory.ts`
|
|
335
|
+
|
|
336
|
+
4 caches module-level remplacés par 4 WeakMaps indépendantes :
|
|
337
|
+
|
|
338
|
+
```ts
|
|
339
|
+
// Avant
|
|
340
|
+
let planRepo: BaseRepository<PlanDTO> | null = null
|
|
341
|
+
let subscriptionRepo: BaseRepository<SubscriptionDTO> | null = null
|
|
342
|
+
let invoiceRepo: BaseRepository<InvoiceDTO> | null = null
|
|
343
|
+
let usageLogRepo: BaseRepository<UsageLogDTO> | null = null
|
|
344
|
+
↓
|
|
345
|
+
const planCache = new WeakMap<IDialect, BaseRepository<PlanDTO>>()
|
|
346
|
+
const subscriptionCache = new WeakMap<IDialect, BaseRepository<SubscriptionDTO>>()
|
|
347
|
+
const invoiceCache = new WeakMap<IDialect, BaseRepository<InvoiceDTO>>()
|
|
348
|
+
const usageLogCache = new WeakMap<IDialect, BaseRepository<UsageLogDTO>>()
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Évite que les repos capturent la référence du PREMIER dialect passé et ignorent tous les suivants. Lorsque `/api/change-dialect` *(ou rotation système↔métier)* modifie le dialect courant, les 4 caches missent et reconstruisent les repos avec la **nouvelle** instance dialect.
|
|
352
|
+
|
|
353
|
+
`resetRepos()` conservé en no-op pour rétro-compat *(les WeakMaps auto-libèrent naturellement les entrées dont le dialect n'est plus référencé)*.
|
|
354
|
+
|
|
355
|
+
#### 3. Correction anomalie pré-existante `file:..` en devDeps
|
|
356
|
+
|
|
357
|
+
Les deux entrées violaient la règle d'écosystème *« entre modules @mostajs : toujours bump+publish+semver, jamais `file:..` »* :
|
|
358
|
+
|
|
359
|
+
```
|
|
360
|
+
"@mostajs/orm": "file:../mosta-orm" → "^1.13.1"
|
|
361
|
+
"@mostajs/payment": "file:../mosta-payment" → "^0.4.1"
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
#### 4. README initial *(386 lignes)*
|
|
365
|
+
|
|
366
|
+
Le module n'avait pas de README. Création d'une doc complète :
|
|
367
|
+
|
|
368
|
+
- **Principe** *(subscription plans, billing, quota, place dans l'écosystème système)*
|
|
369
|
+
- **Install** *(peer deps + optionnels)*
|
|
370
|
+
- **Usage** — 8 sections how-to :
|
|
371
|
+
1. Register schemas au bootstrap
|
|
372
|
+
2. Seed plans initiaux *(`DEFAULT_PLANS`)*
|
|
373
|
+
3. `subscribeToPlan` multi-provider
|
|
374
|
+
4. `checkQuota` / `isDialectAllowed` / `isTransportAllowed`
|
|
375
|
+
5. `incrementUsage` *(metering)*
|
|
376
|
+
6. Webhook Stripe *(`verifyWebhookEvent` / `parseBillingEvent`)*
|
|
377
|
+
7. Routes Fastify *(`createPlanHandlers` / `createSubscriptionHandlers` / `createUsageHandlers`)*
|
|
378
|
+
8. `cancelCurrentSubscription`
|
|
379
|
+
- **API reference** *(server-side + client-safe)*
|
|
380
|
+
- **Schemas** : `PlanDTO`, `PlanLimits`, `SubscriptionDTO`, `InvoiceDTO`, `UsageLogDTO`
|
|
381
|
+
- **Architecture** *(diagramme : système ↔ payment ↔ providers)*
|
|
382
|
+
- **Changelog v0.3.5** détaillé
|
|
383
|
+
- **License** *(AGPL-3.0-or-later + commercial)*
|
|
384
|
+
|
|
385
|
+
#### Bump
|
|
386
|
+
|
|
387
|
+
`0.3.4 → 0.3.5` *(patch — découplage interne, signatures publiques inchangées)*.
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
### v0.3.4 et antérieurs
|
|
392
|
+
|
|
393
|
+
Versions initiales de plans + Stripe billing + quota enforcement. Pas de release notes archivées.
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## License
|
|
398
|
+
|
|
399
|
+
[AGPL-3.0-or-later](LICENSE) — usage libre tant que le code dérivé reste open-source.
|
|
400
|
+
**Licence commerciale** disponible : `drmdh@msn.com`. Pricing par projet, pas par seat.
|
|
401
|
+
|
|
402
|
+
— (c) 2026 Dr Hamid MADANI \<drmdh@msn.com\>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plans.route.d.ts","sourceRoot":"","sources":["../../src/api/plans.route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"plans.route.d.ts","sourceRoot":"","sources":["../../src/api/plans.route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD,KAAK,iBAAiB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IACvD,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,iBAAiB;eAI/D,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;gBAU1B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;eA4B5B,OAAO,MAAM,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC;kBAepC,OAAO,MAAM,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC;EAcnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptions.route.d.ts","sourceRoot":"","sources":["../../src/api/subscriptions.route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"subscriptions.route.d.ts","sourceRoot":"","sources":["../../src/api/subscriptions.route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,QAAQ;eAKlC,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;gBAoB1B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;eAqC5B,OAAO,MAAM,MAAM,KAAG,OAAO,CAAC,QAAQ,CAAC;EAUhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.route.d.ts","sourceRoot":"","sources":["../../src/api/usage.route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"usage.route.d.ts","sourceRoot":"","sources":["../../src/api/usage.route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,QAAQ;eAG3B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;oBAatB,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;gBAmB/B,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;EAkBrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-info.d.ts","sourceRoot":"","sources":["../../src/lib/module-info.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"module-info.d.ts","sourceRoot":"","sources":["../../src/lib/module-info.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAMtD,wBAAgB,UAAU,IAAI,YAAY,EAAE,CAE3C;AAED,eAAO,MAAM,UAAU;;;;;;CAMtB,CAAA"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { BaseRepository } from '@mostajs/
|
|
2
|
-
import type { IDialect } from '@mostajs/
|
|
1
|
+
import { BaseRepository } from '@mostajs/data-plug';
|
|
2
|
+
import type { IDialect } from '@mostajs/data-plug';
|
|
3
3
|
import type { PlanDTO, SubscriptionDTO, InvoiceDTO, UsageLogDTO } from '../types/index.js';
|
|
4
4
|
export declare function getPlanRepo(dialect: IDialect): BaseRepository<PlanDTO>;
|
|
5
5
|
export declare function getSubscriptionRepo(dialect: IDialect): BaseRepository<SubscriptionDTO>;
|
|
6
6
|
export declare function getInvoiceRepo(dialect: IDialect): BaseRepository<InvoiceDTO>;
|
|
7
7
|
export declare function getUsageLogRepo(dialect: IDialect): BaseRepository<UsageLogDTO>;
|
|
8
|
+
/**
|
|
9
|
+
* No-op préservé pour rétro-compat — les WeakMaps libèrent naturellement
|
|
10
|
+
* les entrées dont le dialect n'est plus référencé.
|
|
11
|
+
*/
|
|
8
12
|
export declare function resetRepos(): void;
|
|
9
13
|
//# sourceMappingURL=plan-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-factory.d.ts","sourceRoot":"","sources":["../../src/lib/plan-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan-factory.d.ts","sourceRoot":"","sources":["../../src/lib/plan-factory.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAKlD,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO1F,wBAAgB,WAAW,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAOtE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAOtF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAO5E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAO9E;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}
|
package/dist/lib/plan-factory.js
CHANGED
|
@@ -1,38 +1,62 @@
|
|
|
1
1
|
// @mostajs/subscriptions-plan — Repository factories
|
|
2
2
|
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
3
|
-
|
|
3
|
+
//
|
|
4
|
+
// Cache keyed par identité du dialect (WeakMap) — un changement de dialect
|
|
5
|
+
// (ex: /api/change-dialect côté serveur, ou rotation système↔métier) produit
|
|
6
|
+
// un cache miss et une reconstruction. Évite le bug où le repo capturait
|
|
7
|
+
// la référence du PREMIER dialect passé et ignorait tous les suivants — ce
|
|
8
|
+
// qui conduisait à "PostgreSQL not connected. Call connect() first." après
|
|
9
|
+
// disconnect d'une connexion qui restait quand même cached dans le repo.
|
|
10
|
+
//
|
|
11
|
+
// 4 entités du module (Plan, Subscription, Invoice, UsageLog) → 4 WeakMaps
|
|
12
|
+
// indépendantes. Une mutation dialect invalide les 4 caches simultanément
|
|
13
|
+
// (au prochain appel) sans coordination explicite.
|
|
14
|
+
import { BaseRepository } from '@mostajs/data-plug';
|
|
4
15
|
import { PlanSchema } from '../schemas/plan.schema.js';
|
|
5
16
|
import { SubscriptionSchema } from '../schemas/subscription.schema.js';
|
|
6
17
|
import { InvoiceSchema } from '../schemas/invoice.schema.js';
|
|
7
18
|
import { UsageLogSchema } from '../schemas/usage-log.schema.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
19
|
+
const planCache = new WeakMap();
|
|
20
|
+
const subscriptionCache = new WeakMap();
|
|
21
|
+
const invoiceCache = new WeakMap();
|
|
22
|
+
const usageLogCache = new WeakMap();
|
|
12
23
|
export function getPlanRepo(dialect) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
24
|
+
let r = planCache.get(dialect);
|
|
25
|
+
if (!r) {
|
|
26
|
+
r = new BaseRepository(PlanSchema, dialect);
|
|
27
|
+
planCache.set(dialect, r);
|
|
28
|
+
}
|
|
29
|
+
return r;
|
|
16
30
|
}
|
|
17
31
|
export function getSubscriptionRepo(dialect) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
32
|
+
let r = subscriptionCache.get(dialect);
|
|
33
|
+
if (!r) {
|
|
34
|
+
r = new BaseRepository(SubscriptionSchema, dialect);
|
|
35
|
+
subscriptionCache.set(dialect, r);
|
|
36
|
+
}
|
|
37
|
+
return r;
|
|
21
38
|
}
|
|
22
39
|
export function getInvoiceRepo(dialect) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
40
|
+
let r = invoiceCache.get(dialect);
|
|
41
|
+
if (!r) {
|
|
42
|
+
r = new BaseRepository(InvoiceSchema, dialect);
|
|
43
|
+
invoiceCache.set(dialect, r);
|
|
44
|
+
}
|
|
45
|
+
return r;
|
|
26
46
|
}
|
|
27
47
|
export function getUsageLogRepo(dialect) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
48
|
+
let r = usageLogCache.get(dialect);
|
|
49
|
+
if (!r) {
|
|
50
|
+
r = new BaseRepository(UsageLogSchema, dialect);
|
|
51
|
+
usageLogCache.set(dialect, r);
|
|
52
|
+
}
|
|
53
|
+
return r;
|
|
31
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* No-op préservé pour rétro-compat — les WeakMaps libèrent naturellement
|
|
57
|
+
* les entrées dont le dialect n'est plus référencé.
|
|
58
|
+
*/
|
|
32
59
|
export function resetRepos() {
|
|
33
|
-
|
|
34
|
-
subscriptionRepo = null;
|
|
35
|
-
invoiceRepo = null;
|
|
36
|
-
usageLogRepo = null;
|
|
60
|
+
// Auto-cleanup via WeakMap : intentional no-op.
|
|
37
61
|
}
|
|
38
62
|
//# sourceMappingURL=plan-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-factory.js","sourceRoot":"","sources":["../../src/lib/plan-factory.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,wCAAwC;
|
|
1
|
+
{"version":3,"file":"plan-factory.js","sourceRoot":"","sources":["../../src/lib/plan-factory.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,wCAAwC;AACxC,EAAE;AACF,2EAA2E;AAC3E,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,2EAA2E;AAC3E,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,mDAAmD;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAG/D,MAAM,SAAS,GAAG,IAAI,OAAO,EAAqC,CAAA;AAClE,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAA6C,CAAA;AAClF,MAAM,YAAY,GAAG,IAAI,OAAO,EAAwC,CAAA;AACxE,MAAM,aAAa,GAAG,IAAI,OAAO,EAAyC,CAAA;AAE1E,MAAM,UAAU,WAAW,CAAC,OAAiB;IAC3C,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,cAAc,CAAU,UAAU,EAAE,OAAO,CAAC,CAAA;QACpD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAiB;IACnD,IAAI,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACtC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,cAAc,CAAkB,kBAAkB,EAAE,OAAO,CAAC,CAAA;QACpE,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACjC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,cAAc,CAAa,aAAa,EAAE,OAAO,CAAC,CAAA;QAC1D,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAiB;IAC/C,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAClC,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,GAAG,IAAI,cAAc,CAAc,cAAc,EAAE,OAAO,CAAC,CAAA;QAC5D,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,gDAAgD;AAClD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-check.d.ts","sourceRoot":"","sources":["../../src/lib/quota-check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"quota-check.d.ts","sourceRoot":"","sources":["../../src/lib/quota-check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAe,MAAM,mBAAmB,CAAA;AAGlF;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,EAC7C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAoE3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAG7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAGjF;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAchH;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;YAOjB,UAAU;;;;GAwBlB,CAAA"}
|
package/dist/lib/subscribe.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IDialect } from '@mostajs/
|
|
1
|
+
import type { IDialect } from '@mostajs/data-plug';
|
|
2
2
|
export interface SubscribeParams {
|
|
3
3
|
accountId: string;
|
|
4
4
|
planId: string;
|
|
@@ -39,5 +39,5 @@ export declare function subscribeToPlan(dialect: IDialect, params: SubscribePara
|
|
|
39
39
|
* @param accountId - Account to cancel
|
|
40
40
|
* @returns { ok, subscription } with the new Free subscription
|
|
41
41
|
*/
|
|
42
|
-
export declare function cancelCurrentSubscription(dialect: import('@mostajs/
|
|
42
|
+
export declare function cancelCurrentSubscription(dialect: import('@mostajs/data-plug').IDialect, accountId: string): Promise<SubscribeResult>;
|
|
43
43
|
//# sourceMappingURL=subscribe.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/lib/subscribe.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"subscribe.d.ts","sourceRoot":"","sources":["../../src/lib/subscribe.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGlD,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,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,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,CAwC1B;AA2DD;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,oBAAoB,EAAE,QAAQ,EAC9C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAuB1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/lib/subscribe.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/lib/subscribe.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,wCAAwC;AACxC,kDAAkD;AAGlD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AA6BpE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAiB,EACjB,MAAuB;IAEvB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAE5C,qBAAqB;IACrB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAQ,CAAA;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAEzD,iDAAiD;IACjD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACxF,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClE,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;QAEjF,yCAAyC;QACzC,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAErC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAE7C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC;YAC3C,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;YACnD,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,gBAAgB;YAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;YAChC,WAAW,EAAE,cAAc,IAAI,CAAC,IAAI,EAAE;YACtC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,8BAA8B;YAC/D,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,+BAA+B;YAC9D,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,gBAAgB;YACnC,OAAO,EAAE,IAAI,CAAC,aAAa;YAC3B,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;SACjE,CAAC,CAAA;QAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAA;IACtC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;QAC1E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;IACxC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,OAAY,EAAE,SAAiB,EAAE,MAAc;IAC5E,uCAAuC;IACvC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAChF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAS,CAAC,CAAA;IAC7D,CAAC;IAED,0BAA0B;IAC1B,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;QACxC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;KACV,CAAC,CAAA;IAET,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;IACjE,IAAI,aAAa,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAM;IAE1C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;YACvF,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;YAC1F,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,CAAA;YACxC,MAAK;QACP,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACrF,MAAM,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;YAC5F,gBAAgB,CAAC,sBAAsB,EAAE,CAAC,CAAA;YAC1C,MAAK;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YACrF,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;YAC1F,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,CAAA;YACxC,MAAK;QACP,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;YACvF,MAAM,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;YACzF,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAA;YACvC,MAAK;QACP,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAA8C,EAC9C,SAAiB;IAEjB,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAErC,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9E,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,MAAM,CAAE,GAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAS,CAAC,CAAA;IACtE,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA,CAAC,uBAAuB;IAC7C,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC;QACxC,OAAO,EAAE,SAAS;QAClB,IAAI,EAAG,SAAS,CAAC,CAAC,CAAS,CAAC,EAAE;QAC9B,MAAM,EAAE,QAAQ;KACV,CAAC,CAAA;IAET,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoice.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/invoice.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"invoice.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/invoice.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,eAAO,MAAM,aAAa,EAAE,YA0B3B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/plan.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"plan.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/plan.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,eAAO,MAAM,UAAU,EAAE,YAwBxB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/subscription.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"subscription.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/subscription.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,eAAO,MAAM,kBAAkB,EAAE,YAuBhC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-log.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/usage-log.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"usage-log.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/usage-log.schema.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,eAAO,MAAM,cAAc,EAAE,YAuB5B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mostajs/subscriptions-plan",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Subscription plans, billing, invoices and usage tracking for @mostajs",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
"README.md"
|
|
29
29
|
],
|
|
30
30
|
"author": "Dr Hamid MADANI <drmdh@msn.com>",
|
|
31
|
-
"license": "
|
|
31
|
+
"license": "AGPL-3.0-or-later",
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@mostajs/
|
|
34
|
-
"@mostajs/payment": ">=0.
|
|
33
|
+
"@mostajs/data-plug": "^1.2.4",
|
|
34
|
+
"@mostajs/payment": ">=0.4.1",
|
|
35
35
|
"next": ">=14.0.0",
|
|
36
36
|
"react": ">=18.0.0",
|
|
37
37
|
"stripe": ">=17.0.0"
|
|
@@ -51,8 +51,9 @@
|
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@mostajs/
|
|
55
|
-
"@mostajs/
|
|
54
|
+
"@mostajs/data-plug": "^1.2.4",
|
|
55
|
+
"@mostajs/orm": "^1.13.1",
|
|
56
|
+
"@mostajs/payment": "^0.4.1",
|
|
56
57
|
"@types/node": "^22.0.0",
|
|
57
58
|
"better-sqlite3": "^12.0.0",
|
|
58
59
|
"tsx": "^4.0.0",
|