@wiicode/youcanpay-sdk 1.0.4 → 1.0.5
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 +125 -5
- package/dist/client.d.ts +2 -0
- package/dist/client.js +48 -3
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/payment.interface.d.ts +19 -2
- package/dist/interfaces/transaction.interface.d.ts +2 -0
- package/dist/nestjs/pipes/webhook.pipe.d.ts +1 -1
- package/dist/nestjs/pipes/webhook.pipe.js +13 -6
- package/dist/nestjs/pipes/webhook.pipe.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.js +8 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/validators.d.ts +12 -0
- package/dist/security/validators.js +117 -1
- package/dist/security/validators.js.map +1 -1
- package/dist/security/webhook.js +21 -3
- package/dist/security/webhook.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,11 +9,23 @@ Production-ready Node.js SDK for [YouCanPay](https://youcanpay.com) - Morocco's
|
|
|
9
9
|
|
|
10
10
|
Works with **any Node.js framework** (Express, Fastify, Hapi) and has first-class **NestJS integration**.
|
|
11
11
|
|
|
12
|
+
## Features
|
|
13
|
+
|
|
14
|
+
- **Credit Card Payments** - Redirect to YouCanPay checkout or direct server-side processing
|
|
15
|
+
- **CashPlus Payments** - Generate payment codes for cash payments at 1,800+ CashPlus locations in Morocco
|
|
16
|
+
- **Webhook Handling** - Secure webhook verification and parsing
|
|
17
|
+
- **NestJS Integration** - First-class module, guards, and pipes
|
|
18
|
+
- **TypeScript** - Full type safety and IntelliSense support
|
|
19
|
+
- **Validation** - Built-in input validation and sanitization
|
|
20
|
+
|
|
12
21
|
## Table of Contents
|
|
13
22
|
|
|
14
23
|
- [Installation](#installation)
|
|
15
24
|
- [Environment Setup](#environment-setup)
|
|
16
25
|
- [Quick Start](#quick-start)
|
|
26
|
+
- [Payment Methods](#payment-methods)
|
|
27
|
+
- [Credit Card](#credit-card-payment)
|
|
28
|
+
- [CashPlus](#cashplus-payment)
|
|
17
29
|
- [Complete Payment Flow](#complete-payment-flow)
|
|
18
30
|
- [API Reference](#api-reference)
|
|
19
31
|
- [Webhook Handling](#webhook-handling)
|
|
@@ -177,6 +189,62 @@ export class PaymentsService {
|
|
|
177
189
|
|
|
178
190
|
---
|
|
179
191
|
|
|
192
|
+
## Payment Methods
|
|
193
|
+
|
|
194
|
+
### Credit Card Payment
|
|
195
|
+
|
|
196
|
+
Redirect users to YouCanPay's secure checkout page:
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// 1. Create token
|
|
200
|
+
const { token } = await client.createToken({
|
|
201
|
+
amount: 50000, // 500.00 MAD
|
|
202
|
+
currency: CurrencyCode.MAD,
|
|
203
|
+
customerIp: '192.168.1.1',
|
|
204
|
+
successUrl: 'https://myapp.com/success',
|
|
205
|
+
errorUrl: 'https://myapp.com/error',
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// 2. Redirect to checkout
|
|
209
|
+
const paymentUrl = client.getPaymentUrl(token.id);
|
|
210
|
+
// => https://youcanpay.com/payment/token-id?lang=fr
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### CashPlus Payment
|
|
214
|
+
|
|
215
|
+
Generate a payment code for cash payments at 1,800+ CashPlus locations in Morocco:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// 1. Create token (same as card)
|
|
219
|
+
const { token } = await client.createToken({
|
|
220
|
+
amount: 50000,
|
|
221
|
+
currency: CurrencyCode.MAD,
|
|
222
|
+
customerIp: '192.168.1.1',
|
|
223
|
+
successUrl: 'https://myapp.com/success',
|
|
224
|
+
errorUrl: 'https://myapp.com/error',
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// 2. Initialize CashPlus payment
|
|
228
|
+
const cashplus = await client.payWithCashPlus({
|
|
229
|
+
tokenId: token.id,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
// 3. Display the code to customer
|
|
233
|
+
console.log('Payment Code:', cashplus.token); // e.g., "cp862603980"
|
|
234
|
+
console.log('Transaction ID:', cashplus.transaction_id);
|
|
235
|
+
|
|
236
|
+
// Customer takes this code to any CashPlus location to pay in cash
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**CashPlus Flow:**
|
|
240
|
+
1. Customer sees payment code (e.g., `cp862603980`)
|
|
241
|
+
2. Customer visits any CashPlus location in Morocco
|
|
242
|
+
3. Customer provides the code and pays in cash
|
|
243
|
+
4. YouCanPay sends webhook notification to your server
|
|
244
|
+
5. Your app confirms the payment
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
180
248
|
## Complete Payment Flow
|
|
181
249
|
|
|
182
250
|
```
|
|
@@ -371,14 +439,33 @@ const result = await client.payWithCreditCard({
|
|
|
371
439
|
|
|
372
440
|
#### `payWithCashPlus(params): Promise<CashPlusPaymentResponse>`
|
|
373
441
|
|
|
374
|
-
Initialize CashPlus payment.
|
|
442
|
+
Initialize CashPlus payment. Returns a payment code that customers can use at any CashPlus location in Morocco.
|
|
375
443
|
|
|
376
444
|
```typescript
|
|
377
445
|
const result = await client.payWithCashPlus({
|
|
378
|
-
tokenId: string,
|
|
446
|
+
tokenId: string, // Token from createToken()
|
|
379
447
|
});
|
|
448
|
+
|
|
449
|
+
// Response
|
|
450
|
+
{
|
|
451
|
+
transaction_id: string,
|
|
452
|
+
token: string, // Payment code for CashPlus location (e.g., "cp115705252")
|
|
453
|
+
success?: boolean,
|
|
454
|
+
amount?: number, // Amount in centimes
|
|
455
|
+
currency?: string, // Currency code
|
|
456
|
+
order_id?: string, // Order reference
|
|
457
|
+
expires_at?: string, // Token expiration (ISO date)
|
|
458
|
+
message?: string, // Message from YouCanPay
|
|
459
|
+
}
|
|
380
460
|
```
|
|
381
461
|
|
|
462
|
+
**CashPlus Payment Flow:**
|
|
463
|
+
1. Create a payment token with `createToken()`
|
|
464
|
+
2. Initialize CashPlus payment with `payWithCashPlus()`
|
|
465
|
+
3. Display the `cashplus_token` to the customer
|
|
466
|
+
4. Customer visits any CashPlus location and provides the code
|
|
467
|
+
5. Once paid, YouCanPay sends a webhook notification
|
|
468
|
+
|
|
382
469
|
### Standalone Functions
|
|
383
470
|
|
|
384
471
|
#### Webhook Functions
|
|
@@ -419,6 +506,13 @@ import {
|
|
|
419
506
|
validateOrderId,
|
|
420
507
|
validateIP,
|
|
421
508
|
validateEmail,
|
|
509
|
+
validateTokenId,
|
|
510
|
+
validateTimeout,
|
|
511
|
+
validateClientOptions,
|
|
512
|
+
validateCardNumber,
|
|
513
|
+
validateExpiryDate,
|
|
514
|
+
validateCVV,
|
|
515
|
+
validateCardHolderName,
|
|
422
516
|
validatePaymentInput,
|
|
423
517
|
} from '@wiicode/youcanpay-sdk';
|
|
424
518
|
|
|
@@ -432,6 +526,13 @@ validateCurrency('GBP'); // { valid: false, error: 'Currency mus
|
|
|
432
526
|
|
|
433
527
|
validateRedirectURL('https://app.com'); // { valid: true }
|
|
434
528
|
validateRedirectURL('javascript:...'); // { valid: false }
|
|
529
|
+
validateTokenId('tok_123'); // { valid: true }
|
|
530
|
+
validateTimeout(30000); // { valid: true }
|
|
531
|
+
validateClientOptions({ privateKey: 'pri_x', publicKey: 'pub_x' }); // { valid: true }
|
|
532
|
+
validateCardNumber('4111111111111111'); // { valid: true }
|
|
533
|
+
validateExpiryDate('12/30'); // { valid: true }
|
|
534
|
+
validateCVV('123'); // { valid: true }
|
|
535
|
+
validateCardHolderName('Jane Doe'); // { valid: true }
|
|
435
536
|
|
|
436
537
|
// Validate all at once
|
|
437
538
|
const result = validatePaymentInput({
|
|
@@ -513,7 +614,7 @@ console.log(webhook.transactionId); // 'txn-uuid'
|
|
|
513
614
|
console.log(webhook.orderId); // 'your-order-id'
|
|
514
615
|
console.log(webhook.amount); // 50000
|
|
515
616
|
console.log(webhook.isSuccess); // true
|
|
516
|
-
console.log(webhook.status); // 'paid' | 'failed' | 'refunded'
|
|
617
|
+
console.log(webhook.status); // 'paid' | 'failed' | 'refunded' | 'unknown'
|
|
517
618
|
console.log(webhook.eventName); // 'transaction.paid'
|
|
518
619
|
```
|
|
519
620
|
|
|
@@ -530,6 +631,7 @@ import {
|
|
|
530
631
|
} from '@nestjs/common';
|
|
531
632
|
import {
|
|
532
633
|
ParseWebhookPipe,
|
|
634
|
+
ParsedWebhook,
|
|
533
635
|
ParsedWebhookPayload,
|
|
534
636
|
verifyWebhookSecret,
|
|
535
637
|
} from '@wiicode/youcanpay-sdk';
|
|
@@ -559,6 +661,15 @@ export class PaymentsController {
|
|
|
559
661
|
}
|
|
560
662
|
```
|
|
561
663
|
|
|
664
|
+
You can also inject the parsed payload directly:
|
|
665
|
+
|
|
666
|
+
```typescript
|
|
667
|
+
@Post('webhook')
|
|
668
|
+
handleWebhook(@ParsedWebhook() webhook: ParsedWebhookPayload) {
|
|
669
|
+
return { orderId: webhook.orderId };
|
|
670
|
+
}
|
|
671
|
+
```
|
|
672
|
+
|
|
562
673
|
### Webhook Security Checklist
|
|
563
674
|
|
|
564
675
|
- [ ] Add secret to webhook URL: `https://myapp.com/webhook?secret=xxx`
|
|
@@ -883,6 +994,15 @@ if (!validation.valid) {
|
|
|
883
994
|
6. **HTTPS only** - Never use HTTP in production
|
|
884
995
|
7. **Sanitize inputs** - Use `sanitizeString()` for user inputs
|
|
885
996
|
8. **URL whitelist** - Validate redirect URLs against allowed domains
|
|
997
|
+
9. **Pre-validate outbound requests** - The SDK rejects invalid client, token, and card input before any network call
|
|
998
|
+
|
|
999
|
+
### Production Checklist
|
|
1000
|
+
|
|
1001
|
+
- Complete a full sandbox checkout plus webhook round-trip before enabling live keys.
|
|
1002
|
+
- Restrict redirect URLs to your own domains with `validateRedirectURL(..., { allowedDomains: [...] })`.
|
|
1003
|
+
- Store webhook event IDs in your application database and enforce idempotency there.
|
|
1004
|
+
- Monitor failed `getTransaction()` and webhook-verification paths.
|
|
1005
|
+
- Rotate API keys and webhook secrets regularly.
|
|
886
1006
|
|
|
887
1007
|
---
|
|
888
1008
|
|
|
@@ -898,7 +1018,7 @@ try {
|
|
|
898
1018
|
} catch (error) {
|
|
899
1019
|
if (error instanceof YouCanPayError) {
|
|
900
1020
|
console.log(error.code); // ErrorCodes.VALIDATION_ERROR
|
|
901
|
-
console.log(error.
|
|
1021
|
+
console.log(error.statusCode); // 422
|
|
902
1022
|
console.log(error.message); // "The amount field is required"
|
|
903
1023
|
console.log(error.details); // { amount: ['required'] }
|
|
904
1024
|
}
|
|
@@ -925,7 +1045,7 @@ export class YouCanPayExceptionFilter implements ExceptionFilter {
|
|
|
925
1045
|
catch(exception: YouCanPayError, host: ArgumentsHost) {
|
|
926
1046
|
const response = host.switchToHttp().getResponse();
|
|
927
1047
|
|
|
928
|
-
response.status(exception.
|
|
1048
|
+
response.status(exception.statusCode || 500).json({
|
|
929
1049
|
error: exception.code,
|
|
930
1050
|
message: exception.message,
|
|
931
1051
|
});
|
package/dist/client.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Lang } from './enums';
|
|
|
2
2
|
import { YouCanPayOptions, CreateTokenParams, TokenResponse, PayCreditCardParams, PaymentResponse, PayCashPlusParams, CashPlusPaymentResponse, Transaction } from './interfaces';
|
|
3
3
|
export declare class YouCanPayClient {
|
|
4
4
|
private readonly http;
|
|
5
|
+
private readonly transactionHttp;
|
|
5
6
|
private readonly sandbox;
|
|
6
7
|
private readonly privateKey;
|
|
7
8
|
private readonly publicKey;
|
|
@@ -14,4 +15,5 @@ export declare class YouCanPayClient {
|
|
|
14
15
|
getTransaction(transactionId: string): Promise<Transaction>;
|
|
15
16
|
verifyWebhook(payload: unknown): boolean;
|
|
16
17
|
private handleError;
|
|
18
|
+
private assertValid;
|
|
17
19
|
}
|
package/dist/client.js
CHANGED
|
@@ -10,8 +10,15 @@ const constants_1 = require("./constants");
|
|
|
10
10
|
const errors_1 = require("./errors");
|
|
11
11
|
const enums_1 = require("./enums");
|
|
12
12
|
const logger_1 = require("./logging/logger");
|
|
13
|
+
const webhook_1 = require("./security/webhook");
|
|
14
|
+
const validators_1 = require("./security/validators");
|
|
13
15
|
class YouCanPayClient {
|
|
14
16
|
constructor(options) {
|
|
17
|
+
this.assertValid((0, validators_1.validateClientOptions)({
|
|
18
|
+
privateKey: options.privateKey,
|
|
19
|
+
publicKey: options.publicKey,
|
|
20
|
+
timeout: options.timeout,
|
|
21
|
+
}));
|
|
15
22
|
this.sandbox = options.sandbox ?? false;
|
|
16
23
|
this.privateKey = options.privateKey;
|
|
17
24
|
this.publicKey = options.publicKey;
|
|
@@ -23,10 +30,23 @@ class YouCanPayClient {
|
|
|
23
30
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
24
31
|
},
|
|
25
32
|
});
|
|
33
|
+
this.transactionHttp = axios_1.default.create({
|
|
34
|
+
baseURL: this.sandbox ? constants_1.YOUCANPAY_SANDBOX_TRANSACTION_API_URL : constants_1.YOUCANPAY_TRANSACTION_API_URL,
|
|
35
|
+
timeout: options.timeout ?? 30000,
|
|
36
|
+
});
|
|
26
37
|
}
|
|
27
38
|
async createToken(params) {
|
|
28
39
|
const startTime = Date.now();
|
|
29
40
|
const orderId = params.orderId ?? (0, crypto_1.randomUUID)();
|
|
41
|
+
this.assertValid((0, validators_1.validatePaymentInput)({
|
|
42
|
+
amount: params.amount,
|
|
43
|
+
currency: params.currency,
|
|
44
|
+
orderId,
|
|
45
|
+
customerIp: params.customerIp,
|
|
46
|
+
successUrl: params.successUrl,
|
|
47
|
+
errorUrl: params.errorUrl,
|
|
48
|
+
customerEmail: params.customer?.email,
|
|
49
|
+
}));
|
|
30
50
|
const body = new URLSearchParams();
|
|
31
51
|
body.append('pri_key', this.privateKey);
|
|
32
52
|
body.append('pub_key', this.publicKey);
|
|
@@ -78,6 +98,11 @@ class YouCanPayClient {
|
|
|
78
98
|
}
|
|
79
99
|
async payWithCreditCard(params) {
|
|
80
100
|
const startTime = Date.now();
|
|
101
|
+
this.assertValid((0, validators_1.validateTokenId)(params.tokenId));
|
|
102
|
+
this.assertValid((0, validators_1.validateCardNumber)(params.creditCard));
|
|
103
|
+
this.assertValid((0, validators_1.validateExpiryDate)(params.expireDate));
|
|
104
|
+
this.assertValid((0, validators_1.validateCVV)(params.cvv));
|
|
105
|
+
this.assertValid((0, validators_1.validateCardHolderName)(params.cardHolderName));
|
|
81
106
|
const body = new URLSearchParams();
|
|
82
107
|
body.append('pri_key', this.privateKey);
|
|
83
108
|
body.append('pub_key', this.publicKey);
|
|
@@ -99,13 +124,21 @@ class YouCanPayClient {
|
|
|
99
124
|
}
|
|
100
125
|
async payWithCashPlus(params) {
|
|
101
126
|
const startTime = Date.now();
|
|
127
|
+
this.assertValid((0, validators_1.validateTokenId)(params.tokenId));
|
|
102
128
|
const body = new URLSearchParams();
|
|
103
129
|
body.append('pri_key', this.privateKey);
|
|
104
130
|
body.append('pub_key', this.publicKey);
|
|
105
131
|
body.append('token_id', params.tokenId);
|
|
132
|
+
body.append('payment_method[type]', 'cashplus');
|
|
106
133
|
try {
|
|
107
134
|
const response = await this.http.post('/cashplus/init', body);
|
|
108
|
-
const
|
|
135
|
+
const rawData = response.data;
|
|
136
|
+
const cashplusToken = typeof rawData.token === 'string' ? rawData.token : rawData.token?.id;
|
|
137
|
+
const data = {
|
|
138
|
+
...rawData,
|
|
139
|
+
token: cashplusToken,
|
|
140
|
+
transaction_id: rawData.transaction_id || '',
|
|
141
|
+
};
|
|
109
142
|
await this.logger.log('payWithCashPlus', { tokenId: params.tokenId }, data, 'success', Date.now() - startTime);
|
|
110
143
|
return data;
|
|
111
144
|
}
|
|
@@ -116,8 +149,9 @@ class YouCanPayClient {
|
|
|
116
149
|
}
|
|
117
150
|
async getTransaction(transactionId) {
|
|
118
151
|
const startTime = Date.now();
|
|
152
|
+
this.assertValid((0, validators_1.validateTokenId)(transactionId));
|
|
119
153
|
try {
|
|
120
|
-
const response = await this.
|
|
154
|
+
const response = await this.transactionHttp.get(`/transactions/${transactionId}`, {
|
|
121
155
|
params: { pri_key: this.privateKey },
|
|
122
156
|
});
|
|
123
157
|
const data = response.data;
|
|
@@ -133,10 +167,16 @@ class YouCanPayClient {
|
|
|
133
167
|
if (!payload || typeof payload !== 'object') {
|
|
134
168
|
return false;
|
|
135
169
|
}
|
|
170
|
+
try {
|
|
171
|
+
(0, webhook_1.parseWebhookPayload)(payload);
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
}
|
|
136
176
|
const p = payload;
|
|
137
177
|
return (typeof p['transaction_id'] === 'string' &&
|
|
138
178
|
typeof p['order_id'] === 'string' &&
|
|
139
|
-
typeof p['amount'] === 'number' &&
|
|
179
|
+
(typeof p['amount'] === 'number' || typeof p['amount'] === 'string') &&
|
|
140
180
|
typeof p['status'] === 'string');
|
|
141
181
|
}
|
|
142
182
|
handleError(error) {
|
|
@@ -168,6 +208,11 @@ class YouCanPayClient {
|
|
|
168
208
|
const message = error instanceof Error ? error.message : 'An unknown error occurred';
|
|
169
209
|
return new errors_1.YouCanPayError(message, errors_1.ErrorCodes.UNKNOWN_ERROR);
|
|
170
210
|
}
|
|
211
|
+
assertValid(result) {
|
|
212
|
+
if (!result.valid) {
|
|
213
|
+
throw new errors_1.YouCanPayError(result.error ?? 'Invalid input', errors_1.ErrorCodes.VALIDATION_ERROR);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
171
216
|
}
|
|
172
217
|
exports.YouCanPayClient = YouCanPayClient;
|
|
173
218
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,mCAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,mCAAoC;AACpC,2CAOqB;AACrB,qCAAsD;AACtD,mCAA+B;AAC/B,6CAAmD;AACnD,gDAAyD;AACzD,sDAQ+B;AAa/B,MAAa,eAAe;IAQ1B,YAAY,OAAyB;QACnC,IAAI,CAAC,WAAW,CACd,IAAA,kCAAqB,EAAC;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,CAAC,IAAI,GAAG,eAAK,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,sCAA0B,CAAC,CAAC,CAAC,8BAAkB;YACvE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;aACpD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,GAAG,eAAK,CAAC,MAAM,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,iDAAqC,CAAC,CAAC,CAAC,yCAA6B;YAC7F,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAA,mBAAU,GAAE,CAAC;QAC/C,IAAI,CAAC,WAAW,CACd,IAAA,iCAAoB,EAAC;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO;YACP,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK;SACtC,CAAC,CACH,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,QAAQ,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,QAAQ,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,QAAQ,CAAC,OAAO;gBAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,QAAQ,CAAC,QAAQ;gBAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,QAAQ,CAAC,IAAI;gBAAE,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,QAAQ,CAAC,KAAK;gBAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,QAAQ,CAAC,YAAY;gBAAE,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAqB,CAAC;YAC5C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,aAAa,EACb,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAC7D,IAA0C,EAC1C,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EACtB,MAAM,CAAC,QAAQ,CAChB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,aAAa,EACb,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAC7D,SAAS,EACT,OAAO,EACP,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAe,EAAE,OAAa,YAAI,CAAC,EAAE;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,yCAA6B,CAAC,CAAC,CAAC,iCAAqB,CAAC;QACrF,OAAO,GAAG,OAAO,IAAI,OAAO,SAAS,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA2B;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAA,4BAAe,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,IAAA,+BAAkB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,IAAA,+BAAkB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,IAAA,wBAAW,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,CAAC,IAAA,mCAAsB,EAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;YAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,mBAAmB,EACnB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,EAClE,IAA0C,EAC1C,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,mBAAmB,EACnB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAC3B,SAAS,EACT,OAAO,EACP,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAyB;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAA,4BAAe,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAA2B,CAAC;YAIrD,MAAM,aAAa,GACjB,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAExE,MAAM,IAAI,GAA4B;gBACpC,GAAG,OAAO;gBACV,KAAK,EAAE,aAAa;gBACpB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;aAC7C,CAAC;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,iBAAiB,EACjB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAC3B,IAA0C,EAC1C,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,iBAAiB,EACjB,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAC3B,SAAS,EACT,OAAO,EACP,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,aAAqB;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAA,4BAAe,EAAC,aAAa,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,iBAAiB,aAAa,EAAE,EAAE;gBAChF,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;aACrC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAmB,CAAC;YAC1C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,gBAAgB,EAChB,EAAE,aAAa,EAAE,EACjB,IAA0C,EAC1C,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,gBAAgB,EAChB,EAAE,aAAa,EAAE,EACjB,SAAS,EACT,OAAO,EACP,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CACvB,CAAC;YACF,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAgB;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,IAAA,6BAAmB,EAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;QAED,MAAM,CAAC,GAAG,OAAkC,CAAC;QAC7C,OAAO,CACL,OAAO,CAAC,CAAC,gBAAgB,CAAC,KAAK,QAAQ;YACvC,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;YACjC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC;YACpE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAChC,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,IACE,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,cAAc,IAAI,KAAK;YACtB,KAAmC,CAAC,YAAY,EACjD,CAAC;YACD,MAAM,UAAU,GAAG,KAKlB,CAAC;YAEF,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBACxB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC;gBAC7C,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,uBAAuB,CAAC;gBACzD,MAAM,OAAO,GAAG,IAAI,EAAE,MAAM,CAAC;gBAE7B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrC,OAAO,IAAI,uBAAc,CAAC,OAAO,EAAE,mBAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/E,CAAC;gBACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnB,OAAO,IAAI,uBAAc,CAAC,OAAO,EAAE,mBAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACnF,CAAC;gBACD,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;oBAClC,OAAO,IAAI,uBAAc,CAAC,OAAO,EAAE,mBAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,uBAAc,CAAC,OAAO,EAAE,mBAAU,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChF,CAAC;YAED,OAAO,IAAI,uBAAc,CAAC,wBAAwB,EAAE,mBAAU,CAAC,aAAa,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,KAAK,YAAY,uBAAc,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;QACrF,OAAO,IAAI,uBAAc,CAAC,OAAO,EAAE,mBAAU,CAAC,aAAa,CAAC,CAAC;IAC/D,CAAC;IAEO,WAAW,CAAC,MAA0C;QAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,uBAAc,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,mBAAU,CAAC,gBAAgB,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF;AA9RD,0CA8RC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ export { YouCanPayModule } from './nestjs/youcanpay.module';
|
|
|
3
3
|
export { YouCanPayService } from './nestjs/youcanpay.service';
|
|
4
4
|
export { InjectYouCanPay } from './nestjs/decorators';
|
|
5
5
|
export { WebhookGuard, WebhookOptions, WEBHOOK_SECRET_KEY } from './nestjs/guards';
|
|
6
|
-
export { ParseWebhookPipe } from './nestjs/pipes';
|
|
7
|
-
export { parseWebhookPayload, verifyWebhookSecret, verifyWebhookHMAC, createWebhookSignature, WebhookParseError, WebhookVerifyError, validateAmount, validateCurrency, validateRedirectURL, validateOrderId, validateIP, validateEmail, validatePaymentInput, sanitizeString, toCentimes, fromCentimes, formatAmount, SUPPORTED_CURRENCIES, type YouCanPayRawWebhook, type ParsedWebhookPayload, type WebhookVerifyOptions, type SupportedCurrency, type ValidationResult, } from './security';
|
|
6
|
+
export { ParseWebhookPipe, ParsedWebhook } from './nestjs/pipes';
|
|
7
|
+
export { parseWebhookPayload, verifyWebhookSecret, verifyWebhookHMAC, createWebhookSignature, WebhookParseError, WebhookVerifyError, validateAmount, validateCurrency, validateRedirectURL, validateOrderId, validateIP, validateEmail, validateTokenId, validateTimeout, validateClientOptions, validateCardNumber, validateExpiryDate, validateCVV, validateCardHolderName, validatePaymentInput, sanitizeString, toCentimes, fromCentimes, formatAmount, SUPPORTED_CURRENCIES, type YouCanPayRawWebhook, type ParsedWebhookPayload, type WebhookVerifyOptions, type SupportedCurrency, type ValidationResult, type ClientOptionsValidationInput, } from './security';
|
|
8
8
|
export * from './interfaces';
|
|
9
9
|
export * from './enums';
|
|
10
10
|
export * from './errors';
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.YouCanPayLogger = exports.SUPPORTED_CURRENCIES = exports.formatAmount = exports.fromCentimes = exports.toCentimes = exports.sanitizeString = exports.validatePaymentInput = exports.validateEmail = exports.validateIP = exports.validateOrderId = exports.validateRedirectURL = exports.validateCurrency = exports.validateAmount = exports.WebhookVerifyError = exports.WebhookParseError = exports.createWebhookSignature = exports.verifyWebhookHMAC = exports.verifyWebhookSecret = exports.parseWebhookPayload = exports.ParseWebhookPipe = exports.WEBHOOK_SECRET_KEY = exports.WebhookOptions = exports.WebhookGuard = exports.InjectYouCanPay = exports.YouCanPayService = exports.YouCanPayModule = exports.YouCanPayClient = void 0;
|
|
17
|
+
exports.YouCanPayLogger = exports.SUPPORTED_CURRENCIES = exports.formatAmount = exports.fromCentimes = exports.toCentimes = exports.sanitizeString = exports.validatePaymentInput = exports.validateCardHolderName = exports.validateCVV = exports.validateExpiryDate = exports.validateCardNumber = exports.validateClientOptions = exports.validateTimeout = exports.validateTokenId = exports.validateEmail = exports.validateIP = exports.validateOrderId = exports.validateRedirectURL = exports.validateCurrency = exports.validateAmount = exports.WebhookVerifyError = exports.WebhookParseError = exports.createWebhookSignature = exports.verifyWebhookHMAC = exports.verifyWebhookSecret = exports.parseWebhookPayload = exports.ParsedWebhook = exports.ParseWebhookPipe = exports.WEBHOOK_SECRET_KEY = exports.WebhookOptions = exports.WebhookGuard = exports.InjectYouCanPay = exports.YouCanPayService = exports.YouCanPayModule = exports.YouCanPayClient = void 0;
|
|
18
18
|
var client_1 = require("./client");
|
|
19
19
|
Object.defineProperty(exports, "YouCanPayClient", { enumerable: true, get: function () { return client_1.YouCanPayClient; } });
|
|
20
20
|
var youcanpay_module_1 = require("./nestjs/youcanpay.module");
|
|
@@ -29,6 +29,7 @@ Object.defineProperty(exports, "WebhookOptions", { enumerable: true, get: functi
|
|
|
29
29
|
Object.defineProperty(exports, "WEBHOOK_SECRET_KEY", { enumerable: true, get: function () { return guards_1.WEBHOOK_SECRET_KEY; } });
|
|
30
30
|
var pipes_1 = require("./nestjs/pipes");
|
|
31
31
|
Object.defineProperty(exports, "ParseWebhookPipe", { enumerable: true, get: function () { return pipes_1.ParseWebhookPipe; } });
|
|
32
|
+
Object.defineProperty(exports, "ParsedWebhook", { enumerable: true, get: function () { return pipes_1.ParsedWebhook; } });
|
|
32
33
|
var security_1 = require("./security");
|
|
33
34
|
Object.defineProperty(exports, "parseWebhookPayload", { enumerable: true, get: function () { return security_1.parseWebhookPayload; } });
|
|
34
35
|
Object.defineProperty(exports, "verifyWebhookSecret", { enumerable: true, get: function () { return security_1.verifyWebhookSecret; } });
|
|
@@ -42,6 +43,13 @@ Object.defineProperty(exports, "validateRedirectURL", { enumerable: true, get: f
|
|
|
42
43
|
Object.defineProperty(exports, "validateOrderId", { enumerable: true, get: function () { return security_1.validateOrderId; } });
|
|
43
44
|
Object.defineProperty(exports, "validateIP", { enumerable: true, get: function () { return security_1.validateIP; } });
|
|
44
45
|
Object.defineProperty(exports, "validateEmail", { enumerable: true, get: function () { return security_1.validateEmail; } });
|
|
46
|
+
Object.defineProperty(exports, "validateTokenId", { enumerable: true, get: function () { return security_1.validateTokenId; } });
|
|
47
|
+
Object.defineProperty(exports, "validateTimeout", { enumerable: true, get: function () { return security_1.validateTimeout; } });
|
|
48
|
+
Object.defineProperty(exports, "validateClientOptions", { enumerable: true, get: function () { return security_1.validateClientOptions; } });
|
|
49
|
+
Object.defineProperty(exports, "validateCardNumber", { enumerable: true, get: function () { return security_1.validateCardNumber; } });
|
|
50
|
+
Object.defineProperty(exports, "validateExpiryDate", { enumerable: true, get: function () { return security_1.validateExpiryDate; } });
|
|
51
|
+
Object.defineProperty(exports, "validateCVV", { enumerable: true, get: function () { return security_1.validateCVV; } });
|
|
52
|
+
Object.defineProperty(exports, "validateCardHolderName", { enumerable: true, get: function () { return security_1.validateCardHolderName; } });
|
|
45
53
|
Object.defineProperty(exports, "validatePaymentInput", { enumerable: true, get: function () { return security_1.validatePaymentInput; } });
|
|
46
54
|
Object.defineProperty(exports, "sanitizeString", { enumerable: true, get: function () { return security_1.sanitizeString; } });
|
|
47
55
|
Object.defineProperty(exports, "toCentimes", { enumerable: true, get: function () { return security_1.toCentimes; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAGxB,8DAA4D;AAAnD,mHAAA,eAAe,OAAA;AACxB,gEAA8D;AAArD,qHAAA,gBAAgB,OAAA;AACzB,kDAAsD;AAA7C,6GAAA,eAAe,OAAA;AACxB,0CAAmF;AAA1E,sGAAA,YAAY,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AACzD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AAGxB,8DAA4D;AAAnD,mHAAA,eAAe,OAAA;AACxB,gEAA8D;AAArD,qHAAA,gBAAgB,OAAA;AACzB,kDAAsD;AAA7C,6GAAA,eAAe,OAAA;AACxB,0CAAmF;AAA1E,sGAAA,YAAY,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AACzD,wCAAiE;AAAxD,yGAAA,gBAAgB,OAAA;AAAE,sGAAA,aAAa,OAAA;AAGxC,uCAmCoB;AAjClB,+GAAA,mBAAmB,OAAA;AACnB,+GAAA,mBAAmB,OAAA;AACnB,6GAAA,iBAAiB,OAAA;AACjB,kHAAA,sBAAsB,OAAA;AACtB,6GAAA,iBAAiB,OAAA;AACjB,8GAAA,kBAAkB,OAAA;AAElB,0GAAA,cAAc,OAAA;AACd,4GAAA,gBAAgB,OAAA;AAChB,+GAAA,mBAAmB,OAAA;AACnB,2GAAA,eAAe,OAAA;AACf,sGAAA,UAAU,OAAA;AACV,yGAAA,aAAa,OAAA;AACb,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AACf,iHAAA,qBAAqB,OAAA;AACrB,8GAAA,kBAAkB,OAAA;AAClB,8GAAA,kBAAkB,OAAA;AAClB,uGAAA,WAAW,OAAA;AACX,kHAAA,sBAAsB,OAAA;AACtB,gHAAA,oBAAoB,OAAA;AACpB,0GAAA,cAAc,OAAA;AACd,sGAAA,UAAU,OAAA;AACV,wGAAA,YAAY,OAAA;AACZ,wGAAA,YAAY,OAAA;AACZ,gHAAA,oBAAoB,OAAA;AAWtB,+CAA6B;AAG7B,0CAAwB;AAGxB,2CAAyB;AAGzB,qCAAwF;AAA/E,0GAAA,eAAe,OAAA;AAGxB,8CAA4B"}
|
|
@@ -15,8 +15,25 @@ export interface PaymentResponse {
|
|
|
15
15
|
transaction_id: string;
|
|
16
16
|
order_id: string;
|
|
17
17
|
}
|
|
18
|
+
export interface CashPlusApiResponse {
|
|
19
|
+
success?: boolean;
|
|
20
|
+
transaction_id?: string;
|
|
21
|
+
token: string | {
|
|
22
|
+
id: string;
|
|
23
|
+
};
|
|
24
|
+
amount?: number;
|
|
25
|
+
currency?: string;
|
|
26
|
+
order_id?: string;
|
|
27
|
+
expires_at?: string;
|
|
28
|
+
message?: string;
|
|
29
|
+
}
|
|
18
30
|
export interface CashPlusPaymentResponse {
|
|
19
|
-
success
|
|
31
|
+
success?: boolean;
|
|
20
32
|
transaction_id: string;
|
|
21
|
-
|
|
33
|
+
token: string;
|
|
34
|
+
amount?: number;
|
|
35
|
+
currency?: string;
|
|
36
|
+
order_id?: string;
|
|
37
|
+
expires_at?: string;
|
|
38
|
+
message?: string;
|
|
22
39
|
}
|
|
@@ -4,7 +4,9 @@ export interface Transaction {
|
|
|
4
4
|
amount: number;
|
|
5
5
|
currency: string;
|
|
6
6
|
status: string;
|
|
7
|
+
payment_method?: string;
|
|
7
8
|
created_at: string;
|
|
8
9
|
updated_at: string;
|
|
9
10
|
metadata?: Record<string, string>;
|
|
10
11
|
}
|
|
12
|
+
export type TransactionStatus = 'pending' | 'paid' | 'failed' | 'refunded' | 'cancelled';
|
|
@@ -3,4 +3,4 @@ import { ParsedWebhookPayload } from '../../security/webhook';
|
|
|
3
3
|
export declare class ParseWebhookPipe implements PipeTransform<unknown, ParsedWebhookPayload> {
|
|
4
4
|
transform(value: unknown): ParsedWebhookPayload;
|
|
5
5
|
}
|
|
6
|
-
export declare
|
|
6
|
+
export declare const ParsedWebhook: (...dataOrPipes: unknown[]) => ParameterDecorator;
|
|
@@ -6,8 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.ParseWebhookPipe = void 0;
|
|
10
|
-
exports.ParsedWebhook = ParsedWebhook;
|
|
9
|
+
exports.ParsedWebhook = exports.ParseWebhookPipe = void 0;
|
|
11
10
|
const common_1 = require("@nestjs/common");
|
|
12
11
|
const webhook_1 = require("../../security/webhook");
|
|
13
12
|
let ParseWebhookPipe = class ParseWebhookPipe {
|
|
@@ -27,8 +26,16 @@ exports.ParseWebhookPipe = ParseWebhookPipe;
|
|
|
27
26
|
exports.ParseWebhookPipe = ParseWebhookPipe = __decorate([
|
|
28
27
|
(0, common_1.Injectable)()
|
|
29
28
|
], ParseWebhookPipe);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
exports.ParsedWebhook = (0, common_1.createParamDecorator)((_data, ctx) => {
|
|
30
|
+
try {
|
|
31
|
+
const request = ctx.switchToHttp().getRequest();
|
|
32
|
+
return (0, webhook_1.parseWebhookPayload)(request.body);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof webhook_1.WebhookParseError) {
|
|
36
|
+
throw new common_1.BadRequestException(error.message);
|
|
37
|
+
}
|
|
38
|
+
throw new common_1.BadRequestException('Failed to parse webhook payload');
|
|
39
|
+
}
|
|
40
|
+
});
|
|
34
41
|
//# sourceMappingURL=webhook.pipe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.pipe.js","sourceRoot":"","sources":["../../../src/nestjs/pipes/webhook.pipe.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"webhook.pipe.js","sourceRoot":"","sources":["../../../src/nestjs/pipes/webhook.pipe.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAMwB;AACxB,oDAAsG;AAe/F,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,IAAA,6BAAmB,EAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,2BAAiB,EAAE,CAAC;gBACvC,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAI,4BAAmB,CAAC,iCAAiC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF,CAAA;AAXY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;GACA,gBAAgB,CAW5B;AAcY,QAAA,aAAa,GAAG,IAAA,6BAAoB,EAC/C,CAAC,KAAc,EAAE,GAAqB,EAAwB,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAqB,CAAC;QACnE,OAAO,IAAA,6BAAmB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,2BAAiB,EAAE,CAAC;YACvC,MAAM,IAAI,4BAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,IAAI,4BAAmB,CAAC,iCAAiC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC,CACF,CAAC"}
|
package/dist/security/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { parseWebhookPayload, verifyWebhookSecret, verifyWebhookHMAC, createWebhookSignature, WebhookParseError, WebhookVerifyError, type YouCanPayRawWebhook, type ParsedWebhookPayload, type WebhookVerifyOptions, } from './webhook';
|
|
2
|
-
export { validateAmount, validateCurrency, validateRedirectURL, validateOrderId, validateIP, validateEmail, validatePaymentInput, sanitizeString, toCentimes, fromCentimes, formatAmount, SUPPORTED_CURRENCIES, type SupportedCurrency, type ValidationResult, type AmountValidationOptions, type URLValidationOptions, } from './validators';
|
|
2
|
+
export { validateAmount, validateCurrency, validateRedirectURL, validateOrderId, validateIP, validateEmail, validateTokenId, validateTimeout, validateClientOptions, validateCardNumber, validateExpiryDate, validateCVV, validateCardHolderName, validatePaymentInput, sanitizeString, toCentimes, fromCentimes, formatAmount, SUPPORTED_CURRENCIES, type SupportedCurrency, type ValidationResult, type AmountValidationOptions, type ClientOptionsValidationInput, type URLValidationOptions, } from './validators';
|
package/dist/security/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SUPPORTED_CURRENCIES = exports.formatAmount = exports.fromCentimes = exports.toCentimes = exports.sanitizeString = exports.validatePaymentInput = exports.validateEmail = exports.validateIP = exports.validateOrderId = exports.validateRedirectURL = exports.validateCurrency = exports.validateAmount = exports.WebhookVerifyError = exports.WebhookParseError = exports.createWebhookSignature = exports.verifyWebhookHMAC = exports.verifyWebhookSecret = exports.parseWebhookPayload = void 0;
|
|
3
|
+
exports.SUPPORTED_CURRENCIES = exports.formatAmount = exports.fromCentimes = exports.toCentimes = exports.sanitizeString = exports.validatePaymentInput = exports.validateCardHolderName = exports.validateCVV = exports.validateExpiryDate = exports.validateCardNumber = exports.validateClientOptions = exports.validateTimeout = exports.validateTokenId = exports.validateEmail = exports.validateIP = exports.validateOrderId = exports.validateRedirectURL = exports.validateCurrency = exports.validateAmount = exports.WebhookVerifyError = exports.WebhookParseError = exports.createWebhookSignature = exports.verifyWebhookHMAC = exports.verifyWebhookSecret = exports.parseWebhookPayload = void 0;
|
|
4
4
|
var webhook_1 = require("./webhook");
|
|
5
5
|
Object.defineProperty(exports, "parseWebhookPayload", { enumerable: true, get: function () { return webhook_1.parseWebhookPayload; } });
|
|
6
6
|
Object.defineProperty(exports, "verifyWebhookSecret", { enumerable: true, get: function () { return webhook_1.verifyWebhookSecret; } });
|
|
@@ -15,6 +15,13 @@ Object.defineProperty(exports, "validateRedirectURL", { enumerable: true, get: f
|
|
|
15
15
|
Object.defineProperty(exports, "validateOrderId", { enumerable: true, get: function () { return validators_1.validateOrderId; } });
|
|
16
16
|
Object.defineProperty(exports, "validateIP", { enumerable: true, get: function () { return validators_1.validateIP; } });
|
|
17
17
|
Object.defineProperty(exports, "validateEmail", { enumerable: true, get: function () { return validators_1.validateEmail; } });
|
|
18
|
+
Object.defineProperty(exports, "validateTokenId", { enumerable: true, get: function () { return validators_1.validateTokenId; } });
|
|
19
|
+
Object.defineProperty(exports, "validateTimeout", { enumerable: true, get: function () { return validators_1.validateTimeout; } });
|
|
20
|
+
Object.defineProperty(exports, "validateClientOptions", { enumerable: true, get: function () { return validators_1.validateClientOptions; } });
|
|
21
|
+
Object.defineProperty(exports, "validateCardNumber", { enumerable: true, get: function () { return validators_1.validateCardNumber; } });
|
|
22
|
+
Object.defineProperty(exports, "validateExpiryDate", { enumerable: true, get: function () { return validators_1.validateExpiryDate; } });
|
|
23
|
+
Object.defineProperty(exports, "validateCVV", { enumerable: true, get: function () { return validators_1.validateCVV; } });
|
|
24
|
+
Object.defineProperty(exports, "validateCardHolderName", { enumerable: true, get: function () { return validators_1.validateCardHolderName; } });
|
|
18
25
|
Object.defineProperty(exports, "validatePaymentInput", { enumerable: true, get: function () { return validators_1.validatePaymentInput; } });
|
|
19
26
|
Object.defineProperty(exports, "sanitizeString", { enumerable: true, get: function () { return validators_1.sanitizeString; } });
|
|
20
27
|
Object.defineProperty(exports, "toCentimes", { enumerable: true, get: function () { return validators_1.toCentimes; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":";;;AACA,qCAUmB;AATjB,8GAAA,mBAAmB,OAAA;AACnB,8GAAA,mBAAmB,OAAA;AACnB,4GAAA,iBAAiB,OAAA;AACjB,iHAAA,sBAAsB,OAAA;AACtB,4GAAA,iBAAiB,OAAA;AACjB,6GAAA,kBAAkB,OAAA;AAOpB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":";;;AACA,qCAUmB;AATjB,8GAAA,mBAAmB,OAAA;AACnB,8GAAA,mBAAmB,OAAA;AACnB,4GAAA,iBAAiB,OAAA;AACjB,iHAAA,sBAAsB,OAAA;AACtB,4GAAA,iBAAiB,OAAA;AACjB,6GAAA,kBAAkB,OAAA;AAOpB,2CAyBsB;AAxBpB,4GAAA,cAAc,OAAA;AACd,8GAAA,gBAAgB,OAAA;AAChB,iHAAA,mBAAmB,OAAA;AACnB,6GAAA,eAAe,OAAA;AACf,wGAAA,UAAU,OAAA;AACV,2GAAA,aAAa,OAAA;AACb,6GAAA,eAAe,OAAA;AACf,6GAAA,eAAe,OAAA;AACf,mHAAA,qBAAqB,OAAA;AACrB,gHAAA,kBAAkB,OAAA;AAClB,gHAAA,kBAAkB,OAAA;AAClB,yGAAA,WAAW,OAAA;AACX,oHAAA,sBAAsB,OAAA;AACtB,kHAAA,oBAAoB,OAAA;AACpB,4GAAA,cAAc,OAAA;AACd,wGAAA,UAAU,OAAA;AACV,0GAAA,YAAY,OAAA;AACZ,0GAAA,YAAY,OAAA;AACZ,kHAAA,oBAAoB,OAAA"}
|
|
@@ -4,6 +4,11 @@ export interface ValidationResult {
|
|
|
4
4
|
valid: boolean;
|
|
5
5
|
error?: string;
|
|
6
6
|
}
|
|
7
|
+
export interface ClientOptionsValidationInput {
|
|
8
|
+
privateKey?: unknown;
|
|
9
|
+
publicKey?: unknown;
|
|
10
|
+
timeout?: unknown;
|
|
11
|
+
}
|
|
7
12
|
export interface AmountValidationOptions {
|
|
8
13
|
min?: number;
|
|
9
14
|
max?: number;
|
|
@@ -22,6 +27,13 @@ export declare function validateRedirectURL(url: unknown, options?: URLValidatio
|
|
|
22
27
|
export declare function validateOrderId(orderId: unknown): ValidationResult;
|
|
23
28
|
export declare function validateIP(ip: unknown): ValidationResult;
|
|
24
29
|
export declare function validateEmail(email: unknown): ValidationResult;
|
|
30
|
+
export declare function validateTokenId(tokenId: unknown): ValidationResult;
|
|
31
|
+
export declare function validateTimeout(timeout: unknown): ValidationResult;
|
|
32
|
+
export declare function validateClientOptions(options: ClientOptionsValidationInput): ValidationResult;
|
|
33
|
+
export declare function validateCardNumber(cardNumber: unknown): ValidationResult;
|
|
34
|
+
export declare function validateExpiryDate(expireDate: unknown): ValidationResult;
|
|
35
|
+
export declare function validateCVV(cvv: unknown): ValidationResult;
|
|
36
|
+
export declare function validateCardHolderName(cardHolderName: unknown): ValidationResult;
|
|
25
37
|
export declare function validatePaymentInput(input: {
|
|
26
38
|
amount: unknown;
|
|
27
39
|
currency: unknown;
|