cinetpay-seamless 0.1.1 → 0.1.2

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/README.md CHANGED
@@ -36,7 +36,7 @@ npm install cinetpay-seamless
36
36
  ### CDN
37
37
 
38
38
  ```html
39
- <script src="https://unpkg.com/cinetpay-seamless/dist/cinetpay-seamless.umd.cjs"></script>
39
+ <script src="https://unpkg.com/cinetpay-seamless@0.1.2/dist/cinetpay-seamless.umd.cjs"></script>
40
40
  ```
41
41
 
42
42
  ## Démarrage rapide
@@ -68,7 +68,7 @@ CinetPaySeamless.open({
68
68
  ```html
69
69
  <button id="pay-btn">Payer 5 000 XOF</button>
70
70
 
71
- <script src="https://unpkg.com/cinetpay-seamless/dist/cinetpay-seamless.umd.cjs"></script>
71
+ <script src="https://unpkg.com/cinetpay-seamless@0.1.2/dist/cinetpay-seamless.umd.cjs"></script>
72
72
  <script>
73
73
  document.getElementById('pay-btn').addEventListener('click', function() {
74
74
  // Appeler votre backend pour obtenir le paymentToken
@@ -491,7 +491,7 @@ async function pay() {
491
491
  <meta charset="UTF-8">
492
492
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
493
493
  <title>Paiement</title>
494
- <script src="https://unpkg.com/cinetpay-seamless/dist/cinetpay-seamless.umd.cjs"></script>
494
+ <script src="https://unpkg.com/cinetpay-seamless@0.1.2/dist/cinetpay-seamless.umd.cjs"></script>
495
495
  </head>
496
496
  <body>
497
497
  <form id="payment-form">
@@ -1,4 +1,4 @@
1
- const u = `
1
+ const h = `
2
2
  .cp-seamless-overlay {
3
3
  position: fixed;
4
4
  inset: 0;
@@ -79,7 +79,7 @@ const u = `
79
79
  }
80
80
 
81
81
  `;
82
- const s = class s {
82
+ const i = class i {
83
83
  constructor(e) {
84
84
  this.overlay = null, this.popup = null, this.pollTimer = null, this.closeTimer = null, this.messageHandler = null, this.lastStatus = "UNKNOWN", this.previousBodyOverflow = "", this.logger = e.logger, this.emitter = e.emitter, this.onReadyCallback = e.onReady, this.onPaymentSuccessCallback = e.onPaymentSuccess, this.onPaymentFailedCallback = e.onPaymentFailed, this.onPaymentPendingCallback = e.onPaymentPending, this.onCloseCallback = e.onClose, this.onErrorCallback = e.onError;
85
85
  }
@@ -112,15 +112,15 @@ const s = class s {
112
112
  static childRecords(e) {
113
113
  const t = [];
114
114
  for (const n of ["details", "transaction", "payment", "result", "data"]) {
115
- const i = e[n];
116
- s.isRecord(i) && t.push(i);
115
+ const s = e[n];
116
+ i.isRecord(s) && t.push(s);
117
117
  }
118
118
  return t.push(e), t;
119
119
  }
120
120
  static findValue(e, t) {
121
- for (const n of s.childRecords(e))
122
- for (const i of t)
123
- if (n[i] !== void 0 && n[i] !== null) return n[i];
121
+ for (const n of i.childRecords(e))
122
+ for (const s of t)
123
+ if (n[s] !== void 0 && n[s] !== null) return n[s];
124
124
  }
125
125
  static asString(e) {
126
126
  if (e != null)
@@ -183,29 +183,29 @@ const s = class s {
183
183
  return "UNKNOWN";
184
184
  }
185
185
  static buildPaymentResponse(e) {
186
- const t = s.asString(s.findValue(e, [
186
+ const t = i.asString(i.findValue(e, [
187
187
  "status",
188
188
  "transaction_status",
189
189
  "trans_status",
190
190
  "payment_status"
191
- ])), n = s.asOptionalNumber(s.findValue(e, ["code"])), i = s.normalizeStatus(t, n);
191
+ ])), n = i.asOptionalNumber(i.findValue(e, ["code"])), s = i.normalizeStatus(t, n);
192
192
  return {
193
- amount: s.asNumber(s.findValue(e, ["amount"])),
194
- currency: s.asString(s.findValue(e, ["currency"])) ?? "",
195
- status: i,
193
+ amount: i.asNumber(i.findValue(e, ["amount"])),
194
+ currency: i.asString(i.findValue(e, ["currency"])) ?? "",
195
+ status: s,
196
196
  rawStatus: t,
197
197
  apiCode: n,
198
- paymentMethod: s.asString(s.findValue(e, ["payment_method", "paymentMethod"])) ?? "",
199
- description: s.asString(s.findValue(e, ["description", "designation", "message"])) ?? "",
200
- metadata: s.asString(s.findValue(e, ["metadata", "custom"])),
201
- operatorId: s.asString(s.findValue(e, ["operator_id", "operatorId"])),
202
- paymentDate: s.asString(s.findValue(e, ["payment_date", "paymentDate"])),
203
- transactionId: s.asString(s.findValue(e, ["transaction_id", "transactionId", "merchant_transaction_id"])) ?? ""
198
+ paymentMethod: i.asString(i.findValue(e, ["payment_method", "paymentMethod"])) ?? "",
199
+ description: i.asString(i.findValue(e, ["description", "designation", "message"])) ?? "",
200
+ metadata: i.asString(i.findValue(e, ["metadata", "custom"])),
201
+ operatorId: i.asString(i.findValue(e, ["operator_id", "operatorId"])),
202
+ paymentDate: i.asString(i.findValue(e, ["payment_date", "paymentDate"])),
203
+ transactionId: i.asString(i.findValue(e, ["transaction_id", "transactionId", "merchant_transaction_id"])) ?? ""
204
204
  };
205
205
  }
206
206
  /** Dispatche la réponse vers le bon callback selon le statut. */
207
207
  dispatchResponse(e) {
208
- var t, n, i;
208
+ var t, n, s;
209
209
  switch (this.lastStatus = e.status, this.logger.debug(`Payment response: ${e.status}`, {
210
210
  amount: e.amount,
211
211
  currency: e.currency,
@@ -222,14 +222,14 @@ const s = class s {
222
222
  case "INITIATED":
223
223
  case "EXPIRED":
224
224
  default:
225
- this.logger.debug(`Payment pending: ${e.status}`), this.emitter.emit("payment.pending", e), (i = this.onPaymentPendingCallback) == null || i.call(this, e);
225
+ this.logger.debug(`Payment pending: ${e.status}`), this.emitter.emit("payment.pending", e), (s = this.onPaymentPendingCallback) == null || s.call(this, e);
226
226
  break;
227
227
  }
228
228
  }
229
229
  injectStyles() {
230
230
  if (document.getElementById("cp-seamless-styles")) return;
231
231
  const e = document.createElement("style");
232
- e.id = "cp-seamless-styles", e.textContent = u, document.head.appendChild(e);
232
+ e.id = "cp-seamless-styles", e.textContent = h, document.head.appendChild(e);
233
233
  }
234
234
  createOverlay() {
235
235
  this.overlay = document.createElement("div"), this.overlay.className = "cp-seamless-overlay";
@@ -239,8 +239,8 @@ const s = class s {
239
239
  t.className = "cp-seamless-waiting";
240
240
  const n = document.createElement("div");
241
241
  n.className = "cp-seamless-spinner", t.appendChild(n);
242
- const i = document.createElement("p");
243
- i.className = "cp-seamless-waiting-title", i.textContent = "Paiement en cours...", t.appendChild(i);
242
+ const s = document.createElement("p");
243
+ s.className = "cp-seamless-waiting-title", s.textContent = "Paiement en cours...", t.appendChild(s);
244
244
  const o = document.createElement("p");
245
245
  o.className = "cp-seamless-waiting-msg", o.textContent = "Finalisez votre paiement dans la fenêtre CinetPay.", t.appendChild(o);
246
246
  const a = document.createElement("button");
@@ -250,12 +250,12 @@ const s = class s {
250
250
  * Ouvre la popup centrée sur l'écran.
251
251
  */
252
252
  openPopup(e) {
253
- var a, c;
254
- const i = Math.max(0, (screen.width - 500) / 2), o = Math.max(0, (screen.height - 700) / 2);
253
+ var a, d;
254
+ const s = Math.max(0, (screen.width - 500) / 2), o = Math.max(0, (screen.height - 700) / 2);
255
255
  if (this.popup = window.open(
256
256
  e,
257
257
  "CinetPayCheckout",
258
- `width=500,height=700,left=${i},top=${o},scrollbars=yes,resizable=yes`
258
+ `width=500,height=700,left=${s},top=${o},scrollbars=yes,resizable=yes`
259
259
  ), !this.popup) {
260
260
  this.logger.error("Popup blocked by browser");
261
261
  const p = {
@@ -265,7 +265,7 @@ const s = class s {
265
265
  this.emitter.emit("error", p), (a = this.onErrorCallback) == null || a.call(this, p), this.close();
266
266
  return;
267
267
  }
268
- this.logger.debug("Popup opened"), this.emitter.emit("ready"), (c = this.onReadyCallback) == null || c.call(this);
268
+ this.logger.debug("Popup opened"), this.emitter.emit("ready"), (d = this.onReadyCallback) == null || d.call(this);
269
269
  }
270
270
  /**
271
271
  * Poll toutes les 500ms pour détecter si la popup a été fermée
@@ -285,27 +285,27 @@ const s = class s {
285
285
  listenForMessages() {
286
286
  this.messageHandler = (e) => {
287
287
  var t, n;
288
- if (s.ALLOWED_ORIGINS.some((i) => e.origin === i))
288
+ if (i.ALLOWED_ORIGINS.some((s) => e.origin === s))
289
289
  try {
290
- const i = typeof e.data == "string" ? JSON.parse(e.data) : e.data;
291
- if (!s.isRecord(i)) return;
292
- const o = s.buildPaymentResponse(i), a = (t = o.rawStatus) == null ? void 0 : t.trim().toUpperCase();
290
+ const s = typeof e.data == "string" ? JSON.parse(e.data) : e.data;
291
+ if (!i.isRecord(s)) return;
292
+ const o = i.buildPaymentResponse(s), a = (t = o.rawStatus) == null ? void 0 : t.trim().toUpperCase();
293
293
  (o.status !== "UNKNOWN" || a && a !== "OK") && this.dispatchResponse(o);
294
- const c = s.findValue(i, ["error"]), p = s.asString(s.findValue(i, ["code"]));
295
- if (c || p === "ERROR") {
296
- const d = {
294
+ const d = i.findValue(s, ["error"]), p = i.asString(i.findValue(s, ["code"]));
295
+ if (d || p === "ERROR") {
296
+ const u = {
297
297
  code: p ?? "UNKNOWN",
298
- message: s.asString(s.findValue(i, ["message"])) ?? s.asString(c) ?? "An error occurred"
298
+ message: i.asString(i.findValue(s, ["message"])) ?? i.asString(d) ?? "An error occurred"
299
299
  };
300
- this.logger.error("Payment error from popup", d), this.emitter.emit("error", d), (n = this.onErrorCallback) == null || n.call(this, d);
300
+ this.logger.error("Payment error from popup", u), this.emitter.emit("error", u), (n = this.onErrorCallback) == null || n.call(this, u);
301
301
  }
302
- (i.action === "CLOSE" || i.type === "close") && this.close();
302
+ (s.action === "CLOSE" || s.type === "close") && this.close();
303
303
  } catch {
304
304
  }
305
305
  }, window.addEventListener("message", this.messageHandler);
306
306
  }
307
307
  };
308
- s.ALLOWED_ORIGINS = [
308
+ i.ALLOWED_ORIGINS = [
309
309
  "https://secure.cinetpay.net",
310
310
  "https://secure.cinetpay.com",
311
311
  "https://checkout.cinetpay.net",
@@ -313,9 +313,9 @@ s.ALLOWED_ORIGINS = [
313
313
  "https://api.cinetpay.net",
314
314
  "https://api.cinetpay.co"
315
315
  ];
316
- let m = s;
316
+ let m = i;
317
317
  const l = "[CinetPay Seamless]";
318
- class h {
318
+ class y {
319
319
  constructor(e) {
320
320
  this.enabled = e;
321
321
  }
@@ -332,7 +332,7 @@ class h {
332
332
  this.enabled && (t !== void 0 ? console.error(`${l} ${e}`, t) : console.error(`${l} ${e}`));
333
333
  }
334
334
  }
335
- class y {
335
+ class g {
336
336
  constructor() {
337
337
  this.listeners = /* @__PURE__ */ new Map();
338
338
  }
@@ -377,8 +377,8 @@ class y {
377
377
  * ```
378
378
  */
379
379
  once(e, t) {
380
- const n = ((...i) => {
381
- this.off(e, n), t(...i);
380
+ const n = ((...s) => {
381
+ this.off(e, n), t(...s);
382
382
  });
383
383
  this.on(e, n);
384
384
  }
@@ -389,9 +389,9 @@ class y {
389
389
  emit(e, ...t) {
390
390
  const n = this.listeners.get(e);
391
391
  if (n)
392
- for (const i of n)
392
+ for (const s of n)
393
393
  try {
394
- i(...t);
394
+ s(...t);
395
395
  } catch {
396
396
  }
397
397
  }
@@ -403,11 +403,23 @@ class y {
403
403
  this.listeners.clear();
404
404
  }
405
405
  }
406
- const g = "https://secure.cinetpay.net", f = {
406
+ const f = "https://secure.cinetpay.net";
407
+ function c(r, e) {
408
+ const t = r;
409
+ for (const s of e) {
410
+ const o = t[s];
411
+ if (typeof o == "function") return o;
412
+ }
413
+ const n = new Set(e.map((s) => s.toLowerCase()));
414
+ for (const [s, o] of Object.entries(t))
415
+ if (n.has(s.toLowerCase()) && typeof o == "function")
416
+ return o;
417
+ }
418
+ const E = {
407
419
  /** Instance du checkout actuellement ouvert */
408
420
  _checkout: null,
409
421
  /** Event emitter partagé */
410
- _emitter: new y(),
422
+ _emitter: new g(),
411
423
  /**
412
424
  * Enregistre un listener d'événement (style événementiel).
413
425
  *
@@ -460,19 +472,33 @@ const g = "https://secure.cinetpay.net", f = {
460
472
  */
461
473
  open(r) {
462
474
  this.close();
463
- const e = new h(r.debug ?? !1);
475
+ const e = new y(r.debug ?? !1);
464
476
  if (e.debug("CinetPaySeamless.open() called"), !/^[a-zA-Z0-9_-]{10,128}$/.test(r.paymentToken))
465
477
  throw new Error("Invalid paymentToken format — expected alphanumeric string (10-128 chars)");
466
- const t = `${g}/checkout/${r.paymentToken}`;
478
+ const t = `${f}/checkout/${r.paymentToken}`;
467
479
  this._checkout = new m({
468
480
  logger: e,
469
481
  emitter: this._emitter,
470
- onReady: r.onReady,
471
- onPaymentSuccess: r.onPaymentSuccess ?? r.onPaymentsuccess ?? r.onpaymentSuccess ?? r.onpaymentsuccess,
472
- onPaymentFailed: r.onPaymentFailed ?? r.onPaymentfailed ?? r.onpaymentFailed ?? r.onpaymentfailed,
473
- onPaymentPending: r.onPaymentPending,
474
- onClose: r.onClose,
475
- onError: r.onError
482
+ onReady: c(r, ["onReady"]),
483
+ onPaymentSuccess: c(r, [
484
+ "onPaymentSuccess",
485
+ "onSuccess",
486
+ "onPaymentsuccess",
487
+ "onpaymentSuccess",
488
+ "onpaymentsuccess"
489
+ ]),
490
+ onPaymentFailed: c(r, [
491
+ "onPaymentFailed",
492
+ "onPaymentFail",
493
+ "onPaymentFailure",
494
+ "onFailed",
495
+ "onPaymentfailed",
496
+ "onpaymentFailed",
497
+ "onpaymentfailed"
498
+ ]),
499
+ onPaymentPending: c(r, ["onPaymentPending", "onPending"]),
500
+ onClose: c(r, ["onClose"]),
501
+ onError: c(r, ["onError"])
476
502
  }), this._checkout.open(t);
477
503
  },
478
504
  /**
@@ -483,8 +509,8 @@ const g = "https://secure.cinetpay.net", f = {
483
509
  (r = this._checkout) == null || r.close(), this._checkout = null;
484
510
  }
485
511
  };
486
- typeof window < "u" && (window.CinetPaySeamless = f);
512
+ typeof window < "u" && (window.CinetPaySeamless = E);
487
513
  export {
488
- f as CinetPaySeamless
514
+ E as CinetPaySeamless
489
515
  };
490
516
  //# sourceMappingURL=cinetpay-seamless.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cinetpay-seamless.js","sources":["../src/styles.ts","../src/checkout.ts","../src/logger.ts","../src/emitter.ts","../src/index.ts"],"sourcesContent":["/**\n * Styles CSS du checkout CinetPay Seamless (mode popup).\n */\nexport const STYLES = `\n.cp-seamless-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n background: rgba(0, 0, 0, 0.7);\n backdrop-filter: blur(6px);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.cp-seamless-overlay.cp-visible {\n opacity: 1;\n}\n\n.cp-seamless-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Waiting screen (pendant que la popup est ouverte) */\n.cp-seamless-waiting {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n text-align: center;\n padding: 40px;\n}\n\n.cp-seamless-waiting-title {\n color: #fff;\n font-size: 22px;\n font-weight: 600;\n margin: 0;\n}\n\n.cp-seamless-waiting-msg {\n color: rgba(255, 255, 255, 0.7);\n font-size: 15px;\n margin: 0;\n max-width: 320px;\n line-height: 1.5;\n}\n\n.cp-seamless-spinner {\n width: 48px;\n height: 48px;\n border: 3px solid rgba(255, 255, 255, 0.2);\n border-top-color: #e8530e;\n border-radius: 50%;\n animation: cp-spin 0.8s linear infinite;\n}\n\n@keyframes cp-spin {\n to { transform: rotate(360deg); }\n}\n\n.cp-seamless-cancel-btn {\n margin-top: 12px;\n padding: 10px 28px;\n background: rgba(255, 255, 255, 0.12);\n color: rgba(255, 255, 255, 0.8);\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.cp-seamless-cancel-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n color: #fff;\n}\n\n`\n","import { STYLES } from './styles'\nimport type { PaymentResponse, PaymentError, PaymentStatus } from './types'\nimport { Logger } from './logger'\nimport { EventEmitter } from './emitter'\n\n/** @internal Options du constructeur Checkout */\nexport interface CheckoutOptions {\n onReady?: () => void\n onPaymentSuccess?: (data: PaymentResponse) => void\n onPaymentFailed?: (data: PaymentResponse) => void\n onPaymentPending?: (data: PaymentResponse) => void\n onClose?: (data: { status: string }) => void\n onError?: (error: PaymentError) => void\n logger: Logger\n emitter: EventEmitter\n}\n\n/** @internal Intervalle de polling pour vérifier si la popup est fermée */\nconst POPUP_POLL_INTERVAL = 500\n\n/**\n * Gère le checkout CinetPay via une popup window + overlay.\n *\n * Flow :\n * 1. Affiche un overlay sombre avec un message d'attente\n * 2. Ouvre la page de checkout dans une popup (window.open)\n * 3. Poll la popup pour détecter sa fermeture\n * 4. Écoute les messages postMessage de la popup\n * 5. Ferme l'overlay et dispatche les callbacks\n *\n * @internal Utilisé par {@link CinetPaySeamless}. Ne pas instancier directement.\n */\nexport class Checkout {\n private overlay: HTMLDivElement | null = null\n private popup: Window | null = null\n private pollTimer: ReturnType<typeof setInterval> | null = null\n private closeTimer: ReturnType<typeof setTimeout> | null = null\n private messageHandler: ((event: MessageEvent) => void) | null = null\n private lastStatus = 'UNKNOWN'\n private previousBodyOverflow = ''\n\n private onReadyCallback?: () => void\n private onPaymentSuccessCallback?: (data: PaymentResponse) => void\n private onPaymentFailedCallback?: (data: PaymentResponse) => void\n private onPaymentPendingCallback?: (data: PaymentResponse) => void\n private onCloseCallback?: (data: { status: string }) => void\n private onErrorCallback?: (error: PaymentError) => void\n private logger: Logger\n private emitter: EventEmitter\n\n constructor(options: CheckoutOptions) {\n this.logger = options.logger\n this.emitter = options.emitter\n this.onReadyCallback = options.onReady\n this.onPaymentSuccessCallback = options.onPaymentSuccess\n this.onPaymentFailedCallback = options.onPaymentFailed\n this.onPaymentPendingCallback = options.onPaymentPending\n this.onCloseCallback = options.onClose\n this.onErrorCallback = options.onError\n }\n\n /**\n * Ouvre la popup de checkout et affiche l'overlay d'attente.\n *\n * @param paymentUrl - URL complète de la page de checkout CinetPay\n */\n open(paymentUrl: string): void {\n this.logger.debug('Opening checkout popup', { paymentUrl })\n this.injectStyles()\n this.createOverlay()\n this.openPopup(paymentUrl)\n if (!this.popup) return\n\n this.listenForMessages()\n this.startPolling()\n\n requestAnimationFrame(() => {\n this.overlay?.classList.add('cp-visible')\n })\n\n this.previousBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n\n /**\n * Ferme la popup et l'overlay.\n */\n close(): void {\n if (this.closeTimer) return\n\n this.stopPolling()\n\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler)\n this.messageHandler = null\n }\n\n if (this.popup && !this.popup.closed) {\n this.popup.close()\n }\n this.popup = null\n\n if (this.overlay) {\n const overlay = this.overlay\n this.overlay = null\n overlay.classList.remove('cp-visible')\n this.closeTimer = setTimeout(() => {\n overlay.remove()\n this.closeTimer = null\n\n if (!document.querySelector('.cp-seamless-overlay')) {\n document.body.style.overflow = this.previousBodyOverflow\n }\n\n this.logger.debug('Checkout closed', { lastStatus: this.lastStatus })\n this.emitter.emit('close', { status: this.lastStatus })\n this.onCloseCallback?.({ status: this.lastStatus })\n }, 300)\n }\n }\n\n private static isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n }\n\n private static childRecords(data: Record<string, unknown>): Record<string, unknown>[] {\n const records: Record<string, unknown>[] = []\n for (const key of ['details', 'transaction', 'payment', 'result', 'data']) {\n const child = data[key]\n if (Checkout.isRecord(child)) records.push(child)\n }\n records.push(data)\n return records\n }\n\n private static findValue(data: Record<string, unknown>, keys: string[]): unknown {\n for (const record of Checkout.childRecords(data)) {\n for (const key of keys) {\n if (record[key] !== undefined && record[key] !== null) return record[key]\n }\n }\n return undefined\n }\n\n private static asString(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined\n return String(value)\n }\n\n private static asNumber(value: unknown): number {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/\\s/g, ''))\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n }\n\n private static asOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value === 'string') {\n const parsed = Number(value.trim())\n return Number.isFinite(parsed) ? parsed : undefined\n }\n return undefined\n }\n\n private static normalizeStatus(rawStatus?: string, apiCode?: number): PaymentStatus {\n const normalized = rawStatus?.trim().toUpperCase().replace(/[\\s-]+/g, '_')\n\n if (normalized) {\n if (['ACCEPTED', 'SUCCESS', 'SUCCEEDED', 'SUCCESSFUL', 'PAID', 'VALIDATED', 'APPROVED'].includes(normalized)) {\n return 'ACCEPTED'\n }\n if ([\n 'REFUSED',\n 'FAILED',\n 'FAIL',\n 'FAILURE',\n 'DENIED',\n 'DECLINED',\n 'REJECTED',\n 'CANCELED',\n 'CANCELLED',\n 'CANCEL',\n 'INSUFFICIENT_BALANCE',\n ].includes(normalized)) {\n return 'REFUSED'\n }\n if (['PENDING', 'INITIATED', 'EXPIRED'].includes(normalized)) {\n return normalized as PaymentStatus\n }\n if (['WAITING', 'PROCESSING', 'IN_PROGRESS'].includes(normalized)) {\n return 'PENDING'\n }\n }\n\n switch (apiCode) {\n case 100:\n return 'ACCEPTED'\n case 2010:\n case 2005:\n return 'REFUSED'\n case 2001:\n return 'INITIATED'\n case 2002:\n return 'PENDING'\n case 2003:\n return 'EXPIRED'\n }\n\n return 'UNKNOWN'\n }\n\n private static buildPaymentResponse(data: Record<string, unknown>): PaymentResponse {\n const rawStatus = Checkout.asString(Checkout.findValue(data, [\n 'status',\n 'transaction_status',\n 'trans_status',\n 'payment_status',\n ]))\n const apiCode = Checkout.asOptionalNumber(Checkout.findValue(data, ['code']))\n const status = Checkout.normalizeStatus(rawStatus, apiCode)\n\n return {\n amount: Checkout.asNumber(Checkout.findValue(data, ['amount'])),\n currency: Checkout.asString(Checkout.findValue(data, ['currency'])) ?? '',\n status,\n rawStatus,\n apiCode,\n paymentMethod: Checkout.asString(Checkout.findValue(data, ['payment_method', 'paymentMethod'])) ?? '',\n description: Checkout.asString(Checkout.findValue(data, ['description', 'designation', 'message'])) ?? '',\n metadata: Checkout.asString(Checkout.findValue(data, ['metadata', 'custom'])),\n operatorId: Checkout.asString(Checkout.findValue(data, ['operator_id', 'operatorId'])),\n paymentDate: Checkout.asString(Checkout.findValue(data, ['payment_date', 'paymentDate'])),\n transactionId: Checkout.asString(Checkout.findValue(data, ['transaction_id', 'transactionId', 'merchant_transaction_id'])) ?? '',\n }\n }\n\n /** Dispatche la réponse vers le bon callback selon le statut. */\n private dispatchResponse(response: PaymentResponse): void {\n this.lastStatus = response.status\n\n this.logger.debug(`Payment response: ${response.status}`, {\n amount: response.amount,\n currency: response.currency,\n transactionId: response.transactionId,\n paymentMethod: response.paymentMethod,\n })\n\n switch (response.status) {\n case 'ACCEPTED':\n this.logger.debug('Payment accepted')\n this.emitter.emit('payment.success', response)\n this.onPaymentSuccessCallback?.(response)\n break\n case 'REFUSED':\n this.logger.warn('Payment refused')\n this.emitter.emit('payment.failed', response)\n this.onPaymentFailedCallback?.(response)\n break\n case 'PENDING':\n case 'INITIATED':\n case 'EXPIRED':\n default:\n this.logger.debug(`Payment pending: ${response.status}`)\n this.emitter.emit('payment.pending', response)\n this.onPaymentPendingCallback?.(response)\n break\n }\n }\n\n private injectStyles(): void {\n if (document.getElementById('cp-seamless-styles')) return\n const styleEl = document.createElement('style')\n styleEl.id = 'cp-seamless-styles'\n styleEl.textContent = STYLES\n document.head.appendChild(styleEl)\n }\n\n private createOverlay(): void {\n this.overlay = document.createElement('div')\n this.overlay.className = 'cp-seamless-overlay'\n\n const wrapper = document.createElement('div')\n wrapper.className = 'cp-seamless-wrapper'\n\n // Spinner + message\n const waiting = document.createElement('div')\n waiting.className = 'cp-seamless-waiting'\n\n const spinner = document.createElement('div')\n spinner.className = 'cp-seamless-spinner'\n waiting.appendChild(spinner)\n\n const title = document.createElement('p')\n title.className = 'cp-seamless-waiting-title'\n title.textContent = 'Paiement en cours...'\n waiting.appendChild(title)\n\n const msg = document.createElement('p')\n msg.className = 'cp-seamless-waiting-msg'\n msg.textContent = 'Finalisez votre paiement dans la fenêtre CinetPay.'\n waiting.appendChild(msg)\n\n // Bouton fermer\n const cancelBtn = document.createElement('button')\n cancelBtn.className = 'cp-seamless-cancel-btn'\n cancelBtn.textContent = 'Annuler'\n cancelBtn.addEventListener('click', () => this.close())\n waiting.appendChild(cancelBtn)\n\n wrapper.appendChild(waiting)\n this.overlay.appendChild(wrapper)\n document.body.appendChild(this.overlay)\n }\n\n /**\n * Ouvre la popup centrée sur l'écran.\n */\n private openPopup(paymentUrl: string): void {\n const width = 500\n const height = 700\n const left = Math.max(0, (screen.width - width) / 2)\n const top = Math.max(0, (screen.height - height) / 2)\n\n this.popup = window.open(\n paymentUrl,\n 'CinetPayCheckout',\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`,\n )\n\n if (!this.popup) {\n this.logger.error('Popup blocked by browser')\n const err: PaymentError = {\n code: 'POPUP_BLOCKED',\n message: 'La fenêtre de paiement a été bloquée par le navigateur. Autorisez les popups pour ce site.',\n }\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n this.close()\n return\n }\n\n this.logger.debug('Popup opened')\n this.emitter.emit('ready')\n this.onReadyCallback?.()\n }\n\n /**\n * Poll toutes les 500ms pour détecter si la popup a été fermée\n * (par l'utilisateur ou après redirection).\n */\n private startPolling(): void {\n this.pollTimer = setInterval(() => {\n if (this.popup && this.popup.closed) {\n this.logger.debug('Popup closed by user or redirect')\n this.stopPolling()\n\n // Laisser un court délai pour que le postMessage arrive avant le close\n setTimeout(() => {\n if (this.overlay) {\n this.close()\n }\n }, 500)\n }\n }, POPUP_POLL_INTERVAL)\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = null\n }\n }\n\n /** Origines autorisées pour les messages postMessage */\n private static readonly ALLOWED_ORIGINS = [\n 'https://secure.cinetpay.net',\n 'https://secure.cinetpay.com',\n 'https://checkout.cinetpay.net',\n 'https://checkout.cinetpay.com',\n 'https://api.cinetpay.net',\n 'https://api.cinetpay.co',\n ]\n\n /** Écoute les messages postMessage de la popup CinetPay. */\n private listenForMessages(): void {\n this.messageHandler = (event: MessageEvent) => {\n if (!Checkout.ALLOWED_ORIGINS.some((o) => event.origin === o)) {\n return\n }\n\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n if (!Checkout.isRecord(data)) return\n\n const response = Checkout.buildPaymentResponse(data)\n const rawStatus = response.rawStatus?.trim().toUpperCase()\n if (response.status !== 'UNKNOWN' || (rawStatus && rawStatus !== 'OK')) {\n this.dispatchResponse(response)\n }\n\n const error = Checkout.findValue(data, ['error'])\n const code = Checkout.asString(Checkout.findValue(data, ['code']))\n if (error || code === 'ERROR') {\n const err: PaymentError = {\n code: code ?? 'UNKNOWN',\n message: Checkout.asString(Checkout.findValue(data, ['message'])) ?? Checkout.asString(error) ?? 'An error occurred',\n }\n this.logger.error('Payment error from popup', err)\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n }\n\n if (data.action === 'CLOSE' || data.type === 'close') {\n this.close()\n }\n } catch {\n // Ignorer les messages non-JSON\n }\n }\n\n window.addEventListener('message', this.messageHandler)\n }\n}\n","/** Préfixe des messages de log */\nconst PREFIX = '[CinetPay Seamless]'\n\n/**\n * Logger interne du SDK Seamless.\n * Désactivé par défaut. Activable via `debug: true` dans la config.\n *\n * Tous les logs utilisent le préfixe `[CinetPay Seamless]` pour être\n * facilement filtrables dans la console du navigateur.\n */\nexport class Logger {\n private enabled: boolean\n\n constructor(enabled: boolean) {\n this.enabled = enabled\n }\n\n /** Log de debug — requêtes, réponses, événements */\n debug(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.debug(`${PREFIX} ${message}`, data)\n } else {\n console.debug(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'avertissement — credentials exposés, statuts inattendus */\n warn(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.warn(`${PREFIX} ${message}`, data)\n } else {\n console.warn(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'erreur — erreurs API, timeouts, postMessage invalides */\n error(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.error(`${PREFIX} ${message}`, data)\n } else {\n console.error(`${PREFIX} ${message}`)\n }\n }\n}\n","import type { PaymentResponse, PaymentError } from './types'\n\n/**\n * Map des événements émis par le SDK Seamless.\n *\n * | Événement | Donnée | Quand |\n * |---|---|---|\n * | `ready` | — | Popup ouverte, passerelle prête |\n * | `payment.success` | `PaymentResponse` | Paiement accepté |\n * | `payment.failed` | `PaymentResponse` | Paiement refusé |\n * | `payment.pending` | `PaymentResponse` | En attente (PENDING, INITIATED, EXPIRED) |\n * | `close` | `{ status: string }` | Popup fermée, overlay retiré |\n * | `error` | `PaymentError` | Erreur technique |\n */\nexport interface EventMap {\n 'ready': void\n 'payment.success': PaymentResponse\n 'payment.failed': PaymentResponse\n 'payment.pending': PaymentResponse\n 'close': { status: string }\n 'error': PaymentError\n}\n\n/** Type des noms d'événements */\nexport type EventName = keyof EventMap\n\n/** Type d'un handler pour un événement donné */\ntype Handler<T> = T extends void ? () => void : (data: T) => void\n\n/**\n * Event emitter typé pour le SDK Seamless.\n *\n * Permet d'écouter les événements de paiement avec `on()` et `off()`,\n * style événementiel (`on('event', handler)`).\n *\n * @example\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n *\n * CinetPaySeamless.on('payment.failed', (data) => {\n * console.log('Refusé', data.transactionId)\n * })\n *\n * CinetPaySeamless.on('ready', () => {\n * console.log('Passerelle chargée')\n * })\n * ```\n */\nexport class EventEmitter {\n private listeners = new Map<string, Set<Function>>()\n\n /**\n * Enregistre un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction pour se désabonner (équivalent de `off(event, handler)`)\n *\n * @example\n * ```typescript\n * const unsubscribe = CinetPaySeamless.on('payment.success', (data) => { ... })\n * // Plus tard :\n * unsubscribe()\n * ```\n */\n on<E extends EventName>(event: E, handler: Handler<EventMap[E]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n\n // Retourne une fonction de désabonnement\n return () => this.off(event, handler)\n }\n\n /**\n * Supprime un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Référence du handler à supprimer\n */\n off<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n /**\n * Enregistre un handler qui ne sera appelé qu'une seule fois.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée une seule fois\n *\n * @example\n * ```typescript\n * CinetPaySeamless.once('payment.success', (data) => {\n * // Appelé une seule fois\n * })\n * ```\n */\n once<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n const wrapper = ((...args: unknown[]) => {\n this.off(event, wrapper as Handler<EventMap[E]>)\n ;(handler as Function)(...args)\n }) as Handler<EventMap[E]>\n this.on(event, wrapper)\n }\n\n /**\n * Émet un événement — appelle tous les handlers enregistrés.\n * @internal\n */\n emit<E extends EventName>(event: E, ...args: EventMap[E] extends void ? [] : [EventMap[E]]): void {\n const handlers = this.listeners.get(event)\n if (!handlers) return\n for (const handler of handlers) {\n try {\n (handler as Function)(...args)\n } catch {\n // Ne pas bloquer les autres handlers si un throw\n }\n }\n }\n\n /**\n * Supprime tous les handlers pour tous les événements.\n * @internal\n */\n removeAll(): void {\n this.listeners.clear()\n }\n}\n","import { Checkout } from './checkout'\nimport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n} from './types'\nimport { Logger } from './logger'\nimport { EventEmitter, type EventName, type EventMap } from './emitter'\n\nexport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n}\nexport type { EventName, EventMap } from './emitter'\n\n/** @internal URL de base de la passerelle de paiement sécurisée */\nconst SECURE_BASE_URL = 'https://secure.cinetpay.net'\n\n/**\n * CinetPay Seamless — paiement inline via popup window.\n *\n * Affiche un overlay d'attente et ouvre la passerelle de paiement\n * CinetPay dans une popup. Le client reste sur votre page.\n *\n * Le `paymentToken` est obtenu côté serveur via l'API CinetPay :\n *\n * ```typescript\n * // Frontend\n * CinetPaySeamless.open({\n * paymentToken: 'abc123...',\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * })\n * ```\n *\n * Ou avec des event listeners (style événementiel) :\n *\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => { ... })\n * CinetPaySeamless.open({ paymentToken: 'abc123...' })\n * ```\n */\nexport const CinetPaySeamless = {\n /** Instance du checkout actuellement ouvert */\n _checkout: null as Checkout | null,\n\n /** Event emitter partagé */\n _emitter: new EventEmitter(),\n\n /**\n * Enregistre un listener d'événement (style événementiel).\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction de désabonnement\n *\n * @example\n * ```typescript\n * const unsub = CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n * unsub() // Se désabonner\n * ```\n */\n on<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): () => void {\n return this._emitter.on(event, handler)\n },\n\n /**\n * Supprime un listener.\n */\n off<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.off(event, handler)\n },\n\n /**\n * Enregistre un listener appelé une seule fois.\n */\n once<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.once(event, handler)\n },\n\n /**\n * Ouvre le checkout CinetPay.\n *\n * Affiche un overlay d'attente et ouvre la page de paiement dans une popup.\n * La popup est centrée sur l'écran (500x700px).\n *\n * @param config - Configuration avec `paymentToken` et callbacks optionnels\n * @throws {Error} Si le `paymentToken` a un format invalide\n *\n * @example\n * ```typescript\n * CinetPaySeamless.open({\n * paymentToken: 'abc123def456...',\n * debug: true,\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * onPaymentFailed: (data) => console.log('Refusé'),\n * onClose: ({ status }) => console.log('Fermé:', status),\n * })\n * ```\n */\n open(config: SeamlessConfig): void {\n this.close()\n\n const logger = new Logger(config.debug ?? false)\n logger.debug('CinetPaySeamless.open() called')\n\n // Validation du paymentToken\n if (!/^[a-zA-Z0-9_-]{10,128}$/.test(config.paymentToken)) {\n throw new Error('Invalid paymentToken format — expected alphanumeric string (10-128 chars)')\n }\n\n const paymentUrl = `${SECURE_BASE_URL}/checkout/${config.paymentToken}`\n\n this._checkout = new Checkout({\n logger,\n emitter: this._emitter,\n onReady: config.onReady,\n onPaymentSuccess: config.onPaymentSuccess\n ?? config.onPaymentsuccess\n ?? config.onpaymentSuccess\n ?? config.onpaymentsuccess,\n onPaymentFailed: config.onPaymentFailed\n ?? config.onPaymentfailed\n ?? config.onpaymentFailed\n ?? config.onpaymentfailed,\n onPaymentPending: config.onPaymentPending,\n onClose: config.onClose,\n onError: config.onError,\n })\n\n this._checkout.open(paymentUrl)\n },\n\n /**\n * Ferme le checkout (popup + overlay).\n */\n close(): void {\n this._checkout?.close()\n this._checkout = null\n },\n}\n\n// Auto-attach to window for CDN/script tag usage\nif (typeof window !== 'undefined') {\n (window as unknown as Record<string, unknown>).CinetPaySeamless = CinetPaySeamless\n}\n"],"names":["STYLES","_Checkout","options","paymentUrl","_a","overlay","value","data","records","key","child","keys","record","parsed","rawStatus","apiCode","normalized","status","response","_b","_c","styleEl","wrapper","waiting","spinner","title","msg","cancelBtn","left","top","err","event","o","error","code","Checkout","PREFIX","Logger","enabled","message","EventEmitter","handler","args","handlers","SECURE_BASE_URL","CinetPaySeamless","config","logger"],"mappings":"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"}
1
+ {"version":3,"file":"cinetpay-seamless.js","sources":["../src/styles.ts","../src/checkout.ts","../src/logger.ts","../src/emitter.ts","../src/index.ts"],"sourcesContent":["/**\n * Styles CSS du checkout CinetPay Seamless (mode popup).\n */\nexport const STYLES = `\n.cp-seamless-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n background: rgba(0, 0, 0, 0.7);\n backdrop-filter: blur(6px);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.cp-seamless-overlay.cp-visible {\n opacity: 1;\n}\n\n.cp-seamless-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Waiting screen (pendant que la popup est ouverte) */\n.cp-seamless-waiting {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n text-align: center;\n padding: 40px;\n}\n\n.cp-seamless-waiting-title {\n color: #fff;\n font-size: 22px;\n font-weight: 600;\n margin: 0;\n}\n\n.cp-seamless-waiting-msg {\n color: rgba(255, 255, 255, 0.7);\n font-size: 15px;\n margin: 0;\n max-width: 320px;\n line-height: 1.5;\n}\n\n.cp-seamless-spinner {\n width: 48px;\n height: 48px;\n border: 3px solid rgba(255, 255, 255, 0.2);\n border-top-color: #e8530e;\n border-radius: 50%;\n animation: cp-spin 0.8s linear infinite;\n}\n\n@keyframes cp-spin {\n to { transform: rotate(360deg); }\n}\n\n.cp-seamless-cancel-btn {\n margin-top: 12px;\n padding: 10px 28px;\n background: rgba(255, 255, 255, 0.12);\n color: rgba(255, 255, 255, 0.8);\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.cp-seamless-cancel-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n color: #fff;\n}\n\n`\n","import { STYLES } from './styles'\nimport type { PaymentResponse, PaymentError, PaymentStatus } from './types'\nimport { Logger } from './logger'\nimport { EventEmitter } from './emitter'\n\n/** @internal Options du constructeur Checkout */\nexport interface CheckoutOptions {\n onReady?: () => void\n onPaymentSuccess?: (data: PaymentResponse) => void\n onPaymentFailed?: (data: PaymentResponse) => void\n onPaymentPending?: (data: PaymentResponse) => void\n onClose?: (data: { status: string }) => void\n onError?: (error: PaymentError) => void\n logger: Logger\n emitter: EventEmitter\n}\n\n/** @internal Intervalle de polling pour vérifier si la popup est fermée */\nconst POPUP_POLL_INTERVAL = 500\n\n/**\n * Gère le checkout CinetPay via une popup window + overlay.\n *\n * Flow :\n * 1. Affiche un overlay sombre avec un message d'attente\n * 2. Ouvre la page de checkout dans une popup (window.open)\n * 3. Poll la popup pour détecter sa fermeture\n * 4. Écoute les messages postMessage de la popup\n * 5. Ferme l'overlay et dispatche les callbacks\n *\n * @internal Utilisé par {@link CinetPaySeamless}. Ne pas instancier directement.\n */\nexport class Checkout {\n private overlay: HTMLDivElement | null = null\n private popup: Window | null = null\n private pollTimer: ReturnType<typeof setInterval> | null = null\n private closeTimer: ReturnType<typeof setTimeout> | null = null\n private messageHandler: ((event: MessageEvent) => void) | null = null\n private lastStatus = 'UNKNOWN'\n private previousBodyOverflow = ''\n\n private onReadyCallback?: () => void\n private onPaymentSuccessCallback?: (data: PaymentResponse) => void\n private onPaymentFailedCallback?: (data: PaymentResponse) => void\n private onPaymentPendingCallback?: (data: PaymentResponse) => void\n private onCloseCallback?: (data: { status: string }) => void\n private onErrorCallback?: (error: PaymentError) => void\n private logger: Logger\n private emitter: EventEmitter\n\n constructor(options: CheckoutOptions) {\n this.logger = options.logger\n this.emitter = options.emitter\n this.onReadyCallback = options.onReady\n this.onPaymentSuccessCallback = options.onPaymentSuccess\n this.onPaymentFailedCallback = options.onPaymentFailed\n this.onPaymentPendingCallback = options.onPaymentPending\n this.onCloseCallback = options.onClose\n this.onErrorCallback = options.onError\n }\n\n /**\n * Ouvre la popup de checkout et affiche l'overlay d'attente.\n *\n * @param paymentUrl - URL complète de la page de checkout CinetPay\n */\n open(paymentUrl: string): void {\n this.logger.debug('Opening checkout popup', { paymentUrl })\n this.injectStyles()\n this.createOverlay()\n this.openPopup(paymentUrl)\n if (!this.popup) return\n\n this.listenForMessages()\n this.startPolling()\n\n requestAnimationFrame(() => {\n this.overlay?.classList.add('cp-visible')\n })\n\n this.previousBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n\n /**\n * Ferme la popup et l'overlay.\n */\n close(): void {\n if (this.closeTimer) return\n\n this.stopPolling()\n\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler)\n this.messageHandler = null\n }\n\n if (this.popup && !this.popup.closed) {\n this.popup.close()\n }\n this.popup = null\n\n if (this.overlay) {\n const overlay = this.overlay\n this.overlay = null\n overlay.classList.remove('cp-visible')\n this.closeTimer = setTimeout(() => {\n overlay.remove()\n this.closeTimer = null\n\n if (!document.querySelector('.cp-seamless-overlay')) {\n document.body.style.overflow = this.previousBodyOverflow\n }\n\n this.logger.debug('Checkout closed', { lastStatus: this.lastStatus })\n this.emitter.emit('close', { status: this.lastStatus })\n this.onCloseCallback?.({ status: this.lastStatus })\n }, 300)\n }\n }\n\n private static isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n }\n\n private static childRecords(data: Record<string, unknown>): Record<string, unknown>[] {\n const records: Record<string, unknown>[] = []\n for (const key of ['details', 'transaction', 'payment', 'result', 'data']) {\n const child = data[key]\n if (Checkout.isRecord(child)) records.push(child)\n }\n records.push(data)\n return records\n }\n\n private static findValue(data: Record<string, unknown>, keys: string[]): unknown {\n for (const record of Checkout.childRecords(data)) {\n for (const key of keys) {\n if (record[key] !== undefined && record[key] !== null) return record[key]\n }\n }\n return undefined\n }\n\n private static asString(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined\n return String(value)\n }\n\n private static asNumber(value: unknown): number {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/\\s/g, ''))\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n }\n\n private static asOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value === 'string') {\n const parsed = Number(value.trim())\n return Number.isFinite(parsed) ? parsed : undefined\n }\n return undefined\n }\n\n private static normalizeStatus(rawStatus?: string, apiCode?: number): PaymentStatus {\n const normalized = rawStatus?.trim().toUpperCase().replace(/[\\s-]+/g, '_')\n\n if (normalized) {\n if (['ACCEPTED', 'SUCCESS', 'SUCCEEDED', 'SUCCESSFUL', 'PAID', 'VALIDATED', 'APPROVED'].includes(normalized)) {\n return 'ACCEPTED'\n }\n if ([\n 'REFUSED',\n 'FAILED',\n 'FAIL',\n 'FAILURE',\n 'DENIED',\n 'DECLINED',\n 'REJECTED',\n 'CANCELED',\n 'CANCELLED',\n 'CANCEL',\n 'INSUFFICIENT_BALANCE',\n ].includes(normalized)) {\n return 'REFUSED'\n }\n if (['PENDING', 'INITIATED', 'EXPIRED'].includes(normalized)) {\n return normalized as PaymentStatus\n }\n if (['WAITING', 'PROCESSING', 'IN_PROGRESS'].includes(normalized)) {\n return 'PENDING'\n }\n }\n\n switch (apiCode) {\n case 100:\n return 'ACCEPTED'\n case 2010:\n case 2005:\n return 'REFUSED'\n case 2001:\n return 'INITIATED'\n case 2002:\n return 'PENDING'\n case 2003:\n return 'EXPIRED'\n }\n\n return 'UNKNOWN'\n }\n\n private static buildPaymentResponse(data: Record<string, unknown>): PaymentResponse {\n const rawStatus = Checkout.asString(Checkout.findValue(data, [\n 'status',\n 'transaction_status',\n 'trans_status',\n 'payment_status',\n ]))\n const apiCode = Checkout.asOptionalNumber(Checkout.findValue(data, ['code']))\n const status = Checkout.normalizeStatus(rawStatus, apiCode)\n\n return {\n amount: Checkout.asNumber(Checkout.findValue(data, ['amount'])),\n currency: Checkout.asString(Checkout.findValue(data, ['currency'])) ?? '',\n status,\n rawStatus,\n apiCode,\n paymentMethod: Checkout.asString(Checkout.findValue(data, ['payment_method', 'paymentMethod'])) ?? '',\n description: Checkout.asString(Checkout.findValue(data, ['description', 'designation', 'message'])) ?? '',\n metadata: Checkout.asString(Checkout.findValue(data, ['metadata', 'custom'])),\n operatorId: Checkout.asString(Checkout.findValue(data, ['operator_id', 'operatorId'])),\n paymentDate: Checkout.asString(Checkout.findValue(data, ['payment_date', 'paymentDate'])),\n transactionId: Checkout.asString(Checkout.findValue(data, ['transaction_id', 'transactionId', 'merchant_transaction_id'])) ?? '',\n }\n }\n\n /** Dispatche la réponse vers le bon callback selon le statut. */\n private dispatchResponse(response: PaymentResponse): void {\n this.lastStatus = response.status\n\n this.logger.debug(`Payment response: ${response.status}`, {\n amount: response.amount,\n currency: response.currency,\n transactionId: response.transactionId,\n paymentMethod: response.paymentMethod,\n })\n\n switch (response.status) {\n case 'ACCEPTED':\n this.logger.debug('Payment accepted')\n this.emitter.emit('payment.success', response)\n this.onPaymentSuccessCallback?.(response)\n break\n case 'REFUSED':\n this.logger.warn('Payment refused')\n this.emitter.emit('payment.failed', response)\n this.onPaymentFailedCallback?.(response)\n break\n case 'PENDING':\n case 'INITIATED':\n case 'EXPIRED':\n default:\n this.logger.debug(`Payment pending: ${response.status}`)\n this.emitter.emit('payment.pending', response)\n this.onPaymentPendingCallback?.(response)\n break\n }\n }\n\n private injectStyles(): void {\n if (document.getElementById('cp-seamless-styles')) return\n const styleEl = document.createElement('style')\n styleEl.id = 'cp-seamless-styles'\n styleEl.textContent = STYLES\n document.head.appendChild(styleEl)\n }\n\n private createOverlay(): void {\n this.overlay = document.createElement('div')\n this.overlay.className = 'cp-seamless-overlay'\n\n const wrapper = document.createElement('div')\n wrapper.className = 'cp-seamless-wrapper'\n\n // Spinner + message\n const waiting = document.createElement('div')\n waiting.className = 'cp-seamless-waiting'\n\n const spinner = document.createElement('div')\n spinner.className = 'cp-seamless-spinner'\n waiting.appendChild(spinner)\n\n const title = document.createElement('p')\n title.className = 'cp-seamless-waiting-title'\n title.textContent = 'Paiement en cours...'\n waiting.appendChild(title)\n\n const msg = document.createElement('p')\n msg.className = 'cp-seamless-waiting-msg'\n msg.textContent = 'Finalisez votre paiement dans la fenêtre CinetPay.'\n waiting.appendChild(msg)\n\n // Bouton fermer\n const cancelBtn = document.createElement('button')\n cancelBtn.className = 'cp-seamless-cancel-btn'\n cancelBtn.textContent = 'Annuler'\n cancelBtn.addEventListener('click', () => this.close())\n waiting.appendChild(cancelBtn)\n\n wrapper.appendChild(waiting)\n this.overlay.appendChild(wrapper)\n document.body.appendChild(this.overlay)\n }\n\n /**\n * Ouvre la popup centrée sur l'écran.\n */\n private openPopup(paymentUrl: string): void {\n const width = 500\n const height = 700\n const left = Math.max(0, (screen.width - width) / 2)\n const top = Math.max(0, (screen.height - height) / 2)\n\n this.popup = window.open(\n paymentUrl,\n 'CinetPayCheckout',\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`,\n )\n\n if (!this.popup) {\n this.logger.error('Popup blocked by browser')\n const err: PaymentError = {\n code: 'POPUP_BLOCKED',\n message: 'La fenêtre de paiement a été bloquée par le navigateur. Autorisez les popups pour ce site.',\n }\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n this.close()\n return\n }\n\n this.logger.debug('Popup opened')\n this.emitter.emit('ready')\n this.onReadyCallback?.()\n }\n\n /**\n * Poll toutes les 500ms pour détecter si la popup a été fermée\n * (par l'utilisateur ou après redirection).\n */\n private startPolling(): void {\n this.pollTimer = setInterval(() => {\n if (this.popup && this.popup.closed) {\n this.logger.debug('Popup closed by user or redirect')\n this.stopPolling()\n\n // Laisser un court délai pour que le postMessage arrive avant le close\n setTimeout(() => {\n if (this.overlay) {\n this.close()\n }\n }, 500)\n }\n }, POPUP_POLL_INTERVAL)\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = null\n }\n }\n\n /** Origines autorisées pour les messages postMessage */\n private static readonly ALLOWED_ORIGINS = [\n 'https://secure.cinetpay.net',\n 'https://secure.cinetpay.com',\n 'https://checkout.cinetpay.net',\n 'https://checkout.cinetpay.com',\n 'https://api.cinetpay.net',\n 'https://api.cinetpay.co',\n ]\n\n /** Écoute les messages postMessage de la popup CinetPay. */\n private listenForMessages(): void {\n this.messageHandler = (event: MessageEvent) => {\n if (!Checkout.ALLOWED_ORIGINS.some((o) => event.origin === o)) {\n return\n }\n\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n if (!Checkout.isRecord(data)) return\n\n const response = Checkout.buildPaymentResponse(data)\n const rawStatus = response.rawStatus?.trim().toUpperCase()\n if (response.status !== 'UNKNOWN' || (rawStatus && rawStatus !== 'OK')) {\n this.dispatchResponse(response)\n }\n\n const error = Checkout.findValue(data, ['error'])\n const code = Checkout.asString(Checkout.findValue(data, ['code']))\n if (error || code === 'ERROR') {\n const err: PaymentError = {\n code: code ?? 'UNKNOWN',\n message: Checkout.asString(Checkout.findValue(data, ['message'])) ?? Checkout.asString(error) ?? 'An error occurred',\n }\n this.logger.error('Payment error from popup', err)\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n }\n\n if (data.action === 'CLOSE' || data.type === 'close') {\n this.close()\n }\n } catch {\n // Ignorer les messages non-JSON\n }\n }\n\n window.addEventListener('message', this.messageHandler)\n }\n}\n","/** Préfixe des messages de log */\nconst PREFIX = '[CinetPay Seamless]'\n\n/**\n * Logger interne du SDK Seamless.\n * Désactivé par défaut. Activable via `debug: true` dans la config.\n *\n * Tous les logs utilisent le préfixe `[CinetPay Seamless]` pour être\n * facilement filtrables dans la console du navigateur.\n */\nexport class Logger {\n private enabled: boolean\n\n constructor(enabled: boolean) {\n this.enabled = enabled\n }\n\n /** Log de debug — requêtes, réponses, événements */\n debug(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.debug(`${PREFIX} ${message}`, data)\n } else {\n console.debug(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'avertissement — credentials exposés, statuts inattendus */\n warn(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.warn(`${PREFIX} ${message}`, data)\n } else {\n console.warn(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'erreur — erreurs API, timeouts, postMessage invalides */\n error(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.error(`${PREFIX} ${message}`, data)\n } else {\n console.error(`${PREFIX} ${message}`)\n }\n }\n}\n","import type { PaymentResponse, PaymentError } from './types'\n\n/**\n * Map des événements émis par le SDK Seamless.\n *\n * | Événement | Donnée | Quand |\n * |---|---|---|\n * | `ready` | — | Popup ouverte, passerelle prête |\n * | `payment.success` | `PaymentResponse` | Paiement accepté |\n * | `payment.failed` | `PaymentResponse` | Paiement refusé |\n * | `payment.pending` | `PaymentResponse` | En attente (PENDING, INITIATED, EXPIRED) |\n * | `close` | `{ status: string }` | Popup fermée, overlay retiré |\n * | `error` | `PaymentError` | Erreur technique |\n */\nexport interface EventMap {\n 'ready': void\n 'payment.success': PaymentResponse\n 'payment.failed': PaymentResponse\n 'payment.pending': PaymentResponse\n 'close': { status: string }\n 'error': PaymentError\n}\n\n/** Type des noms d'événements */\nexport type EventName = keyof EventMap\n\n/** Type d'un handler pour un événement donné */\ntype Handler<T> = T extends void ? () => void : (data: T) => void\n\n/**\n * Event emitter typé pour le SDK Seamless.\n *\n * Permet d'écouter les événements de paiement avec `on()` et `off()`,\n * style événementiel (`on('event', handler)`).\n *\n * @example\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n *\n * CinetPaySeamless.on('payment.failed', (data) => {\n * console.log('Refusé', data.transactionId)\n * })\n *\n * CinetPaySeamless.on('ready', () => {\n * console.log('Passerelle chargée')\n * })\n * ```\n */\nexport class EventEmitter {\n private listeners = new Map<string, Set<Function>>()\n\n /**\n * Enregistre un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction pour se désabonner (équivalent de `off(event, handler)`)\n *\n * @example\n * ```typescript\n * const unsubscribe = CinetPaySeamless.on('payment.success', (data) => { ... })\n * // Plus tard :\n * unsubscribe()\n * ```\n */\n on<E extends EventName>(event: E, handler: Handler<EventMap[E]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n\n // Retourne une fonction de désabonnement\n return () => this.off(event, handler)\n }\n\n /**\n * Supprime un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Référence du handler à supprimer\n */\n off<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n /**\n * Enregistre un handler qui ne sera appelé qu'une seule fois.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée une seule fois\n *\n * @example\n * ```typescript\n * CinetPaySeamless.once('payment.success', (data) => {\n * // Appelé une seule fois\n * })\n * ```\n */\n once<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n const wrapper = ((...args: unknown[]) => {\n this.off(event, wrapper as Handler<EventMap[E]>)\n ;(handler as Function)(...args)\n }) as Handler<EventMap[E]>\n this.on(event, wrapper)\n }\n\n /**\n * Émet un événement — appelle tous les handlers enregistrés.\n * @internal\n */\n emit<E extends EventName>(event: E, ...args: EventMap[E] extends void ? [] : [EventMap[E]]): void {\n const handlers = this.listeners.get(event)\n if (!handlers) return\n for (const handler of handlers) {\n try {\n (handler as Function)(...args)\n } catch {\n // Ne pas bloquer les autres handlers si un throw\n }\n }\n }\n\n /**\n * Supprime tous les handlers pour tous les événements.\n * @internal\n */\n removeAll(): void {\n this.listeners.clear()\n }\n}\n","import { Checkout } from './checkout'\nimport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n} from './types'\nimport { Logger } from './logger'\nimport { EventEmitter, type EventName, type EventMap } from './emitter'\n\nexport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n}\nexport type { EventName, EventMap } from './emitter'\n\n/** @internal URL de base de la passerelle de paiement sécurisée */\nconst SECURE_BASE_URL = 'https://secure.cinetpay.net'\n\n/** Récupère un callback en tolérant la casse pour les intégrations CDN/script tag. */\nfunction getCallback<T extends Function>(config: SeamlessConfig, names: string[]): T | undefined {\n const record = config as unknown as Record<string, unknown>\n\n for (const name of names) {\n const value = record[name]\n if (typeof value === 'function') return value as T\n }\n\n const lowerNames = new Set(names.map((name) => name.toLowerCase()))\n for (const [key, value] of Object.entries(record)) {\n if (lowerNames.has(key.toLowerCase()) && typeof value === 'function') {\n return value as T\n }\n }\n\n return undefined\n}\n\n/**\n * CinetPay Seamless — paiement inline via popup window.\n *\n * Affiche un overlay d'attente et ouvre la passerelle de paiement\n * CinetPay dans une popup. Le client reste sur votre page.\n *\n * Le `paymentToken` est obtenu côté serveur via l'API CinetPay :\n *\n * ```typescript\n * // Frontend\n * CinetPaySeamless.open({\n * paymentToken: 'abc123...',\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * })\n * ```\n *\n * Ou avec des event listeners (style événementiel) :\n *\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => { ... })\n * CinetPaySeamless.open({ paymentToken: 'abc123...' })\n * ```\n */\nexport const CinetPaySeamless = {\n /** Instance du checkout actuellement ouvert */\n _checkout: null as Checkout | null,\n\n /** Event emitter partagé */\n _emitter: new EventEmitter(),\n\n /**\n * Enregistre un listener d'événement (style événementiel).\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction de désabonnement\n *\n * @example\n * ```typescript\n * const unsub = CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n * unsub() // Se désabonner\n * ```\n */\n on<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): () => void {\n return this._emitter.on(event, handler)\n },\n\n /**\n * Supprime un listener.\n */\n off<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.off(event, handler)\n },\n\n /**\n * Enregistre un listener appelé une seule fois.\n */\n once<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.once(event, handler)\n },\n\n /**\n * Ouvre le checkout CinetPay.\n *\n * Affiche un overlay d'attente et ouvre la page de paiement dans une popup.\n * La popup est centrée sur l'écran (500x700px).\n *\n * @param config - Configuration avec `paymentToken` et callbacks optionnels\n * @throws {Error} Si le `paymentToken` a un format invalide\n *\n * @example\n * ```typescript\n * CinetPaySeamless.open({\n * paymentToken: 'abc123def456...',\n * debug: true,\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * onPaymentFailed: (data) => console.log('Refusé'),\n * onClose: ({ status }) => console.log('Fermé:', status),\n * })\n * ```\n */\n open(config: SeamlessConfig): void {\n this.close()\n\n const logger = new Logger(config.debug ?? false)\n logger.debug('CinetPaySeamless.open() called')\n\n // Validation du paymentToken\n if (!/^[a-zA-Z0-9_-]{10,128}$/.test(config.paymentToken)) {\n throw new Error('Invalid paymentToken format — expected alphanumeric string (10-128 chars)')\n }\n\n const paymentUrl = `${SECURE_BASE_URL}/checkout/${config.paymentToken}`\n\n this._checkout = new Checkout({\n logger,\n emitter: this._emitter,\n onReady: getCallback(config, ['onReady']),\n onPaymentSuccess: getCallback(config, [\n 'onPaymentSuccess',\n 'onSuccess',\n 'onPaymentsuccess',\n 'onpaymentSuccess',\n 'onpaymentsuccess',\n ]),\n onPaymentFailed: getCallback(config, [\n 'onPaymentFailed',\n 'onPaymentFail',\n 'onPaymentFailure',\n 'onFailed',\n 'onPaymentfailed',\n 'onpaymentFailed',\n 'onpaymentfailed',\n ]),\n onPaymentPending: getCallback(config, ['onPaymentPending', 'onPending']),\n onClose: getCallback(config, ['onClose']),\n onError: getCallback(config, ['onError']),\n })\n\n this._checkout.open(paymentUrl)\n },\n\n /**\n * Ferme le checkout (popup + overlay).\n */\n close(): void {\n this._checkout?.close()\n this._checkout = null\n },\n}\n\n// Auto-attach to window for CDN/script tag usage\nif (typeof window !== 'undefined') {\n (window as unknown as Record<string, unknown>).CinetPaySeamless = CinetPaySeamless\n}\n"],"names":["STYLES","_Checkout","options","paymentUrl","_a","overlay","value","data","records","key","child","keys","record","parsed","rawStatus","apiCode","normalized","status","response","_b","_c","styleEl","wrapper","waiting","spinner","title","msg","cancelBtn","left","top","err","event","o","error","code","Checkout","PREFIX","Logger","enabled","message","EventEmitter","handler","args","handlers","SECURE_BASE_URL","getCallback","config","names","name","lowerNames","CinetPaySeamless","logger"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- (function(l,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(l=typeof globalThis<"u"?globalThis:l||self,d(l.CinetPaySeamless={}))})(this,(function(l){"use strict";const d=`
1
+ (function(l,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(l=typeof globalThis<"u"?globalThis:l||self,p(l.CinetPaySeamless={}))})(this,(function(l){"use strict";const p=`
2
2
  .cp-seamless-overlay {
3
3
  position: fixed;
4
4
  inset: 0;
@@ -78,5 +78,5 @@
78
78
  color: #fff;
79
79
  }
80
80
 
81
- `,s=class s{constructor(e){this.overlay=null,this.popup=null,this.pollTimer=null,this.closeTimer=null,this.messageHandler=null,this.lastStatus="UNKNOWN",this.previousBodyOverflow="",this.logger=e.logger,this.emitter=e.emitter,this.onReadyCallback=e.onReady,this.onPaymentSuccessCallback=e.onPaymentSuccess,this.onPaymentFailedCallback=e.onPaymentFailed,this.onPaymentPendingCallback=e.onPaymentPending,this.onCloseCallback=e.onClose,this.onErrorCallback=e.onError}open(e){this.logger.debug("Opening checkout popup",{paymentUrl:e}),this.injectStyles(),this.createOverlay(),this.openPopup(e),this.popup&&(this.listenForMessages(),this.startPolling(),requestAnimationFrame(()=>{var t;(t=this.overlay)==null||t.classList.add("cp-visible")}),this.previousBodyOverflow=document.body.style.overflow,document.body.style.overflow="hidden")}close(){if(!this.closeTimer&&(this.stopPolling(),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null),this.popup&&!this.popup.closed&&this.popup.close(),this.popup=null,this.overlay)){const e=this.overlay;this.overlay=null,e.classList.remove("cp-visible"),this.closeTimer=setTimeout(()=>{var t;e.remove(),this.closeTimer=null,document.querySelector(".cp-seamless-overlay")||(document.body.style.overflow=this.previousBodyOverflow),this.logger.debug("Checkout closed",{lastStatus:this.lastStatus}),this.emitter.emit("close",{status:this.lastStatus}),(t=this.onCloseCallback)==null||t.call(this,{status:this.lastStatus})},300)}}static isRecord(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}static childRecords(e){const t=[];for(const n of["details","transaction","payment","result","data"]){const i=e[n];s.isRecord(i)&&t.push(i)}return t.push(e),t}static findValue(e,t){for(const n of s.childRecords(e))for(const i of t)if(n[i]!==void 0&&n[i]!==null)return n[i]}static asString(e){if(e!=null)return String(e)}static asNumber(e){if(typeof e=="number")return Number.isFinite(e)?e:0;if(typeof e=="string"){const t=Number(e.replace(/\s/g,""));return Number.isFinite(t)?t:0}return 0}static asOptionalNumber(e){if(e!=null){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(typeof e=="string"){const t=Number(e.trim());return Number.isFinite(t)?t:void 0}}}static normalizeStatus(e,t){const n=e==null?void 0:e.trim().toUpperCase().replace(/[\s-]+/g,"_");if(n){if(["ACCEPTED","SUCCESS","SUCCEEDED","SUCCESSFUL","PAID","VALIDATED","APPROVED"].includes(n))return"ACCEPTED";if(["REFUSED","FAILED","FAIL","FAILURE","DENIED","DECLINED","REJECTED","CANCELED","CANCELLED","CANCEL","INSUFFICIENT_BALANCE"].includes(n))return"REFUSED";if(["PENDING","INITIATED","EXPIRED"].includes(n))return n;if(["WAITING","PROCESSING","IN_PROGRESS"].includes(n))return"PENDING"}switch(t){case 100:return"ACCEPTED";case 2010:case 2005:return"REFUSED";case 2001:return"INITIATED";case 2002:return"PENDING";case 2003:return"EXPIRED"}return"UNKNOWN"}static buildPaymentResponse(e){const t=s.asString(s.findValue(e,["status","transaction_status","trans_status","payment_status"])),n=s.asOptionalNumber(s.findValue(e,["code"])),i=s.normalizeStatus(t,n);return{amount:s.asNumber(s.findValue(e,["amount"])),currency:s.asString(s.findValue(e,["currency"]))??"",status:i,rawStatus:t,apiCode:n,paymentMethod:s.asString(s.findValue(e,["payment_method","paymentMethod"]))??"",description:s.asString(s.findValue(e,["description","designation","message"]))??"",metadata:s.asString(s.findValue(e,["metadata","custom"])),operatorId:s.asString(s.findValue(e,["operator_id","operatorId"])),paymentDate:s.asString(s.findValue(e,["payment_date","paymentDate"])),transactionId:s.asString(s.findValue(e,["transaction_id","transactionId","merchant_transaction_id"]))??""}}dispatchResponse(e){var t,n,i;switch(this.lastStatus=e.status,this.logger.debug(`Payment response: ${e.status}`,{amount:e.amount,currency:e.currency,transactionId:e.transactionId,paymentMethod:e.paymentMethod}),e.status){case"ACCEPTED":this.logger.debug("Payment accepted"),this.emitter.emit("payment.success",e),(t=this.onPaymentSuccessCallback)==null||t.call(this,e);break;case"REFUSED":this.logger.warn("Payment refused"),this.emitter.emit("payment.failed",e),(n=this.onPaymentFailedCallback)==null||n.call(this,e);break;case"PENDING":case"INITIATED":case"EXPIRED":default:this.logger.debug(`Payment pending: ${e.status}`),this.emitter.emit("payment.pending",e),(i=this.onPaymentPendingCallback)==null||i.call(this,e);break}}injectStyles(){if(document.getElementById("cp-seamless-styles"))return;const e=document.createElement("style");e.id="cp-seamless-styles",e.textContent=d,document.head.appendChild(e)}createOverlay(){this.overlay=document.createElement("div"),this.overlay.className="cp-seamless-overlay";const e=document.createElement("div");e.className="cp-seamless-wrapper";const t=document.createElement("div");t.className="cp-seamless-waiting";const n=document.createElement("div");n.className="cp-seamless-spinner",t.appendChild(n);const i=document.createElement("p");i.className="cp-seamless-waiting-title",i.textContent="Paiement en cours...",t.appendChild(i);const o=document.createElement("p");o.className="cp-seamless-waiting-msg",o.textContent="Finalisez votre paiement dans la fenêtre CinetPay.",t.appendChild(o);const a=document.createElement("button");a.className="cp-seamless-cancel-btn",a.textContent="Annuler",a.addEventListener("click",()=>this.close()),t.appendChild(a),e.appendChild(t),this.overlay.appendChild(e),document.body.appendChild(this.overlay)}openPopup(e){var a,p;const i=Math.max(0,(screen.width-500)/2),o=Math.max(0,(screen.height-700)/2);if(this.popup=window.open(e,"CinetPayCheckout",`width=500,height=700,left=${i},top=${o},scrollbars=yes,resizable=yes`),!this.popup){this.logger.error("Popup blocked by browser");const u={code:"POPUP_BLOCKED",message:"La fenêtre de paiement a été bloquée par le navigateur. Autorisez les popups pour ce site."};this.emitter.emit("error",u),(a=this.onErrorCallback)==null||a.call(this,u),this.close();return}this.logger.debug("Popup opened"),this.emitter.emit("ready"),(p=this.onReadyCallback)==null||p.call(this)}startPolling(){this.pollTimer=setInterval(()=>{this.popup&&this.popup.closed&&(this.logger.debug("Popup closed by user or redirect"),this.stopPolling(),setTimeout(()=>{this.overlay&&this.close()},500))},500)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}listenForMessages(){this.messageHandler=e=>{var t,n;if(s.ALLOWED_ORIGINS.some(i=>e.origin===i))try{const i=typeof e.data=="string"?JSON.parse(e.data):e.data;if(!s.isRecord(i))return;const o=s.buildPaymentResponse(i),a=(t=o.rawStatus)==null?void 0:t.trim().toUpperCase();(o.status!=="UNKNOWN"||a&&a!=="OK")&&this.dispatchResponse(o);const p=s.findValue(i,["error"]),u=s.asString(s.findValue(i,["code"]));if(p||u==="ERROR"){const h={code:u??"UNKNOWN",message:s.asString(s.findValue(i,["message"]))??s.asString(p)??"An error occurred"};this.logger.error("Payment error from popup",h),this.emitter.emit("error",h),(n=this.onErrorCallback)==null||n.call(this,h)}(i.action==="CLOSE"||i.type==="close")&&this.close()}catch{}},window.addEventListener("message",this.messageHandler)}};s.ALLOWED_ORIGINS=["https://secure.cinetpay.net","https://secure.cinetpay.com","https://checkout.cinetpay.net","https://checkout.cinetpay.com","https://api.cinetpay.net","https://api.cinetpay.co"];let m=s;const c="[CinetPay Seamless]";class f{constructor(e){this.enabled=e}debug(e,t){this.enabled&&(t!==void 0?console.debug(`${c} ${e}`,t):console.debug(`${c} ${e}`))}warn(e,t){this.enabled&&(t!==void 0?console.warn(`${c} ${e}`,t):console.warn(`${c} ${e}`))}error(e,t){this.enabled&&(t!==void 0?console.error(`${c} ${e}`,t):console.error(`${c} ${e}`))}}class g{constructor(){this.listeners=new Map}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}off(e,t){var n;(n=this.listeners.get(e))==null||n.delete(t)}once(e,t){const n=((...i)=>{this.off(e,n),t(...i)});this.on(e,n)}emit(e,...t){const n=this.listeners.get(e);if(n)for(const i of n)try{i(...t)}catch{}}removeAll(){this.listeners.clear()}}const E="https://secure.cinetpay.net",y={_checkout:null,_emitter:new g,on(r,e){return this._emitter.on(r,e)},off(r,e){this._emitter.off(r,e)},once(r,e){this._emitter.once(r,e)},open(r){this.close();const e=new f(r.debug??!1);if(e.debug("CinetPaySeamless.open() called"),!/^[a-zA-Z0-9_-]{10,128}$/.test(r.paymentToken))throw new Error("Invalid paymentToken format — expected alphanumeric string (10-128 chars)");const t=`${E}/checkout/${r.paymentToken}`;this._checkout=new m({logger:e,emitter:this._emitter,onReady:r.onReady,onPaymentSuccess:r.onPaymentSuccess??r.onPaymentsuccess??r.onpaymentSuccess??r.onpaymentsuccess,onPaymentFailed:r.onPaymentFailed??r.onPaymentfailed??r.onpaymentFailed??r.onpaymentfailed,onPaymentPending:r.onPaymentPending,onClose:r.onClose,onError:r.onError}),this._checkout.open(t)},close(){var r;(r=this._checkout)==null||r.close(),this._checkout=null}};typeof window<"u"&&(window.CinetPaySeamless=y),l.CinetPaySeamless=y,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}));
81
+ `,i=class i{constructor(e){this.overlay=null,this.popup=null,this.pollTimer=null,this.closeTimer=null,this.messageHandler=null,this.lastStatus="UNKNOWN",this.previousBodyOverflow="",this.logger=e.logger,this.emitter=e.emitter,this.onReadyCallback=e.onReady,this.onPaymentSuccessCallback=e.onPaymentSuccess,this.onPaymentFailedCallback=e.onPaymentFailed,this.onPaymentPendingCallback=e.onPaymentPending,this.onCloseCallback=e.onClose,this.onErrorCallback=e.onError}open(e){this.logger.debug("Opening checkout popup",{paymentUrl:e}),this.injectStyles(),this.createOverlay(),this.openPopup(e),this.popup&&(this.listenForMessages(),this.startPolling(),requestAnimationFrame(()=>{var t;(t=this.overlay)==null||t.classList.add("cp-visible")}),this.previousBodyOverflow=document.body.style.overflow,document.body.style.overflow="hidden")}close(){if(!this.closeTimer&&(this.stopPolling(),this.messageHandler&&(window.removeEventListener("message",this.messageHandler),this.messageHandler=null),this.popup&&!this.popup.closed&&this.popup.close(),this.popup=null,this.overlay)){const e=this.overlay;this.overlay=null,e.classList.remove("cp-visible"),this.closeTimer=setTimeout(()=>{var t;e.remove(),this.closeTimer=null,document.querySelector(".cp-seamless-overlay")||(document.body.style.overflow=this.previousBodyOverflow),this.logger.debug("Checkout closed",{lastStatus:this.lastStatus}),this.emitter.emit("close",{status:this.lastStatus}),(t=this.onCloseCallback)==null||t.call(this,{status:this.lastStatus})},300)}}static isRecord(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}static childRecords(e){const t=[];for(const n of["details","transaction","payment","result","data"]){const s=e[n];i.isRecord(s)&&t.push(s)}return t.push(e),t}static findValue(e,t){for(const n of i.childRecords(e))for(const s of t)if(n[s]!==void 0&&n[s]!==null)return n[s]}static asString(e){if(e!=null)return String(e)}static asNumber(e){if(typeof e=="number")return Number.isFinite(e)?e:0;if(typeof e=="string"){const t=Number(e.replace(/\s/g,""));return Number.isFinite(t)?t:0}return 0}static asOptionalNumber(e){if(e!=null){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(typeof e=="string"){const t=Number(e.trim());return Number.isFinite(t)?t:void 0}}}static normalizeStatus(e,t){const n=e==null?void 0:e.trim().toUpperCase().replace(/[\s-]+/g,"_");if(n){if(["ACCEPTED","SUCCESS","SUCCEEDED","SUCCESSFUL","PAID","VALIDATED","APPROVED"].includes(n))return"ACCEPTED";if(["REFUSED","FAILED","FAIL","FAILURE","DENIED","DECLINED","REJECTED","CANCELED","CANCELLED","CANCEL","INSUFFICIENT_BALANCE"].includes(n))return"REFUSED";if(["PENDING","INITIATED","EXPIRED"].includes(n))return n;if(["WAITING","PROCESSING","IN_PROGRESS"].includes(n))return"PENDING"}switch(t){case 100:return"ACCEPTED";case 2010:case 2005:return"REFUSED";case 2001:return"INITIATED";case 2002:return"PENDING";case 2003:return"EXPIRED"}return"UNKNOWN"}static buildPaymentResponse(e){const t=i.asString(i.findValue(e,["status","transaction_status","trans_status","payment_status"])),n=i.asOptionalNumber(i.findValue(e,["code"])),s=i.normalizeStatus(t,n);return{amount:i.asNumber(i.findValue(e,["amount"])),currency:i.asString(i.findValue(e,["currency"]))??"",status:s,rawStatus:t,apiCode:n,paymentMethod:i.asString(i.findValue(e,["payment_method","paymentMethod"]))??"",description:i.asString(i.findValue(e,["description","designation","message"]))??"",metadata:i.asString(i.findValue(e,["metadata","custom"])),operatorId:i.asString(i.findValue(e,["operator_id","operatorId"])),paymentDate:i.asString(i.findValue(e,["payment_date","paymentDate"])),transactionId:i.asString(i.findValue(e,["transaction_id","transactionId","merchant_transaction_id"]))??""}}dispatchResponse(e){var t,n,s;switch(this.lastStatus=e.status,this.logger.debug(`Payment response: ${e.status}`,{amount:e.amount,currency:e.currency,transactionId:e.transactionId,paymentMethod:e.paymentMethod}),e.status){case"ACCEPTED":this.logger.debug("Payment accepted"),this.emitter.emit("payment.success",e),(t=this.onPaymentSuccessCallback)==null||t.call(this,e);break;case"REFUSED":this.logger.warn("Payment refused"),this.emitter.emit("payment.failed",e),(n=this.onPaymentFailedCallback)==null||n.call(this,e);break;case"PENDING":case"INITIATED":case"EXPIRED":default:this.logger.debug(`Payment pending: ${e.status}`),this.emitter.emit("payment.pending",e),(s=this.onPaymentPendingCallback)==null||s.call(this,e);break}}injectStyles(){if(document.getElementById("cp-seamless-styles"))return;const e=document.createElement("style");e.id="cp-seamless-styles",e.textContent=p,document.head.appendChild(e)}createOverlay(){this.overlay=document.createElement("div"),this.overlay.className="cp-seamless-overlay";const e=document.createElement("div");e.className="cp-seamless-wrapper";const t=document.createElement("div");t.className="cp-seamless-waiting";const n=document.createElement("div");n.className="cp-seamless-spinner",t.appendChild(n);const s=document.createElement("p");s.className="cp-seamless-waiting-title",s.textContent="Paiement en cours...",t.appendChild(s);const r=document.createElement("p");r.className="cp-seamless-waiting-msg",r.textContent="Finalisez votre paiement dans la fenêtre CinetPay.",t.appendChild(r);const a=document.createElement("button");a.className="cp-seamless-cancel-btn",a.textContent="Annuler",a.addEventListener("click",()=>this.close()),t.appendChild(a),e.appendChild(t),this.overlay.appendChild(e),document.body.appendChild(this.overlay)}openPopup(e){var a,u;const s=Math.max(0,(screen.width-500)/2),r=Math.max(0,(screen.height-700)/2);if(this.popup=window.open(e,"CinetPayCheckout",`width=500,height=700,left=${s},top=${r},scrollbars=yes,resizable=yes`),!this.popup){this.logger.error("Popup blocked by browser");const m={code:"POPUP_BLOCKED",message:"La fenêtre de paiement a été bloquée par le navigateur. Autorisez les popups pour ce site."};this.emitter.emit("error",m),(a=this.onErrorCallback)==null||a.call(this,m),this.close();return}this.logger.debug("Popup opened"),this.emitter.emit("ready"),(u=this.onReadyCallback)==null||u.call(this)}startPolling(){this.pollTimer=setInterval(()=>{this.popup&&this.popup.closed&&(this.logger.debug("Popup closed by user or redirect"),this.stopPolling(),setTimeout(()=>{this.overlay&&this.close()},500))},500)}stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null)}listenForMessages(){this.messageHandler=e=>{var t,n;if(i.ALLOWED_ORIGINS.some(s=>e.origin===s))try{const s=typeof e.data=="string"?JSON.parse(e.data):e.data;if(!i.isRecord(s))return;const r=i.buildPaymentResponse(s),a=(t=r.rawStatus)==null?void 0:t.trim().toUpperCase();(r.status!=="UNKNOWN"||a&&a!=="OK")&&this.dispatchResponse(r);const u=i.findValue(s,["error"]),m=i.asString(i.findValue(s,["code"]));if(u||m==="ERROR"){const y={code:m??"UNKNOWN",message:i.asString(i.findValue(s,["message"]))??i.asString(u)??"An error occurred"};this.logger.error("Payment error from popup",y),this.emitter.emit("error",y),(n=this.onErrorCallback)==null||n.call(this,y)}(s.action==="CLOSE"||s.type==="close")&&this.close()}catch{}},window.addEventListener("message",this.messageHandler)}};i.ALLOWED_ORIGINS=["https://secure.cinetpay.net","https://secure.cinetpay.com","https://checkout.cinetpay.net","https://checkout.cinetpay.com","https://api.cinetpay.net","https://api.cinetpay.co"];let h=i;const c="[CinetPay Seamless]";class g{constructor(e){this.enabled=e}debug(e,t){this.enabled&&(t!==void 0?console.debug(`${c} ${e}`,t):console.debug(`${c} ${e}`))}warn(e,t){this.enabled&&(t!==void 0?console.warn(`${c} ${e}`,t):console.warn(`${c} ${e}`))}error(e,t){this.enabled&&(t!==void 0?console.error(`${c} ${e}`,t):console.error(`${c} ${e}`))}}class b{constructor(){this.listeners=new Map}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}off(e,t){var n;(n=this.listeners.get(e))==null||n.delete(t)}once(e,t){const n=((...s)=>{this.off(e,n),t(...s)});this.on(e,n)}emit(e,...t){const n=this.listeners.get(e);if(n)for(const s of n)try{s(...t)}catch{}}removeAll(){this.listeners.clear()}}const E="https://secure.cinetpay.net";function d(o,e){const t=o;for(const s of e){const r=t[s];if(typeof r=="function")return r}const n=new Set(e.map(s=>s.toLowerCase()));for(const[s,r]of Object.entries(t))if(n.has(s.toLowerCase())&&typeof r=="function")return r}const f={_checkout:null,_emitter:new b,on(o,e){return this._emitter.on(o,e)},off(o,e){this._emitter.off(o,e)},once(o,e){this._emitter.once(o,e)},open(o){this.close();const e=new g(o.debug??!1);if(e.debug("CinetPaySeamless.open() called"),!/^[a-zA-Z0-9_-]{10,128}$/.test(o.paymentToken))throw new Error("Invalid paymentToken format — expected alphanumeric string (10-128 chars)");const t=`${E}/checkout/${o.paymentToken}`;this._checkout=new h({logger:e,emitter:this._emitter,onReady:d(o,["onReady"]),onPaymentSuccess:d(o,["onPaymentSuccess","onSuccess","onPaymentsuccess","onpaymentSuccess","onpaymentsuccess"]),onPaymentFailed:d(o,["onPaymentFailed","onPaymentFail","onPaymentFailure","onFailed","onPaymentfailed","onpaymentFailed","onpaymentfailed"]),onPaymentPending:d(o,["onPaymentPending","onPending"]),onClose:d(o,["onClose"]),onError:d(o,["onError"])}),this._checkout.open(t)},close(){var o;(o=this._checkout)==null||o.close(),this._checkout=null}};typeof window<"u"&&(window.CinetPaySeamless=f),l.CinetPaySeamless=f,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}));
82
82
  //# sourceMappingURL=cinetpay-seamless.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cinetpay-seamless.umd.cjs","sources":["../src/styles.ts","../src/checkout.ts","../src/logger.ts","../src/emitter.ts","../src/index.ts"],"sourcesContent":["/**\n * Styles CSS du checkout CinetPay Seamless (mode popup).\n */\nexport const STYLES = `\n.cp-seamless-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n background: rgba(0, 0, 0, 0.7);\n backdrop-filter: blur(6px);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.cp-seamless-overlay.cp-visible {\n opacity: 1;\n}\n\n.cp-seamless-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Waiting screen (pendant que la popup est ouverte) */\n.cp-seamless-waiting {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n text-align: center;\n padding: 40px;\n}\n\n.cp-seamless-waiting-title {\n color: #fff;\n font-size: 22px;\n font-weight: 600;\n margin: 0;\n}\n\n.cp-seamless-waiting-msg {\n color: rgba(255, 255, 255, 0.7);\n font-size: 15px;\n margin: 0;\n max-width: 320px;\n line-height: 1.5;\n}\n\n.cp-seamless-spinner {\n width: 48px;\n height: 48px;\n border: 3px solid rgba(255, 255, 255, 0.2);\n border-top-color: #e8530e;\n border-radius: 50%;\n animation: cp-spin 0.8s linear infinite;\n}\n\n@keyframes cp-spin {\n to { transform: rotate(360deg); }\n}\n\n.cp-seamless-cancel-btn {\n margin-top: 12px;\n padding: 10px 28px;\n background: rgba(255, 255, 255, 0.12);\n color: rgba(255, 255, 255, 0.8);\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.cp-seamless-cancel-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n color: #fff;\n}\n\n`\n","import { STYLES } from './styles'\nimport type { PaymentResponse, PaymentError, PaymentStatus } from './types'\nimport { Logger } from './logger'\nimport { EventEmitter } from './emitter'\n\n/** @internal Options du constructeur Checkout */\nexport interface CheckoutOptions {\n onReady?: () => void\n onPaymentSuccess?: (data: PaymentResponse) => void\n onPaymentFailed?: (data: PaymentResponse) => void\n onPaymentPending?: (data: PaymentResponse) => void\n onClose?: (data: { status: string }) => void\n onError?: (error: PaymentError) => void\n logger: Logger\n emitter: EventEmitter\n}\n\n/** @internal Intervalle de polling pour vérifier si la popup est fermée */\nconst POPUP_POLL_INTERVAL = 500\n\n/**\n * Gère le checkout CinetPay via une popup window + overlay.\n *\n * Flow :\n * 1. Affiche un overlay sombre avec un message d'attente\n * 2. Ouvre la page de checkout dans une popup (window.open)\n * 3. Poll la popup pour détecter sa fermeture\n * 4. Écoute les messages postMessage de la popup\n * 5. Ferme l'overlay et dispatche les callbacks\n *\n * @internal Utilisé par {@link CinetPaySeamless}. Ne pas instancier directement.\n */\nexport class Checkout {\n private overlay: HTMLDivElement | null = null\n private popup: Window | null = null\n private pollTimer: ReturnType<typeof setInterval> | null = null\n private closeTimer: ReturnType<typeof setTimeout> | null = null\n private messageHandler: ((event: MessageEvent) => void) | null = null\n private lastStatus = 'UNKNOWN'\n private previousBodyOverflow = ''\n\n private onReadyCallback?: () => void\n private onPaymentSuccessCallback?: (data: PaymentResponse) => void\n private onPaymentFailedCallback?: (data: PaymentResponse) => void\n private onPaymentPendingCallback?: (data: PaymentResponse) => void\n private onCloseCallback?: (data: { status: string }) => void\n private onErrorCallback?: (error: PaymentError) => void\n private logger: Logger\n private emitter: EventEmitter\n\n constructor(options: CheckoutOptions) {\n this.logger = options.logger\n this.emitter = options.emitter\n this.onReadyCallback = options.onReady\n this.onPaymentSuccessCallback = options.onPaymentSuccess\n this.onPaymentFailedCallback = options.onPaymentFailed\n this.onPaymentPendingCallback = options.onPaymentPending\n this.onCloseCallback = options.onClose\n this.onErrorCallback = options.onError\n }\n\n /**\n * Ouvre la popup de checkout et affiche l'overlay d'attente.\n *\n * @param paymentUrl - URL complète de la page de checkout CinetPay\n */\n open(paymentUrl: string): void {\n this.logger.debug('Opening checkout popup', { paymentUrl })\n this.injectStyles()\n this.createOverlay()\n this.openPopup(paymentUrl)\n if (!this.popup) return\n\n this.listenForMessages()\n this.startPolling()\n\n requestAnimationFrame(() => {\n this.overlay?.classList.add('cp-visible')\n })\n\n this.previousBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n\n /**\n * Ferme la popup et l'overlay.\n */\n close(): void {\n if (this.closeTimer) return\n\n this.stopPolling()\n\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler)\n this.messageHandler = null\n }\n\n if (this.popup && !this.popup.closed) {\n this.popup.close()\n }\n this.popup = null\n\n if (this.overlay) {\n const overlay = this.overlay\n this.overlay = null\n overlay.classList.remove('cp-visible')\n this.closeTimer = setTimeout(() => {\n overlay.remove()\n this.closeTimer = null\n\n if (!document.querySelector('.cp-seamless-overlay')) {\n document.body.style.overflow = this.previousBodyOverflow\n }\n\n this.logger.debug('Checkout closed', { lastStatus: this.lastStatus })\n this.emitter.emit('close', { status: this.lastStatus })\n this.onCloseCallback?.({ status: this.lastStatus })\n }, 300)\n }\n }\n\n private static isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n }\n\n private static childRecords(data: Record<string, unknown>): Record<string, unknown>[] {\n const records: Record<string, unknown>[] = []\n for (const key of ['details', 'transaction', 'payment', 'result', 'data']) {\n const child = data[key]\n if (Checkout.isRecord(child)) records.push(child)\n }\n records.push(data)\n return records\n }\n\n private static findValue(data: Record<string, unknown>, keys: string[]): unknown {\n for (const record of Checkout.childRecords(data)) {\n for (const key of keys) {\n if (record[key] !== undefined && record[key] !== null) return record[key]\n }\n }\n return undefined\n }\n\n private static asString(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined\n return String(value)\n }\n\n private static asNumber(value: unknown): number {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/\\s/g, ''))\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n }\n\n private static asOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value === 'string') {\n const parsed = Number(value.trim())\n return Number.isFinite(parsed) ? parsed : undefined\n }\n return undefined\n }\n\n private static normalizeStatus(rawStatus?: string, apiCode?: number): PaymentStatus {\n const normalized = rawStatus?.trim().toUpperCase().replace(/[\\s-]+/g, '_')\n\n if (normalized) {\n if (['ACCEPTED', 'SUCCESS', 'SUCCEEDED', 'SUCCESSFUL', 'PAID', 'VALIDATED', 'APPROVED'].includes(normalized)) {\n return 'ACCEPTED'\n }\n if ([\n 'REFUSED',\n 'FAILED',\n 'FAIL',\n 'FAILURE',\n 'DENIED',\n 'DECLINED',\n 'REJECTED',\n 'CANCELED',\n 'CANCELLED',\n 'CANCEL',\n 'INSUFFICIENT_BALANCE',\n ].includes(normalized)) {\n return 'REFUSED'\n }\n if (['PENDING', 'INITIATED', 'EXPIRED'].includes(normalized)) {\n return normalized as PaymentStatus\n }\n if (['WAITING', 'PROCESSING', 'IN_PROGRESS'].includes(normalized)) {\n return 'PENDING'\n }\n }\n\n switch (apiCode) {\n case 100:\n return 'ACCEPTED'\n case 2010:\n case 2005:\n return 'REFUSED'\n case 2001:\n return 'INITIATED'\n case 2002:\n return 'PENDING'\n case 2003:\n return 'EXPIRED'\n }\n\n return 'UNKNOWN'\n }\n\n private static buildPaymentResponse(data: Record<string, unknown>): PaymentResponse {\n const rawStatus = Checkout.asString(Checkout.findValue(data, [\n 'status',\n 'transaction_status',\n 'trans_status',\n 'payment_status',\n ]))\n const apiCode = Checkout.asOptionalNumber(Checkout.findValue(data, ['code']))\n const status = Checkout.normalizeStatus(rawStatus, apiCode)\n\n return {\n amount: Checkout.asNumber(Checkout.findValue(data, ['amount'])),\n currency: Checkout.asString(Checkout.findValue(data, ['currency'])) ?? '',\n status,\n rawStatus,\n apiCode,\n paymentMethod: Checkout.asString(Checkout.findValue(data, ['payment_method', 'paymentMethod'])) ?? '',\n description: Checkout.asString(Checkout.findValue(data, ['description', 'designation', 'message'])) ?? '',\n metadata: Checkout.asString(Checkout.findValue(data, ['metadata', 'custom'])),\n operatorId: Checkout.asString(Checkout.findValue(data, ['operator_id', 'operatorId'])),\n paymentDate: Checkout.asString(Checkout.findValue(data, ['payment_date', 'paymentDate'])),\n transactionId: Checkout.asString(Checkout.findValue(data, ['transaction_id', 'transactionId', 'merchant_transaction_id'])) ?? '',\n }\n }\n\n /** Dispatche la réponse vers le bon callback selon le statut. */\n private dispatchResponse(response: PaymentResponse): void {\n this.lastStatus = response.status\n\n this.logger.debug(`Payment response: ${response.status}`, {\n amount: response.amount,\n currency: response.currency,\n transactionId: response.transactionId,\n paymentMethod: response.paymentMethod,\n })\n\n switch (response.status) {\n case 'ACCEPTED':\n this.logger.debug('Payment accepted')\n this.emitter.emit('payment.success', response)\n this.onPaymentSuccessCallback?.(response)\n break\n case 'REFUSED':\n this.logger.warn('Payment refused')\n this.emitter.emit('payment.failed', response)\n this.onPaymentFailedCallback?.(response)\n break\n case 'PENDING':\n case 'INITIATED':\n case 'EXPIRED':\n default:\n this.logger.debug(`Payment pending: ${response.status}`)\n this.emitter.emit('payment.pending', response)\n this.onPaymentPendingCallback?.(response)\n break\n }\n }\n\n private injectStyles(): void {\n if (document.getElementById('cp-seamless-styles')) return\n const styleEl = document.createElement('style')\n styleEl.id = 'cp-seamless-styles'\n styleEl.textContent = STYLES\n document.head.appendChild(styleEl)\n }\n\n private createOverlay(): void {\n this.overlay = document.createElement('div')\n this.overlay.className = 'cp-seamless-overlay'\n\n const wrapper = document.createElement('div')\n wrapper.className = 'cp-seamless-wrapper'\n\n // Spinner + message\n const waiting = document.createElement('div')\n waiting.className = 'cp-seamless-waiting'\n\n const spinner = document.createElement('div')\n spinner.className = 'cp-seamless-spinner'\n waiting.appendChild(spinner)\n\n const title = document.createElement('p')\n title.className = 'cp-seamless-waiting-title'\n title.textContent = 'Paiement en cours...'\n waiting.appendChild(title)\n\n const msg = document.createElement('p')\n msg.className = 'cp-seamless-waiting-msg'\n msg.textContent = 'Finalisez votre paiement dans la fenêtre CinetPay.'\n waiting.appendChild(msg)\n\n // Bouton fermer\n const cancelBtn = document.createElement('button')\n cancelBtn.className = 'cp-seamless-cancel-btn'\n cancelBtn.textContent = 'Annuler'\n cancelBtn.addEventListener('click', () => this.close())\n waiting.appendChild(cancelBtn)\n\n wrapper.appendChild(waiting)\n this.overlay.appendChild(wrapper)\n document.body.appendChild(this.overlay)\n }\n\n /**\n * Ouvre la popup centrée sur l'écran.\n */\n private openPopup(paymentUrl: string): void {\n const width = 500\n const height = 700\n const left = Math.max(0, (screen.width - width) / 2)\n const top = Math.max(0, (screen.height - height) / 2)\n\n this.popup = window.open(\n paymentUrl,\n 'CinetPayCheckout',\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`,\n )\n\n if (!this.popup) {\n this.logger.error('Popup blocked by browser')\n const err: PaymentError = {\n code: 'POPUP_BLOCKED',\n message: 'La fenêtre de paiement a été bloquée par le navigateur. Autorisez les popups pour ce site.',\n }\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n this.close()\n return\n }\n\n this.logger.debug('Popup opened')\n this.emitter.emit('ready')\n this.onReadyCallback?.()\n }\n\n /**\n * Poll toutes les 500ms pour détecter si la popup a été fermée\n * (par l'utilisateur ou après redirection).\n */\n private startPolling(): void {\n this.pollTimer = setInterval(() => {\n if (this.popup && this.popup.closed) {\n this.logger.debug('Popup closed by user or redirect')\n this.stopPolling()\n\n // Laisser un court délai pour que le postMessage arrive avant le close\n setTimeout(() => {\n if (this.overlay) {\n this.close()\n }\n }, 500)\n }\n }, POPUP_POLL_INTERVAL)\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = null\n }\n }\n\n /** Origines autorisées pour les messages postMessage */\n private static readonly ALLOWED_ORIGINS = [\n 'https://secure.cinetpay.net',\n 'https://secure.cinetpay.com',\n 'https://checkout.cinetpay.net',\n 'https://checkout.cinetpay.com',\n 'https://api.cinetpay.net',\n 'https://api.cinetpay.co',\n ]\n\n /** Écoute les messages postMessage de la popup CinetPay. */\n private listenForMessages(): void {\n this.messageHandler = (event: MessageEvent) => {\n if (!Checkout.ALLOWED_ORIGINS.some((o) => event.origin === o)) {\n return\n }\n\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n if (!Checkout.isRecord(data)) return\n\n const response = Checkout.buildPaymentResponse(data)\n const rawStatus = response.rawStatus?.trim().toUpperCase()\n if (response.status !== 'UNKNOWN' || (rawStatus && rawStatus !== 'OK')) {\n this.dispatchResponse(response)\n }\n\n const error = Checkout.findValue(data, ['error'])\n const code = Checkout.asString(Checkout.findValue(data, ['code']))\n if (error || code === 'ERROR') {\n const err: PaymentError = {\n code: code ?? 'UNKNOWN',\n message: Checkout.asString(Checkout.findValue(data, ['message'])) ?? Checkout.asString(error) ?? 'An error occurred',\n }\n this.logger.error('Payment error from popup', err)\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n }\n\n if (data.action === 'CLOSE' || data.type === 'close') {\n this.close()\n }\n } catch {\n // Ignorer les messages non-JSON\n }\n }\n\n window.addEventListener('message', this.messageHandler)\n }\n}\n","/** Préfixe des messages de log */\nconst PREFIX = '[CinetPay Seamless]'\n\n/**\n * Logger interne du SDK Seamless.\n * Désactivé par défaut. Activable via `debug: true` dans la config.\n *\n * Tous les logs utilisent le préfixe `[CinetPay Seamless]` pour être\n * facilement filtrables dans la console du navigateur.\n */\nexport class Logger {\n private enabled: boolean\n\n constructor(enabled: boolean) {\n this.enabled = enabled\n }\n\n /** Log de debug — requêtes, réponses, événements */\n debug(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.debug(`${PREFIX} ${message}`, data)\n } else {\n console.debug(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'avertissement — credentials exposés, statuts inattendus */\n warn(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.warn(`${PREFIX} ${message}`, data)\n } else {\n console.warn(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'erreur — erreurs API, timeouts, postMessage invalides */\n error(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.error(`${PREFIX} ${message}`, data)\n } else {\n console.error(`${PREFIX} ${message}`)\n }\n }\n}\n","import type { PaymentResponse, PaymentError } from './types'\n\n/**\n * Map des événements émis par le SDK Seamless.\n *\n * | Événement | Donnée | Quand |\n * |---|---|---|\n * | `ready` | — | Popup ouverte, passerelle prête |\n * | `payment.success` | `PaymentResponse` | Paiement accepté |\n * | `payment.failed` | `PaymentResponse` | Paiement refusé |\n * | `payment.pending` | `PaymentResponse` | En attente (PENDING, INITIATED, EXPIRED) |\n * | `close` | `{ status: string }` | Popup fermée, overlay retiré |\n * | `error` | `PaymentError` | Erreur technique |\n */\nexport interface EventMap {\n 'ready': void\n 'payment.success': PaymentResponse\n 'payment.failed': PaymentResponse\n 'payment.pending': PaymentResponse\n 'close': { status: string }\n 'error': PaymentError\n}\n\n/** Type des noms d'événements */\nexport type EventName = keyof EventMap\n\n/** Type d'un handler pour un événement donné */\ntype Handler<T> = T extends void ? () => void : (data: T) => void\n\n/**\n * Event emitter typé pour le SDK Seamless.\n *\n * Permet d'écouter les événements de paiement avec `on()` et `off()`,\n * style événementiel (`on('event', handler)`).\n *\n * @example\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n *\n * CinetPaySeamless.on('payment.failed', (data) => {\n * console.log('Refusé', data.transactionId)\n * })\n *\n * CinetPaySeamless.on('ready', () => {\n * console.log('Passerelle chargée')\n * })\n * ```\n */\nexport class EventEmitter {\n private listeners = new Map<string, Set<Function>>()\n\n /**\n * Enregistre un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction pour se désabonner (équivalent de `off(event, handler)`)\n *\n * @example\n * ```typescript\n * const unsubscribe = CinetPaySeamless.on('payment.success', (data) => { ... })\n * // Plus tard :\n * unsubscribe()\n * ```\n */\n on<E extends EventName>(event: E, handler: Handler<EventMap[E]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n\n // Retourne une fonction de désabonnement\n return () => this.off(event, handler)\n }\n\n /**\n * Supprime un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Référence du handler à supprimer\n */\n off<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n /**\n * Enregistre un handler qui ne sera appelé qu'une seule fois.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée une seule fois\n *\n * @example\n * ```typescript\n * CinetPaySeamless.once('payment.success', (data) => {\n * // Appelé une seule fois\n * })\n * ```\n */\n once<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n const wrapper = ((...args: unknown[]) => {\n this.off(event, wrapper as Handler<EventMap[E]>)\n ;(handler as Function)(...args)\n }) as Handler<EventMap[E]>\n this.on(event, wrapper)\n }\n\n /**\n * Émet un événement — appelle tous les handlers enregistrés.\n * @internal\n */\n emit<E extends EventName>(event: E, ...args: EventMap[E] extends void ? [] : [EventMap[E]]): void {\n const handlers = this.listeners.get(event)\n if (!handlers) return\n for (const handler of handlers) {\n try {\n (handler as Function)(...args)\n } catch {\n // Ne pas bloquer les autres handlers si un throw\n }\n }\n }\n\n /**\n * Supprime tous les handlers pour tous les événements.\n * @internal\n */\n removeAll(): void {\n this.listeners.clear()\n }\n}\n","import { Checkout } from './checkout'\nimport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n} from './types'\nimport { Logger } from './logger'\nimport { EventEmitter, type EventName, type EventMap } from './emitter'\n\nexport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n}\nexport type { EventName, EventMap } from './emitter'\n\n/** @internal URL de base de la passerelle de paiement sécurisée */\nconst SECURE_BASE_URL = 'https://secure.cinetpay.net'\n\n/**\n * CinetPay Seamless — paiement inline via popup window.\n *\n * Affiche un overlay d'attente et ouvre la passerelle de paiement\n * CinetPay dans une popup. Le client reste sur votre page.\n *\n * Le `paymentToken` est obtenu côté serveur via l'API CinetPay :\n *\n * ```typescript\n * // Frontend\n * CinetPaySeamless.open({\n * paymentToken: 'abc123...',\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * })\n * ```\n *\n * Ou avec des event listeners (style événementiel) :\n *\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => { ... })\n * CinetPaySeamless.open({ paymentToken: 'abc123...' })\n * ```\n */\nexport const CinetPaySeamless = {\n /** Instance du checkout actuellement ouvert */\n _checkout: null as Checkout | null,\n\n /** Event emitter partagé */\n _emitter: new EventEmitter(),\n\n /**\n * Enregistre un listener d'événement (style événementiel).\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction de désabonnement\n *\n * @example\n * ```typescript\n * const unsub = CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n * unsub() // Se désabonner\n * ```\n */\n on<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): () => void {\n return this._emitter.on(event, handler)\n },\n\n /**\n * Supprime un listener.\n */\n off<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.off(event, handler)\n },\n\n /**\n * Enregistre un listener appelé une seule fois.\n */\n once<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.once(event, handler)\n },\n\n /**\n * Ouvre le checkout CinetPay.\n *\n * Affiche un overlay d'attente et ouvre la page de paiement dans une popup.\n * La popup est centrée sur l'écran (500x700px).\n *\n * @param config - Configuration avec `paymentToken` et callbacks optionnels\n * @throws {Error} Si le `paymentToken` a un format invalide\n *\n * @example\n * ```typescript\n * CinetPaySeamless.open({\n * paymentToken: 'abc123def456...',\n * debug: true,\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * onPaymentFailed: (data) => console.log('Refusé'),\n * onClose: ({ status }) => console.log('Fermé:', status),\n * })\n * ```\n */\n open(config: SeamlessConfig): void {\n this.close()\n\n const logger = new Logger(config.debug ?? false)\n logger.debug('CinetPaySeamless.open() called')\n\n // Validation du paymentToken\n if (!/^[a-zA-Z0-9_-]{10,128}$/.test(config.paymentToken)) {\n throw new Error('Invalid paymentToken format — expected alphanumeric string (10-128 chars)')\n }\n\n const paymentUrl = `${SECURE_BASE_URL}/checkout/${config.paymentToken}`\n\n this._checkout = new Checkout({\n logger,\n emitter: this._emitter,\n onReady: config.onReady,\n onPaymentSuccess: config.onPaymentSuccess\n ?? config.onPaymentsuccess\n ?? config.onpaymentSuccess\n ?? config.onpaymentsuccess,\n onPaymentFailed: config.onPaymentFailed\n ?? config.onPaymentfailed\n ?? config.onpaymentFailed\n ?? config.onpaymentfailed,\n onPaymentPending: config.onPaymentPending,\n onClose: config.onClose,\n onError: config.onError,\n })\n\n this._checkout.open(paymentUrl)\n },\n\n /**\n * Ferme le checkout (popup + overlay).\n */\n close(): void {\n this._checkout?.close()\n this._checkout = null\n },\n}\n\n// Auto-attach to window for CDN/script tag usage\nif (typeof window !== 'undefined') {\n (window as unknown as Record<string, unknown>).CinetPaySeamless = CinetPaySeamless\n}\n"],"names":["STYLES","_Checkout","options","paymentUrl","_a","overlay","value","data","records","key","child","keys","record","parsed","rawStatus","apiCode","normalized","status","response","_b","_c","styleEl","wrapper","waiting","spinner","title","msg","cancelBtn","left","top","err","event","o","error","code","Checkout","PREFIX","Logger","enabled","message","EventEmitter","handler","args","handlers","SECURE_BASE_URL","CinetPaySeamless","config","logger"],"mappings":"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"}
1
+ {"version":3,"file":"cinetpay-seamless.umd.cjs","sources":["../src/styles.ts","../src/checkout.ts","../src/logger.ts","../src/emitter.ts","../src/index.ts"],"sourcesContent":["/**\n * Styles CSS du checkout CinetPay Seamless (mode popup).\n */\nexport const STYLES = `\n.cp-seamless-overlay {\n position: fixed;\n inset: 0;\n z-index: 999999;\n background: rgba(0, 0, 0, 0.7);\n backdrop-filter: blur(6px);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.cp-seamless-overlay.cp-visible {\n opacity: 1;\n}\n\n.cp-seamless-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Waiting screen (pendant que la popup est ouverte) */\n.cp-seamless-waiting {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 20px;\n text-align: center;\n padding: 40px;\n}\n\n.cp-seamless-waiting-title {\n color: #fff;\n font-size: 22px;\n font-weight: 600;\n margin: 0;\n}\n\n.cp-seamless-waiting-msg {\n color: rgba(255, 255, 255, 0.7);\n font-size: 15px;\n margin: 0;\n max-width: 320px;\n line-height: 1.5;\n}\n\n.cp-seamless-spinner {\n width: 48px;\n height: 48px;\n border: 3px solid rgba(255, 255, 255, 0.2);\n border-top-color: #e8530e;\n border-radius: 50%;\n animation: cp-spin 0.8s linear infinite;\n}\n\n@keyframes cp-spin {\n to { transform: rotate(360deg); }\n}\n\n.cp-seamless-cancel-btn {\n margin-top: 12px;\n padding: 10px 28px;\n background: rgba(255, 255, 255, 0.12);\n color: rgba(255, 255, 255, 0.8);\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: 8px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.cp-seamless-cancel-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n color: #fff;\n}\n\n`\n","import { STYLES } from './styles'\nimport type { PaymentResponse, PaymentError, PaymentStatus } from './types'\nimport { Logger } from './logger'\nimport { EventEmitter } from './emitter'\n\n/** @internal Options du constructeur Checkout */\nexport interface CheckoutOptions {\n onReady?: () => void\n onPaymentSuccess?: (data: PaymentResponse) => void\n onPaymentFailed?: (data: PaymentResponse) => void\n onPaymentPending?: (data: PaymentResponse) => void\n onClose?: (data: { status: string }) => void\n onError?: (error: PaymentError) => void\n logger: Logger\n emitter: EventEmitter\n}\n\n/** @internal Intervalle de polling pour vérifier si la popup est fermée */\nconst POPUP_POLL_INTERVAL = 500\n\n/**\n * Gère le checkout CinetPay via une popup window + overlay.\n *\n * Flow :\n * 1. Affiche un overlay sombre avec un message d'attente\n * 2. Ouvre la page de checkout dans une popup (window.open)\n * 3. Poll la popup pour détecter sa fermeture\n * 4. Écoute les messages postMessage de la popup\n * 5. Ferme l'overlay et dispatche les callbacks\n *\n * @internal Utilisé par {@link CinetPaySeamless}. Ne pas instancier directement.\n */\nexport class Checkout {\n private overlay: HTMLDivElement | null = null\n private popup: Window | null = null\n private pollTimer: ReturnType<typeof setInterval> | null = null\n private closeTimer: ReturnType<typeof setTimeout> | null = null\n private messageHandler: ((event: MessageEvent) => void) | null = null\n private lastStatus = 'UNKNOWN'\n private previousBodyOverflow = ''\n\n private onReadyCallback?: () => void\n private onPaymentSuccessCallback?: (data: PaymentResponse) => void\n private onPaymentFailedCallback?: (data: PaymentResponse) => void\n private onPaymentPendingCallback?: (data: PaymentResponse) => void\n private onCloseCallback?: (data: { status: string }) => void\n private onErrorCallback?: (error: PaymentError) => void\n private logger: Logger\n private emitter: EventEmitter\n\n constructor(options: CheckoutOptions) {\n this.logger = options.logger\n this.emitter = options.emitter\n this.onReadyCallback = options.onReady\n this.onPaymentSuccessCallback = options.onPaymentSuccess\n this.onPaymentFailedCallback = options.onPaymentFailed\n this.onPaymentPendingCallback = options.onPaymentPending\n this.onCloseCallback = options.onClose\n this.onErrorCallback = options.onError\n }\n\n /**\n * Ouvre la popup de checkout et affiche l'overlay d'attente.\n *\n * @param paymentUrl - URL complète de la page de checkout CinetPay\n */\n open(paymentUrl: string): void {\n this.logger.debug('Opening checkout popup', { paymentUrl })\n this.injectStyles()\n this.createOverlay()\n this.openPopup(paymentUrl)\n if (!this.popup) return\n\n this.listenForMessages()\n this.startPolling()\n\n requestAnimationFrame(() => {\n this.overlay?.classList.add('cp-visible')\n })\n\n this.previousBodyOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n\n /**\n * Ferme la popup et l'overlay.\n */\n close(): void {\n if (this.closeTimer) return\n\n this.stopPolling()\n\n if (this.messageHandler) {\n window.removeEventListener('message', this.messageHandler)\n this.messageHandler = null\n }\n\n if (this.popup && !this.popup.closed) {\n this.popup.close()\n }\n this.popup = null\n\n if (this.overlay) {\n const overlay = this.overlay\n this.overlay = null\n overlay.classList.remove('cp-visible')\n this.closeTimer = setTimeout(() => {\n overlay.remove()\n this.closeTimer = null\n\n if (!document.querySelector('.cp-seamless-overlay')) {\n document.body.style.overflow = this.previousBodyOverflow\n }\n\n this.logger.debug('Checkout closed', { lastStatus: this.lastStatus })\n this.emitter.emit('close', { status: this.lastStatus })\n this.onCloseCallback?.({ status: this.lastStatus })\n }, 300)\n }\n }\n\n private static isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n }\n\n private static childRecords(data: Record<string, unknown>): Record<string, unknown>[] {\n const records: Record<string, unknown>[] = []\n for (const key of ['details', 'transaction', 'payment', 'result', 'data']) {\n const child = data[key]\n if (Checkout.isRecord(child)) records.push(child)\n }\n records.push(data)\n return records\n }\n\n private static findValue(data: Record<string, unknown>, keys: string[]): unknown {\n for (const record of Checkout.childRecords(data)) {\n for (const key of keys) {\n if (record[key] !== undefined && record[key] !== null) return record[key]\n }\n }\n return undefined\n }\n\n private static asString(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined\n return String(value)\n }\n\n private static asNumber(value: unknown): number {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0\n if (typeof value === 'string') {\n const parsed = Number(value.replace(/\\s/g, ''))\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n }\n\n private static asOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null) return undefined\n if (typeof value === 'number') return Number.isFinite(value) ? value : undefined\n if (typeof value === 'string') {\n const parsed = Number(value.trim())\n return Number.isFinite(parsed) ? parsed : undefined\n }\n return undefined\n }\n\n private static normalizeStatus(rawStatus?: string, apiCode?: number): PaymentStatus {\n const normalized = rawStatus?.trim().toUpperCase().replace(/[\\s-]+/g, '_')\n\n if (normalized) {\n if (['ACCEPTED', 'SUCCESS', 'SUCCEEDED', 'SUCCESSFUL', 'PAID', 'VALIDATED', 'APPROVED'].includes(normalized)) {\n return 'ACCEPTED'\n }\n if ([\n 'REFUSED',\n 'FAILED',\n 'FAIL',\n 'FAILURE',\n 'DENIED',\n 'DECLINED',\n 'REJECTED',\n 'CANCELED',\n 'CANCELLED',\n 'CANCEL',\n 'INSUFFICIENT_BALANCE',\n ].includes(normalized)) {\n return 'REFUSED'\n }\n if (['PENDING', 'INITIATED', 'EXPIRED'].includes(normalized)) {\n return normalized as PaymentStatus\n }\n if (['WAITING', 'PROCESSING', 'IN_PROGRESS'].includes(normalized)) {\n return 'PENDING'\n }\n }\n\n switch (apiCode) {\n case 100:\n return 'ACCEPTED'\n case 2010:\n case 2005:\n return 'REFUSED'\n case 2001:\n return 'INITIATED'\n case 2002:\n return 'PENDING'\n case 2003:\n return 'EXPIRED'\n }\n\n return 'UNKNOWN'\n }\n\n private static buildPaymentResponse(data: Record<string, unknown>): PaymentResponse {\n const rawStatus = Checkout.asString(Checkout.findValue(data, [\n 'status',\n 'transaction_status',\n 'trans_status',\n 'payment_status',\n ]))\n const apiCode = Checkout.asOptionalNumber(Checkout.findValue(data, ['code']))\n const status = Checkout.normalizeStatus(rawStatus, apiCode)\n\n return {\n amount: Checkout.asNumber(Checkout.findValue(data, ['amount'])),\n currency: Checkout.asString(Checkout.findValue(data, ['currency'])) ?? '',\n status,\n rawStatus,\n apiCode,\n paymentMethod: Checkout.asString(Checkout.findValue(data, ['payment_method', 'paymentMethod'])) ?? '',\n description: Checkout.asString(Checkout.findValue(data, ['description', 'designation', 'message'])) ?? '',\n metadata: Checkout.asString(Checkout.findValue(data, ['metadata', 'custom'])),\n operatorId: Checkout.asString(Checkout.findValue(data, ['operator_id', 'operatorId'])),\n paymentDate: Checkout.asString(Checkout.findValue(data, ['payment_date', 'paymentDate'])),\n transactionId: Checkout.asString(Checkout.findValue(data, ['transaction_id', 'transactionId', 'merchant_transaction_id'])) ?? '',\n }\n }\n\n /** Dispatche la réponse vers le bon callback selon le statut. */\n private dispatchResponse(response: PaymentResponse): void {\n this.lastStatus = response.status\n\n this.logger.debug(`Payment response: ${response.status}`, {\n amount: response.amount,\n currency: response.currency,\n transactionId: response.transactionId,\n paymentMethod: response.paymentMethod,\n })\n\n switch (response.status) {\n case 'ACCEPTED':\n this.logger.debug('Payment accepted')\n this.emitter.emit('payment.success', response)\n this.onPaymentSuccessCallback?.(response)\n break\n case 'REFUSED':\n this.logger.warn('Payment refused')\n this.emitter.emit('payment.failed', response)\n this.onPaymentFailedCallback?.(response)\n break\n case 'PENDING':\n case 'INITIATED':\n case 'EXPIRED':\n default:\n this.logger.debug(`Payment pending: ${response.status}`)\n this.emitter.emit('payment.pending', response)\n this.onPaymentPendingCallback?.(response)\n break\n }\n }\n\n private injectStyles(): void {\n if (document.getElementById('cp-seamless-styles')) return\n const styleEl = document.createElement('style')\n styleEl.id = 'cp-seamless-styles'\n styleEl.textContent = STYLES\n document.head.appendChild(styleEl)\n }\n\n private createOverlay(): void {\n this.overlay = document.createElement('div')\n this.overlay.className = 'cp-seamless-overlay'\n\n const wrapper = document.createElement('div')\n wrapper.className = 'cp-seamless-wrapper'\n\n // Spinner + message\n const waiting = document.createElement('div')\n waiting.className = 'cp-seamless-waiting'\n\n const spinner = document.createElement('div')\n spinner.className = 'cp-seamless-spinner'\n waiting.appendChild(spinner)\n\n const title = document.createElement('p')\n title.className = 'cp-seamless-waiting-title'\n title.textContent = 'Paiement en cours...'\n waiting.appendChild(title)\n\n const msg = document.createElement('p')\n msg.className = 'cp-seamless-waiting-msg'\n msg.textContent = 'Finalisez votre paiement dans la fenêtre CinetPay.'\n waiting.appendChild(msg)\n\n // Bouton fermer\n const cancelBtn = document.createElement('button')\n cancelBtn.className = 'cp-seamless-cancel-btn'\n cancelBtn.textContent = 'Annuler'\n cancelBtn.addEventListener('click', () => this.close())\n waiting.appendChild(cancelBtn)\n\n wrapper.appendChild(waiting)\n this.overlay.appendChild(wrapper)\n document.body.appendChild(this.overlay)\n }\n\n /**\n * Ouvre la popup centrée sur l'écran.\n */\n private openPopup(paymentUrl: string): void {\n const width = 500\n const height = 700\n const left = Math.max(0, (screen.width - width) / 2)\n const top = Math.max(0, (screen.height - height) / 2)\n\n this.popup = window.open(\n paymentUrl,\n 'CinetPayCheckout',\n `width=${width},height=${height},left=${left},top=${top},scrollbars=yes,resizable=yes`,\n )\n\n if (!this.popup) {\n this.logger.error('Popup blocked by browser')\n const err: PaymentError = {\n code: 'POPUP_BLOCKED',\n message: 'La fenêtre de paiement a été bloquée par le navigateur. Autorisez les popups pour ce site.',\n }\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n this.close()\n return\n }\n\n this.logger.debug('Popup opened')\n this.emitter.emit('ready')\n this.onReadyCallback?.()\n }\n\n /**\n * Poll toutes les 500ms pour détecter si la popup a été fermée\n * (par l'utilisateur ou après redirection).\n */\n private startPolling(): void {\n this.pollTimer = setInterval(() => {\n if (this.popup && this.popup.closed) {\n this.logger.debug('Popup closed by user or redirect')\n this.stopPolling()\n\n // Laisser un court délai pour que le postMessage arrive avant le close\n setTimeout(() => {\n if (this.overlay) {\n this.close()\n }\n }, 500)\n }\n }, POPUP_POLL_INTERVAL)\n }\n\n private stopPolling(): void {\n if (this.pollTimer) {\n clearInterval(this.pollTimer)\n this.pollTimer = null\n }\n }\n\n /** Origines autorisées pour les messages postMessage */\n private static readonly ALLOWED_ORIGINS = [\n 'https://secure.cinetpay.net',\n 'https://secure.cinetpay.com',\n 'https://checkout.cinetpay.net',\n 'https://checkout.cinetpay.com',\n 'https://api.cinetpay.net',\n 'https://api.cinetpay.co',\n ]\n\n /** Écoute les messages postMessage de la popup CinetPay. */\n private listenForMessages(): void {\n this.messageHandler = (event: MessageEvent) => {\n if (!Checkout.ALLOWED_ORIGINS.some((o) => event.origin === o)) {\n return\n }\n\n try {\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : event.data\n if (!Checkout.isRecord(data)) return\n\n const response = Checkout.buildPaymentResponse(data)\n const rawStatus = response.rawStatus?.trim().toUpperCase()\n if (response.status !== 'UNKNOWN' || (rawStatus && rawStatus !== 'OK')) {\n this.dispatchResponse(response)\n }\n\n const error = Checkout.findValue(data, ['error'])\n const code = Checkout.asString(Checkout.findValue(data, ['code']))\n if (error || code === 'ERROR') {\n const err: PaymentError = {\n code: code ?? 'UNKNOWN',\n message: Checkout.asString(Checkout.findValue(data, ['message'])) ?? Checkout.asString(error) ?? 'An error occurred',\n }\n this.logger.error('Payment error from popup', err)\n this.emitter.emit('error', err)\n this.onErrorCallback?.(err)\n }\n\n if (data.action === 'CLOSE' || data.type === 'close') {\n this.close()\n }\n } catch {\n // Ignorer les messages non-JSON\n }\n }\n\n window.addEventListener('message', this.messageHandler)\n }\n}\n","/** Préfixe des messages de log */\nconst PREFIX = '[CinetPay Seamless]'\n\n/**\n * Logger interne du SDK Seamless.\n * Désactivé par défaut. Activable via `debug: true` dans la config.\n *\n * Tous les logs utilisent le préfixe `[CinetPay Seamless]` pour être\n * facilement filtrables dans la console du navigateur.\n */\nexport class Logger {\n private enabled: boolean\n\n constructor(enabled: boolean) {\n this.enabled = enabled\n }\n\n /** Log de debug — requêtes, réponses, événements */\n debug(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.debug(`${PREFIX} ${message}`, data)\n } else {\n console.debug(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'avertissement — credentials exposés, statuts inattendus */\n warn(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.warn(`${PREFIX} ${message}`, data)\n } else {\n console.warn(`${PREFIX} ${message}`)\n }\n }\n\n /** Log d'erreur — erreurs API, timeouts, postMessage invalides */\n error(message: string, data?: unknown): void {\n if (!this.enabled) return\n if (data !== undefined) {\n console.error(`${PREFIX} ${message}`, data)\n } else {\n console.error(`${PREFIX} ${message}`)\n }\n }\n}\n","import type { PaymentResponse, PaymentError } from './types'\n\n/**\n * Map des événements émis par le SDK Seamless.\n *\n * | Événement | Donnée | Quand |\n * |---|---|---|\n * | `ready` | — | Popup ouverte, passerelle prête |\n * | `payment.success` | `PaymentResponse` | Paiement accepté |\n * | `payment.failed` | `PaymentResponse` | Paiement refusé |\n * | `payment.pending` | `PaymentResponse` | En attente (PENDING, INITIATED, EXPIRED) |\n * | `close` | `{ status: string }` | Popup fermée, overlay retiré |\n * | `error` | `PaymentError` | Erreur technique |\n */\nexport interface EventMap {\n 'ready': void\n 'payment.success': PaymentResponse\n 'payment.failed': PaymentResponse\n 'payment.pending': PaymentResponse\n 'close': { status: string }\n 'error': PaymentError\n}\n\n/** Type des noms d'événements */\nexport type EventName = keyof EventMap\n\n/** Type d'un handler pour un événement donné */\ntype Handler<T> = T extends void ? () => void : (data: T) => void\n\n/**\n * Event emitter typé pour le SDK Seamless.\n *\n * Permet d'écouter les événements de paiement avec `on()` et `off()`,\n * style événementiel (`on('event', handler)`).\n *\n * @example\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n *\n * CinetPaySeamless.on('payment.failed', (data) => {\n * console.log('Refusé', data.transactionId)\n * })\n *\n * CinetPaySeamless.on('ready', () => {\n * console.log('Passerelle chargée')\n * })\n * ```\n */\nexport class EventEmitter {\n private listeners = new Map<string, Set<Function>>()\n\n /**\n * Enregistre un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction pour se désabonner (équivalent de `off(event, handler)`)\n *\n * @example\n * ```typescript\n * const unsubscribe = CinetPaySeamless.on('payment.success', (data) => { ... })\n * // Plus tard :\n * unsubscribe()\n * ```\n */\n on<E extends EventName>(event: E, handler: Handler<EventMap[E]>): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n\n // Retourne une fonction de désabonnement\n return () => this.off(event, handler)\n }\n\n /**\n * Supprime un handler pour un événement.\n *\n * @param event - Nom de l'événement\n * @param handler - Référence du handler à supprimer\n */\n off<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n /**\n * Enregistre un handler qui ne sera appelé qu'une seule fois.\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée une seule fois\n *\n * @example\n * ```typescript\n * CinetPaySeamless.once('payment.success', (data) => {\n * // Appelé une seule fois\n * })\n * ```\n */\n once<E extends EventName>(event: E, handler: Handler<EventMap[E]>): void {\n const wrapper = ((...args: unknown[]) => {\n this.off(event, wrapper as Handler<EventMap[E]>)\n ;(handler as Function)(...args)\n }) as Handler<EventMap[E]>\n this.on(event, wrapper)\n }\n\n /**\n * Émet un événement — appelle tous les handlers enregistrés.\n * @internal\n */\n emit<E extends EventName>(event: E, ...args: EventMap[E] extends void ? [] : [EventMap[E]]): void {\n const handlers = this.listeners.get(event)\n if (!handlers) return\n for (const handler of handlers) {\n try {\n (handler as Function)(...args)\n } catch {\n // Ne pas bloquer les autres handlers si un throw\n }\n }\n }\n\n /**\n * Supprime tous les handlers pour tous les événements.\n * @internal\n */\n removeAll(): void {\n this.listeners.clear()\n }\n}\n","import { Checkout } from './checkout'\nimport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n} from './types'\nimport { Logger } from './logger'\nimport { EventEmitter, type EventName, type EventMap } from './emitter'\n\nexport type {\n SeamlessConfig,\n PaymentResponse,\n PaymentError,\n PaymentStatus,\n}\nexport type { EventName, EventMap } from './emitter'\n\n/** @internal URL de base de la passerelle de paiement sécurisée */\nconst SECURE_BASE_URL = 'https://secure.cinetpay.net'\n\n/** Récupère un callback en tolérant la casse pour les intégrations CDN/script tag. */\nfunction getCallback<T extends Function>(config: SeamlessConfig, names: string[]): T | undefined {\n const record = config as unknown as Record<string, unknown>\n\n for (const name of names) {\n const value = record[name]\n if (typeof value === 'function') return value as T\n }\n\n const lowerNames = new Set(names.map((name) => name.toLowerCase()))\n for (const [key, value] of Object.entries(record)) {\n if (lowerNames.has(key.toLowerCase()) && typeof value === 'function') {\n return value as T\n }\n }\n\n return undefined\n}\n\n/**\n * CinetPay Seamless — paiement inline via popup window.\n *\n * Affiche un overlay d'attente et ouvre la passerelle de paiement\n * CinetPay dans une popup. Le client reste sur votre page.\n *\n * Le `paymentToken` est obtenu côté serveur via l'API CinetPay :\n *\n * ```typescript\n * // Frontend\n * CinetPaySeamless.open({\n * paymentToken: 'abc123...',\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * })\n * ```\n *\n * Ou avec des event listeners (style événementiel) :\n *\n * ```typescript\n * CinetPaySeamless.on('payment.success', (data) => { ... })\n * CinetPaySeamless.open({ paymentToken: 'abc123...' })\n * ```\n */\nexport const CinetPaySeamless = {\n /** Instance du checkout actuellement ouvert */\n _checkout: null as Checkout | null,\n\n /** Event emitter partagé */\n _emitter: new EventEmitter(),\n\n /**\n * Enregistre un listener d'événement (style événementiel).\n *\n * @param event - Nom de l'événement\n * @param handler - Fonction appelée quand l'événement est émis\n * @returns Fonction de désabonnement\n *\n * @example\n * ```typescript\n * const unsub = CinetPaySeamless.on('payment.success', (data) => {\n * console.log('Payé !', data.amount, data.currency)\n * })\n * unsub() // Se désabonner\n * ```\n */\n on<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): () => void {\n return this._emitter.on(event, handler)\n },\n\n /**\n * Supprime un listener.\n */\n off<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.off(event, handler)\n },\n\n /**\n * Enregistre un listener appelé une seule fois.\n */\n once<E extends EventName>(\n event: E,\n handler: EventMap[E] extends void ? () => void : (data: EventMap[E]) => void,\n ): void {\n this._emitter.once(event, handler)\n },\n\n /**\n * Ouvre le checkout CinetPay.\n *\n * Affiche un overlay d'attente et ouvre la page de paiement dans une popup.\n * La popup est centrée sur l'écran (500x700px).\n *\n * @param config - Configuration avec `paymentToken` et callbacks optionnels\n * @throws {Error} Si le `paymentToken` a un format invalide\n *\n * @example\n * ```typescript\n * CinetPaySeamless.open({\n * paymentToken: 'abc123def456...',\n * debug: true,\n * onPaymentSuccess: (data) => console.log('Payé !', data.amount),\n * onPaymentFailed: (data) => console.log('Refusé'),\n * onClose: ({ status }) => console.log('Fermé:', status),\n * })\n * ```\n */\n open(config: SeamlessConfig): void {\n this.close()\n\n const logger = new Logger(config.debug ?? false)\n logger.debug('CinetPaySeamless.open() called')\n\n // Validation du paymentToken\n if (!/^[a-zA-Z0-9_-]{10,128}$/.test(config.paymentToken)) {\n throw new Error('Invalid paymentToken format — expected alphanumeric string (10-128 chars)')\n }\n\n const paymentUrl = `${SECURE_BASE_URL}/checkout/${config.paymentToken}`\n\n this._checkout = new Checkout({\n logger,\n emitter: this._emitter,\n onReady: getCallback(config, ['onReady']),\n onPaymentSuccess: getCallback(config, [\n 'onPaymentSuccess',\n 'onSuccess',\n 'onPaymentsuccess',\n 'onpaymentSuccess',\n 'onpaymentsuccess',\n ]),\n onPaymentFailed: getCallback(config, [\n 'onPaymentFailed',\n 'onPaymentFail',\n 'onPaymentFailure',\n 'onFailed',\n 'onPaymentfailed',\n 'onpaymentFailed',\n 'onpaymentfailed',\n ]),\n onPaymentPending: getCallback(config, ['onPaymentPending', 'onPending']),\n onClose: getCallback(config, ['onClose']),\n onError: getCallback(config, ['onError']),\n })\n\n this._checkout.open(paymentUrl)\n },\n\n /**\n * Ferme le checkout (popup + overlay).\n */\n close(): void {\n this._checkout?.close()\n this._checkout = null\n },\n}\n\n// Auto-attach to window for CDN/script tag usage\nif (typeof window !== 'undefined') {\n (window as unknown as Record<string, unknown>).CinetPaySeamless = CinetPaySeamless\n}\n"],"names":["STYLES","_Checkout","options","paymentUrl","_a","overlay","value","data","records","key","child","keys","record","parsed","rawStatus","apiCode","normalized","status","response","_b","_c","styleEl","wrapper","waiting","spinner","title","msg","cancelBtn","left","top","err","event","o","error","code","Checkout","PREFIX","Logger","enabled","message","EventEmitter","handler","args","handlers","SECURE_BASE_URL","getCallback","config","names","name","lowerNames","CinetPaySeamless","logger"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEvE,YAAY,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,GACd,CAAA;AACD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAKpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,gBAAgB;IAC3B,+CAA+C;eAC5B,QAAQ,GAAG,IAAI;IAElC,4BAA4B;;IAG5B;;;;;;;;;;;;;;OAcG;OACA,CAAC,SAAS,SAAS,SACb,CAAC,WACC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3E,MAAM,IAAI;IAIb;;OAEG;QACC,CAAC,SAAS,SAAS,SACd,CAAC,WACC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3E,IAAI;IAIP;;OAEG;SACE,CAAC,SAAS,SAAS,SACf,CAAC,WACC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3E,IAAI;IAIP;;;;;;;;;;;;;;;;;;;OAmBG;iBACU,cAAc,GAAG,IAAI;IAiClC;;OAEG;aACM,IAAI;CAId,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEvE,YAAY,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,aAAa,GACd,CAAA;AACD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAwBpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,gBAAgB;IAC3B,+CAA+C;eAC5B,QAAQ,GAAG,IAAI;IAElC,4BAA4B;;IAG5B;;;;;;;;;;;;;;OAcG;OACA,CAAC,SAAS,SAAS,SACb,CAAC,WACC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3E,MAAM,IAAI;IAIb;;OAEG;QACC,CAAC,SAAS,SAAS,SACd,CAAC,WACC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3E,IAAI;IAIP;;OAEG;SACE,CAAC,SAAS,SAAS,SACf,CAAC,WACC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAC3E,IAAI;IAIP;;;;;;;;;;;;;;;;;;;OAmBG;iBACU,cAAc,GAAG,IAAI;IAyClC;;OAEG;aACM,IAAI;CAId,CAAA"}
package/dist/types.d.ts CHANGED
@@ -22,6 +22,10 @@ export interface SeamlessConfig {
22
22
  onReady?: () => void;
23
23
  /** Callback : paiement accepté (statut ACCEPTED) */
24
24
  onPaymentSuccess?: (data: PaymentResponse) => void;
25
+ /**
26
+ * @deprecated Utilisez `onPaymentSuccess`. Alias pratique pour les intégrations CDN.
27
+ */
28
+ onSuccess?: (data: PaymentResponse) => void;
25
29
  /**
26
30
  * @deprecated Utilisez `onPaymentSuccess`. Conservé pour les intégrations vanilla JS
27
31
  * qui ont utilisé une casse incorrecte.
@@ -39,6 +43,18 @@ export interface SeamlessConfig {
39
43
  onpaymentsuccess?: (data: PaymentResponse) => void;
40
44
  /** Callback : paiement refusé (statut REFUSED) */
41
45
  onPaymentFailed?: (data: PaymentResponse) => void;
46
+ /**
47
+ * @deprecated Utilisez `onPaymentFailed`. Alias pratique pour les intégrations CDN.
48
+ */
49
+ onFailed?: (data: PaymentResponse) => void;
50
+ /**
51
+ * @deprecated Utilisez `onPaymentFailed`. Alias pratique pour les intégrations CDN.
52
+ */
53
+ onPaymentFail?: (data: PaymentResponse) => void;
54
+ /**
55
+ * @deprecated Utilisez `onPaymentFailed`. Alias pratique pour les intégrations CDN.
56
+ */
57
+ onPaymentFailure?: (data: PaymentResponse) => void;
42
58
  /**
43
59
  * @deprecated Utilisez `onPaymentFailed`. Conservé pour les intégrations vanilla JS
44
60
  * qui ont utilisé une casse incorrecte.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,kDAAkD;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5C,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,sCAAsC;AACtC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,GACT,SAAS,CAAA;AAEb,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,yBAAyB;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAA;IACrB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAA;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC7B,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAC3C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,kDAAkD;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAC/C;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IACjD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAClD,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5C,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,sCAAsC;AACtC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,SAAS,GACT,SAAS,GACT,WAAW,GACX,SAAS,GACT,SAAS,CAAA;AAEb,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,yBAAyB;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAA;IACrB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAA;CAChB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cinetpay-seamless",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "CinetPay Seamless — inline payment modal for web applications. No redirect, no iframe. Works with any framework.",
5
5
  "type": "module",
6
6
  "main": "./dist/cinetpay-seamless.umd.cjs",