@p2pdotme/sdk 1.2.16 → 1.2.18

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 (58) hide show
  1. package/README.md +1 -1
  2. package/dist/country.cjs +480 -62
  3. package/dist/country.cjs.map +1 -1
  4. package/dist/country.d.cts +144 -27
  5. package/dist/country.d.ts +144 -27
  6. package/dist/country.mjs +460 -62
  7. package/dist/country.mjs.map +1 -1
  8. package/dist/fraud-engine.cjs +1 -0
  9. package/dist/fraud-engine.cjs.map +1 -1
  10. package/dist/fraud-engine.mjs +1 -0
  11. package/dist/fraud-engine.mjs.map +1 -1
  12. package/dist/index.cjs +2 -1
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.mjs +2 -1
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/orders.cjs +1 -0
  19. package/dist/orders.cjs.map +1 -1
  20. package/dist/orders.d.cts +2 -0
  21. package/dist/orders.d.ts +2 -0
  22. package/dist/orders.mjs +1 -0
  23. package/dist/orders.mjs.map +1 -1
  24. package/dist/prices.cjs +1 -0
  25. package/dist/prices.cjs.map +1 -1
  26. package/dist/prices.d.cts +1 -0
  27. package/dist/prices.d.ts +1 -0
  28. package/dist/prices.mjs +1 -0
  29. package/dist/prices.mjs.map +1 -1
  30. package/dist/profile.cjs +1 -0
  31. package/dist/profile.cjs.map +1 -1
  32. package/dist/profile.d.cts +2 -0
  33. package/dist/profile.d.ts +2 -0
  34. package/dist/profile.mjs +1 -0
  35. package/dist/profile.mjs.map +1 -1
  36. package/dist/qr-parsers.cjs +205 -11
  37. package/dist/qr-parsers.cjs.map +1 -1
  38. package/dist/qr-parsers.d.cts +9 -1
  39. package/dist/qr-parsers.d.ts +9 -1
  40. package/dist/qr-parsers.mjs +204 -11
  41. package/dist/qr-parsers.mjs.map +1 -1
  42. package/dist/react.cjs +1 -0
  43. package/dist/react.cjs.map +1 -1
  44. package/dist/react.d.cts +6 -0
  45. package/dist/react.d.ts +6 -0
  46. package/dist/react.mjs +1 -0
  47. package/dist/react.mjs.map +1 -1
  48. package/dist/stake.cjs +1 -0
  49. package/dist/stake.cjs.map +1 -1
  50. package/dist/stake.d.cts +1 -0
  51. package/dist/stake.d.ts +1 -0
  52. package/dist/stake.mjs +1 -0
  53. package/dist/stake.mjs.map +1 -1
  54. package/dist/zkkyc.cjs +1 -0
  55. package/dist/zkkyc.cjs.map +1 -1
  56. package/dist/zkkyc.mjs +1 -0
  57. package/dist/zkkyc.mjs.map +1 -1
  58. package/package.json +1 -1
package/README.md CHANGED
@@ -162,7 +162,7 @@ All hooks read from the nearest `<SdkProvider>`:
162
162
 
163
163
  ## Supported currencies
164
164
 
165
- `INR` · `IDR` · `BRL` · `ARS` · `MEX` · `VEN` · `EUR` · `NGN` · `USD` · `COP` · `ECU`
165
+ `INR` · `IDR` · `BRL` · `ARS` · `MEX` · `VEN` · `BOB` · `EUR` · `NGN` · `USD` · `COP` · `ECU`
166
166
 
167
167
  ## Development
168
168
 
package/dist/country.cjs CHANGED
@@ -23,11 +23,24 @@ __export(country_exports, {
23
23
  COUNTRY_OPTIONS: () => COUNTRY_OPTIONS,
24
24
  CURRENCY: () => CURRENCY,
25
25
  CURRENCY_CODES: () => CURRENCY_CODES,
26
+ PACKED_PAYMENT_ID_SEP: () => PACKED_PAYMENT_ID_SEP,
26
27
  PAYMENT_ID_FIELDS: () => PAYMENT_ID_FIELDS,
28
+ assignPaymentIdToFieldValues: () => assignPaymentIdToFieldValues,
29
+ assignStoredPaymentIdToFieldValues: () => assignStoredPaymentIdToFieldValues,
27
30
  deserializeCompoundPaymentId: () => deserializeCompoundPaymentId,
28
31
  formatCompoundPaymentIdForDisplay: () => formatCompoundPaymentIdForDisplay,
32
+ formatStoredPaymentIdForDisplay: () => formatStoredPaymentIdForDisplay,
33
+ getCountryOption: () => getCountryOption,
34
+ getStoredQrPayload: () => getStoredQrPayload,
35
+ packStoredPaymentId: () => packStoredPaymentId,
29
36
  serializeCompoundPaymentId: () => serializeCompoundPaymentId,
37
+ unpackPackedPaymentId: () => unpackPackedPaymentId,
38
+ uploadsPaymentQR: () => uploadsPaymentQR,
39
+ usesCatalogPaymentForm: () => usesCatalogPaymentForm,
40
+ usesPackedPaymentId: () => usesPackedPaymentId,
30
41
  validateArgentinePaymentId: () => validateArgentinePaymentId,
42
+ validateBolivianAccount: () => validateBolivianAccount,
43
+ validateBolivianQr: () => validateBolivianQr,
31
44
  validateColombianPaymentId: () => validateColombianPaymentId,
32
45
  validateCubanCardNumber: () => validateCubanCardNumber,
33
46
  validateCubanPhoneNumber: () => validateCubanPhoneNumber,
@@ -39,12 +52,19 @@ __export(country_exports, {
39
52
  validateNigerianAccountName: () => validateNigerianAccountName,
40
53
  validateNigerianAccountNumber: () => validateNigerianAccountNumber,
41
54
  validatePIXId: () => validatePIXId,
55
+ validatePaymentIdFields: () => validatePaymentIdFields,
56
+ validatePeruvianCci: () => validatePeruvianCci,
57
+ validatePeruvianPaymentId: () => validatePeruvianPaymentId,
42
58
  validatePeruvianPaymentKey: () => validatePeruvianPaymentKey,
59
+ validatePeruvianPhone: () => validatePeruvianPhone,
43
60
  validatePeruvianQr: () => validatePeruvianQr,
44
61
  validatePhilippinePhoneNumber: () => validatePhilippinePhoneNumber,
45
62
  validateRevolutId: () => validateRevolutId,
63
+ validateStoredPaymentId: () => validateStoredPaymentId,
46
64
  validateUPIId: () => validateUPIId,
65
+ validateVenezuelanPaymentId: () => validateVenezuelanPaymentId,
47
66
  validateVenezuelanPhoneNumber: () => validateVenezuelanPhoneNumber,
67
+ validateVenezuelanQr: () => validateVenezuelanQr,
48
68
  validateVenezuelanRif: () => validateVenezuelanRif
49
69
  });
50
70
  module.exports = __toCommonJS(country_exports);
@@ -57,6 +77,7 @@ var CURRENCY = {
57
77
  ARS: "ARS",
58
78
  MEX: "MEX",
59
79
  VEN: "VEN",
80
+ BOB: "BOB",
60
81
  EUR: "EUR",
61
82
  NGN: "NGN",
62
83
  USD: "USD",
@@ -132,6 +153,115 @@ var ARS_COUNTRY_OPTION = {
132
153
  disabledPaymentTypes: []
133
154
  };
134
155
 
156
+ // src/country/types.ts
157
+ var PACKED_PAYMENT_ID_SEP = "||";
158
+
159
+ // src/country/qr-validator.ts
160
+ function crc16ccitt(s) {
161
+ let crc = 65535;
162
+ for (let i = 0; i < s.length; i++) {
163
+ crc ^= s.charCodeAt(i) << 8;
164
+ for (let j = 0; j < 8; j++) {
165
+ crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
166
+ crc &= 65535;
167
+ }
168
+ }
169
+ return crc.toString(16).toUpperCase().padStart(4, "0");
170
+ }
171
+ function validateEmvcoQr(payload, country, currency) {
172
+ if (!payload || payload.trim().length === 0) return false;
173
+ const data = payload.trim();
174
+ const tags = {};
175
+ let pos = 0;
176
+ while (pos + 4 <= data.length) {
177
+ const tag = data.substring(pos, pos + 2);
178
+ const lengthStr = data.substring(pos + 2, pos + 4);
179
+ if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
180
+ const length = Number.parseInt(lengthStr, 10);
181
+ if (pos + 4 + length > data.length) break;
182
+ tags[tag] = data.substring(pos + 4, pos + 4 + length);
183
+ pos += 4 + length;
184
+ }
185
+ if (tags["58"] !== country) return false;
186
+ if (tags["53"] !== currency) return false;
187
+ const crcTag = tags["63"];
188
+ if (!crcTag) return false;
189
+ const marker = data.lastIndexOf("6304");
190
+ if (marker === -1) return false;
191
+ const expected = crc16ccitt(data.substring(0, marker + 4));
192
+ return expected.toUpperCase() === crcTag.toUpperCase();
193
+ }
194
+ function validatePeruvianQr(payload) {
195
+ return validateEmvcoQr(payload, "PE", "604");
196
+ }
197
+ function isBolivianEncryptedQr(payload) {
198
+ const trimmed = payload.trim();
199
+ if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
200
+ const sep = trimmed.lastIndexOf("|");
201
+ if (sep < 40) return false;
202
+ const blob = trimmed.slice(0, sep);
203
+ const tag = trimmed.slice(sep + 1);
204
+ if (blob.length % 4 !== 0) return false;
205
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
206
+ return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
207
+ }
208
+ function validateBolivianQr(payload) {
209
+ if (!payload || payload.trim().length === 0) return false;
210
+ return isBolivianEncryptedQr(payload) || validateEmvcoQr(payload, "BO", "068");
211
+ }
212
+ function validateVenezuelanQr(payload) {
213
+ if (!payload || typeof payload !== "string") return false;
214
+ const trimmed = payload.trim();
215
+ if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
216
+ const qIdx = trimmed.indexOf("?");
217
+ if (qIdx < 40) return false;
218
+ const blob = trimmed.substring(0, qIdx);
219
+ if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
220
+ return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
221
+ }
222
+
223
+ // src/country/currencies/bob.ts
224
+ var BOB_PLACEHOLDER = "Bank account number (8\u201320 digits)";
225
+ var BOB_VALIDATION_ERROR = "Please enter a valid Bolivian bank account number";
226
+ function validateBolivianAccount(account) {
227
+ if (!account || account.trim().length === 0) return false;
228
+ const cleaned = account.trim().replace(/[\s-]/g, "");
229
+ return /^\d{8,20}$/.test(cleaned);
230
+ }
231
+ var BOB_PAYMENT_FIELDS = [
232
+ {
233
+ key: "account",
234
+ label: "ACCOUNT_NUMBER",
235
+ placeholder: BOB_PLACEHOLDER,
236
+ displayLabel: "Cuenta",
237
+ validate: validateBolivianAccount,
238
+ validationErrorMessage: BOB_VALIDATION_ERROR
239
+ }
240
+ ];
241
+ var BOB_COUNTRY_OPTION = {
242
+ country: "Bolivia",
243
+ currency: CURRENCY.BOB,
244
+ internationalFormat: "BOB",
245
+ symbolNative: "Bs.",
246
+ locale: "es-BO",
247
+ paymentMethod: "QR_SIMPLE",
248
+ paymentAddressName: "QR_SIMPLE_DETAILS",
249
+ timezone: "America/La_Paz",
250
+ timezone_name: "BOT",
251
+ flag: "\u{1F1E7}\u{1F1F4}",
252
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f4.png",
253
+ phoneCode: "+591",
254
+ telegramSupportChannel: "https://t.me/p2pmebolivia",
255
+ twitterUsername: "p2pmebolivia",
256
+ smsCountryCodes: ["BO"],
257
+ precision: 2,
258
+ isAlpha: true,
259
+ disabled: false,
260
+ disabledPaymentTypes: [],
261
+ uploadPaymentQR: true,
262
+ validateQr: validateBolivianQr
263
+ };
264
+
135
265
  // src/country/currencies/brl.ts
136
266
  var BRL_PLACEHOLDER = "Chave pix ou pix copia e cola";
137
267
  var BRL_VALIDATION_ERROR = "Please enter a valid PIX ID";
@@ -649,59 +779,133 @@ var NGN_COUNTRY_OPTION = {
649
779
  };
650
780
 
651
781
  // src/country/currencies/pen.ts
652
- var PEN_PLACEHOLDER = "CCI (20 digits) or Yape/Plin phone (9XXXXXXXX)";
653
- var PEN_VALIDATION_ERROR = "Please enter a valid 20-digit CCI or Yape/Plin phone number";
654
- function validatePeruvianPaymentKey(value) {
782
+ var PEN_PHONE_PLACEHOLDER = "PERU_PHONE_PLACEHOLDER";
783
+ var PEN_CCI_PLACEHOLDER = "PERU_CCI_PLACEHOLDER";
784
+ var PEN_PHONE_VALIDATION_ERROR = "Please enter a valid Yape/Plin phone (9XXXXXXXX)";
785
+ var PEN_CCI_VALIDATION_ERROR = "Please enter a valid 20-digit CCI";
786
+ function validatePeruvianCci(value) {
787
+ if (!value || value.trim().length === 0) return false;
788
+ return /^\d{20}$/.test(value.trim().replace(/\s+/g, ""));
789
+ }
790
+ function validatePeruvianPhone(value) {
655
791
  if (!value || value.trim().length === 0) return false;
792
+ const phone = value.trim().replace(/\s+/g, "").replace(/^\+?51/, "");
793
+ return /^9\d{8}$/.test(phone);
794
+ }
795
+ function validatePeruvianPaymentKey(value) {
796
+ return validatePeruvianCci(value) || validatePeruvianPhone(value);
797
+ }
798
+ function normalizePeruvianPaymentKey(value) {
656
799
  const trimmed = value.trim();
657
800
  const cci = trimmed.replace(/\s+/g, "");
658
- if (/^\d{20}$/.test(cci)) return true;
801
+ if (/^\d{20}$/.test(cci)) return cci;
659
802
  const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
660
- if (/^9\d{8}$/.test(phone)) return true;
661
- return false;
803
+ if (/^9\d{8}$/.test(phone)) return phone;
804
+ return cci;
662
805
  }
663
- function crc16ccitt(s) {
664
- let crc = 65535;
665
- for (let i = 0; i < s.length; i++) {
666
- crc ^= s.charCodeAt(i) << 8;
667
- for (let j = 0; j < 8; j++) {
668
- crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
669
- crc &= 65535;
806
+ function looksLikeTlv(value) {
807
+ if (value.length < 5 || !/^\d{4}/.test(value)) return false;
808
+ const len = Number.parseInt(value.slice(2, 4), 10);
809
+ return !Number.isNaN(len) && len >= 0 && 4 + len <= value.length;
810
+ }
811
+ function phoneFromTlvValue(value) {
812
+ const trimmed = value.trim();
813
+ if (!trimmed) return null;
814
+ if (validatePeruvianPhone(trimmed)) return normalizePeruvianPaymentKey(trimmed);
815
+ if (/^[0-9a-f]+$/i.test(trimmed) && /[a-f]/i.test(trimmed)) return null;
816
+ const match = trimmed.match(/(^|[^0-9])(\+?51)?(9\d{8})(?![0-9])/);
817
+ if (!match) return null;
818
+ const candidate = `${match[2] ?? ""}${match[3]}`;
819
+ return validatePeruvianPhone(candidate) ? normalizePeruvianPaymentKey(candidate) : null;
820
+ }
821
+ function extractPeruvianPhoneFromQr(payload) {
822
+ let pos = 0;
823
+ while (pos + 4 <= payload.length) {
824
+ const tag = payload.slice(pos, pos + 2);
825
+ const len = Number.parseInt(payload.slice(pos + 2, pos + 4), 10);
826
+ if (Number.isNaN(len) || len < 0 || pos + 4 + len > payload.length) break;
827
+ const value = payload.slice(pos + 4, pos + 4 + len);
828
+ const direct = phoneFromTlvValue(value);
829
+ if (direct) return direct;
830
+ if (tag >= "02" && tag <= "51" || tag === "62" || tag === "64" || looksLikeTlv(value)) {
831
+ const nested = extractPeruvianPhoneFromQr(value);
832
+ if (nested) return nested;
670
833
  }
834
+ pos += 4 + len;
671
835
  }
672
- return crc.toString(16).toUpperCase().padStart(4, "0");
836
+ const glued = payload.match(/\+51\s*9\d{8}/);
837
+ if (glued && validatePeruvianPhone(glued[0])) {
838
+ return normalizePeruvianPaymentKey(glued[0]);
839
+ }
840
+ return null;
673
841
  }
674
- function validatePeruvianQr(payload) {
675
- if (!payload || payload.trim().length === 0) return false;
676
- const data = payload.trim();
677
- const tags = {};
678
- let pos = 0;
679
- while (pos + 4 <= data.length) {
680
- const tag = data.substring(pos, pos + 2);
681
- const lengthStr = data.substring(pos + 2, pos + 4);
682
- if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
683
- const length = Number.parseInt(lengthStr, 10);
684
- if (pos + 4 + length > data.length) break;
685
- tags[tag] = data.substring(pos + 4, pos + 4 + length);
686
- pos += 4 + length;
842
+ function parsePeruvianFallback(value) {
843
+ const trimmed = value.trim();
844
+ if (!trimmed) return { phone: null, cci: null };
845
+ const tokens = trimmed.split("|").map((token) => token.trim()).filter(Boolean);
846
+ let phone = null;
847
+ let cci = null;
848
+ for (const token of tokens) {
849
+ if (!phone && validatePeruvianPhone(token)) {
850
+ phone = normalizePeruvianPaymentKey(token);
851
+ continue;
852
+ }
853
+ if (!cci && validatePeruvianCci(token)) {
854
+ cci = normalizePeruvianPaymentKey(token);
855
+ }
687
856
  }
688
- if (tags["58"] !== "PE") return false;
689
- if (tags["53"] !== "604") return false;
690
- const crcTag = tags["63"];
691
- if (!crcTag) return false;
692
- const marker = data.lastIndexOf("6304");
693
- if (marker === -1) return false;
694
- const expected = crc16ccitt(data.substring(0, marker + 4));
695
- return expected.toUpperCase() === crcTag.toUpperCase();
857
+ return { phone, cci };
858
+ }
859
+ function parsePeruvianPaymentId(value) {
860
+ if (!value || typeof value !== "string") {
861
+ return { qr: null, phone: null, cci: null };
862
+ }
863
+ const trimmed = value.trim();
864
+ const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
865
+ if (sep >= 0) {
866
+ const left = trimmed.slice(0, sep);
867
+ const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
868
+ const fallback2 = parsePeruvianFallback(right);
869
+ const qr = validatePeruvianQr(left) ? left : null;
870
+ return {
871
+ qr,
872
+ phone: fallback2.phone ?? (qr ? extractPeruvianPhoneFromQr(qr) : null),
873
+ cci: fallback2.cci
874
+ };
875
+ }
876
+ if (validatePeruvianQr(trimmed)) {
877
+ return {
878
+ qr: trimmed,
879
+ phone: extractPeruvianPhoneFromQr(trimmed),
880
+ cci: null
881
+ };
882
+ }
883
+ const fallback = parsePeruvianFallback(trimmed);
884
+ return { qr: null, phone: fallback.phone, cci: fallback.cci };
885
+ }
886
+ function validatePeruvianPaymentId(value) {
887
+ if (!value || typeof value !== "string") return false;
888
+ const { qr, phone, cci } = parsePeruvianPaymentId(value);
889
+ return Boolean(qr || phone || cci);
696
890
  }
697
891
  var PEN_PAYMENT_FIELDS = [
698
892
  {
699
- key: "paymentId",
700
- label: "CCI_YAPE_PLIN",
701
- placeholder: PEN_PLACEHOLDER,
702
- displayLabel: "CCI / Yape / Plin",
703
- validate: validatePeruvianPaymentKey,
704
- validationErrorMessage: PEN_VALIDATION_ERROR
893
+ key: "phone",
894
+ label: "PERU_PHONE_LABEL",
895
+ placeholder: PEN_PHONE_PLACEHOLDER,
896
+ displayLabel: "Yape / Plin phone",
897
+ validate: validatePeruvianPhone,
898
+ validationErrorMessage: PEN_PHONE_VALIDATION_ERROR,
899
+ optional: true
900
+ },
901
+ {
902
+ key: "cci",
903
+ label: "PERU_CCI_LABEL",
904
+ placeholder: PEN_CCI_PLACEHOLDER,
905
+ displayLabel: "CCI",
906
+ validate: validatePeruvianCci,
907
+ validationErrorMessage: PEN_CCI_VALIDATION_ERROR,
908
+ optional: true
705
909
  }
706
910
  ];
707
911
  var PEN_COUNTRY_OPTION = {
@@ -722,7 +926,13 @@ var PEN_COUNTRY_OPTION = {
722
926
  precision: 2,
723
927
  isAlpha: true,
724
928
  disabled: false,
725
- disabledPaymentTypes: []
929
+ disabledPaymentTypes: [],
930
+ uploadPaymentQR: true,
931
+ validateQr: validatePeruvianQr,
932
+ hydrateFieldsFromQr: (qr) => {
933
+ const phone = extractPeruvianPhoneFromQr(qr);
934
+ return phone ? { phone } : {};
935
+ }
726
936
  };
727
937
 
728
938
  // src/country/currencies/php.ts
@@ -831,6 +1041,32 @@ function validateVenezuelanRif(rif) {
831
1041
  const trimmed = rif.trim().toUpperCase();
832
1042
  return /^[VEJGRP]\d+$/.test(trimmed);
833
1043
  }
1044
+ function isValidVenezuelanCompound(value) {
1045
+ const parts = value.split("|");
1046
+ if (parts.length !== 3) return false;
1047
+ return validateVenezuelanPhoneNumber(parts[0]) && validateVenezuelanRif(parts[1]) && parts[2].trim().length > 0;
1048
+ }
1049
+ function parseVenezuelanPaymentId(value) {
1050
+ if (!value || typeof value !== "string") return { qr: null, compound: null };
1051
+ const trimmed = value.trim();
1052
+ const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
1053
+ if (sep >= 0) {
1054
+ const left = trimmed.slice(0, sep);
1055
+ const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
1056
+ return {
1057
+ qr: validateVenezuelanQr(left) ? left : null,
1058
+ compound: isValidVenezuelanCompound(right) ? right : null
1059
+ };
1060
+ }
1061
+ if (validateVenezuelanQr(trimmed)) return { qr: trimmed, compound: null };
1062
+ if (isValidVenezuelanCompound(trimmed)) return { qr: null, compound: trimmed };
1063
+ return { qr: null, compound: null };
1064
+ }
1065
+ function validateVenezuelanPaymentId(value) {
1066
+ if (!value || typeof value !== "string") return false;
1067
+ const { qr, compound } = parseVenezuelanPaymentId(value);
1068
+ return qr !== null || compound !== null;
1069
+ }
834
1070
  var VEN_PAYMENT_FIELDS = [
835
1071
  {
836
1072
  key: "phone",
@@ -876,27 +1112,11 @@ var VEN_COUNTRY_OPTION = {
876
1112
  precision: 2,
877
1113
  isAlpha: false,
878
1114
  disabled: false,
879
- disabledPaymentTypes: []
1115
+ disabledPaymentTypes: [],
1116
+ uploadPaymentQR: true,
1117
+ validateQr: validateVenezuelanQr
880
1118
  };
881
1119
 
882
- // src/country/countries.ts
883
- var COUNTRY_OPTIONS = [
884
- INR_COUNTRY_OPTION,
885
- IDR_COUNTRY_OPTION,
886
- BRL_COUNTRY_OPTION,
887
- ARS_COUNTRY_OPTION,
888
- MEX_COUNTRY_OPTION,
889
- VEN_COUNTRY_OPTION,
890
- NGN_COUNTRY_OPTION,
891
- COP_COUNTRY_OPTION,
892
- CUP_COUNTRY_OPTION,
893
- ECU_COUNTRY_OPTION,
894
- PEN_COUNTRY_OPTION,
895
- PHP_COUNTRY_OPTION,
896
- EUR_COUNTRY_OPTION,
897
- USD_COUNTRY_OPTION
898
- ];
899
-
900
1120
  // src/country/payment-fields.ts
901
1121
  var PAYMENT_ID_FIELDS = {
902
1122
  INR: INR_PAYMENT_FIELDS,
@@ -905,6 +1125,7 @@ var PAYMENT_ID_FIELDS = {
905
1125
  ARS: ARS_PAYMENT_FIELDS,
906
1126
  MEX: MEX_PAYMENT_FIELDS,
907
1127
  VEN: VEN_PAYMENT_FIELDS,
1128
+ BOB: BOB_PAYMENT_FIELDS,
908
1129
  NGN: NGN_PAYMENT_FIELDS,
909
1130
  EUR: EUR_PAYMENT_FIELDS,
910
1131
  USD: USD_PAYMENT_FIELDS,
@@ -915,6 +1136,39 @@ var PAYMENT_ID_FIELDS = {
915
1136
  PHP: PHP_PAYMENT_FIELDS
916
1137
  };
917
1138
 
1139
+ // src/country/countries.ts
1140
+ var COUNTRY_OPTIONS = [
1141
+ INR_COUNTRY_OPTION,
1142
+ IDR_COUNTRY_OPTION,
1143
+ BRL_COUNTRY_OPTION,
1144
+ ARS_COUNTRY_OPTION,
1145
+ MEX_COUNTRY_OPTION,
1146
+ VEN_COUNTRY_OPTION,
1147
+ BOB_COUNTRY_OPTION,
1148
+ NGN_COUNTRY_OPTION,
1149
+ COP_COUNTRY_OPTION,
1150
+ CUP_COUNTRY_OPTION,
1151
+ ECU_COUNTRY_OPTION,
1152
+ PEN_COUNTRY_OPTION,
1153
+ PHP_COUNTRY_OPTION,
1154
+ EUR_COUNTRY_OPTION,
1155
+ USD_COUNTRY_OPTION
1156
+ ];
1157
+ function getCountryOption(currency) {
1158
+ if (!currency) return void 0;
1159
+ return COUNTRY_OPTIONS.find((c) => c.currency === currency);
1160
+ }
1161
+ function uploadsPaymentQR(currency) {
1162
+ return getCountryOption(currency)?.uploadPaymentQR === true;
1163
+ }
1164
+ function usesPackedPaymentId(currency) {
1165
+ return getCountryOption(currency)?.validateQr != null;
1166
+ }
1167
+ function usesCatalogPaymentForm(currency) {
1168
+ if (!currency) return false;
1169
+ return uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;
1170
+ }
1171
+
918
1172
  // src/country/validators.ts
919
1173
  function serializeCompoundPaymentId(...fields) {
920
1174
  return fields.join("|");
@@ -924,18 +1178,175 @@ function deserializeCompoundPaymentId(paymentId) {
924
1178
  }
925
1179
  function formatCompoundPaymentIdForDisplay(paymentId, labels) {
926
1180
  const parts = deserializeCompoundPaymentId(paymentId);
927
- return parts.map((part, i) => labels[i] ? `${labels[i]}: ${part}` : part).join(" | ");
1181
+ return parts.map((part, i) => {
1182
+ if (!part?.trim()) return null;
1183
+ return labels[i] ? `${labels[i]}: ${part}` : part;
1184
+ }).filter((part) => part !== null).join(" | ");
1185
+ }
1186
+ function validatePaymentIdFields(fields, paymentId) {
1187
+ if (!paymentId || paymentId.trim().length === 0) return false;
1188
+ if (!fields.length) return false;
1189
+ if (fields.length === 1) {
1190
+ return fields[0].validate(paymentId);
1191
+ }
1192
+ const parts = deserializeCompoundPaymentId(paymentId);
1193
+ if (parts.length === 1) {
1194
+ if (!fields.some((field) => field.optional)) return false;
1195
+ return fields.some((field) => field.validate(parts[0]));
1196
+ }
1197
+ const values = fields.map((_, i) => (parts[i] ?? "").trim());
1198
+ const eachOk = fields.every((field, i) => {
1199
+ const value = values[i];
1200
+ if (!value) return field.optional === true;
1201
+ return field.validate(value);
1202
+ });
1203
+ if (!eachOk) return false;
1204
+ return values.some((value) => value.length > 0);
1205
+ }
1206
+ function assignPaymentIdToFieldValues(fields, paymentId) {
1207
+ const result = {};
1208
+ for (const field of fields) result[field.key] = "";
1209
+ if (!paymentId) return result;
1210
+ const { rest } = unpackPackedPaymentId(paymentId);
1211
+ if (!rest) return result;
1212
+ const tokens = deserializeCompoundPaymentId(rest).map((part) => part.trim()).filter((part) => part.length > 0);
1213
+ const claimed = /* @__PURE__ */ new Set();
1214
+ for (const token of tokens) {
1215
+ const field = fields.find((item) => !claimed.has(item.key) && item.validate(token));
1216
+ if (field) {
1217
+ result[field.key] = token;
1218
+ claimed.add(field.key);
1219
+ }
1220
+ }
1221
+ if (claimed.size === 0 && tokens.length === 1 && fields.length === 1) {
1222
+ result[fields[0].key] = tokens[0];
1223
+ return result;
1224
+ }
1225
+ if (claimed.size < Math.min(tokens.length, fields.length)) {
1226
+ fields.forEach((field, i) => {
1227
+ if (!result[field.key]) result[field.key] = tokens[i] ?? "";
1228
+ });
1229
+ }
1230
+ return result;
1231
+ }
1232
+ function unpackPackedPaymentId(paymentId) {
1233
+ const sep = paymentId.indexOf(PACKED_PAYMENT_ID_SEP);
1234
+ if (sep < 0) return { qr: "", rest: paymentId };
1235
+ return {
1236
+ qr: paymentId.slice(0, sep),
1237
+ rest: paymentId.slice(sep + PACKED_PAYMENT_ID_SEP.length)
1238
+ };
1239
+ }
1240
+ function isStandaloneQr(validateQr, value) {
1241
+ return !!validateQr?.(value);
1242
+ }
1243
+ function getStoredQrPayload(currency, paymentId) {
1244
+ if (!currency || !paymentId) return null;
1245
+ const option = getCountryOption(currency);
1246
+ if (!option?.validateQr) return null;
1247
+ const trimmed = paymentId.trim();
1248
+ const { qr } = unpackPackedPaymentId(trimmed);
1249
+ if (qr && option.validateQr(qr)) return qr;
1250
+ if (isStandaloneQr(option.validateQr, trimmed)) return trimmed;
1251
+ return null;
1252
+ }
1253
+ function packedTypedRest(fields, fieldValues) {
1254
+ const parts = fields.map((field) => {
1255
+ const value = (fieldValues[field.key] ?? "").trim();
1256
+ if (!value) return "";
1257
+ return field.validate(value) ? value : "";
1258
+ });
1259
+ if (!parts.some((part) => part.length > 0)) return "";
1260
+ return serializeCompoundPaymentId(...parts);
1261
+ }
1262
+ function packStoredPaymentId(currency, qr, fieldValues) {
1263
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1264
+ const option = getCountryOption(currency);
1265
+ const trimmedQr = qr?.trim() ?? "";
1266
+ const q = trimmedQr && option?.validateQr?.(trimmedQr) ? trimmedQr : "";
1267
+ const rest = packedTypedRest(fields, fieldValues);
1268
+ if (q && rest) return `${q}${PACKED_PAYMENT_ID_SEP}${rest}`;
1269
+ return q || rest;
1270
+ }
1271
+ function fieldsMatchStoredId(fields, paymentId) {
1272
+ if (validatePaymentIdFields(fields, paymentId)) return true;
1273
+ const assigned = assignPaymentIdToFieldValues(fields, paymentId);
1274
+ const filled = fields.filter((field) => (assigned[field.key] || "").trim().length > 0);
1275
+ if (filled.length === 0) return false;
1276
+ return fields.every(
1277
+ (field) => field.optional === true || (assigned[field.key] || "").trim().length > 0
1278
+ );
1279
+ }
1280
+ function validateStoredPaymentId(currency, paymentId) {
1281
+ if (!paymentId || paymentId.trim().length === 0) return false;
1282
+ const fields = PAYMENT_ID_FIELDS[currency];
1283
+ if (!fields?.length) return false;
1284
+ const option = getCountryOption(currency);
1285
+ const trimmed = paymentId.trim();
1286
+ const { qr, rest } = unpackPackedPaymentId(trimmed);
1287
+ if (qr) {
1288
+ if (!option?.validateQr?.(qr)) return false;
1289
+ if (!rest.trim()) return true;
1290
+ return fieldsMatchStoredId(fields, rest);
1291
+ }
1292
+ if (isStandaloneQr(option?.validateQr, trimmed)) return true;
1293
+ return fieldsMatchStoredId(fields, trimmed);
1294
+ }
1295
+ function assignStoredPaymentIdToFieldValues(currency, paymentId) {
1296
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1297
+ const option = getCountryOption(currency);
1298
+ const trimmed = paymentId.trim();
1299
+ const { qr, rest } = unpackPackedPaymentId(trimmed);
1300
+ let qrPayload = "";
1301
+ let typed = rest.trim();
1302
+ if (qr && option?.validateQr?.(qr)) {
1303
+ qrPayload = qr;
1304
+ } else if (isStandaloneQr(option?.validateQr, trimmed)) {
1305
+ qrPayload = trimmed;
1306
+ typed = "";
1307
+ }
1308
+ const values = assignPaymentIdToFieldValues(fields, typed);
1309
+ if (qrPayload && option?.hydrateFieldsFromQr) {
1310
+ const extra = option.hydrateFieldsFromQr(qrPayload);
1311
+ for (const [key, value] of Object.entries(extra)) {
1312
+ if (value && !values[key]) values[key] = value;
1313
+ }
1314
+ }
1315
+ return values;
1316
+ }
1317
+ function formatStoredPaymentIdForDisplay(currency, paymentId) {
1318
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1319
+ const values = assignStoredPaymentIdToFieldValues(currency, paymentId);
1320
+ if (fields.length <= 1) return (values[fields[0]?.key ?? ""] || "").trim();
1321
+ return fields.map((field) => {
1322
+ const value = (values[field.key] || "").trim();
1323
+ if (!value) return null;
1324
+ return field.displayLabel ? `${field.displayLabel}: ${value}` : value;
1325
+ }).filter((part) => part !== null).join(" | ");
928
1326
  }
929
1327
  // Annotate the CommonJS export names for ESM import in node:
930
1328
  0 && (module.exports = {
931
1329
  COUNTRY_OPTIONS,
932
1330
  CURRENCY,
933
1331
  CURRENCY_CODES,
1332
+ PACKED_PAYMENT_ID_SEP,
934
1333
  PAYMENT_ID_FIELDS,
1334
+ assignPaymentIdToFieldValues,
1335
+ assignStoredPaymentIdToFieldValues,
935
1336
  deserializeCompoundPaymentId,
936
1337
  formatCompoundPaymentIdForDisplay,
1338
+ formatStoredPaymentIdForDisplay,
1339
+ getCountryOption,
1340
+ getStoredQrPayload,
1341
+ packStoredPaymentId,
937
1342
  serializeCompoundPaymentId,
1343
+ unpackPackedPaymentId,
1344
+ uploadsPaymentQR,
1345
+ usesCatalogPaymentForm,
1346
+ usesPackedPaymentId,
938
1347
  validateArgentinePaymentId,
1348
+ validateBolivianAccount,
1349
+ validateBolivianQr,
939
1350
  validateColombianPaymentId,
940
1351
  validateCubanCardNumber,
941
1352
  validateCubanPhoneNumber,
@@ -947,12 +1358,19 @@ function formatCompoundPaymentIdForDisplay(paymentId, labels) {
947
1358
  validateNigerianAccountName,
948
1359
  validateNigerianAccountNumber,
949
1360
  validatePIXId,
1361
+ validatePaymentIdFields,
1362
+ validatePeruvianCci,
1363
+ validatePeruvianPaymentId,
950
1364
  validatePeruvianPaymentKey,
1365
+ validatePeruvianPhone,
951
1366
  validatePeruvianQr,
952
1367
  validatePhilippinePhoneNumber,
953
1368
  validateRevolutId,
1369
+ validateStoredPaymentId,
954
1370
  validateUPIId,
1371
+ validateVenezuelanPaymentId,
955
1372
  validateVenezuelanPhoneNumber,
1373
+ validateVenezuelanQr,
956
1374
  validateVenezuelanRif
957
1375
  });
958
1376
  //# sourceMappingURL=country.cjs.map