@mostajs/payment 0.4.2 → 0.5.1

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.
@@ -0,0 +1,62 @@
1
+ import type { PaymentProvider, WebhookEvent } from '../core/provider.interface.js';
2
+ export type ProviderName = 'chargily' | 'stripe' | 'satim' | 'paypal' | 'manual';
3
+ /**
4
+ * Sélectionne le header signature attendu pour chaque provider.
5
+ * Headers normalisés en lowercase (Headers.get est case-insensitive).
6
+ */
7
+ export declare function pickSignatureHeader(headers: Headers | Record<string, string>, providerName: ProviderName): string;
8
+ /**
9
+ * Instancie un PaymentProvider à partir de son nom (lit env via le constructor).
10
+ * Utile pour le webhook handler qui n'a pas besoin de connaître la config.
11
+ */
12
+ export declare function getProviderByName(name: ProviderName): PaymentProvider;
13
+ export interface HandleProviderWebhookArgs {
14
+ /** Body brut de la requête (req.text() avant parse). Crucial : signature
15
+ * computed sur les bytes exacts envoyés par le provider. */
16
+ body: string;
17
+ /** Headers de la requête HTTP. */
18
+ headers: Headers | Record<string, string>;
19
+ /** Nom du provider. */
20
+ providerName: ProviderName;
21
+ }
22
+ export type HandleProviderWebhookResult = {
23
+ ok: true;
24
+ event: WebhookEvent;
25
+ } | {
26
+ ok: false;
27
+ reason: 'bad_signature' | 'malformed' | 'unknown_provider';
28
+ error: string;
29
+ };
30
+ /**
31
+ * Vérifie le webhook reçu d'un provider de paiement et retourne l'event
32
+ * normalisé. La logique métier (créer une Subscription, marquer une
33
+ * Registration, etc.) reste à la charge du caller.
34
+ *
35
+ * @example
36
+ * const r = await handleProviderWebhook({
37
+ * body: await req.text(),
38
+ * headers: req.headers,
39
+ * providerName: 'chargily',
40
+ * })
41
+ * if (!r.ok) return NextResponse.json({ error: r.error }, { status: 400 })
42
+ * if (isPaidEvent(r.event)) {
43
+ * // ... mettre à jour DB métier ...
44
+ * }
45
+ */
46
+ export declare function handleProviderWebhook(args: HandleProviderWebhookArgs): Promise<HandleProviderWebhookResult>;
47
+ /**
48
+ * Vrai si l'event indique un paiement réussi, peu importe le provider.
49
+ * Couvre les variantes de naming entre Chargily / Stripe / Satim / PayPal.
50
+ */
51
+ export declare function isPaidEvent(event: WebhookEvent): boolean;
52
+ /** Vrai si l'event indique un échec ou une annulation de paiement. */
53
+ export declare function isFailedEvent(event: WebhookEvent): boolean;
54
+ /** Vrai si l'event indique un remboursement. */
55
+ export declare function isRefundedEvent(event: WebhookEvent): boolean;
56
+ /**
57
+ * Extrait l'`orderId` (= clef de matching côté app, ex: registrationId)
58
+ * depuis le payload event, peu importe le provider. Cherche dans plusieurs
59
+ * positions usuelles.
60
+ */
61
+ export declare function extractOrderId(event: WebhookEvent): string | null;
62
+ //# sourceMappingURL=webhook-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-helpers.d.ts","sourceRoot":"","sources":["../../src/lib/webhook-helpers.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAElF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEhF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAsBjH;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,CAQrE;AAED,MAAM,WAAW,yBAAyB;IACxC;iEAC6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzC,uBAAuB;IACvB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5F;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAgBjH;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAOxD;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAS1D;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAK5D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CASjE"}
@@ -0,0 +1,135 @@
1
+ // @mostajs/payment — Webhook helpers (provider-agnostic) — v0.5.0+
2
+ // Author: Dr Hamid MADANI <drmdh@msn.com>
3
+ //
4
+ // Mutualise le code de vérification signature + normalisation event
5
+ // type entre les apps consumers (octonet-cloud, iquesta, etc.).
6
+ // Chaque app garde sa logique métier (Subscription / Registration / …)
7
+ // dans son route handler, mais la vérif HMAC et le mapping
8
+ // event-type sont centralisés ici.
9
+ import { createChargilyProvider } from '../providers/chargily.provider.js';
10
+ import { createStripeProvider } from '../providers/stripe.provider.js';
11
+ import { createSatimProvider } from '../providers/satim.provider.js';
12
+ import { createPayPalProvider } from '../providers/paypal.provider.js';
13
+ import { createManualProvider } from '../providers/manual.provider.js';
14
+ /**
15
+ * Sélectionne le header signature attendu pour chaque provider.
16
+ * Headers normalisés en lowercase (Headers.get est case-insensitive).
17
+ */
18
+ export function pickSignatureHeader(headers, providerName) {
19
+ const get = (key) => {
20
+ if (headers instanceof Headers)
21
+ return headers.get(key) ?? '';
22
+ return headers[key] ?? headers[key.toLowerCase()] ?? '';
23
+ };
24
+ switch (providerName) {
25
+ case 'chargily':
26
+ // Chargily envoie `signature` (header officiel docs) ;
27
+ // certains proxies passent `chargily-signature` (legacy).
28
+ return get('chargily-signature') || get('signature') || '';
29
+ case 'stripe':
30
+ return get('stripe-signature') || '';
31
+ case 'satim':
32
+ return get('x-satim-signature') || get('signature') || '';
33
+ case 'paypal':
34
+ // PayPal utilise plusieurs headers ; le caller doit traiter à part.
35
+ return get('paypal-transmission-sig') || '';
36
+ case 'manual':
37
+ return get('x-signature') || '';
38
+ default:
39
+ return '';
40
+ }
41
+ }
42
+ /**
43
+ * Instancie un PaymentProvider à partir de son nom (lit env via le constructor).
44
+ * Utile pour le webhook handler qui n'a pas besoin de connaître la config.
45
+ */
46
+ export function getProviderByName(name) {
47
+ switch (name) {
48
+ case 'chargily': return createChargilyProvider();
49
+ case 'stripe': return createStripeProvider();
50
+ case 'satim': return createSatimProvider();
51
+ case 'paypal': return createPayPalProvider();
52
+ case 'manual': return createManualProvider();
53
+ }
54
+ }
55
+ /**
56
+ * Vérifie le webhook reçu d'un provider de paiement et retourne l'event
57
+ * normalisé. La logique métier (créer une Subscription, marquer une
58
+ * Registration, etc.) reste à la charge du caller.
59
+ *
60
+ * @example
61
+ * const r = await handleProviderWebhook({
62
+ * body: await req.text(),
63
+ * headers: req.headers,
64
+ * providerName: 'chargily',
65
+ * })
66
+ * if (!r.ok) return NextResponse.json({ error: r.error }, { status: 400 })
67
+ * if (isPaidEvent(r.event)) {
68
+ * // ... mettre à jour DB métier ...
69
+ * }
70
+ */
71
+ export async function handleProviderWebhook(args) {
72
+ let provider;
73
+ try {
74
+ provider = getProviderByName(args.providerName);
75
+ }
76
+ catch (e) {
77
+ return { ok: false, reason: 'unknown_provider', error: e?.message ?? String(e) };
78
+ }
79
+ const signature = pickSignatureHeader(args.headers, args.providerName);
80
+ try {
81
+ const event = await provider.verifyWebhook(args.body, signature);
82
+ return { ok: true, event };
83
+ }
84
+ catch (e) {
85
+ const msg = String(e?.message ?? e);
86
+ if (/signature/i.test(msg))
87
+ return { ok: false, reason: 'bad_signature', error: msg };
88
+ return { ok: false, reason: 'malformed', error: msg };
89
+ }
90
+ }
91
+ // ─── Event type normalization ─────────────────────────────────────────
92
+ /**
93
+ * Vrai si l'event indique un paiement réussi, peu importe le provider.
94
+ * Couvre les variantes de naming entre Chargily / Stripe / Satim / PayPal.
95
+ */
96
+ export function isPaidEvent(event) {
97
+ const t = String(event?.type ?? '');
98
+ return t === 'payment.success' // Chargily, Satim
99
+ || t === 'checkout.paid' // legacy alias
100
+ || t === 'checkout.session.completed' // Stripe Checkout
101
+ || t === 'payment_intent.succeeded' // Stripe PaymentIntent
102
+ || t === 'PAYMENT.CAPTURE.COMPLETED'; // PayPal
103
+ }
104
+ /** Vrai si l'event indique un échec ou une annulation de paiement. */
105
+ export function isFailedEvent(event) {
106
+ const t = String(event?.type ?? '');
107
+ return t === 'payment.failed'
108
+ || t === 'payment.canceled'
109
+ || t === 'checkout.failed'
110
+ || t === 'checkout.session.expired'
111
+ || t === 'payment_intent.payment_failed'
112
+ || t === 'PAYMENT.CAPTURE.DENIED'
113
+ || t === 'PAYMENT.CAPTURE.REFUNDED';
114
+ }
115
+ /** Vrai si l'event indique un remboursement. */
116
+ export function isRefundedEvent(event) {
117
+ const t = String(event?.type ?? '');
118
+ return t === 'payment.refunded'
119
+ || t === 'charge.refunded'
120
+ || t === 'PAYMENT.CAPTURE.REFUNDED';
121
+ }
122
+ /**
123
+ * Extrait l'`orderId` (= clef de matching côté app, ex: registrationId)
124
+ * depuis le payload event, peu importe le provider. Cherche dans plusieurs
125
+ * positions usuelles.
126
+ */
127
+ export function extractOrderId(event) {
128
+ const data = event?.data ?? {};
129
+ return String(data?.metadata?.orderId
130
+ ?? data?.metadata?.registrationId
131
+ ?? data?.orderId
132
+ ?? data?.client_reference_id
133
+ ?? '') || null;
134
+ }
135
+ //# sourceMappingURL=webhook-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-helpers.js","sourceRoot":"","sources":["../../src/lib/webhook-helpers.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -15,6 +15,8 @@ export type { WebhookHandlers } from './lib/stripe.js';
15
15
  export { getPaymentRepo, resetPaymentRepo } from './lib/payment-factory.js';
16
16
  export { createCheckoutHandler } from './api/checkout.route.js';
17
17
  export { createPaymentHandlers } from './api/payments.route.js';
18
+ export { handleProviderWebhook, pickSignatureHeader, getProviderByName, isPaidEvent, isFailedEvent, isRefundedEvent, extractOrderId, } from './lib/webhook-helpers.js';
19
+ export type { ProviderName, HandleProviderWebhookArgs, HandleProviderWebhookResult, } from './lib/webhook-helpers.js';
18
20
  export { getSchemas, moduleInfo } from './lib/module-info.js';
19
21
  export { paymentModuleRegistration } from './register.js';
20
22
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAC/D,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAClE,aAAa,EAAE,YAAY,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,YAAY,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAC/D,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAClE,aAAa,EAAE,YAAY,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAC3F,YAAY,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AACrF,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAGlE,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,YAAY,EACZ,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
package/dist/server.js CHANGED
@@ -14,6 +14,8 @@ export { getPaymentRepo, resetPaymentRepo } from './lib/payment-factory.js';
14
14
  // ─── API handlers ───────────────────────────────
15
15
  export { createCheckoutHandler } from './api/checkout.route.js';
16
16
  export { createPaymentHandlers } from './api/payments.route.js';
17
+ // ─── Webhook helpers (provider-agnostic) — v0.5.0+ ───
18
+ export { handleProviderWebhook, pickSignatureHeader, getProviderByName, isPaidEvent, isFailedEvent, isRefundedEvent, extractOrderId, } from './lib/webhook-helpers.js';
17
19
  // ─── Module info ────────────────────────────────
18
20
  export { getSchemas, moduleInfo } from './lib/module-info.js';
19
21
  export { paymentModuleRegistration } from './register.js';
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,wCAAwC;AASxC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAEjC,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAGlF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAG3F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,kDAAkD;AAClD,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AAGxB,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3E,mDAAmD;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,wCAAwC;AASxC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EACjD,aAAa,EAAE,sBAAsB,EAAE,cAAc,GACtD,MAAM,0BAA0B,CAAA;AAEjC,mDAAmD;AACnD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAGlF,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAG3F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAGrF,kDAAkD;AAClD,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,aAAa,EACxD,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAChE,MAAM,iBAAiB,CAAA;AAGxB,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE3E,mDAAmD;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,wDAAwD;AACxD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,0BAA0B,CAAA;AAOjC,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/payment",
3
- "version": "0.4.2",
3
+ "version": "0.5.1",
4
4
  "description": "Payment module for @mostajs — Multi-provider (Stripe, Satim/CIB, Chargily, PayPal), multi-method, multi-currency",
5
5
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
6
6
  "license": "AGPL-3.0-or-later",