@p2pdotme/sdk 1.2.15 → 1.2.17

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/dist/country.cjs CHANGED
@@ -23,10 +23,21 @@ __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,
31
42
  validateColombianPaymentId: () => validateColombianPaymentId,
32
43
  validateCubanCardNumber: () => validateCubanCardNumber,
@@ -39,12 +50,19 @@ __export(country_exports, {
39
50
  validateNigerianAccountName: () => validateNigerianAccountName,
40
51
  validateNigerianAccountNumber: () => validateNigerianAccountNumber,
41
52
  validatePIXId: () => validatePIXId,
53
+ validatePaymentIdFields: () => validatePaymentIdFields,
54
+ validatePeruvianCci: () => validatePeruvianCci,
55
+ validatePeruvianPaymentId: () => validatePeruvianPaymentId,
42
56
  validatePeruvianPaymentKey: () => validatePeruvianPaymentKey,
57
+ validatePeruvianPhone: () => validatePeruvianPhone,
43
58
  validatePeruvianQr: () => validatePeruvianQr,
44
59
  validatePhilippinePhoneNumber: () => validatePhilippinePhoneNumber,
45
60
  validateRevolutId: () => validateRevolutId,
61
+ validateStoredPaymentId: () => validateStoredPaymentId,
46
62
  validateUPIId: () => validateUPIId,
63
+ validateVenezuelanPaymentId: () => validateVenezuelanPaymentId,
47
64
  validateVenezuelanPhoneNumber: () => validateVenezuelanPhoneNumber,
65
+ validateVenezuelanQr: () => validateVenezuelanQr,
48
66
  validateVenezuelanRif: () => validateVenezuelanRif
49
67
  });
50
68
  module.exports = __toCommonJS(country_exports);
@@ -648,18 +666,10 @@ var NGN_COUNTRY_OPTION = {
648
666
  disabledPaymentTypes: []
649
667
  };
650
668
 
651
- // 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) {
655
- if (!value || value.trim().length === 0) return false;
656
- const trimmed = value.trim();
657
- const cci = trimmed.replace(/\s+/g, "");
658
- if (/^\d{20}$/.test(cci)) return true;
659
- const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
660
- if (/^9\d{8}$/.test(phone)) return true;
661
- return false;
662
- }
669
+ // src/country/types.ts
670
+ var PACKED_PAYMENT_ID_SEP = "||";
671
+
672
+ // src/country/qr-validator.ts
663
673
  function crc16ccitt(s) {
664
674
  let crc = 65535;
665
675
  for (let i = 0; i < s.length; i++) {
@@ -694,14 +704,145 @@ function validatePeruvianQr(payload) {
694
704
  const expected = crc16ccitt(data.substring(0, marker + 4));
695
705
  return expected.toUpperCase() === crcTag.toUpperCase();
696
706
  }
707
+ function validateVenezuelanQr(payload) {
708
+ if (!payload || typeof payload !== "string") return false;
709
+ const trimmed = payload.trim();
710
+ if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
711
+ const qIdx = trimmed.indexOf("?");
712
+ if (qIdx < 40) return false;
713
+ const blob = trimmed.substring(0, qIdx);
714
+ if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
715
+ return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
716
+ }
717
+
718
+ // src/country/currencies/pen.ts
719
+ var PEN_PHONE_PLACEHOLDER = "PERU_PHONE_PLACEHOLDER";
720
+ var PEN_CCI_PLACEHOLDER = "PERU_CCI_PLACEHOLDER";
721
+ var PEN_PHONE_VALIDATION_ERROR = "Please enter a valid Yape/Plin phone (9XXXXXXXX)";
722
+ var PEN_CCI_VALIDATION_ERROR = "Please enter a valid 20-digit CCI";
723
+ function validatePeruvianCci(value) {
724
+ if (!value || value.trim().length === 0) return false;
725
+ return /^\d{20}$/.test(value.trim().replace(/\s+/g, ""));
726
+ }
727
+ function validatePeruvianPhone(value) {
728
+ if (!value || value.trim().length === 0) return false;
729
+ const phone = value.trim().replace(/\s+/g, "").replace(/^\+?51/, "");
730
+ return /^9\d{8}$/.test(phone);
731
+ }
732
+ function validatePeruvianPaymentKey(value) {
733
+ return validatePeruvianCci(value) || validatePeruvianPhone(value);
734
+ }
735
+ function normalizePeruvianPaymentKey(value) {
736
+ const trimmed = value.trim();
737
+ const cci = trimmed.replace(/\s+/g, "");
738
+ if (/^\d{20}$/.test(cci)) return cci;
739
+ const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
740
+ if (/^9\d{8}$/.test(phone)) return phone;
741
+ return cci;
742
+ }
743
+ function looksLikeTlv(value) {
744
+ if (value.length < 5 || !/^\d{4}/.test(value)) return false;
745
+ const len = Number.parseInt(value.slice(2, 4), 10);
746
+ return !Number.isNaN(len) && len >= 0 && 4 + len <= value.length;
747
+ }
748
+ function phoneFromTlvValue(value) {
749
+ const trimmed = value.trim();
750
+ if (!trimmed) return null;
751
+ if (validatePeruvianPhone(trimmed)) return normalizePeruvianPaymentKey(trimmed);
752
+ if (/^[0-9a-f]+$/i.test(trimmed) && /[a-f]/i.test(trimmed)) return null;
753
+ const match = trimmed.match(/(^|[^0-9])(\+?51)?(9\d{8})(?![0-9])/);
754
+ if (!match) return null;
755
+ const candidate = `${match[2] ?? ""}${match[3]}`;
756
+ return validatePeruvianPhone(candidate) ? normalizePeruvianPaymentKey(candidate) : null;
757
+ }
758
+ function extractPeruvianPhoneFromQr(payload) {
759
+ let pos = 0;
760
+ while (pos + 4 <= payload.length) {
761
+ const tag = payload.slice(pos, pos + 2);
762
+ const len = Number.parseInt(payload.slice(pos + 2, pos + 4), 10);
763
+ if (Number.isNaN(len) || len < 0 || pos + 4 + len > payload.length) break;
764
+ const value = payload.slice(pos + 4, pos + 4 + len);
765
+ const direct = phoneFromTlvValue(value);
766
+ if (direct) return direct;
767
+ if (tag >= "02" && tag <= "51" || tag === "62" || tag === "64" || looksLikeTlv(value)) {
768
+ const nested = extractPeruvianPhoneFromQr(value);
769
+ if (nested) return nested;
770
+ }
771
+ pos += 4 + len;
772
+ }
773
+ const glued = payload.match(/\+51\s*9\d{8}/);
774
+ if (glued && validatePeruvianPhone(glued[0])) {
775
+ return normalizePeruvianPaymentKey(glued[0]);
776
+ }
777
+ return null;
778
+ }
779
+ function parsePeruvianFallback(value) {
780
+ const trimmed = value.trim();
781
+ if (!trimmed) return { phone: null, cci: null };
782
+ const tokens = trimmed.split("|").map((token) => token.trim()).filter(Boolean);
783
+ let phone = null;
784
+ let cci = null;
785
+ for (const token of tokens) {
786
+ if (!phone && validatePeruvianPhone(token)) {
787
+ phone = normalizePeruvianPaymentKey(token);
788
+ continue;
789
+ }
790
+ if (!cci && validatePeruvianCci(token)) {
791
+ cci = normalizePeruvianPaymentKey(token);
792
+ }
793
+ }
794
+ return { phone, cci };
795
+ }
796
+ function parsePeruvianPaymentId(value) {
797
+ if (!value || typeof value !== "string") {
798
+ return { qr: null, phone: null, cci: null };
799
+ }
800
+ const trimmed = value.trim();
801
+ const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
802
+ if (sep >= 0) {
803
+ const left = trimmed.slice(0, sep);
804
+ const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
805
+ const fallback2 = parsePeruvianFallback(right);
806
+ const qr = validatePeruvianQr(left) ? left : null;
807
+ return {
808
+ qr,
809
+ phone: fallback2.phone ?? (qr ? extractPeruvianPhoneFromQr(qr) : null),
810
+ cci: fallback2.cci
811
+ };
812
+ }
813
+ if (validatePeruvianQr(trimmed)) {
814
+ return {
815
+ qr: trimmed,
816
+ phone: extractPeruvianPhoneFromQr(trimmed),
817
+ cci: null
818
+ };
819
+ }
820
+ const fallback = parsePeruvianFallback(trimmed);
821
+ return { qr: null, phone: fallback.phone, cci: fallback.cci };
822
+ }
823
+ function validatePeruvianPaymentId(value) {
824
+ if (!value || typeof value !== "string") return false;
825
+ const { qr, phone, cci } = parsePeruvianPaymentId(value);
826
+ return Boolean(qr || phone || cci);
827
+ }
697
828
  var PEN_PAYMENT_FIELDS = [
698
829
  {
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
830
+ key: "phone",
831
+ label: "PERU_PHONE_LABEL",
832
+ placeholder: PEN_PHONE_PLACEHOLDER,
833
+ displayLabel: "Yape / Plin phone",
834
+ validate: validatePeruvianPhone,
835
+ validationErrorMessage: PEN_PHONE_VALIDATION_ERROR,
836
+ optional: true
837
+ },
838
+ {
839
+ key: "cci",
840
+ label: "PERU_CCI_LABEL",
841
+ placeholder: PEN_CCI_PLACEHOLDER,
842
+ displayLabel: "CCI",
843
+ validate: validatePeruvianCci,
844
+ validationErrorMessage: PEN_CCI_VALIDATION_ERROR,
845
+ optional: true
705
846
  }
706
847
  ];
707
848
  var PEN_COUNTRY_OPTION = {
@@ -722,7 +863,13 @@ var PEN_COUNTRY_OPTION = {
722
863
  precision: 2,
723
864
  isAlpha: true,
724
865
  disabled: false,
725
- disabledPaymentTypes: []
866
+ disabledPaymentTypes: [],
867
+ uploadPaymentQR: true,
868
+ validateQr: validatePeruvianQr,
869
+ hydrateFieldsFromQr: (qr) => {
870
+ const phone = extractPeruvianPhoneFromQr(qr);
871
+ return phone ? { phone } : {};
872
+ }
726
873
  };
727
874
 
728
875
  // src/country/currencies/php.ts
@@ -817,7 +964,7 @@ var VEN_PLACEHOLDER = "04121234567";
817
964
  var VEN_PLACEHOLDER_RIF = "V12345678";
818
965
  var VEN_PLACEHOLDER_BANK = "Banesco";
819
966
  var VEN_VALIDATION_ERROR = "Please enter a valid phone number (e.g., 04121234567)";
820
- var VEN_VALIDATION_ERROR_RIF = "Please enter a valid C\xE9dula (e.g., V12345678)";
967
+ var VEN_VALIDATION_ERROR_RIF = "Please enter a valid C\xE9dula/RIF (e.g., V12345678, P12345678)";
821
968
  var VEN_VALIDATION_ERROR_BANK = "Please enter a bank name";
822
969
  function validateVenezuelanPhoneNumber(phoneNumber) {
823
970
  if (!phoneNumber || phoneNumber.trim().length === 0) return false;
@@ -829,7 +976,33 @@ function validateVenezuelanPhoneNumber(phoneNumber) {
829
976
  function validateVenezuelanRif(rif) {
830
977
  if (!rif || rif.trim().length === 0) return false;
831
978
  const trimmed = rif.trim().toUpperCase();
832
- return /^V\d+$/.test(trimmed);
979
+ return /^[VEJGRP]\d+$/.test(trimmed);
980
+ }
981
+ function isValidVenezuelanCompound(value) {
982
+ const parts = value.split("|");
983
+ if (parts.length !== 3) return false;
984
+ return validateVenezuelanPhoneNumber(parts[0]) && validateVenezuelanRif(parts[1]) && parts[2].trim().length > 0;
985
+ }
986
+ function parseVenezuelanPaymentId(value) {
987
+ if (!value || typeof value !== "string") return { qr: null, compound: null };
988
+ const trimmed = value.trim();
989
+ const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
990
+ if (sep >= 0) {
991
+ const left = trimmed.slice(0, sep);
992
+ const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
993
+ return {
994
+ qr: validateVenezuelanQr(left) ? left : null,
995
+ compound: isValidVenezuelanCompound(right) ? right : null
996
+ };
997
+ }
998
+ if (validateVenezuelanQr(trimmed)) return { qr: trimmed, compound: null };
999
+ if (isValidVenezuelanCompound(trimmed)) return { qr: null, compound: trimmed };
1000
+ return { qr: null, compound: null };
1001
+ }
1002
+ function validateVenezuelanPaymentId(value) {
1003
+ if (!value || typeof value !== "string") return false;
1004
+ const { qr, compound } = parseVenezuelanPaymentId(value);
1005
+ return qr !== null || compound !== null;
833
1006
  }
834
1007
  var VEN_PAYMENT_FIELDS = [
835
1008
  {
@@ -844,7 +1017,7 @@ var VEN_PAYMENT_FIELDS = [
844
1017
  key: "rif",
845
1018
  label: "RIF_LABEL",
846
1019
  placeholder: VEN_PLACEHOLDER_RIF,
847
- displayLabel: "Cedula con V",
1020
+ displayLabel: "C\xE9dula/RIF",
848
1021
  validate: validateVenezuelanRif,
849
1022
  validationErrorMessage: VEN_VALIDATION_ERROR_RIF
850
1023
  },
@@ -876,27 +1049,11 @@ var VEN_COUNTRY_OPTION = {
876
1049
  precision: 2,
877
1050
  isAlpha: false,
878
1051
  disabled: false,
879
- disabledPaymentTypes: []
1052
+ disabledPaymentTypes: [],
1053
+ uploadPaymentQR: true,
1054
+ validateQr: validateVenezuelanQr
880
1055
  };
881
1056
 
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
1057
  // src/country/payment-fields.ts
901
1058
  var PAYMENT_ID_FIELDS = {
902
1059
  INR: INR_PAYMENT_FIELDS,
@@ -915,6 +1072,38 @@ var PAYMENT_ID_FIELDS = {
915
1072
  PHP: PHP_PAYMENT_FIELDS
916
1073
  };
917
1074
 
1075
+ // src/country/countries.ts
1076
+ var COUNTRY_OPTIONS = [
1077
+ INR_COUNTRY_OPTION,
1078
+ IDR_COUNTRY_OPTION,
1079
+ BRL_COUNTRY_OPTION,
1080
+ ARS_COUNTRY_OPTION,
1081
+ MEX_COUNTRY_OPTION,
1082
+ VEN_COUNTRY_OPTION,
1083
+ NGN_COUNTRY_OPTION,
1084
+ COP_COUNTRY_OPTION,
1085
+ CUP_COUNTRY_OPTION,
1086
+ ECU_COUNTRY_OPTION,
1087
+ PEN_COUNTRY_OPTION,
1088
+ PHP_COUNTRY_OPTION,
1089
+ EUR_COUNTRY_OPTION,
1090
+ USD_COUNTRY_OPTION
1091
+ ];
1092
+ function getCountryOption(currency) {
1093
+ if (!currency) return void 0;
1094
+ return COUNTRY_OPTIONS.find((c) => c.currency === currency);
1095
+ }
1096
+ function uploadsPaymentQR(currency) {
1097
+ return getCountryOption(currency)?.uploadPaymentQR === true;
1098
+ }
1099
+ function usesPackedPaymentId(currency) {
1100
+ return getCountryOption(currency)?.validateQr != null;
1101
+ }
1102
+ function usesCatalogPaymentForm(currency) {
1103
+ if (!currency) return false;
1104
+ return uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;
1105
+ }
1106
+
918
1107
  // src/country/validators.ts
919
1108
  function serializeCompoundPaymentId(...fields) {
920
1109
  return fields.join("|");
@@ -924,17 +1113,172 @@ function deserializeCompoundPaymentId(paymentId) {
924
1113
  }
925
1114
  function formatCompoundPaymentIdForDisplay(paymentId, labels) {
926
1115
  const parts = deserializeCompoundPaymentId(paymentId);
927
- return parts.map((part, i) => labels[i] ? `${labels[i]}: ${part}` : part).join(" | ");
1116
+ return parts.map((part, i) => {
1117
+ if (!part?.trim()) return null;
1118
+ return labels[i] ? `${labels[i]}: ${part}` : part;
1119
+ }).filter((part) => part !== null).join(" | ");
1120
+ }
1121
+ function validatePaymentIdFields(fields, paymentId) {
1122
+ if (!paymentId || paymentId.trim().length === 0) return false;
1123
+ if (!fields.length) return false;
1124
+ if (fields.length === 1) {
1125
+ return fields[0].validate(paymentId);
1126
+ }
1127
+ const parts = deserializeCompoundPaymentId(paymentId);
1128
+ if (parts.length === 1) {
1129
+ if (!fields.some((field) => field.optional)) return false;
1130
+ return fields.some((field) => field.validate(parts[0]));
1131
+ }
1132
+ const values = fields.map((_, i) => (parts[i] ?? "").trim());
1133
+ const eachOk = fields.every((field, i) => {
1134
+ const value = values[i];
1135
+ if (!value) return field.optional === true;
1136
+ return field.validate(value);
1137
+ });
1138
+ if (!eachOk) return false;
1139
+ return values.some((value) => value.length > 0);
1140
+ }
1141
+ function assignPaymentIdToFieldValues(fields, paymentId) {
1142
+ const result = {};
1143
+ for (const field of fields) result[field.key] = "";
1144
+ if (!paymentId) return result;
1145
+ const { rest } = unpackPackedPaymentId(paymentId);
1146
+ if (!rest) return result;
1147
+ const tokens = deserializeCompoundPaymentId(rest).map((part) => part.trim()).filter((part) => part.length > 0);
1148
+ const claimed = /* @__PURE__ */ new Set();
1149
+ for (const token of tokens) {
1150
+ const field = fields.find((item) => !claimed.has(item.key) && item.validate(token));
1151
+ if (field) {
1152
+ result[field.key] = token;
1153
+ claimed.add(field.key);
1154
+ }
1155
+ }
1156
+ if (claimed.size === 0 && tokens.length === 1 && fields.length === 1) {
1157
+ result[fields[0].key] = tokens[0];
1158
+ return result;
1159
+ }
1160
+ if (claimed.size < Math.min(tokens.length, fields.length)) {
1161
+ fields.forEach((field, i) => {
1162
+ if (!result[field.key]) result[field.key] = tokens[i] ?? "";
1163
+ });
1164
+ }
1165
+ return result;
1166
+ }
1167
+ function unpackPackedPaymentId(paymentId) {
1168
+ const sep = paymentId.indexOf(PACKED_PAYMENT_ID_SEP);
1169
+ if (sep < 0) return { qr: "", rest: paymentId };
1170
+ return {
1171
+ qr: paymentId.slice(0, sep),
1172
+ rest: paymentId.slice(sep + PACKED_PAYMENT_ID_SEP.length)
1173
+ };
1174
+ }
1175
+ function isStandaloneQr(validateQr, value) {
1176
+ return !!validateQr?.(value);
1177
+ }
1178
+ function getStoredQrPayload(currency, paymentId) {
1179
+ if (!currency || !paymentId) return null;
1180
+ const option = getCountryOption(currency);
1181
+ if (!option?.validateQr) return null;
1182
+ const trimmed = paymentId.trim();
1183
+ const { qr } = unpackPackedPaymentId(trimmed);
1184
+ if (qr && option.validateQr(qr)) return qr;
1185
+ if (isStandaloneQr(option.validateQr, trimmed)) return trimmed;
1186
+ return null;
1187
+ }
1188
+ function packedTypedRest(fields, fieldValues) {
1189
+ const parts = fields.map((field) => {
1190
+ const value = (fieldValues[field.key] ?? "").trim();
1191
+ if (!value) return "";
1192
+ return field.validate(value) ? value : "";
1193
+ });
1194
+ if (!parts.some((part) => part.length > 0)) return "";
1195
+ return serializeCompoundPaymentId(...parts);
1196
+ }
1197
+ function packStoredPaymentId(currency, qr, fieldValues) {
1198
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1199
+ const option = getCountryOption(currency);
1200
+ const trimmedQr = qr?.trim() ?? "";
1201
+ const q = trimmedQr && option?.validateQr?.(trimmedQr) ? trimmedQr : "";
1202
+ const rest = packedTypedRest(fields, fieldValues);
1203
+ if (q && rest) return `${q}${PACKED_PAYMENT_ID_SEP}${rest}`;
1204
+ return q || rest;
1205
+ }
1206
+ function fieldsMatchStoredId(fields, paymentId) {
1207
+ if (validatePaymentIdFields(fields, paymentId)) return true;
1208
+ const assigned = assignPaymentIdToFieldValues(fields, paymentId);
1209
+ const filled = fields.filter((field) => (assigned[field.key] || "").trim().length > 0);
1210
+ if (filled.length === 0) return false;
1211
+ return fields.every(
1212
+ (field) => field.optional === true || (assigned[field.key] || "").trim().length > 0
1213
+ );
1214
+ }
1215
+ function validateStoredPaymentId(currency, paymentId) {
1216
+ if (!paymentId || paymentId.trim().length === 0) return false;
1217
+ const fields = PAYMENT_ID_FIELDS[currency];
1218
+ if (!fields?.length) return false;
1219
+ const option = getCountryOption(currency);
1220
+ const trimmed = paymentId.trim();
1221
+ const { qr, rest } = unpackPackedPaymentId(trimmed);
1222
+ if (qr) {
1223
+ if (!option?.validateQr?.(qr)) return false;
1224
+ if (!rest.trim()) return true;
1225
+ return fieldsMatchStoredId(fields, rest);
1226
+ }
1227
+ if (isStandaloneQr(option?.validateQr, trimmed)) return true;
1228
+ return fieldsMatchStoredId(fields, trimmed);
1229
+ }
1230
+ function assignStoredPaymentIdToFieldValues(currency, paymentId) {
1231
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1232
+ const option = getCountryOption(currency);
1233
+ const trimmed = paymentId.trim();
1234
+ const { qr, rest } = unpackPackedPaymentId(trimmed);
1235
+ let qrPayload = "";
1236
+ let typed = rest.trim();
1237
+ if (qr && option?.validateQr?.(qr)) {
1238
+ qrPayload = qr;
1239
+ } else if (isStandaloneQr(option?.validateQr, trimmed)) {
1240
+ qrPayload = trimmed;
1241
+ typed = "";
1242
+ }
1243
+ const values = assignPaymentIdToFieldValues(fields, typed);
1244
+ if (qrPayload && option?.hydrateFieldsFromQr) {
1245
+ const extra = option.hydrateFieldsFromQr(qrPayload);
1246
+ for (const [key, value] of Object.entries(extra)) {
1247
+ if (value && !values[key]) values[key] = value;
1248
+ }
1249
+ }
1250
+ return values;
1251
+ }
1252
+ function formatStoredPaymentIdForDisplay(currency, paymentId) {
1253
+ const fields = PAYMENT_ID_FIELDS[currency] ?? [];
1254
+ const values = assignStoredPaymentIdToFieldValues(currency, paymentId);
1255
+ if (fields.length <= 1) return (values[fields[0]?.key ?? ""] || "").trim();
1256
+ return fields.map((field) => {
1257
+ const value = (values[field.key] || "").trim();
1258
+ if (!value) return null;
1259
+ return field.displayLabel ? `${field.displayLabel}: ${value}` : value;
1260
+ }).filter((part) => part !== null).join(" | ");
928
1261
  }
929
1262
  // Annotate the CommonJS export names for ESM import in node:
930
1263
  0 && (module.exports = {
931
1264
  COUNTRY_OPTIONS,
932
1265
  CURRENCY,
933
1266
  CURRENCY_CODES,
1267
+ PACKED_PAYMENT_ID_SEP,
934
1268
  PAYMENT_ID_FIELDS,
1269
+ assignPaymentIdToFieldValues,
1270
+ assignStoredPaymentIdToFieldValues,
935
1271
  deserializeCompoundPaymentId,
936
1272
  formatCompoundPaymentIdForDisplay,
1273
+ formatStoredPaymentIdForDisplay,
1274
+ getCountryOption,
1275
+ getStoredQrPayload,
1276
+ packStoredPaymentId,
937
1277
  serializeCompoundPaymentId,
1278
+ unpackPackedPaymentId,
1279
+ uploadsPaymentQR,
1280
+ usesCatalogPaymentForm,
1281
+ usesPackedPaymentId,
938
1282
  validateArgentinePaymentId,
939
1283
  validateColombianPaymentId,
940
1284
  validateCubanCardNumber,
@@ -947,12 +1291,19 @@ function formatCompoundPaymentIdForDisplay(paymentId, labels) {
947
1291
  validateNigerianAccountName,
948
1292
  validateNigerianAccountNumber,
949
1293
  validatePIXId,
1294
+ validatePaymentIdFields,
1295
+ validatePeruvianCci,
1296
+ validatePeruvianPaymentId,
950
1297
  validatePeruvianPaymentKey,
1298
+ validatePeruvianPhone,
951
1299
  validatePeruvianQr,
952
1300
  validatePhilippinePhoneNumber,
953
1301
  validateRevolutId,
1302
+ validateStoredPaymentId,
954
1303
  validateUPIId,
1304
+ validateVenezuelanPaymentId,
955
1305
  validateVenezuelanPhoneNumber,
1306
+ validateVenezuelanQr,
956
1307
  validateVenezuelanRif
957
1308
  });
958
1309
  //# sourceMappingURL=country.cjs.map