@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/dist/country.mjs CHANGED
@@ -6,6 +6,7 @@ var CURRENCY = {
6
6
  ARS: "ARS",
7
7
  MEX: "MEX",
8
8
  VEN: "VEN",
9
+ BOB: "BOB",
9
10
  EUR: "EUR",
10
11
  NGN: "NGN",
11
12
  USD: "USD",
@@ -81,6 +82,115 @@ var ARS_COUNTRY_OPTION = {
81
82
  disabledPaymentTypes: []
82
83
  };
83
84
 
85
+ // src/country/types.ts
86
+ var PACKED_PAYMENT_ID_SEP = "||";
87
+
88
+ // src/country/qr-validator.ts
89
+ function crc16ccitt(s) {
90
+ let crc = 65535;
91
+ for (let i = 0; i < s.length; i++) {
92
+ crc ^= s.charCodeAt(i) << 8;
93
+ for (let j = 0; j < 8; j++) {
94
+ crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
95
+ crc &= 65535;
96
+ }
97
+ }
98
+ return crc.toString(16).toUpperCase().padStart(4, "0");
99
+ }
100
+ function validateEmvcoQr(payload, country, currency) {
101
+ if (!payload || payload.trim().length === 0) return false;
102
+ const data = payload.trim();
103
+ const tags = {};
104
+ let pos = 0;
105
+ while (pos + 4 <= data.length) {
106
+ const tag = data.substring(pos, pos + 2);
107
+ const lengthStr = data.substring(pos + 2, pos + 4);
108
+ if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
109
+ const length = Number.parseInt(lengthStr, 10);
110
+ if (pos + 4 + length > data.length) break;
111
+ tags[tag] = data.substring(pos + 4, pos + 4 + length);
112
+ pos += 4 + length;
113
+ }
114
+ if (tags["58"] !== country) return false;
115
+ if (tags["53"] !== currency) return false;
116
+ const crcTag = tags["63"];
117
+ if (!crcTag) return false;
118
+ const marker = data.lastIndexOf("6304");
119
+ if (marker === -1) return false;
120
+ const expected = crc16ccitt(data.substring(0, marker + 4));
121
+ return expected.toUpperCase() === crcTag.toUpperCase();
122
+ }
123
+ function validatePeruvianQr(payload) {
124
+ return validateEmvcoQr(payload, "PE", "604");
125
+ }
126
+ function isBolivianEncryptedQr(payload) {
127
+ const trimmed = payload.trim();
128
+ if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
129
+ const sep = trimmed.lastIndexOf("|");
130
+ if (sep < 40) return false;
131
+ const blob = trimmed.slice(0, sep);
132
+ const tag = trimmed.slice(sep + 1);
133
+ if (blob.length % 4 !== 0) return false;
134
+ if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
135
+ return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
136
+ }
137
+ function validateBolivianQr(payload) {
138
+ if (!payload || payload.trim().length === 0) return false;
139
+ return isBolivianEncryptedQr(payload) || validateEmvcoQr(payload, "BO", "068");
140
+ }
141
+ function validateVenezuelanQr(payload) {
142
+ if (!payload || typeof payload !== "string") return false;
143
+ const trimmed = payload.trim();
144
+ if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
145
+ const qIdx = trimmed.indexOf("?");
146
+ if (qIdx < 40) return false;
147
+ const blob = trimmed.substring(0, qIdx);
148
+ if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
149
+ return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
150
+ }
151
+
152
+ // src/country/currencies/bob.ts
153
+ var BOB_PLACEHOLDER = "Bank account number (8\u201320 digits)";
154
+ var BOB_VALIDATION_ERROR = "Please enter a valid Bolivian bank account number";
155
+ function validateBolivianAccount(account) {
156
+ if (!account || account.trim().length === 0) return false;
157
+ const cleaned = account.trim().replace(/[\s-]/g, "");
158
+ return /^\d{8,20}$/.test(cleaned);
159
+ }
160
+ var BOB_PAYMENT_FIELDS = [
161
+ {
162
+ key: "account",
163
+ label: "ACCOUNT_NUMBER",
164
+ placeholder: BOB_PLACEHOLDER,
165
+ displayLabel: "Cuenta",
166
+ validate: validateBolivianAccount,
167
+ validationErrorMessage: BOB_VALIDATION_ERROR
168
+ }
169
+ ];
170
+ var BOB_COUNTRY_OPTION = {
171
+ country: "Bolivia",
172
+ currency: CURRENCY.BOB,
173
+ internationalFormat: "BOB",
174
+ symbolNative: "Bs.",
175
+ locale: "es-BO",
176
+ paymentMethod: "QR_SIMPLE",
177
+ paymentAddressName: "QR_SIMPLE_DETAILS",
178
+ timezone: "America/La_Paz",
179
+ timezone_name: "BOT",
180
+ flag: "\u{1F1E7}\u{1F1F4}",
181
+ flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f4.png",
182
+ phoneCode: "+591",
183
+ telegramSupportChannel: "https://t.me/p2pmebolivia",
184
+ twitterUsername: "p2pmebolivia",
185
+ smsCountryCodes: ["BO"],
186
+ precision: 2,
187
+ isAlpha: true,
188
+ disabled: false,
189
+ disabledPaymentTypes: [],
190
+ uploadPaymentQR: true,
191
+ validateQr: validateBolivianQr
192
+ };
193
+
84
194
  // src/country/currencies/brl.ts
85
195
  var BRL_PLACEHOLDER = "Chave pix ou pix copia e cola";
86
196
  var BRL_VALIDATION_ERROR = "Please enter a valid PIX ID";
@@ -598,59 +708,133 @@ var NGN_COUNTRY_OPTION = {
598
708
  };
599
709
 
600
710
  // src/country/currencies/pen.ts
601
- var PEN_PLACEHOLDER = "CCI (20 digits) or Yape/Plin phone (9XXXXXXXX)";
602
- var PEN_VALIDATION_ERROR = "Please enter a valid 20-digit CCI or Yape/Plin phone number";
603
- function validatePeruvianPaymentKey(value) {
711
+ var PEN_PHONE_PLACEHOLDER = "PERU_PHONE_PLACEHOLDER";
712
+ var PEN_CCI_PLACEHOLDER = "PERU_CCI_PLACEHOLDER";
713
+ var PEN_PHONE_VALIDATION_ERROR = "Please enter a valid Yape/Plin phone (9XXXXXXXX)";
714
+ var PEN_CCI_VALIDATION_ERROR = "Please enter a valid 20-digit CCI";
715
+ function validatePeruvianCci(value) {
716
+ if (!value || value.trim().length === 0) return false;
717
+ return /^\d{20}$/.test(value.trim().replace(/\s+/g, ""));
718
+ }
719
+ function validatePeruvianPhone(value) {
604
720
  if (!value || value.trim().length === 0) return false;
721
+ const phone = value.trim().replace(/\s+/g, "").replace(/^\+?51/, "");
722
+ return /^9\d{8}$/.test(phone);
723
+ }
724
+ function validatePeruvianPaymentKey(value) {
725
+ return validatePeruvianCci(value) || validatePeruvianPhone(value);
726
+ }
727
+ function normalizePeruvianPaymentKey(value) {
605
728
  const trimmed = value.trim();
606
729
  const cci = trimmed.replace(/\s+/g, "");
607
- if (/^\d{20}$/.test(cci)) return true;
730
+ if (/^\d{20}$/.test(cci)) return cci;
608
731
  const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
609
- if (/^9\d{8}$/.test(phone)) return true;
610
- return false;
732
+ if (/^9\d{8}$/.test(phone)) return phone;
733
+ return cci;
611
734
  }
612
- function crc16ccitt(s) {
613
- let crc = 65535;
614
- for (let i = 0; i < s.length; i++) {
615
- crc ^= s.charCodeAt(i) << 8;
616
- for (let j = 0; j < 8; j++) {
617
- crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
618
- crc &= 65535;
735
+ function looksLikeTlv(value) {
736
+ if (value.length < 5 || !/^\d{4}/.test(value)) return false;
737
+ const len = Number.parseInt(value.slice(2, 4), 10);
738
+ return !Number.isNaN(len) && len >= 0 && 4 + len <= value.length;
739
+ }
740
+ function phoneFromTlvValue(value) {
741
+ const trimmed = value.trim();
742
+ if (!trimmed) return null;
743
+ if (validatePeruvianPhone(trimmed)) return normalizePeruvianPaymentKey(trimmed);
744
+ if (/^[0-9a-f]+$/i.test(trimmed) && /[a-f]/i.test(trimmed)) return null;
745
+ const match = trimmed.match(/(^|[^0-9])(\+?51)?(9\d{8})(?![0-9])/);
746
+ if (!match) return null;
747
+ const candidate = `${match[2] ?? ""}${match[3]}`;
748
+ return validatePeruvianPhone(candidate) ? normalizePeruvianPaymentKey(candidate) : null;
749
+ }
750
+ function extractPeruvianPhoneFromQr(payload) {
751
+ let pos = 0;
752
+ while (pos + 4 <= payload.length) {
753
+ const tag = payload.slice(pos, pos + 2);
754
+ const len = Number.parseInt(payload.slice(pos + 2, pos + 4), 10);
755
+ if (Number.isNaN(len) || len < 0 || pos + 4 + len > payload.length) break;
756
+ const value = payload.slice(pos + 4, pos + 4 + len);
757
+ const direct = phoneFromTlvValue(value);
758
+ if (direct) return direct;
759
+ if (tag >= "02" && tag <= "51" || tag === "62" || tag === "64" || looksLikeTlv(value)) {
760
+ const nested = extractPeruvianPhoneFromQr(value);
761
+ if (nested) return nested;
619
762
  }
763
+ pos += 4 + len;
620
764
  }
621
- return crc.toString(16).toUpperCase().padStart(4, "0");
765
+ const glued = payload.match(/\+51\s*9\d{8}/);
766
+ if (glued && validatePeruvianPhone(glued[0])) {
767
+ return normalizePeruvianPaymentKey(glued[0]);
768
+ }
769
+ return null;
622
770
  }
623
- function validatePeruvianQr(payload) {
624
- if (!payload || payload.trim().length === 0) return false;
625
- const data = payload.trim();
626
- const tags = {};
627
- let pos = 0;
628
- while (pos + 4 <= data.length) {
629
- const tag = data.substring(pos, pos + 2);
630
- const lengthStr = data.substring(pos + 2, pos + 4);
631
- if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
632
- const length = Number.parseInt(lengthStr, 10);
633
- if (pos + 4 + length > data.length) break;
634
- tags[tag] = data.substring(pos + 4, pos + 4 + length);
635
- pos += 4 + length;
771
+ function parsePeruvianFallback(value) {
772
+ const trimmed = value.trim();
773
+ if (!trimmed) return { phone: null, cci: null };
774
+ const tokens = trimmed.split("|").map((token) => token.trim()).filter(Boolean);
775
+ let phone = null;
776
+ let cci = null;
777
+ for (const token of tokens) {
778
+ if (!phone && validatePeruvianPhone(token)) {
779
+ phone = normalizePeruvianPaymentKey(token);
780
+ continue;
781
+ }
782
+ if (!cci && validatePeruvianCci(token)) {
783
+ cci = normalizePeruvianPaymentKey(token);
784
+ }
636
785
  }
637
- if (tags["58"] !== "PE") return false;
638
- if (tags["53"] !== "604") return false;
639
- const crcTag = tags["63"];
640
- if (!crcTag) return false;
641
- const marker = data.lastIndexOf("6304");
642
- if (marker === -1) return false;
643
- const expected = crc16ccitt(data.substring(0, marker + 4));
644
- return expected.toUpperCase() === crcTag.toUpperCase();
786
+ return { phone, cci };
787
+ }
788
+ function parsePeruvianPaymentId(value) {
789
+ if (!value || typeof value !== "string") {
790
+ return { qr: null, phone: null, cci: null };
791
+ }
792
+ const trimmed = value.trim();
793
+ const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
794
+ if (sep >= 0) {
795
+ const left = trimmed.slice(0, sep);
796
+ const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
797
+ const fallback2 = parsePeruvianFallback(right);
798
+ const qr = validatePeruvianQr(left) ? left : null;
799
+ return {
800
+ qr,
801
+ phone: fallback2.phone ?? (qr ? extractPeruvianPhoneFromQr(qr) : null),
802
+ cci: fallback2.cci
803
+ };
804
+ }
805
+ if (validatePeruvianQr(trimmed)) {
806
+ return {
807
+ qr: trimmed,
808
+ phone: extractPeruvianPhoneFromQr(trimmed),
809
+ cci: null
810
+ };
811
+ }
812
+ const fallback = parsePeruvianFallback(trimmed);
813
+ return { qr: null, phone: fallback.phone, cci: fallback.cci };
814
+ }
815
+ function validatePeruvianPaymentId(value) {
816
+ if (!value || typeof value !== "string") return false;
817
+ const { qr, phone, cci } = parsePeruvianPaymentId(value);
818
+ return Boolean(qr || phone || cci);
645
819
  }
646
820
  var PEN_PAYMENT_FIELDS = [
647
821
  {
648
- key: "paymentId",
649
- label: "CCI_YAPE_PLIN",
650
- placeholder: PEN_PLACEHOLDER,
651
- displayLabel: "CCI / Yape / Plin",
652
- validate: validatePeruvianPaymentKey,
653
- validationErrorMessage: PEN_VALIDATION_ERROR
822
+ key: "phone",
823
+ label: "PERU_PHONE_LABEL",
824
+ placeholder: PEN_PHONE_PLACEHOLDER,
825
+ displayLabel: "Yape / Plin phone",
826
+ validate: validatePeruvianPhone,
827
+ validationErrorMessage: PEN_PHONE_VALIDATION_ERROR,
828
+ optional: true
829
+ },
830
+ {
831
+ key: "cci",
832
+ label: "PERU_CCI_LABEL",
833
+ placeholder: PEN_CCI_PLACEHOLDER,
834
+ displayLabel: "CCI",
835
+ validate: validatePeruvianCci,
836
+ validationErrorMessage: PEN_CCI_VALIDATION_ERROR,
837
+ optional: true
654
838
  }
655
839
  ];
656
840
  var PEN_COUNTRY_OPTION = {
@@ -671,7 +855,13 @@ var PEN_COUNTRY_OPTION = {
671
855
  precision: 2,
672
856
  isAlpha: true,
673
857
  disabled: false,
674
- disabledPaymentTypes: []
858
+ disabledPaymentTypes: [],
859
+ uploadPaymentQR: true,
860
+ validateQr: validatePeruvianQr,
861
+ hydrateFieldsFromQr: (qr) => {
862
+ const phone = extractPeruvianPhoneFromQr(qr);
863
+ return phone ? { phone } : {};
864
+ }
675
865
  };
676
866
 
677
867
  // src/country/currencies/php.ts
@@ -780,6 +970,32 @@ function validateVenezuelanRif(rif) {
780
970
  const trimmed = rif.trim().toUpperCase();
781
971
  return /^[VEJGRP]\d+$/.test(trimmed);
782
972
  }
973
+ function isValidVenezuelanCompound(value) {
974
+ const parts = value.split("|");
975
+ if (parts.length !== 3) return false;
976
+ return validateVenezuelanPhoneNumber(parts[0]) && validateVenezuelanRif(parts[1]) && parts[2].trim().length > 0;
977
+ }
978
+ function parseVenezuelanPaymentId(value) {
979
+ if (!value || typeof value !== "string") return { qr: null, compound: null };
980
+ const trimmed = value.trim();
981
+ const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
982
+ if (sep >= 0) {
983
+ const left = trimmed.slice(0, sep);
984
+ const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
985
+ return {
986
+ qr: validateVenezuelanQr(left) ? left : null,
987
+ compound: isValidVenezuelanCompound(right) ? right : null
988
+ };
989
+ }
990
+ if (validateVenezuelanQr(trimmed)) return { qr: trimmed, compound: null };
991
+ if (isValidVenezuelanCompound(trimmed)) return { qr: null, compound: trimmed };
992
+ return { qr: null, compound: null };
993
+ }
994
+ function validateVenezuelanPaymentId(value) {
995
+ if (!value || typeof value !== "string") return false;
996
+ const { qr, compound } = parseVenezuelanPaymentId(value);
997
+ return qr !== null || compound !== null;
998
+ }
783
999
  var VEN_PAYMENT_FIELDS = [
784
1000
  {
785
1001
  key: "phone",
@@ -825,27 +1041,11 @@ var VEN_COUNTRY_OPTION = {
825
1041
  precision: 2,
826
1042
  isAlpha: false,
827
1043
  disabled: false,
828
- disabledPaymentTypes: []
1044
+ disabledPaymentTypes: [],
1045
+ uploadPaymentQR: true,
1046
+ validateQr: validateVenezuelanQr
829
1047
  };
830
1048
 
831
- // src/country/countries.ts
832
- var COUNTRY_OPTIONS = [
833
- INR_COUNTRY_OPTION,
834
- IDR_COUNTRY_OPTION,
835
- BRL_COUNTRY_OPTION,
836
- ARS_COUNTRY_OPTION,
837
- MEX_COUNTRY_OPTION,
838
- VEN_COUNTRY_OPTION,
839
- NGN_COUNTRY_OPTION,
840
- COP_COUNTRY_OPTION,
841
- CUP_COUNTRY_OPTION,
842
- ECU_COUNTRY_OPTION,
843
- PEN_COUNTRY_OPTION,
844
- PHP_COUNTRY_OPTION,
845
- EUR_COUNTRY_OPTION,
846
- USD_COUNTRY_OPTION
847
- ];
848
-
849
1049
  // src/country/payment-fields.ts
850
1050
  var PAYMENT_ID_FIELDS = {
851
1051
  INR: INR_PAYMENT_FIELDS,
@@ -854,6 +1054,7 @@ var PAYMENT_ID_FIELDS = {
854
1054
  ARS: ARS_PAYMENT_FIELDS,
855
1055
  MEX: MEX_PAYMENT_FIELDS,
856
1056
  VEN: VEN_PAYMENT_FIELDS,
1057
+ BOB: BOB_PAYMENT_FIELDS,
857
1058
  NGN: NGN_PAYMENT_FIELDS,
858
1059
  EUR: EUR_PAYMENT_FIELDS,
859
1060
  USD: USD_PAYMENT_FIELDS,
@@ -864,6 +1065,39 @@ var PAYMENT_ID_FIELDS = {
864
1065
  PHP: PHP_PAYMENT_FIELDS
865
1066
  };
866
1067
 
1068
+ // src/country/countries.ts
1069
+ var COUNTRY_OPTIONS = [
1070
+ INR_COUNTRY_OPTION,
1071
+ IDR_COUNTRY_OPTION,
1072
+ BRL_COUNTRY_OPTION,
1073
+ ARS_COUNTRY_OPTION,
1074
+ MEX_COUNTRY_OPTION,
1075
+ VEN_COUNTRY_OPTION,
1076
+ BOB_COUNTRY_OPTION,
1077
+ NGN_COUNTRY_OPTION,
1078
+ COP_COUNTRY_OPTION,
1079
+ CUP_COUNTRY_OPTION,
1080
+ ECU_COUNTRY_OPTION,
1081
+ PEN_COUNTRY_OPTION,
1082
+ PHP_COUNTRY_OPTION,
1083
+ EUR_COUNTRY_OPTION,
1084
+ USD_COUNTRY_OPTION
1085
+ ];
1086
+ function getCountryOption(currency) {
1087
+ if (!currency) return void 0;
1088
+ return COUNTRY_OPTIONS.find((c) => c.currency === currency);
1089
+ }
1090
+ function uploadsPaymentQR(currency) {
1091
+ return getCountryOption(currency)?.uploadPaymentQR === true;
1092
+ }
1093
+ function usesPackedPaymentId(currency) {
1094
+ return getCountryOption(currency)?.validateQr != null;
1095
+ }
1096
+ function usesCatalogPaymentForm(currency) {
1097
+ if (!currency) return false;
1098
+ return uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;
1099
+ }
1100
+
867
1101
  // src/country/validators.ts
868
1102
  function serializeCompoundPaymentId(...fields) {
869
1103
  return fields.join("|");
@@ -873,17 +1107,174 @@ function deserializeCompoundPaymentId(paymentId) {
873
1107
  }
874
1108
  function formatCompoundPaymentIdForDisplay(paymentId, labels) {
875
1109
  const parts = deserializeCompoundPaymentId(paymentId);
876
- return parts.map((part, i) => labels[i] ? `${labels[i]}: ${part}` : part).join(" | ");
1110
+ return parts.map((part, i) => {
1111
+ if (!part?.trim()) return null;
1112
+ return labels[i] ? `${labels[i]}: ${part}` : part;
1113
+ }).filter((part) => part !== null).join(" | ");
1114
+ }
1115
+ function validatePaymentIdFields(fields, paymentId) {
1116
+ if (!paymentId || paymentId.trim().length === 0) return false;
1117
+ if (!fields.length) return false;
1118
+ if (fields.length === 1) {
1119
+ return fields[0].validate(paymentId);
1120
+ }
1121
+ const parts = deserializeCompoundPaymentId(paymentId);
1122
+ if (parts.length === 1) {
1123
+ if (!fields.some((field) => field.optional)) return false;
1124
+ return fields.some((field) => field.validate(parts[0]));
1125
+ }
1126
+ const values = fields.map((_, i) => (parts[i] ?? "").trim());
1127
+ const eachOk = fields.every((field, i) => {
1128
+ const value = values[i];
1129
+ if (!value) return field.optional === true;
1130
+ return field.validate(value);
1131
+ });
1132
+ if (!eachOk) return false;
1133
+ return values.some((value) => value.length > 0);
1134
+ }
1135
+ function assignPaymentIdToFieldValues(fields, paymentId) {
1136
+ const result = {};
1137
+ for (const field of fields) result[field.key] = "";
1138
+ if (!paymentId) return result;
1139
+ const { rest } = unpackPackedPaymentId(paymentId);
1140
+ if (!rest) return result;
1141
+ const tokens = deserializeCompoundPaymentId(rest).map((part) => part.trim()).filter((part) => part.length > 0);
1142
+ const claimed = /* @__PURE__ */ new Set();
1143
+ for (const token of tokens) {
1144
+ const field = fields.find((item) => !claimed.has(item.key) && item.validate(token));
1145
+ if (field) {
1146
+ result[field.key] = token;
1147
+ claimed.add(field.key);
1148
+ }
1149
+ }
1150
+ if (claimed.size === 0 && tokens.length === 1 && fields.length === 1) {
1151
+ result[fields[0].key] = tokens[0];
1152
+ return result;
1153
+ }
1154
+ if (claimed.size < Math.min(tokens.length, fields.length)) {
1155
+ fields.forEach((field, i) => {
1156
+ if (!result[field.key]) result[field.key] = tokens[i] ?? "";
1157
+ });
1158
+ }
1159
+ return result;
1160
+ }
1161
+ function unpackPackedPaymentId(paymentId) {
1162
+ const sep = paymentId.indexOf(PACKED_PAYMENT_ID_SEP);
1163
+ if (sep < 0) return { qr: "", rest: paymentId };
1164
+ return {
1165
+ qr: paymentId.slice(0, sep),
1166
+ rest: paymentId.slice(sep + PACKED_PAYMENT_ID_SEP.length)
1167
+ };
1168
+ }
1169
+ function isStandaloneQr(validateQr, value) {
1170
+ return !!validateQr?.(value);
1171
+ }
1172
+ function getStoredQrPayload(currency, paymentId) {
1173
+ if (!currency || !paymentId) return null;
1174
+ const option = getCountryOption(currency);
1175
+ if (!option?.validateQr) return null;
1176
+ const trimmed = paymentId.trim();
1177
+ const { qr } = unpackPackedPaymentId(trimmed);
1178
+ if (qr && option.validateQr(qr)) return qr;
1179
+ if (isStandaloneQr(option.validateQr, trimmed)) return trimmed;
1180
+ return null;
1181
+ }
1182
+ function packedTypedRest(fields, fieldValues) {
1183
+ const parts = fields.map((field) => {
1184
+ const value = (fieldValues[field.key] ?? "").trim();
1185
+ if (!value) return "";
1186
+ return field.validate(value) ? value : "";
1187
+ });
1188
+ if (!parts.some((part) => part.length > 0)) return "";
1189
+ return serializeCompoundPaymentId(...parts);
1190
+ }
1191
+ function packStoredPaymentId(currency, qr, fieldValues) {
1192
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1193
+ const option = getCountryOption(currency);
1194
+ const trimmedQr = qr?.trim() ?? "";
1195
+ const q = trimmedQr && option?.validateQr?.(trimmedQr) ? trimmedQr : "";
1196
+ const rest = packedTypedRest(fields, fieldValues);
1197
+ if (q && rest) return `${q}${PACKED_PAYMENT_ID_SEP}${rest}`;
1198
+ return q || rest;
1199
+ }
1200
+ function fieldsMatchStoredId(fields, paymentId) {
1201
+ if (validatePaymentIdFields(fields, paymentId)) return true;
1202
+ const assigned = assignPaymentIdToFieldValues(fields, paymentId);
1203
+ const filled = fields.filter((field) => (assigned[field.key] || "").trim().length > 0);
1204
+ if (filled.length === 0) return false;
1205
+ return fields.every(
1206
+ (field) => field.optional === true || (assigned[field.key] || "").trim().length > 0
1207
+ );
1208
+ }
1209
+ function validateStoredPaymentId(currency, paymentId) {
1210
+ if (!paymentId || paymentId.trim().length === 0) return false;
1211
+ const fields = PAYMENT_ID_FIELDS[currency];
1212
+ if (!fields?.length) return false;
1213
+ const option = getCountryOption(currency);
1214
+ const trimmed = paymentId.trim();
1215
+ const { qr, rest } = unpackPackedPaymentId(trimmed);
1216
+ if (qr) {
1217
+ if (!option?.validateQr?.(qr)) return false;
1218
+ if (!rest.trim()) return true;
1219
+ return fieldsMatchStoredId(fields, rest);
1220
+ }
1221
+ if (isStandaloneQr(option?.validateQr, trimmed)) return true;
1222
+ return fieldsMatchStoredId(fields, trimmed);
1223
+ }
1224
+ function assignStoredPaymentIdToFieldValues(currency, paymentId) {
1225
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1226
+ const option = getCountryOption(currency);
1227
+ const trimmed = paymentId.trim();
1228
+ const { qr, rest } = unpackPackedPaymentId(trimmed);
1229
+ let qrPayload = "";
1230
+ let typed = rest.trim();
1231
+ if (qr && option?.validateQr?.(qr)) {
1232
+ qrPayload = qr;
1233
+ } else if (isStandaloneQr(option?.validateQr, trimmed)) {
1234
+ qrPayload = trimmed;
1235
+ typed = "";
1236
+ }
1237
+ const values = assignPaymentIdToFieldValues(fields, typed);
1238
+ if (qrPayload && option?.hydrateFieldsFromQr) {
1239
+ const extra = option.hydrateFieldsFromQr(qrPayload);
1240
+ for (const [key, value] of Object.entries(extra)) {
1241
+ if (value && !values[key]) values[key] = value;
1242
+ }
1243
+ }
1244
+ return values;
1245
+ }
1246
+ function formatStoredPaymentIdForDisplay(currency, paymentId) {
1247
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1248
+ const values = assignStoredPaymentIdToFieldValues(currency, paymentId);
1249
+ if (fields.length <= 1) return (values[fields[0]?.key ?? ""] || "").trim();
1250
+ return fields.map((field) => {
1251
+ const value = (values[field.key] || "").trim();
1252
+ if (!value) return null;
1253
+ return field.displayLabel ? `${field.displayLabel}: ${value}` : value;
1254
+ }).filter((part) => part !== null).join(" | ");
877
1255
  }
878
1256
  export {
879
1257
  COUNTRY_OPTIONS,
880
1258
  CURRENCY,
881
1259
  CURRENCY_CODES,
1260
+ PACKED_PAYMENT_ID_SEP,
882
1261
  PAYMENT_ID_FIELDS,
1262
+ assignPaymentIdToFieldValues,
1263
+ assignStoredPaymentIdToFieldValues,
883
1264
  deserializeCompoundPaymentId,
884
1265
  formatCompoundPaymentIdForDisplay,
1266
+ formatStoredPaymentIdForDisplay,
1267
+ getCountryOption,
1268
+ getStoredQrPayload,
1269
+ packStoredPaymentId,
885
1270
  serializeCompoundPaymentId,
1271
+ unpackPackedPaymentId,
1272
+ uploadsPaymentQR,
1273
+ usesCatalogPaymentForm,
1274
+ usesPackedPaymentId,
886
1275
  validateArgentinePaymentId,
1276
+ validateBolivianAccount,
1277
+ validateBolivianQr,
887
1278
  validateColombianPaymentId,
888
1279
  validateCubanCardNumber,
889
1280
  validateCubanPhoneNumber,
@@ -895,12 +1286,19 @@ export {
895
1286
  validateNigerianAccountName,
896
1287
  validateNigerianAccountNumber,
897
1288
  validatePIXId,
1289
+ validatePaymentIdFields,
1290
+ validatePeruvianCci,
1291
+ validatePeruvianPaymentId,
898
1292
  validatePeruvianPaymentKey,
1293
+ validatePeruvianPhone,
899
1294
  validatePeruvianQr,
900
1295
  validatePhilippinePhoneNumber,
901
1296
  validateRevolutId,
1297
+ validateStoredPaymentId,
902
1298
  validateUPIId,
1299
+ validateVenezuelanPaymentId,
903
1300
  validateVenezuelanPhoneNumber,
1301
+ validateVenezuelanQr,
904
1302
  validateVenezuelanRif
905
1303
  };
906
1304
  //# sourceMappingURL=country.mjs.map