@p2pdotme/sdk 1.0.2 → 1.0.4

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -4
  3. package/dist/country.cjs +613 -0
  4. package/dist/country.cjs.map +1 -0
  5. package/dist/country.d.cts +107 -0
  6. package/dist/country.d.ts +107 -0
  7. package/dist/country.mjs +573 -0
  8. package/dist/country.mjs.map +1 -0
  9. package/dist/fraud-engine.cjs +19 -13
  10. package/dist/fraud-engine.cjs.map +1 -1
  11. package/dist/fraud-engine.mjs +19 -13
  12. package/dist/fraud-engine.mjs.map +1 -1
  13. package/dist/index.cjs +24 -16
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.cts +32 -25
  16. package/dist/index.d.ts +32 -25
  17. package/dist/index.mjs +23 -16
  18. package/dist/index.mjs.map +1 -1
  19. package/dist/order-routing.cjs +19 -13
  20. package/dist/order-routing.cjs.map +1 -1
  21. package/dist/order-routing.mjs +19 -13
  22. package/dist/order-routing.mjs.map +1 -1
  23. package/dist/payload.cjs +18 -14
  24. package/dist/payload.cjs.map +1 -1
  25. package/dist/payload.d.cts +5 -20
  26. package/dist/payload.d.ts +5 -20
  27. package/dist/payload.mjs +18 -14
  28. package/dist/payload.mjs.map +1 -1
  29. package/dist/profile.cjs +19 -13
  30. package/dist/profile.cjs.map +1 -1
  31. package/dist/profile.d.cts +3 -27
  32. package/dist/profile.d.ts +3 -27
  33. package/dist/profile.mjs +19 -13
  34. package/dist/profile.mjs.map +1 -1
  35. package/dist/qr-parsers.cjs +260 -5
  36. package/dist/qr-parsers.cjs.map +1 -1
  37. package/dist/qr-parsers.d.cts +10 -1
  38. package/dist/qr-parsers.d.ts +10 -1
  39. package/dist/qr-parsers.mjs +260 -5
  40. package/dist/qr-parsers.mjs.map +1 -1
  41. package/dist/react.cjs +26 -20
  42. package/dist/react.cjs.map +1 -1
  43. package/dist/react.d.cts +8 -47
  44. package/dist/react.d.ts +8 -47
  45. package/dist/react.mjs +26 -20
  46. package/dist/react.mjs.map +1 -1
  47. package/dist/zkkyc.cjs +21 -15
  48. package/dist/zkkyc.cjs.map +1 -1
  49. package/dist/zkkyc.d.cts +2 -2
  50. package/dist/zkkyc.d.ts +2 -2
  51. package/dist/zkkyc.mjs +21 -15
  52. package/dist/zkkyc.mjs.map +1 -1
  53. package/package.json +9 -2
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 P2P.me
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -29,6 +29,7 @@ bun add react
29
29
  | `@p2pdotme/sdk/qr-parsers` | [QR code parsers](./src/qr-parsers/README.md) for UPI, QRIS, PIX, MercadoPago, Pago Movil |
30
30
  | `@p2pdotme/sdk/fraud-engine` | [Fraud detection](./src/fraud-engine/README.md), device fingerprinting, SEON integration |
31
31
  | `@p2pdotme/sdk/zkkyc` | [ZK KYC verification](./src/zkkyc/README.md) — Reclaim, Anon Aadhaar, ZK Passport |
32
+ | `@p2pdotme/sdk/country` | [Country & currency config](./src/country/README.md) — payment methods, validators, field configs |
32
33
  | `@p2pdotme/sdk/react` | Unified React provider (`SdkProvider`) + hooks |
33
34
 
34
35
  ## Quick Start
@@ -105,7 +106,7 @@ All hooks read from the nearest `<SdkProvider>`:
105
106
 
106
107
  ## Supported Currencies
107
108
 
108
- `INR` | `IDR` | `BRL` | `ARS` | `MEX` | `VEN` | `EUR` | `NGN` | `USD`
109
+ `INR` | `IDR` | `BRL` | `ARS` | `MEX` | `VEN` | `EUR` | `NGN` | `USD` | `COP`
109
110
 
110
111
  ## Development
111
112
 
@@ -134,9 +135,12 @@ bun run dev # http://localhost:5173
134
135
 
135
136
  ### Release
136
137
 
138
+ Releases are published manually — there is no CI. See [docs/publishing.md](./docs/publishing.md) for the full flow.
139
+
137
140
  ```bash
138
- bun run changeset # create a changeset
139
- bun run release # build + publish
141
+ bun run changeset # describe your change (run on feature branch)
142
+ bunx changeset version # bump version + update CHANGELOG (run on main after merge)
143
+ bun run release # build + publish to npm (run on main after version bump)
140
144
  ```
141
145
 
142
146
  ## Dependencies
@@ -152,4 +156,4 @@ bun run release # build + publish
152
156
 
153
157
  ## License
154
158
 
155
- Private
159
+ MIT © P2P.me
@@ -0,0 +1,613 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/country/index.ts
21
+ var country_exports = {};
22
+ __export(country_exports, {
23
+ COUNTRY_OPTIONS: () => COUNTRY_OPTIONS,
24
+ PAYMENT_ID_FIELDS: () => PAYMENT_ID_FIELDS,
25
+ deserializeCompoundPaymentId: () => deserializeCompoundPaymentId,
26
+ formatCompoundPaymentIdForDisplay: () => formatCompoundPaymentIdForDisplay,
27
+ serializeCompoundPaymentId: () => serializeCompoundPaymentId,
28
+ validateArgentinePaymentId: () => validateArgentinePaymentId,
29
+ validateIndonesianPhoneNumber: () => validateIndonesianPhoneNumber,
30
+ validateMexicanPaymentId: () => validateMexicanPaymentId,
31
+ validateNigerianAccountNumber: () => validateNigerianAccountNumber,
32
+ validatePIXId: () => validatePIXId,
33
+ validateRevolutId: () => validateRevolutId,
34
+ validateUPIId: () => validateUPIId,
35
+ validateVenezuelanPhoneNumber: () => validateVenezuelanPhoneNumber,
36
+ validateVenezuelanRif: () => validateVenezuelanRif
37
+ });
38
+ module.exports = __toCommonJS(country_exports);
39
+
40
+ // src/constants/currencies.constant.ts
41
+ var CURRENCY = {
42
+ IDR: "IDR",
43
+ INR: "INR",
44
+ BRL: "BRL",
45
+ ARS: "ARS",
46
+ MEX: "MEX",
47
+ VEN: "VEN",
48
+ EUR: "EUR",
49
+ NGN: "NGN",
50
+ USD: "USD",
51
+ COP: "COP"
52
+ };
53
+
54
+ // src/country/currencies/ars.ts
55
+ var ARS_PLACEHOLDER = "juan.perez";
56
+ var ARS_VALIDATION_ERROR = "Please enter a valid CBU/CVU (22 digits) or Alias (6-20 characters)";
57
+ function validateCBU(cbu) {
58
+ if (cbu.length !== 22) return false;
59
+ if (/^(\d)\1{21}$/.test(cbu)) return false;
60
+ const bankCode = cbu.substring(0, 7);
61
+ const bankCheckDigit = parseInt(cbu[7], 10);
62
+ let sum = 0;
63
+ const weights = [7, 1, 3, 9, 7, 1, 3];
64
+ for (let i = 0; i < 7; i++) {
65
+ sum += parseInt(bankCode[i], 10) * weights[i];
66
+ }
67
+ const calculatedBankCheck = (10 - sum % 10) % 10;
68
+ if (bankCheckDigit !== calculatedBankCheck) return false;
69
+ const accountNumber = cbu.substring(8, 21);
70
+ const accountCheckDigit = parseInt(cbu[21], 10);
71
+ sum = 0;
72
+ const accountWeights = [3, 9, 7, 1, 3, 9, 7, 1, 3, 9, 7, 1, 3];
73
+ for (let i = 0; i < 13; i++) {
74
+ sum += parseInt(accountNumber[i], 10) * accountWeights[i];
75
+ }
76
+ const calculatedAccountCheck = (10 - sum % 10) % 10;
77
+ if (accountCheckDigit !== calculatedAccountCheck) return false;
78
+ return true;
79
+ }
80
+ function validateArgentinePaymentId(paymentId) {
81
+ if (!paymentId || paymentId.trim().length === 0) return false;
82
+ const trimmedPaymentId = paymentId.trim();
83
+ if (/^\d{22}$/.test(trimmedPaymentId)) return validateCBU(trimmedPaymentId);
84
+ if (/^[a-zA-Z0-9.\-_]{6,20}$/.test(trimmedPaymentId)) return true;
85
+ return false;
86
+ }
87
+ var ARS_PAYMENT_FIELDS = [
88
+ {
89
+ key: "alias",
90
+ label: "ALIAS_ID",
91
+ placeholder: ARS_PLACEHOLDER,
92
+ displayLabel: "Alias",
93
+ validate: validateArgentinePaymentId,
94
+ validationErrorMessage: ARS_VALIDATION_ERROR
95
+ }
96
+ ];
97
+ var ARS_COUNTRY_OPTION = {
98
+ country: "Argentina",
99
+ currency: CURRENCY.ARS,
100
+ symbolNative: "$",
101
+ locale: "es-AR",
102
+ paymentMethod: "ALIAS",
103
+ paymentAddressName: "ALIAS_ID",
104
+ timezone: "America/Argentina/Buenos_Aires",
105
+ timezone_name: "ART",
106
+ flag: "\u{1F1E6}\u{1F1F7}",
107
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e6-1f1f7.png",
108
+ phoneCode: "+54",
109
+ telegramSupportChannel: "https://t.me/p2pmeargentina",
110
+ twitterUsername: "p2pmeargentina",
111
+ smsCountryCodes: ["AR"],
112
+ precision: 2,
113
+ isAlpha: false,
114
+ disabled: false,
115
+ disabledPaymentTypes: []
116
+ };
117
+
118
+ // src/country/currencies/brl.ts
119
+ var BRL_PLACEHOLDER = "Chave pix ou pix copia e cola";
120
+ var BRL_VALIDATION_ERROR = "Please enter a valid PIX ID";
121
+ function validateCPF(cpf) {
122
+ if (cpf.length !== 11) return false;
123
+ if (/^(\d)\1{10}$/.test(cpf)) return false;
124
+ let sum = 0;
125
+ for (let i = 0; i < 9; i++) {
126
+ sum += parseInt(cpf[i], 10) * (10 - i);
127
+ }
128
+ let remainder = sum % 11;
129
+ const firstDigit = remainder < 2 ? 0 : 11 - remainder;
130
+ if (parseInt(cpf[9], 10) !== firstDigit) return false;
131
+ sum = 0;
132
+ for (let i = 0; i < 10; i++) {
133
+ sum += parseInt(cpf[i], 10) * (11 - i);
134
+ }
135
+ remainder = sum % 11;
136
+ const secondDigit = remainder < 2 ? 0 : 11 - remainder;
137
+ return parseInt(cpf[10], 10) === secondDigit;
138
+ }
139
+ function validateCNPJ(cnpj) {
140
+ if (cnpj.length !== 14) return false;
141
+ if (/^(\d)\1{13}$/.test(cnpj)) return false;
142
+ let sum = 0;
143
+ const weights1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
144
+ for (let i = 0; i < 12; i++) {
145
+ sum += parseInt(cnpj[i], 10) * weights1[i];
146
+ }
147
+ let remainder = sum % 11;
148
+ const firstDigit = remainder < 2 ? 0 : 11 - remainder;
149
+ if (parseInt(cnpj[12], 10) !== firstDigit) return false;
150
+ sum = 0;
151
+ const weights2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
152
+ for (let i = 0; i < 13; i++) {
153
+ sum += parseInt(cnpj[i], 10) * weights2[i];
154
+ }
155
+ remainder = sum % 11;
156
+ const secondDigit = remainder < 2 ? 0 : 11 - remainder;
157
+ return parseInt(cnpj[13], 10) === secondDigit;
158
+ }
159
+ function validatePIXId(pixId) {
160
+ if (!pixId || pixId.trim().length === 0) return false;
161
+ const trimmedPixId = pixId.trim();
162
+ if (/^000201/.test(trimmedPixId)) return true;
163
+ if (/^\d{11}$/.test(trimmedPixId))
164
+ return validateCPF(trimmedPixId) || /^[1-9][1-9]9\d{8}$/.test(trimmedPixId);
165
+ if (/^\d{14}$/.test(trimmedPixId)) return validateCNPJ(trimmedPixId);
166
+ if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmedPixId)) return true;
167
+ if (/^\d{10,11}$/.test(trimmedPixId)) return true;
168
+ if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmedPixId))
169
+ return true;
170
+ return false;
171
+ }
172
+ var BRL_PAYMENT_FIELDS = [
173
+ {
174
+ key: "pix",
175
+ label: "PIX_ID",
176
+ placeholder: BRL_PLACEHOLDER,
177
+ displayLabel: "PIX ID",
178
+ validate: validatePIXId,
179
+ validationErrorMessage: BRL_VALIDATION_ERROR
180
+ }
181
+ ];
182
+ var BRL_COUNTRY_OPTION = {
183
+ country: "Brazil",
184
+ currency: CURRENCY.BRL,
185
+ symbolNative: "R$",
186
+ locale: "pt-BR",
187
+ paymentMethod: "PIX",
188
+ paymentAddressName: "PIX_ID",
189
+ timezone: "America/Sao_Paulo",
190
+ timezone_name: "BRT",
191
+ flag: "\u{1F1E7}\u{1F1F7}",
192
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f7.png",
193
+ phoneCode: "+55",
194
+ telegramSupportChannel: "https://t.me/p2pmebrasil",
195
+ twitterUsername: "p2pmebrasil",
196
+ smsCountryCodes: ["BR"],
197
+ precision: 2,
198
+ isAlpha: false,
199
+ disabled: false,
200
+ disabledPaymentTypes: []
201
+ };
202
+
203
+ // src/country/currencies/cop.ts
204
+ var COP_PLACEHOLDER = "juan.perez@nequi.com.co";
205
+ var COP_VALIDATION_ERROR = "Please enter a valid Nequi or Daviplata ID (e.g., 3001234567 or email)";
206
+ function validateColombianPaymentId(paymentId) {
207
+ if (!paymentId || paymentId.trim().length === 0) return false;
208
+ const trimmed = paymentId.trim();
209
+ if (/^3\d{9}$/.test(trimmed)) return true;
210
+ if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed)) return true;
211
+ return false;
212
+ }
213
+ var COP_PAYMENT_FIELDS = [
214
+ {
215
+ key: "alias",
216
+ label: "ALIAS_TRANSFERENCIA",
217
+ placeholder: COP_PLACEHOLDER,
218
+ displayLabel: "Nequi / Daviplata",
219
+ validate: validateColombianPaymentId,
220
+ validationErrorMessage: COP_VALIDATION_ERROR
221
+ }
222
+ ];
223
+ var COP_COUNTRY_OPTION = {
224
+ country: "Colombia",
225
+ currency: CURRENCY.COP,
226
+ symbolNative: "$",
227
+ locale: "es-CO",
228
+ paymentMethod: "TRANSFERENCIA",
229
+ paymentAddressName: "ALIAS_TRANSFERENCIA",
230
+ timezone: "America/Bogota",
231
+ timezone_name: "COT",
232
+ flag: "\u{1F1E8}\u{1F1F4}",
233
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e8-1f1f4.png",
234
+ phoneCode: "+57",
235
+ telegramSupportChannel: "https://t.me/p2pmeColombia",
236
+ twitterUsername: "p2pmeColombia",
237
+ smsCountryCodes: ["CO"],
238
+ precision: 2,
239
+ isAlpha: true,
240
+ disabled: true,
241
+ disabledPaymentTypes: ["PAY"]
242
+ };
243
+
244
+ // src/country/currencies/eur.ts
245
+ var EUR_PLACEHOLDER = "@username or email";
246
+ var EUR_VALIDATION_ERROR = "Please enter a valid Revolut ID (username, email, or phone)";
247
+ function validateRevolutId(revolutId) {
248
+ if (!revolutId || revolutId.trim().length === 0) return false;
249
+ const trimmed = revolutId.trim();
250
+ if (/^@?[a-zA-Z0-9._-]{3,30}$/.test(trimmed)) return true;
251
+ if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed)) return true;
252
+ if (/^\+?\d{7,15}$/.test(trimmed)) return true;
253
+ return false;
254
+ }
255
+ var EUR_PAYMENT_FIELDS = [
256
+ {
257
+ key: "revolut",
258
+ label: "REVOLUT_ID",
259
+ placeholder: EUR_PLACEHOLDER,
260
+ displayLabel: "Revolut ID",
261
+ validate: validateRevolutId,
262
+ validationErrorMessage: EUR_VALIDATION_ERROR
263
+ }
264
+ ];
265
+ var EUR_COUNTRY_OPTION = {
266
+ country: "Revolut EUR",
267
+ currency: CURRENCY.EUR,
268
+ symbolNative: "\u20AC",
269
+ locale: "de-DE",
270
+ paymentMethod: "REVOLUT",
271
+ paymentAddressName: "REVOLUT_ID",
272
+ timezone: "Europe/Berlin",
273
+ timezone_name: "CET",
274
+ flag: "",
275
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f310.png",
276
+ phoneCode: "",
277
+ telegramSupportChannel: "https://t.me/P2Pdotme",
278
+ twitterUsername: "P2Pdotme",
279
+ smsCountryCodes: [],
280
+ precision: 2,
281
+ isAlpha: true,
282
+ disabled: false,
283
+ disabledPaymentTypes: ["PAY"]
284
+ };
285
+
286
+ // src/country/currencies/idr.ts
287
+ var IDR_PLACEHOLDER = "8123456789";
288
+ var IDR_VALIDATION_ERROR = "Please enter a valid Indonesian phone number (e.g., 8123456789)";
289
+ function validateIndonesianPhoneNumber(phoneNumber) {
290
+ if (!phoneNumber || phoneNumber.trim().length === 0) return false;
291
+ if (/[a-zA-Z]/.test(phoneNumber)) return false;
292
+ const cleaned = phoneNumber.replace(/\D/g, "");
293
+ return /^\d{9,12}$/.test(cleaned);
294
+ }
295
+ var IDR_PAYMENT_FIELDS = [
296
+ {
297
+ key: "phone",
298
+ label: "PHONE_NUMBER",
299
+ placeholder: IDR_PLACEHOLDER,
300
+ displayLabel: "Phone Number",
301
+ validate: validateIndonesianPhoneNumber,
302
+ validationErrorMessage: IDR_VALIDATION_ERROR
303
+ }
304
+ ];
305
+ var IDR_COUNTRY_OPTION = {
306
+ country: "Indonesia",
307
+ currency: CURRENCY.IDR,
308
+ symbolNative: "Rp",
309
+ locale: "id-ID",
310
+ paymentMethod: "QRIS",
311
+ paymentAddressName: "PHONE_NUMBER",
312
+ timezone: "Asia/Jakarta",
313
+ timezone_name: "WIB",
314
+ flag: "\u{1F1EE}\u{1F1E9}",
315
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1ee-1f1e9.png",
316
+ phoneCode: "+62",
317
+ telegramSupportChannel: "https://t.me/p2pmeindonesia",
318
+ twitterUsername: "p2pdotmeID",
319
+ smsCountryCodes: [],
320
+ precision: 0,
321
+ isAlpha: false,
322
+ disabled: false,
323
+ disabledPaymentTypes: []
324
+ };
325
+
326
+ // src/country/currencies/inr.ts
327
+ var INR_PLACEHOLDER = "merchant@upi";
328
+ var INR_VALIDATION_ERROR = "Please enter a valid UPI ID (e.g., username@bankname)";
329
+ function validateUPIId(upiId) {
330
+ if (!upiId || upiId.trim().length === 0) return false;
331
+ const upiRegex = /^[a-zA-Z0-9.\-_]{2,256}@[a-zA-Z0-9]{2,64}$/;
332
+ return upiRegex.test(upiId.trim());
333
+ }
334
+ var INR_PAYMENT_FIELDS = [
335
+ {
336
+ key: "upi",
337
+ label: "UPI_ID",
338
+ placeholder: INR_PLACEHOLDER,
339
+ displayLabel: "UPI ID",
340
+ validate: validateUPIId,
341
+ validationErrorMessage: INR_VALIDATION_ERROR
342
+ }
343
+ ];
344
+ var INR_COUNTRY_OPTION = {
345
+ country: "India",
346
+ currency: CURRENCY.INR,
347
+ symbolNative: "\u20B9",
348
+ locale: "en-IN",
349
+ paymentMethod: "UPI",
350
+ paymentAddressName: "UPI_ID",
351
+ timezone: "Asia/Kolkata",
352
+ timezone_name: "IST",
353
+ flag: "\u{1F1EE}\u{1F1F3}",
354
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1ee-1f1f3.png",
355
+ phoneCode: "+91",
356
+ telegramSupportChannel: "https://t.me/P2Pdotme",
357
+ twitterUsername: "P2Pdotme",
358
+ smsCountryCodes: ["IN"],
359
+ precision: 2,
360
+ isAlpha: false,
361
+ disabled: false,
362
+ disabledPaymentTypes: []
363
+ };
364
+
365
+ // src/country/currencies/mex.ts
366
+ var MEX_PLACEHOLDER = "012345678901234567";
367
+ var MEX_VALIDATION_ERROR = "Please enter a valid CLABE (18 digits), card number, or phone number";
368
+ function validateMexicanPaymentId(paymentId) {
369
+ if (!paymentId || paymentId.trim().length === 0) return false;
370
+ const trimmed = paymentId.trim().replace(/\D/g, "");
371
+ if (/^\d{18}$/.test(trimmed)) return true;
372
+ if (/^\d{16}$/.test(trimmed)) return true;
373
+ if (/^\d{10}$/.test(trimmed)) return true;
374
+ return false;
375
+ }
376
+ var MEX_PAYMENT_FIELDS = [
377
+ {
378
+ key: "clabe",
379
+ label: "CLABE_ID",
380
+ placeholder: MEX_PLACEHOLDER,
381
+ displayLabel: "CLABE",
382
+ validate: validateMexicanPaymentId,
383
+ validationErrorMessage: MEX_VALIDATION_ERROR
384
+ }
385
+ ];
386
+ var MEX_COUNTRY_OPTION = {
387
+ country: "Mexico",
388
+ currency: CURRENCY.MEX,
389
+ internationalFormat: "MXN",
390
+ symbolNative: "Mx",
391
+ locale: "es-MX",
392
+ paymentMethod: "SPEI",
393
+ paymentAddressName: "CLABE_ID",
394
+ timezone: "America/Mexico_City",
395
+ timezone_name: "CST",
396
+ flag: "\u{1F1F2}\u{1F1FD}",
397
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1f2-1f1fd.png",
398
+ phoneCode: "+52",
399
+ telegramSupportChannel: "https://t.me/p2pmemexico",
400
+ twitterUsername: "p2pmemexico",
401
+ smsCountryCodes: ["MX"],
402
+ precision: 2,
403
+ isAlpha: true,
404
+ disabled: false,
405
+ disabledPaymentTypes: ["PAY"]
406
+ };
407
+
408
+ // src/country/currencies/ngn.ts
409
+ var NGN_PLACEHOLDER = "0123456789";
410
+ var NGN_PLACEHOLDER_BANK = "Bank Name";
411
+ var NGN_VALIDATION_ERROR = "Please enter a valid 10-digit account number";
412
+ function validateNigerianAccountNumber(accountNumber) {
413
+ if (!accountNumber || accountNumber.trim().length === 0) return false;
414
+ const cleaned = accountNumber.trim().replace(/\D/g, "");
415
+ return /^\d{10}$/.test(cleaned);
416
+ }
417
+ var NGN_PAYMENT_FIELDS = [
418
+ {
419
+ key: "account",
420
+ label: "ACCOUNT_NUMBER",
421
+ placeholder: NGN_PLACEHOLDER,
422
+ displayLabel: "Account Number",
423
+ validate: validateNigerianAccountNumber,
424
+ validationErrorMessage: NGN_VALIDATION_ERROR
425
+ },
426
+ {
427
+ key: "bank-name",
428
+ label: "BANK_NAME",
429
+ placeholder: NGN_PLACEHOLDER_BANK,
430
+ displayLabel: "Bank Name",
431
+ validate: (v) => v.trim().length > 0,
432
+ validationErrorMessage: NGN_VALIDATION_ERROR
433
+ }
434
+ ];
435
+ var NGN_COUNTRY_OPTION = {
436
+ country: "Nigeria",
437
+ currency: CURRENCY.NGN,
438
+ symbolNative: "\u20A6",
439
+ locale: "en-NG",
440
+ paymentMethod: "NIP",
441
+ paymentAddressName: "ACCOUNT_NUMBER",
442
+ timezone: "Africa/Lagos",
443
+ timezone_name: "WAT",
444
+ flag: "\u{1F1F3}\u{1F1EC}",
445
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1f3-1f1ec.png",
446
+ phoneCode: "+234",
447
+ telegramSupportChannel: "https://t.me/p2pmeNigeria",
448
+ twitterUsername: "p2pmeNigeria",
449
+ smsCountryCodes: ["NG"],
450
+ precision: 2,
451
+ isAlpha: true,
452
+ disabled: false,
453
+ disabledPaymentTypes: ["PAY"]
454
+ };
455
+
456
+ // src/country/currencies/usd.ts
457
+ var USD_PLACEHOLDER = EUR_PLACEHOLDER;
458
+ var USD_VALIDATION_ERROR = EUR_VALIDATION_ERROR;
459
+ var USD_PAYMENT_FIELDS = [
460
+ {
461
+ key: "revolut",
462
+ label: "REVOLUT_ID",
463
+ placeholder: USD_PLACEHOLDER,
464
+ displayLabel: "Revolut ID",
465
+ validate: validateRevolutId,
466
+ validationErrorMessage: USD_VALIDATION_ERROR
467
+ }
468
+ ];
469
+ var USD_COUNTRY_OPTION = {
470
+ country: "Revolut USD",
471
+ currency: CURRENCY.USD,
472
+ symbolNative: "$",
473
+ locale: "en-US",
474
+ paymentMethod: "REVOLUT",
475
+ paymentAddressName: "REVOLUT_ID",
476
+ timezone: "America/New_York",
477
+ timezone_name: "EST",
478
+ flag: "",
479
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f310.png",
480
+ phoneCode: "+1",
481
+ telegramSupportChannel: "https://t.me/P2Pdotme",
482
+ twitterUsername: "P2Pdotme",
483
+ smsCountryCodes: ["US"],
484
+ precision: 2,
485
+ isAlpha: true,
486
+ disabled: false,
487
+ disabledPaymentTypes: ["PAY"]
488
+ };
489
+
490
+ // src/country/currencies/ven.ts
491
+ var VEN_PLACEHOLDER = "04121234567";
492
+ var VEN_PLACEHOLDER_RIF = "V12345678";
493
+ var VEN_PLACEHOLDER_BANK = "Banesco";
494
+ var VEN_VALIDATION_ERROR = "Please enter a valid phone number (e.g., 04121234567)";
495
+ var VEN_VALIDATION_ERROR_RIF = "Please enter a valid RIF (e.g., V12345678)";
496
+ var VEN_VALIDATION_ERROR_BANK = "Please enter a bank name";
497
+ function validateVenezuelanPhoneNumber(phoneNumber) {
498
+ if (!phoneNumber || phoneNumber.trim().length === 0) return false;
499
+ const cleaned = phoneNumber.trim().replace(/\D/g, "");
500
+ if (/^04\d{9}$/.test(cleaned)) return true;
501
+ if (/^4\d{9}$/.test(cleaned)) return true;
502
+ return false;
503
+ }
504
+ function validateVenezuelanRif(rif) {
505
+ if (!rif || rif.trim().length === 0) return false;
506
+ const trimmed = rif.trim().toUpperCase();
507
+ return /^[JVEGC]\d{7,9}$/.test(trimmed);
508
+ }
509
+ var VEN_PAYMENT_FIELDS = [
510
+ {
511
+ key: "phone",
512
+ label: "PHONE_NUMBER",
513
+ placeholder: VEN_PLACEHOLDER,
514
+ displayLabel: "Phone",
515
+ validate: validateVenezuelanPhoneNumber,
516
+ validationErrorMessage: VEN_VALIDATION_ERROR
517
+ },
518
+ {
519
+ key: "rif",
520
+ label: "RIF_LABEL",
521
+ placeholder: VEN_PLACEHOLDER_RIF,
522
+ displayLabel: "RIF",
523
+ validate: validateVenezuelanRif,
524
+ validationErrorMessage: VEN_VALIDATION_ERROR_RIF
525
+ },
526
+ {
527
+ key: "bank",
528
+ label: "BANK_LABEL",
529
+ placeholder: VEN_PLACEHOLDER_BANK,
530
+ displayLabel: "Banco",
531
+ validate: (v) => v.trim().length > 0,
532
+ validationErrorMessage: VEN_VALIDATION_ERROR_BANK
533
+ }
534
+ ];
535
+ var VEN_COUNTRY_OPTION = {
536
+ country: "Venezuela",
537
+ currency: CURRENCY.VEN,
538
+ internationalFormat: "VES",
539
+ symbolNative: "Bs",
540
+ locale: "es-VE",
541
+ paymentMethod: "PAGO_MOVIL",
542
+ paymentAddressName: "PAGO_MOVIL_DETAILS",
543
+ timezone: "America/Caracas",
544
+ timezone_name: "VET",
545
+ flag: "\u{1F1FB}\u{1F1EA}",
546
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1fb-1f1ea.png",
547
+ phoneCode: "+58",
548
+ telegramSupportChannel: "https://t.me/p2pmevenezuela",
549
+ twitterUsername: "p2pmevenezuela",
550
+ smsCountryCodes: ["VE"],
551
+ precision: 2,
552
+ isAlpha: true,
553
+ disabled: false,
554
+ disabledPaymentTypes: []
555
+ };
556
+
557
+ // src/country/countries.ts
558
+ var COUNTRY_OPTIONS = [
559
+ INR_COUNTRY_OPTION,
560
+ IDR_COUNTRY_OPTION,
561
+ BRL_COUNTRY_OPTION,
562
+ ARS_COUNTRY_OPTION,
563
+ MEX_COUNTRY_OPTION,
564
+ VEN_COUNTRY_OPTION,
565
+ NGN_COUNTRY_OPTION,
566
+ COP_COUNTRY_OPTION,
567
+ EUR_COUNTRY_OPTION,
568
+ USD_COUNTRY_OPTION
569
+ ];
570
+
571
+ // src/country/payment-fields.ts
572
+ var PAYMENT_ID_FIELDS = {
573
+ INR: INR_PAYMENT_FIELDS,
574
+ IDR: IDR_PAYMENT_FIELDS,
575
+ BRL: BRL_PAYMENT_FIELDS,
576
+ ARS: ARS_PAYMENT_FIELDS,
577
+ MEX: MEX_PAYMENT_FIELDS,
578
+ VEN: VEN_PAYMENT_FIELDS,
579
+ NGN: NGN_PAYMENT_FIELDS,
580
+ EUR: EUR_PAYMENT_FIELDS,
581
+ USD: USD_PAYMENT_FIELDS,
582
+ COP: COP_PAYMENT_FIELDS
583
+ };
584
+
585
+ // src/country/validators.ts
586
+ function serializeCompoundPaymentId(...fields) {
587
+ return fields.join("|");
588
+ }
589
+ function deserializeCompoundPaymentId(paymentId) {
590
+ return paymentId.split("|");
591
+ }
592
+ function formatCompoundPaymentIdForDisplay(paymentId, labels) {
593
+ const parts = deserializeCompoundPaymentId(paymentId);
594
+ return parts.map((part, i) => labels[i] ? `${labels[i]}: ${part}` : part).join(" | ");
595
+ }
596
+ // Annotate the CommonJS export names for ESM import in node:
597
+ 0 && (module.exports = {
598
+ COUNTRY_OPTIONS,
599
+ PAYMENT_ID_FIELDS,
600
+ deserializeCompoundPaymentId,
601
+ formatCompoundPaymentIdForDisplay,
602
+ serializeCompoundPaymentId,
603
+ validateArgentinePaymentId,
604
+ validateIndonesianPhoneNumber,
605
+ validateMexicanPaymentId,
606
+ validateNigerianAccountNumber,
607
+ validatePIXId,
608
+ validateRevolutId,
609
+ validateUPIId,
610
+ validateVenezuelanPhoneNumber,
611
+ validateVenezuelanRif
612
+ });
613
+ //# sourceMappingURL=country.cjs.map