@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.mjs
CHANGED
|
@@ -597,18 +597,10 @@ var NGN_COUNTRY_OPTION = {
|
|
|
597
597
|
disabledPaymentTypes: []
|
|
598
598
|
};
|
|
599
599
|
|
|
600
|
-
// src/country/
|
|
601
|
-
var
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
if (!value || value.trim().length === 0) return false;
|
|
605
|
-
const trimmed = value.trim();
|
|
606
|
-
const cci = trimmed.replace(/\s+/g, "");
|
|
607
|
-
if (/^\d{20}$/.test(cci)) return true;
|
|
608
|
-
const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
|
|
609
|
-
if (/^9\d{8}$/.test(phone)) return true;
|
|
610
|
-
return false;
|
|
611
|
-
}
|
|
600
|
+
// src/country/types.ts
|
|
601
|
+
var PACKED_PAYMENT_ID_SEP = "||";
|
|
602
|
+
|
|
603
|
+
// src/country/qr-validator.ts
|
|
612
604
|
function crc16ccitt(s) {
|
|
613
605
|
let crc = 65535;
|
|
614
606
|
for (let i = 0; i < s.length; i++) {
|
|
@@ -643,14 +635,145 @@ function validatePeruvianQr(payload) {
|
|
|
643
635
|
const expected = crc16ccitt(data.substring(0, marker + 4));
|
|
644
636
|
return expected.toUpperCase() === crcTag.toUpperCase();
|
|
645
637
|
}
|
|
638
|
+
function validateVenezuelanQr(payload) {
|
|
639
|
+
if (!payload || typeof payload !== "string") return false;
|
|
640
|
+
const trimmed = payload.trim();
|
|
641
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
642
|
+
const qIdx = trimmed.indexOf("?");
|
|
643
|
+
if (qIdx < 40) return false;
|
|
644
|
+
const blob = trimmed.substring(0, qIdx);
|
|
645
|
+
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
646
|
+
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// src/country/currencies/pen.ts
|
|
650
|
+
var PEN_PHONE_PLACEHOLDER = "PERU_PHONE_PLACEHOLDER";
|
|
651
|
+
var PEN_CCI_PLACEHOLDER = "PERU_CCI_PLACEHOLDER";
|
|
652
|
+
var PEN_PHONE_VALIDATION_ERROR = "Please enter a valid Yape/Plin phone (9XXXXXXXX)";
|
|
653
|
+
var PEN_CCI_VALIDATION_ERROR = "Please enter a valid 20-digit CCI";
|
|
654
|
+
function validatePeruvianCci(value) {
|
|
655
|
+
if (!value || value.trim().length === 0) return false;
|
|
656
|
+
return /^\d{20}$/.test(value.trim().replace(/\s+/g, ""));
|
|
657
|
+
}
|
|
658
|
+
function validatePeruvianPhone(value) {
|
|
659
|
+
if (!value || value.trim().length === 0) return false;
|
|
660
|
+
const phone = value.trim().replace(/\s+/g, "").replace(/^\+?51/, "");
|
|
661
|
+
return /^9\d{8}$/.test(phone);
|
|
662
|
+
}
|
|
663
|
+
function validatePeruvianPaymentKey(value) {
|
|
664
|
+
return validatePeruvianCci(value) || validatePeruvianPhone(value);
|
|
665
|
+
}
|
|
666
|
+
function normalizePeruvianPaymentKey(value) {
|
|
667
|
+
const trimmed = value.trim();
|
|
668
|
+
const cci = trimmed.replace(/\s+/g, "");
|
|
669
|
+
if (/^\d{20}$/.test(cci)) return cci;
|
|
670
|
+
const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
|
|
671
|
+
if (/^9\d{8}$/.test(phone)) return phone;
|
|
672
|
+
return cci;
|
|
673
|
+
}
|
|
674
|
+
function looksLikeTlv(value) {
|
|
675
|
+
if (value.length < 5 || !/^\d{4}/.test(value)) return false;
|
|
676
|
+
const len = Number.parseInt(value.slice(2, 4), 10);
|
|
677
|
+
return !Number.isNaN(len) && len >= 0 && 4 + len <= value.length;
|
|
678
|
+
}
|
|
679
|
+
function phoneFromTlvValue(value) {
|
|
680
|
+
const trimmed = value.trim();
|
|
681
|
+
if (!trimmed) return null;
|
|
682
|
+
if (validatePeruvianPhone(trimmed)) return normalizePeruvianPaymentKey(trimmed);
|
|
683
|
+
if (/^[0-9a-f]+$/i.test(trimmed) && /[a-f]/i.test(trimmed)) return null;
|
|
684
|
+
const match = trimmed.match(/(^|[^0-9])(\+?51)?(9\d{8})(?![0-9])/);
|
|
685
|
+
if (!match) return null;
|
|
686
|
+
const candidate = `${match[2] ?? ""}${match[3]}`;
|
|
687
|
+
return validatePeruvianPhone(candidate) ? normalizePeruvianPaymentKey(candidate) : null;
|
|
688
|
+
}
|
|
689
|
+
function extractPeruvianPhoneFromQr(payload) {
|
|
690
|
+
let pos = 0;
|
|
691
|
+
while (pos + 4 <= payload.length) {
|
|
692
|
+
const tag = payload.slice(pos, pos + 2);
|
|
693
|
+
const len = Number.parseInt(payload.slice(pos + 2, pos + 4), 10);
|
|
694
|
+
if (Number.isNaN(len) || len < 0 || pos + 4 + len > payload.length) break;
|
|
695
|
+
const value = payload.slice(pos + 4, pos + 4 + len);
|
|
696
|
+
const direct = phoneFromTlvValue(value);
|
|
697
|
+
if (direct) return direct;
|
|
698
|
+
if (tag >= "02" && tag <= "51" || tag === "62" || tag === "64" || looksLikeTlv(value)) {
|
|
699
|
+
const nested = extractPeruvianPhoneFromQr(value);
|
|
700
|
+
if (nested) return nested;
|
|
701
|
+
}
|
|
702
|
+
pos += 4 + len;
|
|
703
|
+
}
|
|
704
|
+
const glued = payload.match(/\+51\s*9\d{8}/);
|
|
705
|
+
if (glued && validatePeruvianPhone(glued[0])) {
|
|
706
|
+
return normalizePeruvianPaymentKey(glued[0]);
|
|
707
|
+
}
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
function parsePeruvianFallback(value) {
|
|
711
|
+
const trimmed = value.trim();
|
|
712
|
+
if (!trimmed) return { phone: null, cci: null };
|
|
713
|
+
const tokens = trimmed.split("|").map((token) => token.trim()).filter(Boolean);
|
|
714
|
+
let phone = null;
|
|
715
|
+
let cci = null;
|
|
716
|
+
for (const token of tokens) {
|
|
717
|
+
if (!phone && validatePeruvianPhone(token)) {
|
|
718
|
+
phone = normalizePeruvianPaymentKey(token);
|
|
719
|
+
continue;
|
|
720
|
+
}
|
|
721
|
+
if (!cci && validatePeruvianCci(token)) {
|
|
722
|
+
cci = normalizePeruvianPaymentKey(token);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
return { phone, cci };
|
|
726
|
+
}
|
|
727
|
+
function parsePeruvianPaymentId(value) {
|
|
728
|
+
if (!value || typeof value !== "string") {
|
|
729
|
+
return { qr: null, phone: null, cci: null };
|
|
730
|
+
}
|
|
731
|
+
const trimmed = value.trim();
|
|
732
|
+
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
733
|
+
if (sep >= 0) {
|
|
734
|
+
const left = trimmed.slice(0, sep);
|
|
735
|
+
const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
|
|
736
|
+
const fallback2 = parsePeruvianFallback(right);
|
|
737
|
+
const qr = validatePeruvianQr(left) ? left : null;
|
|
738
|
+
return {
|
|
739
|
+
qr,
|
|
740
|
+
phone: fallback2.phone ?? (qr ? extractPeruvianPhoneFromQr(qr) : null),
|
|
741
|
+
cci: fallback2.cci
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
if (validatePeruvianQr(trimmed)) {
|
|
745
|
+
return {
|
|
746
|
+
qr: trimmed,
|
|
747
|
+
phone: extractPeruvianPhoneFromQr(trimmed),
|
|
748
|
+
cci: null
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
const fallback = parsePeruvianFallback(trimmed);
|
|
752
|
+
return { qr: null, phone: fallback.phone, cci: fallback.cci };
|
|
753
|
+
}
|
|
754
|
+
function validatePeruvianPaymentId(value) {
|
|
755
|
+
if (!value || typeof value !== "string") return false;
|
|
756
|
+
const { qr, phone, cci } = parsePeruvianPaymentId(value);
|
|
757
|
+
return Boolean(qr || phone || cci);
|
|
758
|
+
}
|
|
646
759
|
var PEN_PAYMENT_FIELDS = [
|
|
647
760
|
{
|
|
648
|
-
key: "
|
|
649
|
-
label: "
|
|
650
|
-
placeholder:
|
|
651
|
-
displayLabel: "
|
|
652
|
-
validate:
|
|
653
|
-
validationErrorMessage:
|
|
761
|
+
key: "phone",
|
|
762
|
+
label: "PERU_PHONE_LABEL",
|
|
763
|
+
placeholder: PEN_PHONE_PLACEHOLDER,
|
|
764
|
+
displayLabel: "Yape / Plin phone",
|
|
765
|
+
validate: validatePeruvianPhone,
|
|
766
|
+
validationErrorMessage: PEN_PHONE_VALIDATION_ERROR,
|
|
767
|
+
optional: true
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
key: "cci",
|
|
771
|
+
label: "PERU_CCI_LABEL",
|
|
772
|
+
placeholder: PEN_CCI_PLACEHOLDER,
|
|
773
|
+
displayLabel: "CCI",
|
|
774
|
+
validate: validatePeruvianCci,
|
|
775
|
+
validationErrorMessage: PEN_CCI_VALIDATION_ERROR,
|
|
776
|
+
optional: true
|
|
654
777
|
}
|
|
655
778
|
];
|
|
656
779
|
var PEN_COUNTRY_OPTION = {
|
|
@@ -671,7 +794,13 @@ var PEN_COUNTRY_OPTION = {
|
|
|
671
794
|
precision: 2,
|
|
672
795
|
isAlpha: true,
|
|
673
796
|
disabled: false,
|
|
674
|
-
disabledPaymentTypes: []
|
|
797
|
+
disabledPaymentTypes: [],
|
|
798
|
+
uploadPaymentQR: true,
|
|
799
|
+
validateQr: validatePeruvianQr,
|
|
800
|
+
hydrateFieldsFromQr: (qr) => {
|
|
801
|
+
const phone = extractPeruvianPhoneFromQr(qr);
|
|
802
|
+
return phone ? { phone } : {};
|
|
803
|
+
}
|
|
675
804
|
};
|
|
676
805
|
|
|
677
806
|
// src/country/currencies/php.ts
|
|
@@ -766,7 +895,7 @@ var VEN_PLACEHOLDER = "04121234567";
|
|
|
766
895
|
var VEN_PLACEHOLDER_RIF = "V12345678";
|
|
767
896
|
var VEN_PLACEHOLDER_BANK = "Banesco";
|
|
768
897
|
var VEN_VALIDATION_ERROR = "Please enter a valid phone number (e.g., 04121234567)";
|
|
769
|
-
var VEN_VALIDATION_ERROR_RIF = "Please enter a valid C\xE9dula (e.g., V12345678)";
|
|
898
|
+
var VEN_VALIDATION_ERROR_RIF = "Please enter a valid C\xE9dula/RIF (e.g., V12345678, P12345678)";
|
|
770
899
|
var VEN_VALIDATION_ERROR_BANK = "Please enter a bank name";
|
|
771
900
|
function validateVenezuelanPhoneNumber(phoneNumber) {
|
|
772
901
|
if (!phoneNumber || phoneNumber.trim().length === 0) return false;
|
|
@@ -778,7 +907,33 @@ function validateVenezuelanPhoneNumber(phoneNumber) {
|
|
|
778
907
|
function validateVenezuelanRif(rif) {
|
|
779
908
|
if (!rif || rif.trim().length === 0) return false;
|
|
780
909
|
const trimmed = rif.trim().toUpperCase();
|
|
781
|
-
return /^
|
|
910
|
+
return /^[VEJGRP]\d+$/.test(trimmed);
|
|
911
|
+
}
|
|
912
|
+
function isValidVenezuelanCompound(value) {
|
|
913
|
+
const parts = value.split("|");
|
|
914
|
+
if (parts.length !== 3) return false;
|
|
915
|
+
return validateVenezuelanPhoneNumber(parts[0]) && validateVenezuelanRif(parts[1]) && parts[2].trim().length > 0;
|
|
916
|
+
}
|
|
917
|
+
function parseVenezuelanPaymentId(value) {
|
|
918
|
+
if (!value || typeof value !== "string") return { qr: null, compound: null };
|
|
919
|
+
const trimmed = value.trim();
|
|
920
|
+
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
921
|
+
if (sep >= 0) {
|
|
922
|
+
const left = trimmed.slice(0, sep);
|
|
923
|
+
const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
|
|
924
|
+
return {
|
|
925
|
+
qr: validateVenezuelanQr(left) ? left : null,
|
|
926
|
+
compound: isValidVenezuelanCompound(right) ? right : null
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
if (validateVenezuelanQr(trimmed)) return { qr: trimmed, compound: null };
|
|
930
|
+
if (isValidVenezuelanCompound(trimmed)) return { qr: null, compound: trimmed };
|
|
931
|
+
return { qr: null, compound: null };
|
|
932
|
+
}
|
|
933
|
+
function validateVenezuelanPaymentId(value) {
|
|
934
|
+
if (!value || typeof value !== "string") return false;
|
|
935
|
+
const { qr, compound } = parseVenezuelanPaymentId(value);
|
|
936
|
+
return qr !== null || compound !== null;
|
|
782
937
|
}
|
|
783
938
|
var VEN_PAYMENT_FIELDS = [
|
|
784
939
|
{
|
|
@@ -793,7 +948,7 @@ var VEN_PAYMENT_FIELDS = [
|
|
|
793
948
|
key: "rif",
|
|
794
949
|
label: "RIF_LABEL",
|
|
795
950
|
placeholder: VEN_PLACEHOLDER_RIF,
|
|
796
|
-
displayLabel: "
|
|
951
|
+
displayLabel: "C\xE9dula/RIF",
|
|
797
952
|
validate: validateVenezuelanRif,
|
|
798
953
|
validationErrorMessage: VEN_VALIDATION_ERROR_RIF
|
|
799
954
|
},
|
|
@@ -825,27 +980,11 @@ var VEN_COUNTRY_OPTION = {
|
|
|
825
980
|
precision: 2,
|
|
826
981
|
isAlpha: false,
|
|
827
982
|
disabled: false,
|
|
828
|
-
disabledPaymentTypes: []
|
|
983
|
+
disabledPaymentTypes: [],
|
|
984
|
+
uploadPaymentQR: true,
|
|
985
|
+
validateQr: validateVenezuelanQr
|
|
829
986
|
};
|
|
830
987
|
|
|
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
988
|
// src/country/payment-fields.ts
|
|
850
989
|
var PAYMENT_ID_FIELDS = {
|
|
851
990
|
INR: INR_PAYMENT_FIELDS,
|
|
@@ -864,6 +1003,38 @@ var PAYMENT_ID_FIELDS = {
|
|
|
864
1003
|
PHP: PHP_PAYMENT_FIELDS
|
|
865
1004
|
};
|
|
866
1005
|
|
|
1006
|
+
// src/country/countries.ts
|
|
1007
|
+
var COUNTRY_OPTIONS = [
|
|
1008
|
+
INR_COUNTRY_OPTION,
|
|
1009
|
+
IDR_COUNTRY_OPTION,
|
|
1010
|
+
BRL_COUNTRY_OPTION,
|
|
1011
|
+
ARS_COUNTRY_OPTION,
|
|
1012
|
+
MEX_COUNTRY_OPTION,
|
|
1013
|
+
VEN_COUNTRY_OPTION,
|
|
1014
|
+
NGN_COUNTRY_OPTION,
|
|
1015
|
+
COP_COUNTRY_OPTION,
|
|
1016
|
+
CUP_COUNTRY_OPTION,
|
|
1017
|
+
ECU_COUNTRY_OPTION,
|
|
1018
|
+
PEN_COUNTRY_OPTION,
|
|
1019
|
+
PHP_COUNTRY_OPTION,
|
|
1020
|
+
EUR_COUNTRY_OPTION,
|
|
1021
|
+
USD_COUNTRY_OPTION
|
|
1022
|
+
];
|
|
1023
|
+
function getCountryOption(currency) {
|
|
1024
|
+
if (!currency) return void 0;
|
|
1025
|
+
return COUNTRY_OPTIONS.find((c) => c.currency === currency);
|
|
1026
|
+
}
|
|
1027
|
+
function uploadsPaymentQR(currency) {
|
|
1028
|
+
return getCountryOption(currency)?.uploadPaymentQR === true;
|
|
1029
|
+
}
|
|
1030
|
+
function usesPackedPaymentId(currency) {
|
|
1031
|
+
return getCountryOption(currency)?.validateQr != null;
|
|
1032
|
+
}
|
|
1033
|
+
function usesCatalogPaymentForm(currency) {
|
|
1034
|
+
if (!currency) return false;
|
|
1035
|
+
return uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
867
1038
|
// src/country/validators.ts
|
|
868
1039
|
function serializeCompoundPaymentId(...fields) {
|
|
869
1040
|
return fields.join("|");
|
|
@@ -873,16 +1044,171 @@ function deserializeCompoundPaymentId(paymentId) {
|
|
|
873
1044
|
}
|
|
874
1045
|
function formatCompoundPaymentIdForDisplay(paymentId, labels) {
|
|
875
1046
|
const parts = deserializeCompoundPaymentId(paymentId);
|
|
876
|
-
return parts.map((part, i) =>
|
|
1047
|
+
return parts.map((part, i) => {
|
|
1048
|
+
if (!part?.trim()) return null;
|
|
1049
|
+
return labels[i] ? `${labels[i]}: ${part}` : part;
|
|
1050
|
+
}).filter((part) => part !== null).join(" | ");
|
|
1051
|
+
}
|
|
1052
|
+
function validatePaymentIdFields(fields, paymentId) {
|
|
1053
|
+
if (!paymentId || paymentId.trim().length === 0) return false;
|
|
1054
|
+
if (!fields.length) return false;
|
|
1055
|
+
if (fields.length === 1) {
|
|
1056
|
+
return fields[0].validate(paymentId);
|
|
1057
|
+
}
|
|
1058
|
+
const parts = deserializeCompoundPaymentId(paymentId);
|
|
1059
|
+
if (parts.length === 1) {
|
|
1060
|
+
if (!fields.some((field) => field.optional)) return false;
|
|
1061
|
+
return fields.some((field) => field.validate(parts[0]));
|
|
1062
|
+
}
|
|
1063
|
+
const values = fields.map((_, i) => (parts[i] ?? "").trim());
|
|
1064
|
+
const eachOk = fields.every((field, i) => {
|
|
1065
|
+
const value = values[i];
|
|
1066
|
+
if (!value) return field.optional === true;
|
|
1067
|
+
return field.validate(value);
|
|
1068
|
+
});
|
|
1069
|
+
if (!eachOk) return false;
|
|
1070
|
+
return values.some((value) => value.length > 0);
|
|
1071
|
+
}
|
|
1072
|
+
function assignPaymentIdToFieldValues(fields, paymentId) {
|
|
1073
|
+
const result = {};
|
|
1074
|
+
for (const field of fields) result[field.key] = "";
|
|
1075
|
+
if (!paymentId) return result;
|
|
1076
|
+
const { rest } = unpackPackedPaymentId(paymentId);
|
|
1077
|
+
if (!rest) return result;
|
|
1078
|
+
const tokens = deserializeCompoundPaymentId(rest).map((part) => part.trim()).filter((part) => part.length > 0);
|
|
1079
|
+
const claimed = /* @__PURE__ */ new Set();
|
|
1080
|
+
for (const token of tokens) {
|
|
1081
|
+
const field = fields.find((item) => !claimed.has(item.key) && item.validate(token));
|
|
1082
|
+
if (field) {
|
|
1083
|
+
result[field.key] = token;
|
|
1084
|
+
claimed.add(field.key);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
if (claimed.size === 0 && tokens.length === 1 && fields.length === 1) {
|
|
1088
|
+
result[fields[0].key] = tokens[0];
|
|
1089
|
+
return result;
|
|
1090
|
+
}
|
|
1091
|
+
if (claimed.size < Math.min(tokens.length, fields.length)) {
|
|
1092
|
+
fields.forEach((field, i) => {
|
|
1093
|
+
if (!result[field.key]) result[field.key] = tokens[i] ?? "";
|
|
1094
|
+
});
|
|
1095
|
+
}
|
|
1096
|
+
return result;
|
|
1097
|
+
}
|
|
1098
|
+
function unpackPackedPaymentId(paymentId) {
|
|
1099
|
+
const sep = paymentId.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
1100
|
+
if (sep < 0) return { qr: "", rest: paymentId };
|
|
1101
|
+
return {
|
|
1102
|
+
qr: paymentId.slice(0, sep),
|
|
1103
|
+
rest: paymentId.slice(sep + PACKED_PAYMENT_ID_SEP.length)
|
|
1104
|
+
};
|
|
1105
|
+
}
|
|
1106
|
+
function isStandaloneQr(validateQr, value) {
|
|
1107
|
+
return !!validateQr?.(value);
|
|
1108
|
+
}
|
|
1109
|
+
function getStoredQrPayload(currency, paymentId) {
|
|
1110
|
+
if (!currency || !paymentId) return null;
|
|
1111
|
+
const option = getCountryOption(currency);
|
|
1112
|
+
if (!option?.validateQr) return null;
|
|
1113
|
+
const trimmed = paymentId.trim();
|
|
1114
|
+
const { qr } = unpackPackedPaymentId(trimmed);
|
|
1115
|
+
if (qr && option.validateQr(qr)) return qr;
|
|
1116
|
+
if (isStandaloneQr(option.validateQr, trimmed)) return trimmed;
|
|
1117
|
+
return null;
|
|
1118
|
+
}
|
|
1119
|
+
function packedTypedRest(fields, fieldValues) {
|
|
1120
|
+
const parts = fields.map((field) => {
|
|
1121
|
+
const value = (fieldValues[field.key] ?? "").trim();
|
|
1122
|
+
if (!value) return "";
|
|
1123
|
+
return field.validate(value) ? value : "";
|
|
1124
|
+
});
|
|
1125
|
+
if (!parts.some((part) => part.length > 0)) return "";
|
|
1126
|
+
return serializeCompoundPaymentId(...parts);
|
|
1127
|
+
}
|
|
1128
|
+
function packStoredPaymentId(currency, qr, fieldValues) {
|
|
1129
|
+
const fields = PAYMENT_ID_FIELDS[currency] ?? [];
|
|
1130
|
+
const option = getCountryOption(currency);
|
|
1131
|
+
const trimmedQr = qr?.trim() ?? "";
|
|
1132
|
+
const q = trimmedQr && option?.validateQr?.(trimmedQr) ? trimmedQr : "";
|
|
1133
|
+
const rest = packedTypedRest(fields, fieldValues);
|
|
1134
|
+
if (q && rest) return `${q}${PACKED_PAYMENT_ID_SEP}${rest}`;
|
|
1135
|
+
return q || rest;
|
|
1136
|
+
}
|
|
1137
|
+
function fieldsMatchStoredId(fields, paymentId) {
|
|
1138
|
+
if (validatePaymentIdFields(fields, paymentId)) return true;
|
|
1139
|
+
const assigned = assignPaymentIdToFieldValues(fields, paymentId);
|
|
1140
|
+
const filled = fields.filter((field) => (assigned[field.key] || "").trim().length > 0);
|
|
1141
|
+
if (filled.length === 0) return false;
|
|
1142
|
+
return fields.every(
|
|
1143
|
+
(field) => field.optional === true || (assigned[field.key] || "").trim().length > 0
|
|
1144
|
+
);
|
|
1145
|
+
}
|
|
1146
|
+
function validateStoredPaymentId(currency, paymentId) {
|
|
1147
|
+
if (!paymentId || paymentId.trim().length === 0) return false;
|
|
1148
|
+
const fields = PAYMENT_ID_FIELDS[currency];
|
|
1149
|
+
if (!fields?.length) return false;
|
|
1150
|
+
const option = getCountryOption(currency);
|
|
1151
|
+
const trimmed = paymentId.trim();
|
|
1152
|
+
const { qr, rest } = unpackPackedPaymentId(trimmed);
|
|
1153
|
+
if (qr) {
|
|
1154
|
+
if (!option?.validateQr?.(qr)) return false;
|
|
1155
|
+
if (!rest.trim()) return true;
|
|
1156
|
+
return fieldsMatchStoredId(fields, rest);
|
|
1157
|
+
}
|
|
1158
|
+
if (isStandaloneQr(option?.validateQr, trimmed)) return true;
|
|
1159
|
+
return fieldsMatchStoredId(fields, trimmed);
|
|
1160
|
+
}
|
|
1161
|
+
function assignStoredPaymentIdToFieldValues(currency, paymentId) {
|
|
1162
|
+
const fields = PAYMENT_ID_FIELDS[currency] ?? [];
|
|
1163
|
+
const option = getCountryOption(currency);
|
|
1164
|
+
const trimmed = paymentId.trim();
|
|
1165
|
+
const { qr, rest } = unpackPackedPaymentId(trimmed);
|
|
1166
|
+
let qrPayload = "";
|
|
1167
|
+
let typed = rest.trim();
|
|
1168
|
+
if (qr && option?.validateQr?.(qr)) {
|
|
1169
|
+
qrPayload = qr;
|
|
1170
|
+
} else if (isStandaloneQr(option?.validateQr, trimmed)) {
|
|
1171
|
+
qrPayload = trimmed;
|
|
1172
|
+
typed = "";
|
|
1173
|
+
}
|
|
1174
|
+
const values = assignPaymentIdToFieldValues(fields, typed);
|
|
1175
|
+
if (qrPayload && option?.hydrateFieldsFromQr) {
|
|
1176
|
+
const extra = option.hydrateFieldsFromQr(qrPayload);
|
|
1177
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
1178
|
+
if (value && !values[key]) values[key] = value;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
return values;
|
|
1182
|
+
}
|
|
1183
|
+
function formatStoredPaymentIdForDisplay(currency, paymentId) {
|
|
1184
|
+
const fields = PAYMENT_ID_FIELDS[currency] ?? [];
|
|
1185
|
+
const values = assignStoredPaymentIdToFieldValues(currency, paymentId);
|
|
1186
|
+
if (fields.length <= 1) return (values[fields[0]?.key ?? ""] || "").trim();
|
|
1187
|
+
return fields.map((field) => {
|
|
1188
|
+
const value = (values[field.key] || "").trim();
|
|
1189
|
+
if (!value) return null;
|
|
1190
|
+
return field.displayLabel ? `${field.displayLabel}: ${value}` : value;
|
|
1191
|
+
}).filter((part) => part !== null).join(" | ");
|
|
877
1192
|
}
|
|
878
1193
|
export {
|
|
879
1194
|
COUNTRY_OPTIONS,
|
|
880
1195
|
CURRENCY,
|
|
881
1196
|
CURRENCY_CODES,
|
|
1197
|
+
PACKED_PAYMENT_ID_SEP,
|
|
882
1198
|
PAYMENT_ID_FIELDS,
|
|
1199
|
+
assignPaymentIdToFieldValues,
|
|
1200
|
+
assignStoredPaymentIdToFieldValues,
|
|
883
1201
|
deserializeCompoundPaymentId,
|
|
884
1202
|
formatCompoundPaymentIdForDisplay,
|
|
1203
|
+
formatStoredPaymentIdForDisplay,
|
|
1204
|
+
getCountryOption,
|
|
1205
|
+
getStoredQrPayload,
|
|
1206
|
+
packStoredPaymentId,
|
|
885
1207
|
serializeCompoundPaymentId,
|
|
1208
|
+
unpackPackedPaymentId,
|
|
1209
|
+
uploadsPaymentQR,
|
|
1210
|
+
usesCatalogPaymentForm,
|
|
1211
|
+
usesPackedPaymentId,
|
|
886
1212
|
validateArgentinePaymentId,
|
|
887
1213
|
validateColombianPaymentId,
|
|
888
1214
|
validateCubanCardNumber,
|
|
@@ -895,12 +1221,19 @@ export {
|
|
|
895
1221
|
validateNigerianAccountName,
|
|
896
1222
|
validateNigerianAccountNumber,
|
|
897
1223
|
validatePIXId,
|
|
1224
|
+
validatePaymentIdFields,
|
|
1225
|
+
validatePeruvianCci,
|
|
1226
|
+
validatePeruvianPaymentId,
|
|
898
1227
|
validatePeruvianPaymentKey,
|
|
1228
|
+
validatePeruvianPhone,
|
|
899
1229
|
validatePeruvianQr,
|
|
900
1230
|
validatePhilippinePhoneNumber,
|
|
901
1231
|
validateRevolutId,
|
|
1232
|
+
validateStoredPaymentId,
|
|
902
1233
|
validateUPIId,
|
|
1234
|
+
validateVenezuelanPaymentId,
|
|
903
1235
|
validateVenezuelanPhoneNumber,
|
|
1236
|
+
validateVenezuelanQr,
|
|
904
1237
|
validateVenezuelanRif
|
|
905
1238
|
};
|
|
906
1239
|
//# sourceMappingURL=country.mjs.map
|