tupay 0.5.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.
Files changed (116) hide show
  1. package/README.md +358 -0
  2. package/dist/cjs/client.d.ts +48 -0
  3. package/dist/cjs/client.d.ts.map +1 -0
  4. package/dist/cjs/client.js +165 -0
  5. package/dist/cjs/client.js.map +1 -0
  6. package/dist/cjs/errors.d.ts +66 -0
  7. package/dist/cjs/errors.d.ts.map +1 -0
  8. package/dist/cjs/errors.js +105 -0
  9. package/dist/cjs/errors.js.map +1 -0
  10. package/dist/cjs/index.d.ts +86 -0
  11. package/dist/cjs/index.d.ts.map +1 -0
  12. package/dist/cjs/index.js +110 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/liste.d.ts +54 -0
  15. package/dist/cjs/liste.d.ts.map +1 -0
  16. package/dist/cjs/liste.js +36 -0
  17. package/dist/cjs/liste.js.map +1 -0
  18. package/dist/cjs/package.json +3 -0
  19. package/dist/cjs/resources/events.d.ts +64 -0
  20. package/dist/cjs/resources/events.d.ts.map +1 -0
  21. package/dist/cjs/resources/events.js +104 -0
  22. package/dist/cjs/resources/events.js.map +1 -0
  23. package/dist/cjs/resources/merchants.d.ts +19 -0
  24. package/dist/cjs/resources/merchants.d.ts.map +1 -0
  25. package/dist/cjs/resources/merchants.js +29 -0
  26. package/dist/cjs/resources/merchants.js.map +1 -0
  27. package/dist/cjs/resources/payment-intents.d.ts +29 -0
  28. package/dist/cjs/resources/payment-intents.d.ts.map +1 -0
  29. package/dist/cjs/resources/payment-intents.js +22 -0
  30. package/dist/cjs/resources/payment-intents.js.map +1 -0
  31. package/dist/cjs/resources/payment-links.d.ts +38 -0
  32. package/dist/cjs/resources/payment-links.d.ts.map +1 -0
  33. package/dist/cjs/resources/payment-links.js +56 -0
  34. package/dist/cjs/resources/payment-links.js.map +1 -0
  35. package/dist/cjs/resources/refunds.d.ts +27 -0
  36. package/dist/cjs/resources/refunds.d.ts.map +1 -0
  37. package/dist/cjs/resources/refunds.js +33 -0
  38. package/dist/cjs/resources/refunds.js.map +1 -0
  39. package/dist/cjs/resources/test-helpers.d.ts +42 -0
  40. package/dist/cjs/resources/test-helpers.d.ts.map +1 -0
  41. package/dist/cjs/resources/test-helpers.js +50 -0
  42. package/dist/cjs/resources/test-helpers.js.map +1 -0
  43. package/dist/cjs/resources/transactions.d.ts +29 -0
  44. package/dist/cjs/resources/transactions.d.ts.map +1 -0
  45. package/dist/cjs/resources/transactions.js +65 -0
  46. package/dist/cjs/resources/transactions.js.map +1 -0
  47. package/dist/cjs/resources/webhook-endpoints.d.ts +43 -0
  48. package/dist/cjs/resources/webhook-endpoints.d.ts.map +1 -0
  49. package/dist/cjs/resources/webhook-endpoints.js +71 -0
  50. package/dist/cjs/resources/webhook-endpoints.js.map +1 -0
  51. package/dist/cjs/types.d.ts +166 -0
  52. package/dist/cjs/types.d.ts.map +1 -0
  53. package/dist/cjs/types.js +10 -0
  54. package/dist/cjs/types.js.map +1 -0
  55. package/dist/cjs/webhooks.d.ts +31 -0
  56. package/dist/cjs/webhooks.d.ts.map +1 -0
  57. package/dist/cjs/webhooks.js +81 -0
  58. package/dist/cjs/webhooks.js.map +1 -0
  59. package/dist/esm/client.d.ts +48 -0
  60. package/dist/esm/client.d.ts.map +1 -0
  61. package/dist/esm/client.js +161 -0
  62. package/dist/esm/client.js.map +1 -0
  63. package/dist/esm/errors.d.ts +66 -0
  64. package/dist/esm/errors.d.ts.map +1 -0
  65. package/dist/esm/errors.js +90 -0
  66. package/dist/esm/errors.js.map +1 -0
  67. package/dist/esm/index.d.ts +86 -0
  68. package/dist/esm/index.d.ts.map +1 -0
  69. package/dist/esm/index.js +90 -0
  70. package/dist/esm/index.js.map +1 -0
  71. package/dist/esm/liste.d.ts +54 -0
  72. package/dist/esm/liste.d.ts.map +1 -0
  73. package/dist/esm/liste.js +32 -0
  74. package/dist/esm/liste.js.map +1 -0
  75. package/dist/esm/package.json +3 -0
  76. package/dist/esm/resources/events.d.ts +64 -0
  77. package/dist/esm/resources/events.d.ts.map +1 -0
  78. package/dist/esm/resources/events.js +100 -0
  79. package/dist/esm/resources/events.js.map +1 -0
  80. package/dist/esm/resources/merchants.d.ts +19 -0
  81. package/dist/esm/resources/merchants.d.ts.map +1 -0
  82. package/dist/esm/resources/merchants.js +25 -0
  83. package/dist/esm/resources/merchants.js.map +1 -0
  84. package/dist/esm/resources/payment-intents.d.ts +29 -0
  85. package/dist/esm/resources/payment-intents.d.ts.map +1 -0
  86. package/dist/esm/resources/payment-intents.js +18 -0
  87. package/dist/esm/resources/payment-intents.js.map +1 -0
  88. package/dist/esm/resources/payment-links.d.ts +38 -0
  89. package/dist/esm/resources/payment-links.d.ts.map +1 -0
  90. package/dist/esm/resources/payment-links.js +52 -0
  91. package/dist/esm/resources/payment-links.js.map +1 -0
  92. package/dist/esm/resources/refunds.d.ts +27 -0
  93. package/dist/esm/resources/refunds.d.ts.map +1 -0
  94. package/dist/esm/resources/refunds.js +29 -0
  95. package/dist/esm/resources/refunds.js.map +1 -0
  96. package/dist/esm/resources/test-helpers.d.ts +42 -0
  97. package/dist/esm/resources/test-helpers.d.ts.map +1 -0
  98. package/dist/esm/resources/test-helpers.js +46 -0
  99. package/dist/esm/resources/test-helpers.js.map +1 -0
  100. package/dist/esm/resources/transactions.d.ts +29 -0
  101. package/dist/esm/resources/transactions.d.ts.map +1 -0
  102. package/dist/esm/resources/transactions.js +61 -0
  103. package/dist/esm/resources/transactions.js.map +1 -0
  104. package/dist/esm/resources/webhook-endpoints.d.ts +43 -0
  105. package/dist/esm/resources/webhook-endpoints.d.ts.map +1 -0
  106. package/dist/esm/resources/webhook-endpoints.js +67 -0
  107. package/dist/esm/resources/webhook-endpoints.js.map +1 -0
  108. package/dist/esm/types.d.ts +166 -0
  109. package/dist/esm/types.d.ts.map +1 -0
  110. package/dist/esm/types.js +9 -0
  111. package/dist/esm/types.js.map +1 -0
  112. package/dist/esm/webhooks.d.ts +31 -0
  113. package/dist/esm/webhooks.d.ts.map +1 -0
  114. package/dist/esm/webhooks.js +77 -0
  115. package/dist/esm/webhooks.js.map +1 -0
  116. package/package.json +53 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Hiérarchie d'erreurs du SDK.
3
+ *
4
+ * Toutes héritent de `TupayError` : un `catch (err)` unique suffit, et
5
+ * `err instanceof TupayRateLimitError` permet d'affiner si besoin.
6
+ *
7
+ * `code` est le code machine renvoyé par l'API (`validation_error`,
8
+ * `livemode_mismatch`, …). C'est lui qu'il faut tester — le `message`
9
+ * est en français, destiné à un humain, et peut changer sans préavis.
10
+ */
11
+ export class TupayError extends Error {
12
+ /** Code machine stable renvoyé par l'API. */
13
+ code;
14
+ /** Statut HTTP, absent si l'erreur est survenue avant toute réponse. */
15
+ statusCode;
16
+ /** Identifiant de requête, à citer au support. */
17
+ requestId;
18
+ constructor(message, options) {
19
+ super(message, { cause: options.cause });
20
+ this.name = new.target.name;
21
+ this.code = options.code;
22
+ this.statusCode = options.statusCode;
23
+ this.requestId = options.requestId;
24
+ }
25
+ }
26
+ /** 401 — clé absente, invalide ou révoquée. */
27
+ export class TupayAuthenticationError extends TupayError {
28
+ }
29
+ /** 403 — opération interdite dans ce contexte (dont `livemode_mismatch`). */
30
+ export class TupayPermissionError extends TupayError {
31
+ }
32
+ /** 404 — ressource inexistante ou hors du périmètre de la clé. */
33
+ export class TupayNotFoundError extends TupayError {
34
+ }
35
+ /** 400 / 422 — corps de requête invalide. */
36
+ export class TupayValidationError extends TupayError {
37
+ }
38
+ /** 409 — état incompatible (déjà remboursé, limite atteinte). */
39
+ export class TupayConflictError extends TupayError {
40
+ }
41
+ /** 429 — 100 req/min par marchand dépassées. */
42
+ export class TupayRateLimitError extends TupayError {
43
+ }
44
+ /** 5xx — incident côté Tupay. */
45
+ export class TupayApiError extends TupayError {
46
+ }
47
+ /** 502 — le prestataire bancaire a refusé l'opération. */
48
+ export class TupayBaasError extends TupayError {
49
+ }
50
+ /** Panne réseau, DNS, TLS ou dépassement du timeout. Aucune réponse reçue. */
51
+ export class TupayConnectionError extends TupayError {
52
+ constructor(message, cause) {
53
+ super(message, { code: 'connection_error', cause });
54
+ }
55
+ }
56
+ /** La signature d'un webhook n'a pas pu être vérifiée. */
57
+ export class TupaySignatureVerificationError extends TupayError {
58
+ constructor(message) {
59
+ super(message, { code: 'signature_verification_failed' });
60
+ }
61
+ }
62
+ /**
63
+ * Construit l'erreur typée correspondant à une réponse HTTP.
64
+ * Le mapping suit le catalogue documenté dans `docs/api-integration.md`.
65
+ */
66
+ export function errorFromResponse(status, body, requestId) {
67
+ const code = body?.error ?? 'server_error';
68
+ const message = body?.message ?? `Requête échouée (HTTP ${status}).`;
69
+ const options = { code, statusCode: status, requestId };
70
+ switch (status) {
71
+ case 400:
72
+ case 422:
73
+ return new TupayValidationError(message, options);
74
+ case 401:
75
+ return new TupayAuthenticationError(message, options);
76
+ case 403:
77
+ return new TupayPermissionError(message, options);
78
+ case 404:
79
+ return new TupayNotFoundError(message, options);
80
+ case 409:
81
+ return new TupayConflictError(message, options);
82
+ case 429:
83
+ return new TupayRateLimitError(message, options);
84
+ case 502:
85
+ return new TupayBaasError(message, options);
86
+ default:
87
+ return new TupayApiError(message, options);
88
+ }
89
+ }
90
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,6CAA6C;IACpC,IAAI,CAAQ;IACrB,wEAAwE;IAC/D,UAAU,CAAS;IAC5B,kDAAkD;IACzC,SAAS,CAAS;IAE3B,YAAY,OAAe,EAAE,OAA0B;QACrD,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;QACpC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IACpC,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,OAAO,wBAAyB,SAAQ,UAAU;CAAG;AAE3D,6EAA6E;AAC7E,MAAM,OAAO,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,kEAAkE;AAClE,MAAM,OAAO,kBAAmB,SAAQ,UAAU;CAAG;AAErD,6CAA6C;AAC7C,MAAM,OAAO,oBAAqB,SAAQ,UAAU;CAAG;AAEvD,iEAAiE;AACjE,MAAM,OAAO,kBAAmB,SAAQ,UAAU;CAAG;AAErD,gDAAgD;AAChD,MAAM,OAAO,mBAAoB,SAAQ,UAAU;CAAG;AAEtD,iCAAiC;AACjC,MAAM,OAAO,aAAc,SAAQ,UAAU;CAAG;AAEhD,0DAA0D;AAC1D,MAAM,OAAO,cAAe,SAAQ,UAAU;CAAG;AAEjD,8EAA8E;AAC9E,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAA;IACrD,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,OAAO,+BAAgC,SAAQ,UAAU;IAC7D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAAC,CAAA;IAC3D,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,IAAiD,EACjD,SAAkB;IAElB,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,IAAI,cAAc,CAAA;IAC1C,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,yBAAyB,MAAM,IAAI,CAAA;IACpE,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAEvD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACN,OAAO,IAAI,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACnD,KAAK,GAAG;YACN,OAAO,IAAI,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACvD,KAAK,GAAG;YACN,OAAO,IAAI,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACnD,KAAK,GAAG;YACN,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACjD,KAAK,GAAG;YACN,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACjD,KAAK,GAAG;YACN,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAClD,KAAK,GAAG;YACN,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC7C;YACE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * SDK Node officiel de Tupay — encaissement en XPF, Polynésie française.
3
+ *
4
+ * @example
5
+ * import { Tupay } from 'tupay'
6
+ *
7
+ * const tupay = new Tupay(process.env.TUPAY_SECRET_KEY!)
8
+ *
9
+ * const link = await tupay.paymentLinks.create({
10
+ * amountXpf: 4500,
11
+ * description: 'Location paddle 2 h',
12
+ * returnUrl: 'https://ma-boutique.pf/merci',
13
+ * })
14
+ * console.log(link.url)
15
+ */
16
+ import { type TupayOptions } from './client.js';
17
+ import { PaymentIntents } from './resources/payment-intents.js';
18
+ import { PaymentLinks } from './resources/payment-links.js';
19
+ import { Transactions } from './resources/transactions.js';
20
+ import { Refunds } from './resources/refunds.js';
21
+ import { WebhookEndpoints } from './resources/webhook-endpoints.js';
22
+ import { Merchants } from './resources/merchants.js';
23
+ import { Events } from './resources/events.js';
24
+ import { TestHelpers } from './resources/test-helpers.js';
25
+ import { type ConstructEventOptions } from './webhooks.js';
26
+ import type { WebhookEvent } from './types.js';
27
+ export declare class Tupay {
28
+ #private;
29
+ readonly paymentIntents: PaymentIntents;
30
+ readonly paymentLinks: PaymentLinks;
31
+ readonly transactions: Transactions;
32
+ readonly refunds: Refunds;
33
+ readonly webhookEndpoints: WebhookEndpoints;
34
+ readonly merchants: Merchants;
35
+ /** Historique des événements émis — consultation et rejeu. */
36
+ readonly events: Events;
37
+ /** Utilitaires de mode test — lèvent une erreur avec une clé live. */
38
+ readonly testHelpers: TestHelpers;
39
+ /** `true` si la clé fournie est une `tpk_live_`. Déduit du préfixe. */
40
+ readonly livemode: boolean;
41
+ constructor(apiKey: string, options?: TupayOptions);
42
+ /**
43
+ * Vérifie la signature d'un webhook et renvoie l'événement typé.
44
+ *
45
+ * ⚠️ `payload` doit être le corps **brut** de la requête. Un objet déjà
46
+ * parsé puis re-sérialisé ne produira pas le même HMAC.
47
+ *
48
+ * @example
49
+ * app.post('/hook', express.raw({ type: 'application/json' }), (req, res) => {
50
+ * let event
51
+ * try {
52
+ * event = tupay.webhooks.constructEvent(
53
+ * req.body,
54
+ * req.get('tupay-signature'),
55
+ * process.env.TUPAY_WEBHOOK_SECRET,
56
+ * )
57
+ * } catch {
58
+ * return res.status(400).send('signature invalide')
59
+ * }
60
+ * res.sendStatus(200) // acquittez vite
61
+ * traiter(event) // puis traitez
62
+ * })
63
+ */
64
+ readonly webhooks: {
65
+ constructEvent(payload: string | Buffer, header: string | null | undefined, secret: string, options?: ConstructEventOptions): WebhookEvent;
66
+ };
67
+ /** Génère une clé d'idempotence (UUID v4). */
68
+ static idempotencyKey(): string;
69
+ }
70
+ export default Tupay;
71
+ export { TupayClient } from './client.js';
72
+ export type { TupayOptions, RequestOptions } from './client.js';
73
+ export { constructEvent, DEFAULT_TOLERANCE_SECONDS } from './webhooks.js';
74
+ export type { ConstructEventOptions } from './webhooks.js';
75
+ export { TupayError, TupayAuthenticationError, TupayPermissionError, TupayNotFoundError, TupayValidationError, TupayConflictError, TupayRateLimitError, TupayApiError, TupayBaasError, TupayConnectionError, TupaySignatureVerificationError, } from './errors.js';
76
+ export type * from './types.js';
77
+ export type { CreatePaymentIntentParams } from './resources/payment-intents.js';
78
+ export type { CreatePaymentLinkParams } from './resources/payment-links.js';
79
+ export type { ListTransactionsParams } from './resources/transactions.js';
80
+ export type { CreateRefundParams, ListRefundsParams } from './resources/refunds.js';
81
+ export type { CreateWebhookEndpointParams, UpdateWebhookEndpointParams, ListDeliveriesParams, } from './resources/webhook-endpoints.js';
82
+ export type { ListEventsParams } from './resources/events.js';
83
+ export { Events } from './resources/events.js';
84
+ export type { SimulateOutcome, SimulateResult } from './resources/test-helpers.js';
85
+ export { TestHelpers } from './resources/test-helpers.js';
86
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,qBAAa,KAAK;;IAChB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAA;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IAEjC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;gBAId,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB;IActD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,QAAQ,CAAC,QAAQ;gCAEJ,MAAM,GAAG,MAAM,UAChB,MAAM,GAAG,IAAI,GAAG,SAAS,UACzB,MAAM,YACJ,qBAAqB,GAC9B,YAAY;MAGhB;IAED,8CAA8C;IAC9C,MAAM,CAAC,cAAc,IAAI,MAAM;CAGhC;AAED,eAAe,KAAK,CAAA;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AACzE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE1D,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,aAAa,CAAA;AAEpB,mBAAmB,YAAY,CAAA;AAE/B,YAAY,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAC3E,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACzE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AACnF,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,kCAAkC,CAAA;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * SDK Node officiel de Tupay — encaissement en XPF, Polynésie française.
3
+ *
4
+ * @example
5
+ * import { Tupay } from 'tupay'
6
+ *
7
+ * const tupay = new Tupay(process.env.TUPAY_SECRET_KEY!)
8
+ *
9
+ * const link = await tupay.paymentLinks.create({
10
+ * amountXpf: 4500,
11
+ * description: 'Location paddle 2 h',
12
+ * returnUrl: 'https://ma-boutique.pf/merci',
13
+ * })
14
+ * console.log(link.url)
15
+ */
16
+ import { TupayClient } from './client.js';
17
+ import { PaymentIntents } from './resources/payment-intents.js';
18
+ import { PaymentLinks } from './resources/payment-links.js';
19
+ import { Transactions } from './resources/transactions.js';
20
+ import { Refunds } from './resources/refunds.js';
21
+ import { WebhookEndpoints } from './resources/webhook-endpoints.js';
22
+ import { Merchants } from './resources/merchants.js';
23
+ import { Events } from './resources/events.js';
24
+ import { TestHelpers } from './resources/test-helpers.js';
25
+ import { constructEvent } from './webhooks.js';
26
+ export class Tupay {
27
+ paymentIntents;
28
+ paymentLinks;
29
+ transactions;
30
+ refunds;
31
+ webhookEndpoints;
32
+ merchants;
33
+ /** Historique des événements émis — consultation et rejeu. */
34
+ events;
35
+ /** Utilitaires de mode test — lèvent une erreur avec une clé live. */
36
+ testHelpers;
37
+ /** `true` si la clé fournie est une `tpk_live_`. Déduit du préfixe. */
38
+ livemode;
39
+ #client;
40
+ constructor(apiKey, options = {}) {
41
+ this.#client = new TupayClient(apiKey, options);
42
+ this.livemode = this.#client.livemode;
43
+ this.paymentIntents = new PaymentIntents(this.#client);
44
+ this.paymentLinks = new PaymentLinks(this.#client);
45
+ this.transactions = new Transactions(this.#client);
46
+ this.refunds = new Refunds(this.#client);
47
+ this.webhookEndpoints = new WebhookEndpoints(this.#client);
48
+ this.merchants = new Merchants(this.#client);
49
+ this.events = new Events(this.#client);
50
+ this.testHelpers = new TestHelpers(this.#client);
51
+ }
52
+ /**
53
+ * Vérifie la signature d'un webhook et renvoie l'événement typé.
54
+ *
55
+ * ⚠️ `payload` doit être le corps **brut** de la requête. Un objet déjà
56
+ * parsé puis re-sérialisé ne produira pas le même HMAC.
57
+ *
58
+ * @example
59
+ * app.post('/hook', express.raw({ type: 'application/json' }), (req, res) => {
60
+ * let event
61
+ * try {
62
+ * event = tupay.webhooks.constructEvent(
63
+ * req.body,
64
+ * req.get('tupay-signature'),
65
+ * process.env.TUPAY_WEBHOOK_SECRET,
66
+ * )
67
+ * } catch {
68
+ * return res.status(400).send('signature invalide')
69
+ * }
70
+ * res.sendStatus(200) // acquittez vite
71
+ * traiter(event) // puis traitez
72
+ * })
73
+ */
74
+ webhooks = {
75
+ constructEvent(payload, header, secret, options) {
76
+ return constructEvent(payload, header, secret, options);
77
+ },
78
+ };
79
+ /** Génère une clé d'idempotence (UUID v4). */
80
+ static idempotencyKey() {
81
+ return TupayClient.idempotencyKey();
82
+ }
83
+ }
84
+ export default Tupay;
85
+ export { TupayClient } from './client.js';
86
+ export { constructEvent, DEFAULT_TOLERANCE_SECONDS } from './webhooks.js';
87
+ export { TupayError, TupayAuthenticationError, TupayPermissionError, TupayNotFoundError, TupayValidationError, TupayConflictError, TupayRateLimitError, TupayApiError, TupayBaasError, TupayConnectionError, TupaySignatureVerificationError, } from './errors.js';
88
+ export { Events } from './resources/events.js';
89
+ export { TestHelpers } from './resources/test-helpers.js';
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Collections : paramètres émis et réponse normalisée.
3
+ *
4
+ * ── Pourquoi ce module existe ──────────────────────────────────────
5
+ * L'API a rendu longtemps `{ data, hasMore }` en camelCase. Elle rend
6
+ * désormais les DEUX clés, `has_more` étant la canonique, et retirera
7
+ * `hasMore` dans une version datée future.
8
+ *
9
+ * Un SDK qui lirait l'une des deux se casserait à un moment ou à un
10
+ * autre, et se casserait en SILENCE : `page.hasMore` vaudrait
11
+ * `undefined`, la condition de boucle deviendrait fausse, et
12
+ * l'intégrateur croirait avoir fini de parcourir. Pas d'exception, pas
13
+ * de log, juste des pages manquantes.
14
+ *
15
+ * `normaliserListe` lit donc `has_more` avec repli sur `hasMore`, et
16
+ * remplit les deux dans ce qu'elle rend. Un SDK neuf parle à une API
17
+ * ancienne, un SDK ancien à une API neuve.
18
+ */
19
+ import type { ListResult } from './types.js';
20
+ /** La réponse telle qu'elle arrive : l'une des deux clés peut manquer. */
21
+ export interface ListeBrute<T> {
22
+ data?: T[];
23
+ has_more?: boolean;
24
+ hasMore?: boolean;
25
+ }
26
+ export declare function normaliserListe<T>(brut: ListeBrute<T>): ListResult<T>;
27
+ /** Ce qui est commun aux six collections. */
28
+ export interface ListParams {
29
+ /** Entre 1 et 100. Défaut 25. Une valeur hors bornes est refusée en 400. */
30
+ limit?: number;
31
+ /**
32
+ * Curseur : ne rend que les éléments postérieurs à celui-ci dans
33
+ * l'ordre de parcours, donc plus anciens. L'élément désigné n'est
34
+ * jamais inclus.
35
+ */
36
+ startingAfter?: string;
37
+ /**
38
+ * Curseur inverse : ne rend que les éléments antérieurs, donc plus
39
+ * récents. `hasMore` parle alors de ce qui reste AVANT la page.
40
+ */
41
+ endingBefore?: string;
42
+ /**
43
+ * @deprecated Utilisez `startingAfter`. Supporté au minimum douze mois.
44
+ *
45
+ * Un décalage nomme une position dans un classement qui bouge : dès
46
+ * qu'une ligne naît pendant votre parcours, tout ce qui suit glisse
47
+ * d'un cran et vous sautez un élément sans rien voir. Il n'est jamais
48
+ * envoyé par défaut, et ne se combine pas avec un curseur.
49
+ */
50
+ offset?: number;
51
+ }
52
+ /** Traduit les paramètres communs en chaîne de requête. */
53
+ export declare function parametresListe(params: ListParams): Record<string, string | number | boolean | undefined>;
54
+ //# sourceMappingURL=liste.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liste.d.ts","sourceRoot":"","sources":["../../src/liste.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,0EAA0E;AAC1E,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;IACV,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAGrE;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAOvD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Collections : paramètres émis et réponse normalisée.
3
+ *
4
+ * ── Pourquoi ce module existe ──────────────────────────────────────
5
+ * L'API a rendu longtemps `{ data, hasMore }` en camelCase. Elle rend
6
+ * désormais les DEUX clés, `has_more` étant la canonique, et retirera
7
+ * `hasMore` dans une version datée future.
8
+ *
9
+ * Un SDK qui lirait l'une des deux se casserait à un moment ou à un
10
+ * autre, et se casserait en SILENCE : `page.hasMore` vaudrait
11
+ * `undefined`, la condition de boucle deviendrait fausse, et
12
+ * l'intégrateur croirait avoir fini de parcourir. Pas d'exception, pas
13
+ * de log, juste des pages manquantes.
14
+ *
15
+ * `normaliserListe` lit donc `has_more` avec repli sur `hasMore`, et
16
+ * remplit les deux dans ce qu'elle rend. Un SDK neuf parle à une API
17
+ * ancienne, un SDK ancien à une API neuve.
18
+ */
19
+ export function normaliserListe(brut) {
20
+ const encore = brut.has_more ?? brut.hasMore ?? false;
21
+ return { data: brut.data ?? [], has_more: encore, hasMore: encore };
22
+ }
23
+ /** Traduit les paramètres communs en chaîne de requête. */
24
+ export function parametresListe(params) {
25
+ return {
26
+ limit: params.limit,
27
+ starting_after: params.startingAfter,
28
+ ending_before: params.endingBefore,
29
+ offset: params.offset,
30
+ };
31
+ }
32
+ //# sourceMappingURL=liste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liste.js","sourceRoot":"","sources":["../../src/liste.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,MAAM,UAAU,eAAe,CAAI,IAAmB;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAA;IACrD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AACrE,CAAC;AA4BD,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAC7B,MAAkB;IAElB,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,aAAa;QACpC,aAAa,EAAE,MAAM,CAAC,YAAY;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,64 @@
1
+ import type { TupayClient } from '../client.js';
2
+ import type { ListResult, TupayEvent, WebhookEventType, ResendResult } from '../types.js';
3
+ import { type ListParams } from '../liste.js';
4
+ export interface ListEventsParams extends ListParams {
5
+ /**
6
+ * @deprecated Renommé `startingAfter`. Alias strict, même
7
+ * comportement, accepté au minimum douze mois.
8
+ *
9
+ * Il est traduit en `starting_after` à l'émission : mélanger l'ancien
10
+ * et le nouveau nom dans un même appel est refusé par l'API, et une
11
+ * seule des deux formes part sur le réseau.
12
+ */
13
+ apres?: string;
14
+ type?: WebhookEventType;
15
+ }
16
+ export declare class Events {
17
+ private readonly client;
18
+ constructor(client: TupayClient);
19
+ /**
20
+ * Les événements du marchand, du plus récent au plus ancien.
21
+ *
22
+ * Le mode vient de la clé : une clé `tpk_test_` ne voit jamais les
23
+ * événements live, et réciproquement.
24
+ *
25
+ * Pagination par CURSEUR, comme les cinq autres collections. Un
26
+ * `offset` glisserait dès qu'un événement naît pendant le parcours, et
27
+ * l'on en sauterait, silencieusement. Le curseur est ancré sur une
28
+ * ligne précise, et un curseur qui ne se résout pas est refusé par un
29
+ * `400 invalid_cursor` plutôt que par une page vide.
30
+ */
31
+ list(params?: ListEventsParams): Promise<ListResult<TupayEvent>>;
32
+ /**
33
+ * Un événement précis.
34
+ *
35
+ * Le geste courant du débogage : un webhook arrive, vous tenez son
36
+ * `id`, vous voulez revoir l'objet exact que Tupay a émis.
37
+ */
38
+ retrieve(id: string): Promise<TupayEvent>;
39
+ /**
40
+ * Rejoue un événement vers vos endpoints actifs.
41
+ *
42
+ * ⚠️ Le rejeu **crée** une nouvelle livraison, il ne modifie pas
43
+ * l'ancienne. Votre gestionnaire recevra donc l'événement une fois de
44
+ * plus, avec le même `id` : dédupliquez dessus.
45
+ *
46
+ * @example
47
+ * // Votre serveur était en panne à 3 h du matin.
48
+ * const { data } = await tupay.events.list({ type: 'payment.succeeded' })
49
+ * for (const event of data) {
50
+ * await tupay.events.resend(event.id)
51
+ * }
52
+ */
53
+ resend(id: string): Promise<ResendResult>;
54
+ /**
55
+ * Parcourt toutes les pages, un événement à la fois.
56
+ *
57
+ * @example
58
+ * for await (const event of tupay.events.autoPagingEach()) {
59
+ * console.log(event.type, event.created)
60
+ * }
61
+ */
62
+ autoPagingEach(params?: ListEventsParams): AsyncGenerator<TupayEvent, void, undefined>;
63
+ }
64
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/resources/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,gBAAgB,CAAA;CACxB;AAED,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEhD;;;;;;;;;;;OAWG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAc1E;;;;;OAKG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ/C;;;;;;;;;;;;;OAaG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ/C;;;;;;;OAOG;IACI,cAAc,CACnB,MAAM,GAAE,gBAAqB,GAC5B,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC;CAyB/C"}
@@ -0,0 +1,100 @@
1
+ import { normaliserListe, parametresListe, } from '../liste.js';
2
+ export class Events {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ /**
8
+ * Les événements du marchand, du plus récent au plus ancien.
9
+ *
10
+ * Le mode vient de la clé : une clé `tpk_test_` ne voit jamais les
11
+ * événements live, et réciproquement.
12
+ *
13
+ * Pagination par CURSEUR, comme les cinq autres collections. Un
14
+ * `offset` glisserait dès qu'un événement naît pendant le parcours, et
15
+ * l'on en sauterait, silencieusement. Le curseur est ancré sur une
16
+ * ligne précise, et un curseur qui ne se résout pas est refusé par un
17
+ * `400 invalid_cursor` plutôt que par une page vide.
18
+ */
19
+ async list(params = {}) {
20
+ const communs = parametresListe({
21
+ ...params,
22
+ startingAfter: params.startingAfter ?? params.apres,
23
+ });
24
+ return normaliserListe(await this.client.request({
25
+ method: 'GET',
26
+ path: '/events',
27
+ query: { ...communs, type: params.type },
28
+ }));
29
+ }
30
+ /**
31
+ * Un événement précis.
32
+ *
33
+ * Le geste courant du débogage : un webhook arrive, vous tenez son
34
+ * `id`, vous voulez revoir l'objet exact que Tupay a émis.
35
+ */
36
+ async retrieve(id) {
37
+ const { data } = await this.client.request({
38
+ method: 'GET',
39
+ path: `/events/${encodeURIComponent(id)}`,
40
+ });
41
+ return data;
42
+ }
43
+ /**
44
+ * Rejoue un événement vers vos endpoints actifs.
45
+ *
46
+ * ⚠️ Le rejeu **crée** une nouvelle livraison, il ne modifie pas
47
+ * l'ancienne. Votre gestionnaire recevra donc l'événement une fois de
48
+ * plus, avec le même `id` : dédupliquez dessus.
49
+ *
50
+ * @example
51
+ * // Votre serveur était en panne à 3 h du matin.
52
+ * const { data } = await tupay.events.list({ type: 'payment.succeeded' })
53
+ * for (const event of data) {
54
+ * await tupay.events.resend(event.id)
55
+ * }
56
+ */
57
+ async resend(id) {
58
+ const { data } = await this.client.request({
59
+ method: 'POST',
60
+ path: `/events/${encodeURIComponent(id)}/resend`,
61
+ });
62
+ return data;
63
+ }
64
+ /**
65
+ * Parcourt toutes les pages, un événement à la fois.
66
+ *
67
+ * @example
68
+ * for await (const event of tupay.events.autoPagingEach()) {
69
+ * console.log(event.type, event.created)
70
+ * }
71
+ */
72
+ async *autoPagingEach(params = {}) {
73
+ const limit = params.limit ?? 100;
74
+ let startingAfter = params.startingAfter ?? params.apres;
75
+ let precedent;
76
+ for (;;) {
77
+ const page = await this.list({
78
+ ...params,
79
+ limit,
80
+ apres: undefined,
81
+ startingAfter,
82
+ });
83
+ for (const event of page.data)
84
+ yield event;
85
+ // Une page vide signifie la fin, même si le serveur annonçait
86
+ // `hasMore` : ceinture et bretelles contre une boucle infinie.
87
+ const dernier = page.data[page.data.length - 1];
88
+ if (!page.hasMore || !dernier)
89
+ return;
90
+ // Et si le curseur n'avance pas non plus. Une API plus ancienne que
91
+ // ce SDK ignorerait `starting_after` et rendrait indéfiniment la
92
+ // première page.
93
+ if (dernier.id === precedent)
94
+ return;
95
+ precedent = dernier.id;
96
+ startingAfter = dernier.id;
97
+ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/resources/events.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AAepB,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,IAAI,CAAC,SAA2B,EAAE;QACtC,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,GAAG,MAAM;YACT,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK;SACpD,CAAC,CAAA;QACF,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAyB;YAChD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;SACzC,CAAC,CACH,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAuB;YAC/D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,WAAW,kBAAkB,CAAC,EAAE,CAAC,EAAE;SAC1C,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAyB;YACjE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW,kBAAkB,CAAC,EAAE,CAAC,SAAS;SACjD,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,CAAC,cAAc,CACnB,SAA2B,EAAE;QAE7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAA;QACjC,IAAI,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK,CAAA;QACxD,IAAI,SAA6B,CAAA;QAEjC,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;gBAC3B,GAAG,MAAM;gBACT,KAAK;gBACL,KAAK,EAAE,SAAS;gBAChB,aAAa;aACd,CAAC,CAAA;YACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,KAAK,CAAA;YAC1C,8DAA8D;YAC9D,+DAA+D;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;gBAAE,OAAM;YACrC,oEAAoE;YACpE,iEAAiE;YACjE,iBAAiB;YACjB,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;gBAAE,OAAM;YACpC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAA;YACtB,aAAa,GAAG,OAAO,CAAC,EAAE,CAAA;QAC5B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { TupayClient } from '../client.js';
2
+ import type { Merchant } from '../types.js';
3
+ export declare class Merchants {
4
+ private readonly client;
5
+ constructor(client: TupayClient);
6
+ /**
7
+ * Profil du marchand associé à la clé.
8
+ *
9
+ * Utile au démarrage : `kyb_status` doit valoir `validated` pour
10
+ * encaisser en mode live, et `id` est le `merchantId` attendu par
11
+ * `paymentIntents.create`.
12
+ *
13
+ * La mise à jour du profil (nom, IBAN) n'est pas exposée : elle exige
14
+ * une session humaine sur le dashboard, parce que changer l'IBAN
15
+ * redirige les virements.
16
+ */
17
+ me(): Promise<Merchant>;
18
+ }
19
+ //# sourceMappingURL=merchants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merchants.d.ts","sourceRoot":"","sources":["../../../src/resources/merchants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEhD;;;;;;;;;;OAUG;IACG,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC;CAO9B"}
@@ -0,0 +1,25 @@
1
+ export class Merchants {
2
+ client;
3
+ constructor(client) {
4
+ this.client = client;
5
+ }
6
+ /**
7
+ * Profil du marchand associé à la clé.
8
+ *
9
+ * Utile au démarrage : `kyb_status` doit valoir `validated` pour
10
+ * encaisser en mode live, et `id` est le `merchantId` attendu par
11
+ * `paymentIntents.create`.
12
+ *
13
+ * La mise à jour du profil (nom, IBAN) n'est pas exposée : elle exige
14
+ * une session humaine sur le dashboard, parce que changer l'IBAN
15
+ * redirige les virements.
16
+ */
17
+ async me() {
18
+ const { data } = await this.client.request({
19
+ method: 'GET',
20
+ path: '/merchants/me',
21
+ });
22
+ return data;
23
+ }
24
+ }
25
+ //# sourceMappingURL=merchants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merchants.js","sourceRoot":"","sources":["../../../src/resources/merchants.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC7D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,eAAe;SACtB,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import { TupayClient } from '../client.js';
2
+ import type { PaymentIntent } from '../types.js';
3
+ export interface CreatePaymentIntentParams {
4
+ /** Entier XPF, entre 100 et 10 000 000. */
5
+ amountXpf: number;
6
+ /**
7
+ * Facultatif — le marchand est déduit de votre clé API.
8
+ *
9
+ * Ne le fournissez que si vous tenez à ce que le serveur vérifie que
10
+ * vous visez bien le compte attendu : un `merchantId` qui ne
11
+ * correspond pas à la clé répond 403.
12
+ */
13
+ merchantId?: string;
14
+ paymentLinkId?: string;
15
+ metadata?: Record<string, string>;
16
+ /**
17
+ * Clé d'idempotence. Omise, le SDK en génère une (UUID v4) : la requête
18
+ * devient rejouable sans risque de double débit. Fournissez la vôtre si
19
+ * vous voulez qu'un retry applicatif ultérieur retombe sur le même
20
+ * résultat — par exemple une clé dérivée de votre numéro de commande.
21
+ */
22
+ idempotencyKey?: string;
23
+ }
24
+ export declare class PaymentIntents {
25
+ private readonly client;
26
+ constructor(client: TupayClient);
27
+ create(params: CreatePaymentIntentParams): Promise<PaymentIntent>;
28
+ }
29
+ //# sourceMappingURL=payment-intents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-intents.d.ts","sourceRoot":"","sources":["../../../src/resources/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,WAAW,yBAAyB;IACxC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC;CAUxE"}