@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 +393 -42
- package/dist/country.cjs.map +1 -1
- package/dist/country.d.cts +130 -25
- package/dist/country.d.ts +130 -25
- package/dist/country.mjs +375 -42
- package/dist/country.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/qr-parsers.cjs +121 -8
- package/dist/qr-parsers.cjs.map +1 -1
- package/dist/qr-parsers.d.cts +8 -1
- package/dist/qr-parsers.d.ts +8 -1
- package/dist/qr-parsers.mjs +120 -8
- package/dist/qr-parsers.mjs.map +1 -1
- package/package.json +1 -1
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/
|
|
652
|
-
var
|
|
653
|
-
|
|
654
|
-
|
|
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: "
|
|
700
|
-
label: "
|
|
701
|
-
placeholder:
|
|
702
|
-
displayLabel: "
|
|
703
|
-
validate:
|
|
704
|
-
validationErrorMessage:
|
|
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 /^
|
|
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: "
|
|
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) =>
|
|
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
|