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,18 @@
1
+ import { TupayClient } from '../client.js';
2
+ export class PaymentIntents {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ async create(params) {
8
+ const { idempotencyKey, ...body } = params;
9
+ const { data } = await this.client.request({
10
+ method: 'POST',
11
+ path: '/payments/intent',
12
+ body,
13
+ idempotencyKey: idempotencyKey ?? TupayClient.idempotencyKey(),
14
+ });
15
+ return data;
16
+ }
17
+ }
18
+ //# sourceMappingURL=payment-intents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-intents.js","sourceRoot":"","sources":["../../../src/resources/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAyB1C,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,MAAM,CAAC,MAAiC;QAC5C,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;YAClE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,kBAAkB;YACxB,IAAI;YACJ,cAAc,EAAE,cAAc,IAAI,WAAW,CAAC,cAAc,EAAE;SAC/D,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { TupayClient } from '../client.js';
2
+ import type { ListResult, PaymentLink } from '../types.js';
3
+ import { type ListParams } from '../liste.js';
4
+ export interface CreatePaymentLinkParams {
5
+ /** Entier XPF, entre 100 et 10 000 000. Le XPF n'a pas de centimes. */
6
+ amountXpf: number;
7
+ description: string;
8
+ /**
9
+ * Où renvoyer le client après paiement. Tupay y ajoute
10
+ * `?tupay_transaction=<uuid>&tupay_status=<statut>`.
11
+ *
12
+ * ⚠️ Ces paramètres transitent par le navigateur du client : ils sont
13
+ * falsifiables. Ne validez jamais une commande dessus — seul le
14
+ * webhook signé fait foi.
15
+ */
16
+ returnUrl?: string;
17
+ /** Vos identifiants (n° de commande…), relisibles via `retrieve()`. */
18
+ metadata?: Record<string, string>;
19
+ }
20
+ export declare class PaymentLinks {
21
+ #private;
22
+ private readonly client;
23
+ constructor(client: TupayClient);
24
+ /**
25
+ * Crée un lien de paiement partageable.
26
+ *
27
+ * Non rejouable automatiquement : l'API n'accepte pas d'en-tête
28
+ * d'idempotence ici, une reprise créerait un second lien. En cas de
29
+ * timeout, listez avant de recréer.
30
+ */
31
+ create(params: CreatePaymentLinkParams): Promise<PaymentLink>;
32
+ retrieve(id: string): Promise<PaymentLink>;
33
+ list(params?: ListParams): Promise<ListResult<PaymentLink>>;
34
+ /** Désactive le lien : il n'est plus payable, mais reste consultable. */
35
+ deactivate(id: string): Promise<PaymentLink>;
36
+ activate(id: string): Promise<PaymentLink>;
37
+ }
38
+ //# sourceMappingURL=payment-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-links.d.ts","sourceRoot":"","sources":["../../../src/resources/payment-links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,uBAAuB;IACtC,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,qBAAa,YAAY;;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEhD;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAS7D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ1C,IAAI,CAAC,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAUrE,yEAAyE;IACnE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI5C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAYjD"}
@@ -0,0 +1,52 @@
1
+ import { normaliserListe, parametresListe, } from '../liste.js';
2
+ export class PaymentLinks {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ /**
8
+ * Crée un lien de paiement partageable.
9
+ *
10
+ * Non rejouable automatiquement : l'API n'accepte pas d'en-tête
11
+ * d'idempotence ici, une reprise créerait un second lien. En cas de
12
+ * timeout, listez avant de recréer.
13
+ */
14
+ async create(params) {
15
+ const { data } = await this.client.request({
16
+ method: 'POST',
17
+ path: '/payment-links',
18
+ body: params,
19
+ });
20
+ return data;
21
+ }
22
+ async retrieve(id) {
23
+ const { data } = await this.client.request({
24
+ method: 'GET',
25
+ path: `/payment-links/${encodeURIComponent(id)}`,
26
+ });
27
+ return data;
28
+ }
29
+ async list(params = {}) {
30
+ return normaliserListe(await this.client.request({
31
+ method: 'GET',
32
+ path: '/payment-links',
33
+ query: parametresListe(params),
34
+ }));
35
+ }
36
+ /** Désactive le lien : il n'est plus payable, mais reste consultable. */
37
+ async deactivate(id) {
38
+ return this.#setActive(id, false);
39
+ }
40
+ async activate(id) {
41
+ return this.#setActive(id, true);
42
+ }
43
+ async #setActive(id, active) {
44
+ const { data } = await this.client.request({
45
+ method: 'PATCH',
46
+ path: `/payment-links/${encodeURIComponent(id)}`,
47
+ body: { active },
48
+ });
49
+ return data;
50
+ }
51
+ }
52
+ //# sourceMappingURL=payment-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment-links.js","sourceRoot":"","sources":["../../../src/resources/payment-links.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AAmBpB,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CAAC,MAA+B;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAChE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,MAAM;SACb,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAChE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACjD,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAqB,EAAE;QAChC,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;YACjD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC;SAC/B,CAAC,CACH,CAAA;IACH,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAAe;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAChE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE;YAChD,IAAI,EAAE,EAAE,MAAM,EAAE;SACjB,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import { TupayClient } from '../client.js';
2
+ import type { ListResult, Refund } from '../types.js';
3
+ import { type ListParams } from '../liste.js';
4
+ export interface CreateRefundParams {
5
+ transactionId: string;
6
+ /**
7
+ * Montant à rembourser, en XPF entiers. **Omis = tout le reliquat.**
8
+ *
9
+ * Les remboursements partiels s'accumulent : après un remboursement
10
+ * partiel, `transaction.status` reste `succeeded` et c'est
11
+ * `refundedAmountXpf` qui reflète le cumul.
12
+ */
13
+ amountXpf?: number;
14
+ reason?: string;
15
+ /** Omise, le SDK génère un UUID v4 — la requête devient rejouable. */
16
+ idempotencyKey?: string;
17
+ }
18
+ export interface ListRefundsParams extends ListParams {
19
+ transactionId?: string;
20
+ }
21
+ export declare class Refunds {
22
+ private readonly client;
23
+ constructor(client: TupayClient);
24
+ create(params: CreateRefundParams): Promise<Refund>;
25
+ list(params?: ListRefundsParams): Promise<ListResult<Refund>>;
26
+ }
27
+ //# sourceMappingURL=refunds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refunds.d.ts","sourceRoot":"","sources":["../../../src/resources/refunds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAA;IACrB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAWnD,IAAI,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;CAYxE"}
@@ -0,0 +1,29 @@
1
+ import { TupayClient } from '../client.js';
2
+ import { normaliserListe, parametresListe, } from '../liste.js';
3
+ export class Refunds {
4
+ client;
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ async create(params) {
9
+ const { idempotencyKey, ...body } = params;
10
+ const { data } = await this.client.request({
11
+ method: 'POST',
12
+ path: '/refunds',
13
+ body,
14
+ idempotencyKey: idempotencyKey ?? TupayClient.idempotencyKey(),
15
+ });
16
+ return data;
17
+ }
18
+ async list(params = {}) {
19
+ return normaliserListe(await this.client.request({
20
+ method: 'GET',
21
+ path: '/refunds',
22
+ query: {
23
+ ...parametresListe(params),
24
+ transactionId: params.transactionId,
25
+ },
26
+ }));
27
+ }
28
+ }
29
+ //# sourceMappingURL=refunds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refunds.js","sourceRoot":"","sources":["../../../src/resources/refunds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AAqBpB,MAAM,OAAO,OAAO;IACW;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,MAAM,CAAC,MAA0B;QACrC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAmB;YAC3D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,UAAU;YAChB,IAAI;YACJ,cAAc,EAAE,cAAc,IAAI,WAAW,CAAC,cAAc,EAAE;SAC/D,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAA4B,EAAE;QACvC,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC5C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE;gBACL,GAAG,eAAe,CAAC,MAAM,CAAC;gBAC1B,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC;SACF,CAAC,CACH,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import type { TupayClient } from '../client.js';
2
+ import type { Transaction } from '../types.js';
3
+ export type SimulateOutcome = 'succeeded' | 'failed' | 'processing';
4
+ export interface SimulateResult extends Transaction {
5
+ simulated: true;
6
+ eventId?: string;
7
+ endpointsNotified?: number;
8
+ alreadyInState?: boolean;
9
+ }
10
+ /**
11
+ * Utilitaires réservés au **mode test**.
12
+ *
13
+ * Le bac à sable ne résout pas les paiements tout seul : c'est vous qui
14
+ * décidez de l'issue. C'est ce qui permet de tester les chemins d'échec
15
+ * et de recevoir de vrais webhooks signés sans qu'un centime bouge.
16
+ */
17
+ export declare class TestHelpers {
18
+ private readonly client;
19
+ constructor(client: TupayClient);
20
+ /**
21
+ * Force l'issue d'un paiement de test et déclenche le webhook associé.
22
+ *
23
+ * Rejouer la même issue ne réémet pas d'événement (`alreadyInState`).
24
+ *
25
+ * @throws {TupayError} si le client a été construit avec une clé live —
26
+ * on échoue localement plutôt que d'envoyer une requête vouée au 403.
27
+ */
28
+ simulatePayment(transactionId: string, outcome: SimulateOutcome): Promise<SimulateResult>;
29
+ /**
30
+ * Montants XPF qui provoquent un échec **dès la création** de l'intent.
31
+ * Pratique pour tester vos écrans d'erreur.
32
+ */
33
+ static readonly magicAmounts: {
34
+ /** → `card_declined` */
35
+ readonly cardDeclined: 402;
36
+ /** → `insufficient_funds` */
37
+ readonly insufficientFunds: 403;
38
+ /** → `rate_limited` (marquée réessayable) */
39
+ readonly rateLimited: 429;
40
+ };
41
+ }
42
+ //# sourceMappingURL=test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/resources/test-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAA;AAEnE,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,SAAS,EAAE,IAAI,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEhD;;;;;;;OAOG;IACG,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC;IAgB1B;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,YAAY;QAC1B,wBAAwB;;QAExB,6BAA6B;;QAE7B,6CAA6C;;MAErC;CACX"}
@@ -0,0 +1,46 @@
1
+ import { TupayError } from '../errors.js';
2
+ /**
3
+ * Utilitaires réservés au **mode test**.
4
+ *
5
+ * Le bac à sable ne résout pas les paiements tout seul : c'est vous qui
6
+ * décidez de l'issue. C'est ce qui permet de tester les chemins d'échec
7
+ * et de recevoir de vrais webhooks signés sans qu'un centime bouge.
8
+ */
9
+ export class TestHelpers {
10
+ client;
11
+ constructor(client) {
12
+ this.client = client;
13
+ }
14
+ /**
15
+ * Force l'issue d'un paiement de test et déclenche le webhook associé.
16
+ *
17
+ * Rejouer la même issue ne réémet pas d'événement (`alreadyInState`).
18
+ *
19
+ * @throws {TupayError} si le client a été construit avec une clé live —
20
+ * on échoue localement plutôt que d'envoyer une requête vouée au 403.
21
+ */
22
+ async simulatePayment(transactionId, outcome) {
23
+ if (this.client.livemode) {
24
+ throw new TupayError('simulatePayment est réservé au mode test. Construisez le client avec une clé tpk_test_.', { code: 'livemode_mismatch' });
25
+ }
26
+ const { data } = await this.client.request({
27
+ method: 'POST',
28
+ path: '/test/simulate',
29
+ body: { transactionId, outcome },
30
+ });
31
+ return data;
32
+ }
33
+ /**
34
+ * Montants XPF qui provoquent un échec **dès la création** de l'intent.
35
+ * Pratique pour tester vos écrans d'erreur.
36
+ */
37
+ static magicAmounts = {
38
+ /** → `card_declined` */
39
+ cardDeclined: 402,
40
+ /** → `insufficient_funds` */
41
+ insufficientFunds: 403,
42
+ /** → `rate_limited` (marquée réessayable) */
43
+ rateLimited: 429,
44
+ };
45
+ }
46
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/resources/test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAazC;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe,CACnB,aAAqB,EACrB,OAAwB;QAExB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,UAAU,CAClB,yFAAyF,EACzF,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAC9B,CAAA;QACH,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA2B;YACnE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE;SACjC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,MAAM,CAAU,YAAY,GAAG;QAC7B,wBAAwB;QACxB,YAAY,EAAE,GAAG;QACjB,6BAA6B;QAC7B,iBAAiB,EAAE,GAAG;QACtB,6CAA6C;QAC7C,WAAW,EAAE,GAAG;KACR,CAAA"}
@@ -0,0 +1,29 @@
1
+ import type { TupayClient } from '../client.js';
2
+ import type { ListResult, Transaction, TransactionStatus } from '../types.js';
3
+ import { type ListParams } from '../liste.js';
4
+ export interface ListTransactionsParams extends ListParams {
5
+ status?: TransactionStatus;
6
+ /** Date ISO 8601 — ne renvoie que les transactions postérieures. */
7
+ createdAfter?: string;
8
+ }
9
+ export declare class Transactions {
10
+ private readonly client;
11
+ constructor(client: TupayClient);
12
+ retrieve(id: string): Promise<Transaction>;
13
+ list(params?: ListTransactionsParams): Promise<ListResult<Transaction>>;
14
+ /**
15
+ * Parcourt toutes les pages, une transaction à la fois.
16
+ *
17
+ * Avance par CURSEUR et non plus par décalage : une transaction qui
18
+ * naît pendant le parcours ne décale plus la fenêtre, et rien n'est
19
+ * sauté. `offset` reste accepté par `list()`, mais l'itérateur ne s'y
20
+ * appuie plus.
21
+ *
22
+ * @example
23
+ * for await (const tx of tupay.transactions.autoPagingEach({ status: 'succeeded' })) {
24
+ * total += tx.amountXpf
25
+ * }
26
+ */
27
+ autoPagingEach(params?: ListTransactionsParams): AsyncGenerator<Transaction, void, undefined>;
28
+ }
29
+ //# sourceMappingURL=transactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../../src/resources/transactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC7E,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ1C,IAAI,CAAC,MAAM,GAAE,sBAA2B,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAcjF;;;;;;;;;;;;OAYG;IACI,cAAc,CACnB,MAAM,GAAE,sBAA2B,GAClC,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;CAqBhD"}
@@ -0,0 +1,61 @@
1
+ import { normaliserListe, parametresListe, } from '../liste.js';
2
+ export class Transactions {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ async retrieve(id) {
8
+ const { data } = await this.client.request({
9
+ method: 'GET',
10
+ path: `/transactions/${encodeURIComponent(id)}`,
11
+ });
12
+ return data;
13
+ }
14
+ async list(params = {}) {
15
+ return normaliserListe(await this.client.request({
16
+ method: 'GET',
17
+ path: '/transactions',
18
+ query: {
19
+ ...parametresListe(params),
20
+ status: params.status,
21
+ created_after: params.createdAfter,
22
+ },
23
+ }));
24
+ }
25
+ /**
26
+ * Parcourt toutes les pages, une transaction à la fois.
27
+ *
28
+ * Avance par CURSEUR et non plus par décalage : une transaction qui
29
+ * naît pendant le parcours ne décale plus la fenêtre, et rien n'est
30
+ * sauté. `offset` reste accepté par `list()`, mais l'itérateur ne s'y
31
+ * appuie plus.
32
+ *
33
+ * @example
34
+ * for await (const tx of tupay.transactions.autoPagingEach({ status: 'succeeded' })) {
35
+ * total += tx.amountXpf
36
+ * }
37
+ */
38
+ async *autoPagingEach(params = {}) {
39
+ const limit = params.limit ?? 100;
40
+ let startingAfter = params.startingAfter;
41
+ let precedent;
42
+ for (;;) {
43
+ const page = await this.list({ ...params, limit, offset: undefined, startingAfter });
44
+ for (const transaction of page.data)
45
+ yield transaction;
46
+ const dernier = page.data[page.data.length - 1];
47
+ // Une page vide signifie la fin, même si le serveur annonçait
48
+ // `hasMore` : ceinture et bretelles contre une boucle infinie.
49
+ if (!page.hasMore || !dernier)
50
+ return;
51
+ // Et si le curseur n'avance pas, on s'arrête aussi. Une API plus
52
+ // ancienne que ce SDK ignorerait `starting_after` et rendrait
53
+ // indéfiniment la première page.
54
+ if (dernier.id === precedent)
55
+ return;
56
+ precedent = dernier.id;
57
+ startingAfter = dernier.id;
58
+ }
59
+ }
60
+ }
61
+ //# sourceMappingURL=transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../../../src/resources/transactions.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AAQpB,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAChE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,iBAAiB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SAChD,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiC,EAAE;QAC5C,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;YACjD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE;gBACL,GAAG,eAAe,CAAC,MAAM,CAAC;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,aAAa,EAAE,MAAM,CAAC,YAAY;aACnC;SACF,CAAC,CACH,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,CAAC,cAAc,CACnB,SAAiC,EAAE;QAEnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAA;QACjC,IAAI,aAAa,GAAG,MAAM,CAAC,aAAa,CAAA;QACxC,IAAI,SAA6B,CAAA;QAEjC,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;YACpF,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,WAAW,CAAA;YAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAC/C,8DAA8D;YAC9D,+DAA+D;YAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;gBAAE,OAAM;YACrC,iEAAiE;YACjE,8DAA8D;YAC9D,iCAAiC;YACjC,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,43 @@
1
+ import type { TupayClient } from '../client.js';
2
+ import type { ListResult, WebhookDelivery, WebhookEndpoint, WebhookEndpointWithSecret, WebhookEventType } from '../types.js';
3
+ import { type ListParams } from '../liste.js';
4
+ export interface CreateWebhookEndpointParams {
5
+ /** HTTPS et port 443 obligatoires en mode live. */
6
+ url: string;
7
+ description?: string;
8
+ /** Défaut `['*']` (tout recevoir). */
9
+ enabledEvents?: (WebhookEventType | '*')[];
10
+ }
11
+ export interface UpdateWebhookEndpointParams {
12
+ url?: string;
13
+ description?: string | null;
14
+ enabledEvents?: (WebhookEventType | '*')[];
15
+ status?: 'enabled' | 'disabled';
16
+ }
17
+ export interface ListDeliveriesParams extends ListParams {
18
+ status?: WebhookDelivery['status'];
19
+ eventType?: string;
20
+ }
21
+ export declare class WebhookEndpoints {
22
+ private readonly client;
23
+ constructor(client: TupayClient);
24
+ /**
25
+ * Déclare un endpoint.
26
+ *
27
+ * ⚠️ La réponse est le **seul** endroit où `secret` apparaît. Stockez-le
28
+ * immédiatement (variable d'environnement, coffre) : il n'est plus jamais
29
+ * lisible ensuite. Perdu = supprimer l'endpoint et en recréer un.
30
+ */
31
+ create(params: CreateWebhookEndpointParams): Promise<WebhookEndpointWithSecret>;
32
+ retrieve(id: string): Promise<WebhookEndpoint>;
33
+ list(params?: ListParams): Promise<ListResult<WebhookEndpoint>>;
34
+ update(id: string, params: UpdateWebhookEndpointParams): Promise<WebhookEndpoint>;
35
+ /** Désactivation logique — l'historique de livraison reste consultable. */
36
+ del(id: string): Promise<void>;
37
+ /**
38
+ * Historique de livraison — l'outil de débogage n°1 d'une intégration.
39
+ * Filtrez sur `status: 'failed'` pour voir ce que votre serveur a renvoyé.
40
+ */
41
+ listDeliveries(id: string, params?: ListDeliveriesParams): Promise<ListResult<WebhookDelivery>>;
42
+ }
43
+ //# sourceMappingURL=webhook-endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-endpoints.d.ts","sourceRoot":"","sources":["../../../src/resources/webhook-endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,2BAA2B;IAC1C,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sCAAsC;IACtC,aAAa,CAAC,EAAE,CAAC,gBAAgB,GAAG,GAAG,CAAC,EAAE,CAAA;CAC3C;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,CAAC,EAAE,CAAC,gBAAgB,GAAG,GAAG,CAAC,EAAE,CAAA;IAC1C,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CAChC;AAED,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEhD;;;;;;OAMG;IACG,MAAM,CACV,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,yBAAyB,CAAC;IAW/B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQ9C,IAAI,CAAC,MAAM,GAAE,UAAe,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAUnE,MAAM,CACV,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,eAAe,CAAC;IAS3B,2EAA2E;IACrE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC;;;OAGG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,oBAAyB,GAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;CAaxC"}
@@ -0,0 +1,67 @@
1
+ import { normaliserListe, parametresListe, } from '../liste.js';
2
+ export class WebhookEndpoints {
3
+ client;
4
+ constructor(client) {
5
+ this.client = client;
6
+ }
7
+ /**
8
+ * Déclare un endpoint.
9
+ *
10
+ * ⚠️ La réponse est le **seul** endroit où `secret` apparaît. Stockez-le
11
+ * immédiatement (variable d'environnement, coffre) : il n'est plus jamais
12
+ * lisible ensuite. Perdu = supprimer l'endpoint et en recréer un.
13
+ */
14
+ async create(params) {
15
+ const { data } = await this.client.request({
16
+ method: 'POST',
17
+ path: '/webhook-endpoints',
18
+ body: params,
19
+ });
20
+ return data;
21
+ }
22
+ async retrieve(id) {
23
+ const { data } = await this.client.request({
24
+ method: 'GET',
25
+ path: `/webhook-endpoints/${encodeURIComponent(id)}`,
26
+ });
27
+ return data;
28
+ }
29
+ async list(params = {}) {
30
+ return normaliserListe(await this.client.request({
31
+ method: 'GET',
32
+ path: '/webhook-endpoints',
33
+ query: parametresListe(params),
34
+ }));
35
+ }
36
+ async update(id, params) {
37
+ const { data } = await this.client.request({
38
+ method: 'PATCH',
39
+ path: `/webhook-endpoints/${encodeURIComponent(id)}`,
40
+ body: params,
41
+ });
42
+ return data;
43
+ }
44
+ /** Désactivation logique — l'historique de livraison reste consultable. */
45
+ async del(id) {
46
+ await this.client.request({
47
+ method: 'DELETE',
48
+ path: `/webhook-endpoints/${encodeURIComponent(id)}`,
49
+ });
50
+ }
51
+ /**
52
+ * Historique de livraison — l'outil de débogage n°1 d'une intégration.
53
+ * Filtrez sur `status: 'failed'` pour voir ce que votre serveur a renvoyé.
54
+ */
55
+ async listDeliveries(id, params = {}) {
56
+ return normaliserListe(await this.client.request({
57
+ method: 'GET',
58
+ path: `/webhook-endpoints/${encodeURIComponent(id)}/deliveries`,
59
+ query: {
60
+ ...parametresListe(params),
61
+ status: params.status,
62
+ eventType: params.eventType,
63
+ },
64
+ }));
65
+ }
66
+ }
67
+ //# sourceMappingURL=webhook-endpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-endpoints.js","sourceRoot":"","sources":["../../../src/resources/webhook-endpoints.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AAsBpB,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,MAAmC;QAEnC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAEvC;YACD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,MAAM;SACb,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA4B;YACpE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACrD,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAqB,EAAE;QAChC,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA8B;YACrD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC;SAC/B,CAAC,CACH,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,EAAU,EACV,MAAmC;QAEnC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA4B;YACpE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,EAAE,CAAC,EAAE;YACpD,IAAI,EAAE,MAAM;SACb,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAU;YACjC,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,EAAE,CAAC,EAAE;SACrD,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,EAAU,EACV,SAA+B,EAAE;QAEjC,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA8B;YACrD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,sBAAsB,kBAAkB,CAAC,EAAE,CAAC,aAAa;YAC/D,KAAK,EAAE;gBACL,GAAG,eAAe,CAAC,MAAM,CAAC;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;SACF,CAAC,CACH,CAAA;IACH,CAAC;CACF"}