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.
- package/README.md +358 -0
- package/dist/cjs/client.d.ts +48 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +165 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.d.ts +66 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +105 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +86 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +110 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/liste.d.ts +54 -0
- package/dist/cjs/liste.d.ts.map +1 -0
- package/dist/cjs/liste.js +36 -0
- package/dist/cjs/liste.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/resources/events.d.ts +64 -0
- package/dist/cjs/resources/events.d.ts.map +1 -0
- package/dist/cjs/resources/events.js +104 -0
- package/dist/cjs/resources/events.js.map +1 -0
- package/dist/cjs/resources/merchants.d.ts +19 -0
- package/dist/cjs/resources/merchants.d.ts.map +1 -0
- package/dist/cjs/resources/merchants.js +29 -0
- package/dist/cjs/resources/merchants.js.map +1 -0
- package/dist/cjs/resources/payment-intents.d.ts +29 -0
- package/dist/cjs/resources/payment-intents.d.ts.map +1 -0
- package/dist/cjs/resources/payment-intents.js +22 -0
- package/dist/cjs/resources/payment-intents.js.map +1 -0
- package/dist/cjs/resources/payment-links.d.ts +38 -0
- package/dist/cjs/resources/payment-links.d.ts.map +1 -0
- package/dist/cjs/resources/payment-links.js +56 -0
- package/dist/cjs/resources/payment-links.js.map +1 -0
- package/dist/cjs/resources/refunds.d.ts +27 -0
- package/dist/cjs/resources/refunds.d.ts.map +1 -0
- package/dist/cjs/resources/refunds.js +33 -0
- package/dist/cjs/resources/refunds.js.map +1 -0
- package/dist/cjs/resources/test-helpers.d.ts +42 -0
- package/dist/cjs/resources/test-helpers.d.ts.map +1 -0
- package/dist/cjs/resources/test-helpers.js +50 -0
- package/dist/cjs/resources/test-helpers.js.map +1 -0
- package/dist/cjs/resources/transactions.d.ts +29 -0
- package/dist/cjs/resources/transactions.d.ts.map +1 -0
- package/dist/cjs/resources/transactions.js +65 -0
- package/dist/cjs/resources/transactions.js.map +1 -0
- package/dist/cjs/resources/webhook-endpoints.d.ts +43 -0
- package/dist/cjs/resources/webhook-endpoints.d.ts.map +1 -0
- package/dist/cjs/resources/webhook-endpoints.js +71 -0
- package/dist/cjs/resources/webhook-endpoints.js.map +1 -0
- package/dist/cjs/types.d.ts +166 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +10 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/webhooks.d.ts +31 -0
- package/dist/cjs/webhooks.d.ts.map +1 -0
- package/dist/cjs/webhooks.js +81 -0
- package/dist/cjs/webhooks.js.map +1 -0
- package/dist/esm/client.d.ts +48 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +161 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.d.ts +66 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +90 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +86 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +90 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/liste.d.ts +54 -0
- package/dist/esm/liste.d.ts.map +1 -0
- package/dist/esm/liste.js +32 -0
- package/dist/esm/liste.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/resources/events.d.ts +64 -0
- package/dist/esm/resources/events.d.ts.map +1 -0
- package/dist/esm/resources/events.js +100 -0
- package/dist/esm/resources/events.js.map +1 -0
- package/dist/esm/resources/merchants.d.ts +19 -0
- package/dist/esm/resources/merchants.d.ts.map +1 -0
- package/dist/esm/resources/merchants.js +25 -0
- package/dist/esm/resources/merchants.js.map +1 -0
- package/dist/esm/resources/payment-intents.d.ts +29 -0
- package/dist/esm/resources/payment-intents.d.ts.map +1 -0
- package/dist/esm/resources/payment-intents.js +18 -0
- package/dist/esm/resources/payment-intents.js.map +1 -0
- package/dist/esm/resources/payment-links.d.ts +38 -0
- package/dist/esm/resources/payment-links.d.ts.map +1 -0
- package/dist/esm/resources/payment-links.js +52 -0
- package/dist/esm/resources/payment-links.js.map +1 -0
- package/dist/esm/resources/refunds.d.ts +27 -0
- package/dist/esm/resources/refunds.d.ts.map +1 -0
- package/dist/esm/resources/refunds.js +29 -0
- package/dist/esm/resources/refunds.js.map +1 -0
- package/dist/esm/resources/test-helpers.d.ts +42 -0
- package/dist/esm/resources/test-helpers.d.ts.map +1 -0
- package/dist/esm/resources/test-helpers.js +46 -0
- package/dist/esm/resources/test-helpers.js.map +1 -0
- package/dist/esm/resources/transactions.d.ts +29 -0
- package/dist/esm/resources/transactions.d.ts.map +1 -0
- package/dist/esm/resources/transactions.js +61 -0
- package/dist/esm/resources/transactions.js.map +1 -0
- package/dist/esm/resources/webhook-endpoints.d.ts +43 -0
- package/dist/esm/resources/webhook-endpoints.d.ts.map +1 -0
- package/dist/esm/resources/webhook-endpoints.js +67 -0
- package/dist/esm/resources/webhook-endpoints.js.map +1 -0
- package/dist/esm/types.d.ts +166 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +9 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/webhooks.d.ts +31 -0
- package/dist/esm/webhooks.d.ts.map +1 -0
- package/dist/esm/webhooks.js +77 -0
- package/dist/esm/webhooks.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hiérarchie d'erreurs du SDK.
|
|
4
|
+
*
|
|
5
|
+
* Toutes héritent de `TupayError` : un `catch (err)` unique suffit, et
|
|
6
|
+
* `err instanceof TupayRateLimitError` permet d'affiner si besoin.
|
|
7
|
+
*
|
|
8
|
+
* `code` est le code machine renvoyé par l'API (`validation_error`,
|
|
9
|
+
* `livemode_mismatch`, …). C'est lui qu'il faut tester — le `message`
|
|
10
|
+
* est en français, destiné à un humain, et peut changer sans préavis.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.TupaySignatureVerificationError = exports.TupayConnectionError = exports.TupayBaasError = exports.TupayApiError = exports.TupayRateLimitError = exports.TupayConflictError = exports.TupayValidationError = exports.TupayNotFoundError = exports.TupayPermissionError = exports.TupayAuthenticationError = exports.TupayError = void 0;
|
|
14
|
+
exports.errorFromResponse = errorFromResponse;
|
|
15
|
+
class TupayError extends Error {
|
|
16
|
+
/** Code machine stable renvoyé par l'API. */
|
|
17
|
+
code;
|
|
18
|
+
/** Statut HTTP, absent si l'erreur est survenue avant toute réponse. */
|
|
19
|
+
statusCode;
|
|
20
|
+
/** Identifiant de requête, à citer au support. */
|
|
21
|
+
requestId;
|
|
22
|
+
constructor(message, options) {
|
|
23
|
+
super(message, { cause: options.cause });
|
|
24
|
+
this.name = new.target.name;
|
|
25
|
+
this.code = options.code;
|
|
26
|
+
this.statusCode = options.statusCode;
|
|
27
|
+
this.requestId = options.requestId;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.TupayError = TupayError;
|
|
31
|
+
/** 401 — clé absente, invalide ou révoquée. */
|
|
32
|
+
class TupayAuthenticationError extends TupayError {
|
|
33
|
+
}
|
|
34
|
+
exports.TupayAuthenticationError = TupayAuthenticationError;
|
|
35
|
+
/** 403 — opération interdite dans ce contexte (dont `livemode_mismatch`). */
|
|
36
|
+
class TupayPermissionError extends TupayError {
|
|
37
|
+
}
|
|
38
|
+
exports.TupayPermissionError = TupayPermissionError;
|
|
39
|
+
/** 404 — ressource inexistante ou hors du périmètre de la clé. */
|
|
40
|
+
class TupayNotFoundError extends TupayError {
|
|
41
|
+
}
|
|
42
|
+
exports.TupayNotFoundError = TupayNotFoundError;
|
|
43
|
+
/** 400 / 422 — corps de requête invalide. */
|
|
44
|
+
class TupayValidationError extends TupayError {
|
|
45
|
+
}
|
|
46
|
+
exports.TupayValidationError = TupayValidationError;
|
|
47
|
+
/** 409 — état incompatible (déjà remboursé, limite atteinte). */
|
|
48
|
+
class TupayConflictError extends TupayError {
|
|
49
|
+
}
|
|
50
|
+
exports.TupayConflictError = TupayConflictError;
|
|
51
|
+
/** 429 — 100 req/min par marchand dépassées. */
|
|
52
|
+
class TupayRateLimitError extends TupayError {
|
|
53
|
+
}
|
|
54
|
+
exports.TupayRateLimitError = TupayRateLimitError;
|
|
55
|
+
/** 5xx — incident côté Tupay. */
|
|
56
|
+
class TupayApiError extends TupayError {
|
|
57
|
+
}
|
|
58
|
+
exports.TupayApiError = TupayApiError;
|
|
59
|
+
/** 502 — le prestataire bancaire a refusé l'opération. */
|
|
60
|
+
class TupayBaasError extends TupayError {
|
|
61
|
+
}
|
|
62
|
+
exports.TupayBaasError = TupayBaasError;
|
|
63
|
+
/** Panne réseau, DNS, TLS ou dépassement du timeout. Aucune réponse reçue. */
|
|
64
|
+
class TupayConnectionError extends TupayError {
|
|
65
|
+
constructor(message, cause) {
|
|
66
|
+
super(message, { code: 'connection_error', cause });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.TupayConnectionError = TupayConnectionError;
|
|
70
|
+
/** La signature d'un webhook n'a pas pu être vérifiée. */
|
|
71
|
+
class TupaySignatureVerificationError extends TupayError {
|
|
72
|
+
constructor(message) {
|
|
73
|
+
super(message, { code: 'signature_verification_failed' });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.TupaySignatureVerificationError = TupaySignatureVerificationError;
|
|
77
|
+
/**
|
|
78
|
+
* Construit l'erreur typée correspondant à une réponse HTTP.
|
|
79
|
+
* Le mapping suit le catalogue documenté dans `docs/api-integration.md`.
|
|
80
|
+
*/
|
|
81
|
+
function errorFromResponse(status, body, requestId) {
|
|
82
|
+
const code = body?.error ?? 'server_error';
|
|
83
|
+
const message = body?.message ?? `Requête échouée (HTTP ${status}).`;
|
|
84
|
+
const options = { code, statusCode: status, requestId };
|
|
85
|
+
switch (status) {
|
|
86
|
+
case 400:
|
|
87
|
+
case 422:
|
|
88
|
+
return new TupayValidationError(message, options);
|
|
89
|
+
case 401:
|
|
90
|
+
return new TupayAuthenticationError(message, options);
|
|
91
|
+
case 403:
|
|
92
|
+
return new TupayPermissionError(message, options);
|
|
93
|
+
case 404:
|
|
94
|
+
return new TupayNotFoundError(message, options);
|
|
95
|
+
case 409:
|
|
96
|
+
return new TupayConflictError(message, options);
|
|
97
|
+
case 429:
|
|
98
|
+
return new TupayRateLimitError(message, options);
|
|
99
|
+
case 502:
|
|
100
|
+
return new TupayBaasError(message, options);
|
|
101
|
+
default:
|
|
102
|
+
return new TupayApiError(message, options);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SDK Node officiel de Tupay — encaissement en XPF, Polynésie française.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* import { Tupay } from 'tupay'
|
|
7
|
+
*
|
|
8
|
+
* const tupay = new Tupay(process.env.TUPAY_SECRET_KEY!)
|
|
9
|
+
*
|
|
10
|
+
* const link = await tupay.paymentLinks.create({
|
|
11
|
+
* amountXpf: 4500,
|
|
12
|
+
* description: 'Location paddle 2 h',
|
|
13
|
+
* returnUrl: 'https://ma-boutique.pf/merci',
|
|
14
|
+
* })
|
|
15
|
+
* console.log(link.url)
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.TestHelpers = exports.Events = exports.TupaySignatureVerificationError = exports.TupayConnectionError = exports.TupayBaasError = exports.TupayApiError = exports.TupayRateLimitError = exports.TupayConflictError = exports.TupayValidationError = exports.TupayNotFoundError = exports.TupayPermissionError = exports.TupayAuthenticationError = exports.TupayError = exports.DEFAULT_TOLERANCE_SECONDS = exports.constructEvent = exports.TupayClient = exports.Tupay = void 0;
|
|
19
|
+
const client_js_1 = require("./client.js");
|
|
20
|
+
const payment_intents_js_1 = require("./resources/payment-intents.js");
|
|
21
|
+
const payment_links_js_1 = require("./resources/payment-links.js");
|
|
22
|
+
const transactions_js_1 = require("./resources/transactions.js");
|
|
23
|
+
const refunds_js_1 = require("./resources/refunds.js");
|
|
24
|
+
const webhook_endpoints_js_1 = require("./resources/webhook-endpoints.js");
|
|
25
|
+
const merchants_js_1 = require("./resources/merchants.js");
|
|
26
|
+
const events_js_1 = require("./resources/events.js");
|
|
27
|
+
const test_helpers_js_1 = require("./resources/test-helpers.js");
|
|
28
|
+
const webhooks_js_1 = require("./webhooks.js");
|
|
29
|
+
class Tupay {
|
|
30
|
+
paymentIntents;
|
|
31
|
+
paymentLinks;
|
|
32
|
+
transactions;
|
|
33
|
+
refunds;
|
|
34
|
+
webhookEndpoints;
|
|
35
|
+
merchants;
|
|
36
|
+
/** Historique des événements émis — consultation et rejeu. */
|
|
37
|
+
events;
|
|
38
|
+
/** Utilitaires de mode test — lèvent une erreur avec une clé live. */
|
|
39
|
+
testHelpers;
|
|
40
|
+
/** `true` si la clé fournie est une `tpk_live_`. Déduit du préfixe. */
|
|
41
|
+
livemode;
|
|
42
|
+
#client;
|
|
43
|
+
constructor(apiKey, options = {}) {
|
|
44
|
+
this.#client = new client_js_1.TupayClient(apiKey, options);
|
|
45
|
+
this.livemode = this.#client.livemode;
|
|
46
|
+
this.paymentIntents = new payment_intents_js_1.PaymentIntents(this.#client);
|
|
47
|
+
this.paymentLinks = new payment_links_js_1.PaymentLinks(this.#client);
|
|
48
|
+
this.transactions = new transactions_js_1.Transactions(this.#client);
|
|
49
|
+
this.refunds = new refunds_js_1.Refunds(this.#client);
|
|
50
|
+
this.webhookEndpoints = new webhook_endpoints_js_1.WebhookEndpoints(this.#client);
|
|
51
|
+
this.merchants = new merchants_js_1.Merchants(this.#client);
|
|
52
|
+
this.events = new events_js_1.Events(this.#client);
|
|
53
|
+
this.testHelpers = new test_helpers_js_1.TestHelpers(this.#client);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Vérifie la signature d'un webhook et renvoie l'événement typé.
|
|
57
|
+
*
|
|
58
|
+
* ⚠️ `payload` doit être le corps **brut** de la requête. Un objet déjà
|
|
59
|
+
* parsé puis re-sérialisé ne produira pas le même HMAC.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* app.post('/hook', express.raw({ type: 'application/json' }), (req, res) => {
|
|
63
|
+
* let event
|
|
64
|
+
* try {
|
|
65
|
+
* event = tupay.webhooks.constructEvent(
|
|
66
|
+
* req.body,
|
|
67
|
+
* req.get('tupay-signature'),
|
|
68
|
+
* process.env.TUPAY_WEBHOOK_SECRET,
|
|
69
|
+
* )
|
|
70
|
+
* } catch {
|
|
71
|
+
* return res.status(400).send('signature invalide')
|
|
72
|
+
* }
|
|
73
|
+
* res.sendStatus(200) // acquittez vite
|
|
74
|
+
* traiter(event) // puis traitez
|
|
75
|
+
* })
|
|
76
|
+
*/
|
|
77
|
+
webhooks = {
|
|
78
|
+
constructEvent(payload, header, secret, options) {
|
|
79
|
+
return (0, webhooks_js_1.constructEvent)(payload, header, secret, options);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
/** Génère une clé d'idempotence (UUID v4). */
|
|
83
|
+
static idempotencyKey() {
|
|
84
|
+
return client_js_1.TupayClient.idempotencyKey();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.Tupay = Tupay;
|
|
88
|
+
exports.default = Tupay;
|
|
89
|
+
var client_js_2 = require("./client.js");
|
|
90
|
+
Object.defineProperty(exports, "TupayClient", { enumerable: true, get: function () { return client_js_2.TupayClient; } });
|
|
91
|
+
var webhooks_js_2 = require("./webhooks.js");
|
|
92
|
+
Object.defineProperty(exports, "constructEvent", { enumerable: true, get: function () { return webhooks_js_2.constructEvent; } });
|
|
93
|
+
Object.defineProperty(exports, "DEFAULT_TOLERANCE_SECONDS", { enumerable: true, get: function () { return webhooks_js_2.DEFAULT_TOLERANCE_SECONDS; } });
|
|
94
|
+
var errors_js_1 = require("./errors.js");
|
|
95
|
+
Object.defineProperty(exports, "TupayError", { enumerable: true, get: function () { return errors_js_1.TupayError; } });
|
|
96
|
+
Object.defineProperty(exports, "TupayAuthenticationError", { enumerable: true, get: function () { return errors_js_1.TupayAuthenticationError; } });
|
|
97
|
+
Object.defineProperty(exports, "TupayPermissionError", { enumerable: true, get: function () { return errors_js_1.TupayPermissionError; } });
|
|
98
|
+
Object.defineProperty(exports, "TupayNotFoundError", { enumerable: true, get: function () { return errors_js_1.TupayNotFoundError; } });
|
|
99
|
+
Object.defineProperty(exports, "TupayValidationError", { enumerable: true, get: function () { return errors_js_1.TupayValidationError; } });
|
|
100
|
+
Object.defineProperty(exports, "TupayConflictError", { enumerable: true, get: function () { return errors_js_1.TupayConflictError; } });
|
|
101
|
+
Object.defineProperty(exports, "TupayRateLimitError", { enumerable: true, get: function () { return errors_js_1.TupayRateLimitError; } });
|
|
102
|
+
Object.defineProperty(exports, "TupayApiError", { enumerable: true, get: function () { return errors_js_1.TupayApiError; } });
|
|
103
|
+
Object.defineProperty(exports, "TupayBaasError", { enumerable: true, get: function () { return errors_js_1.TupayBaasError; } });
|
|
104
|
+
Object.defineProperty(exports, "TupayConnectionError", { enumerable: true, get: function () { return errors_js_1.TupayConnectionError; } });
|
|
105
|
+
Object.defineProperty(exports, "TupaySignatureVerificationError", { enumerable: true, get: function () { return errors_js_1.TupaySignatureVerificationError; } });
|
|
106
|
+
var events_js_2 = require("./resources/events.js");
|
|
107
|
+
Object.defineProperty(exports, "Events", { enumerable: true, get: function () { return events_js_2.Events; } });
|
|
108
|
+
var test_helpers_js_2 = require("./resources/test-helpers.js");
|
|
109
|
+
Object.defineProperty(exports, "TestHelpers", { enumerable: true, get: function () { return test_helpers_js_2.TestHelpers; } });
|
|
110
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,2CAA4D;AAC5D,uEAA+D;AAC/D,mEAA2D;AAC3D,iEAA0D;AAC1D,uDAAgD;AAChD,2EAAmE;AACnE,2DAAoD;AACpD,qDAA8C;AAC9C,iEAAyD;AACzD,+CAA0E;AAG1E,MAAa,KAAK;IACP,cAAc,CAAgB;IAC9B,YAAY,CAAc;IAC1B,YAAY,CAAc;IAC1B,OAAO,CAAS;IAChB,gBAAgB,CAAkB;IAClC,SAAS,CAAW;IAC7B,8DAA8D;IACrD,MAAM,CAAQ;IACvB,sEAAsE;IAC7D,WAAW,CAAa;IAEjC,uEAAuE;IAC9D,QAAQ,CAAS;IAEjB,OAAO,CAAa;IAE7B,YAAY,MAAc,EAAE,UAAwB,EAAE;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,uBAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA;QAErC,IAAI,CAAC,cAAc,GAAG,IAAI,mCAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,+BAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,8BAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,CAAC,gBAAgB,GAAG,IAAI,uCAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,6BAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAClD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACM,QAAQ,GAAG;QAClB,cAAc,CACZ,OAAwB,EACxB,MAAiC,EACjC,MAAc,EACd,OAA+B;YAE/B,OAAO,IAAA,4BAAc,EAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QACzD,CAAC;KACF,CAAA;IAED,8CAA8C;IAC9C,MAAM,CAAC,cAAc;QACnB,OAAO,uBAAW,CAAC,cAAc,EAAE,CAAA;IACrC,CAAC;CACF;AApED,sBAoEC;AAED,kBAAe,KAAK,CAAA;AAEpB,yCAAyC;AAAhC,wGAAA,WAAW,OAAA;AAEpB,6CAAyE;AAAhE,6GAAA,cAAc,OAAA;AAAE,wHAAA,yBAAyB,OAAA;AAGlD,yCAYoB;AAXlB,uGAAA,UAAU,OAAA;AACV,qHAAA,wBAAwB,OAAA;AACxB,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,gHAAA,mBAAmB,OAAA;AACnB,0GAAA,aAAa,OAAA;AACb,2GAAA,cAAc,OAAA;AACd,iHAAA,oBAAoB,OAAA;AACpB,4HAAA,+BAA+B,OAAA;AAejC,mDAA8C;AAArC,mGAAA,MAAM,OAAA;AAEf,+DAAyD;AAAhD,8GAAA,WAAW,OAAA"}
|
|
@@ -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,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Collections : paramètres émis et réponse normalisée.
|
|
4
|
+
*
|
|
5
|
+
* ── Pourquoi ce module existe ──────────────────────────────────────
|
|
6
|
+
* L'API a rendu longtemps `{ data, hasMore }` en camelCase. Elle rend
|
|
7
|
+
* désormais les DEUX clés, `has_more` étant la canonique, et retirera
|
|
8
|
+
* `hasMore` dans une version datée future.
|
|
9
|
+
*
|
|
10
|
+
* Un SDK qui lirait l'une des deux se casserait à un moment ou à un
|
|
11
|
+
* autre, et se casserait en SILENCE : `page.hasMore` vaudrait
|
|
12
|
+
* `undefined`, la condition de boucle deviendrait fausse, et
|
|
13
|
+
* l'intégrateur croirait avoir fini de parcourir. Pas d'exception, pas
|
|
14
|
+
* de log, juste des pages manquantes.
|
|
15
|
+
*
|
|
16
|
+
* `normaliserListe` lit donc `has_more` avec repli sur `hasMore`, et
|
|
17
|
+
* remplit les deux dans ce qu'elle rend. Un SDK neuf parle à une API
|
|
18
|
+
* ancienne, un SDK ancien à une API neuve.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.normaliserListe = normaliserListe;
|
|
22
|
+
exports.parametresListe = parametresListe;
|
|
23
|
+
function normaliserListe(brut) {
|
|
24
|
+
const encore = brut.has_more ?? brut.hasMore ?? false;
|
|
25
|
+
return { data: brut.data ?? [], has_more: encore, hasMore: encore };
|
|
26
|
+
}
|
|
27
|
+
/** Traduit les paramètres communs en chaîne de requête. */
|
|
28
|
+
function parametresListe(params) {
|
|
29
|
+
return {
|
|
30
|
+
limit: params.limit,
|
|
31
|
+
starting_after: params.startingAfter,
|
|
32
|
+
ending_before: params.endingBefore,
|
|
33
|
+
offset: params.offset,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=liste.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liste.js","sourceRoot":"","sources":["../../src/liste.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAWH,0CAGC;AA6BD,0CASC;AAzCD,SAAgB,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,SAAgB,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,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,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Events = void 0;
|
|
4
|
+
const liste_js_1 = require("../liste.js");
|
|
5
|
+
class Events {
|
|
6
|
+
client;
|
|
7
|
+
constructor(client) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Les événements du marchand, du plus récent au plus ancien.
|
|
12
|
+
*
|
|
13
|
+
* Le mode vient de la clé : une clé `tpk_test_` ne voit jamais les
|
|
14
|
+
* événements live, et réciproquement.
|
|
15
|
+
*
|
|
16
|
+
* Pagination par CURSEUR, comme les cinq autres collections. Un
|
|
17
|
+
* `offset` glisserait dès qu'un événement naît pendant le parcours, et
|
|
18
|
+
* l'on en sauterait, silencieusement. Le curseur est ancré sur une
|
|
19
|
+
* ligne précise, et un curseur qui ne se résout pas est refusé par un
|
|
20
|
+
* `400 invalid_cursor` plutôt que par une page vide.
|
|
21
|
+
*/
|
|
22
|
+
async list(params = {}) {
|
|
23
|
+
const communs = (0, liste_js_1.parametresListe)({
|
|
24
|
+
...params,
|
|
25
|
+
startingAfter: params.startingAfter ?? params.apres,
|
|
26
|
+
});
|
|
27
|
+
return (0, liste_js_1.normaliserListe)(await this.client.request({
|
|
28
|
+
method: 'GET',
|
|
29
|
+
path: '/events',
|
|
30
|
+
query: { ...communs, type: params.type },
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Un événement précis.
|
|
35
|
+
*
|
|
36
|
+
* Le geste courant du débogage : un webhook arrive, vous tenez son
|
|
37
|
+
* `id`, vous voulez revoir l'objet exact que Tupay a émis.
|
|
38
|
+
*/
|
|
39
|
+
async retrieve(id) {
|
|
40
|
+
const { data } = await this.client.request({
|
|
41
|
+
method: 'GET',
|
|
42
|
+
path: `/events/${encodeURIComponent(id)}`,
|
|
43
|
+
});
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Rejoue un événement vers vos endpoints actifs.
|
|
48
|
+
*
|
|
49
|
+
* ⚠️ Le rejeu **crée** une nouvelle livraison, il ne modifie pas
|
|
50
|
+
* l'ancienne. Votre gestionnaire recevra donc l'événement une fois de
|
|
51
|
+
* plus, avec le même `id` : dédupliquez dessus.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* // Votre serveur était en panne à 3 h du matin.
|
|
55
|
+
* const { data } = await tupay.events.list({ type: 'payment.succeeded' })
|
|
56
|
+
* for (const event of data) {
|
|
57
|
+
* await tupay.events.resend(event.id)
|
|
58
|
+
* }
|
|
59
|
+
*/
|
|
60
|
+
async resend(id) {
|
|
61
|
+
const { data } = await this.client.request({
|
|
62
|
+
method: 'POST',
|
|
63
|
+
path: `/events/${encodeURIComponent(id)}/resend`,
|
|
64
|
+
});
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Parcourt toutes les pages, un événement à la fois.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* for await (const event of tupay.events.autoPagingEach()) {
|
|
72
|
+
* console.log(event.type, event.created)
|
|
73
|
+
* }
|
|
74
|
+
*/
|
|
75
|
+
async *autoPagingEach(params = {}) {
|
|
76
|
+
const limit = params.limit ?? 100;
|
|
77
|
+
let startingAfter = params.startingAfter ?? params.apres;
|
|
78
|
+
let precedent;
|
|
79
|
+
for (;;) {
|
|
80
|
+
const page = await this.list({
|
|
81
|
+
...params,
|
|
82
|
+
limit,
|
|
83
|
+
apres: undefined,
|
|
84
|
+
startingAfter,
|
|
85
|
+
});
|
|
86
|
+
for (const event of page.data)
|
|
87
|
+
yield event;
|
|
88
|
+
// Une page vide signifie la fin, même si le serveur annonçait
|
|
89
|
+
// `hasMore` : ceinture et bretelles contre une boucle infinie.
|
|
90
|
+
const dernier = page.data[page.data.length - 1];
|
|
91
|
+
if (!page.hasMore || !dernier)
|
|
92
|
+
return;
|
|
93
|
+
// Et si le curseur n'avance pas non plus. Une API plus ancienne que
|
|
94
|
+
// ce SDK ignorerait `starting_after` et rendrait indéfiniment la
|
|
95
|
+
// première page.
|
|
96
|
+
if (dernier.id === precedent)
|
|
97
|
+
return;
|
|
98
|
+
precedent = dernier.id;
|
|
99
|
+
startingAfter = dernier.id;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.Events = Events;
|
|
104
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/resources/events.ts"],"names":[],"mappings":";;;AAOA,0CAKoB;AAepB,MAAa,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,IAAA,0BAAe,EAAC;YAC9B,GAAG,MAAM;YACT,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK;SACpD,CAAC,CAAA;QACF,OAAO,IAAA,0BAAe,EACpB,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;AApGD,wBAoGC"}
|
|
@@ -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"}
|