@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.
- package/README.md +1 -1
- package/dist/country.cjs +480 -62
- package/dist/country.cjs.map +1 -1
- package/dist/country.d.cts +144 -27
- package/dist/country.d.ts +144 -27
- package/dist/country.mjs +460 -62
- package/dist/country.mjs.map +1 -1
- package/dist/fraud-engine.cjs +1 -0
- package/dist/fraud-engine.cjs.map +1 -1
- package/dist/fraud-engine.mjs +1 -0
- package/dist/fraud-engine.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/orders.cjs +1 -0
- package/dist/orders.cjs.map +1 -1
- package/dist/orders.d.cts +2 -0
- package/dist/orders.d.ts +2 -0
- package/dist/orders.mjs +1 -0
- package/dist/orders.mjs.map +1 -1
- package/dist/prices.cjs +1 -0
- package/dist/prices.cjs.map +1 -1
- package/dist/prices.d.cts +1 -0
- package/dist/prices.d.ts +1 -0
- package/dist/prices.mjs +1 -0
- package/dist/prices.mjs.map +1 -1
- package/dist/profile.cjs +1 -0
- package/dist/profile.cjs.map +1 -1
- package/dist/profile.d.cts +2 -0
- package/dist/profile.d.ts +2 -0
- package/dist/profile.mjs +1 -0
- package/dist/profile.mjs.map +1 -1
- package/dist/qr-parsers.cjs +205 -11
- package/dist/qr-parsers.cjs.map +1 -1
- package/dist/qr-parsers.d.cts +9 -1
- package/dist/qr-parsers.d.ts +9 -1
- package/dist/qr-parsers.mjs +204 -11
- package/dist/qr-parsers.mjs.map +1 -1
- package/dist/react.cjs +1 -0
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +6 -0
- package/dist/react.d.ts +6 -0
- package/dist/react.mjs +1 -0
- package/dist/react.mjs.map +1 -1
- package/dist/stake.cjs +1 -0
- package/dist/stake.cjs.map +1 -1
- package/dist/stake.d.cts +1 -0
- package/dist/stake.d.ts +1 -0
- package/dist/stake.mjs +1 -0
- package/dist/stake.mjs.map +1 -1
- package/dist/zkkyc.cjs +1 -0
- package/dist/zkkyc.cjs.map +1 -1
- package/dist/zkkyc.mjs +1 -0
- package/dist/zkkyc.mjs.map +1 -1
- 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
|
|
602
|
-
var
|
|
603
|
-
|
|
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
|
|
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
|
|
610
|
-
return
|
|
732
|
+
if (/^9\d{8}$/.test(phone)) return phone;
|
|
733
|
+
return cci;
|
|
611
734
|
}
|
|
612
|
-
function
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
-
|
|
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
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
const
|
|
627
|
-
let
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
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
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
if (!
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
const
|
|
644
|
-
|
|
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: "
|
|
649
|
-
label: "
|
|
650
|
-
placeholder:
|
|
651
|
-
displayLabel: "
|
|
652
|
-
validate:
|
|
653
|
-
validationErrorMessage:
|
|
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) =>
|
|
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
|