@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/README.md
CHANGED
|
@@ -162,7 +162,7 @@ All hooks read from the nearest `<SdkProvider>`:
|
|
|
162
162
|
|
|
163
163
|
## Supported currencies
|
|
164
164
|
|
|
165
|
-
`INR` · `IDR` · `BRL` · `ARS` · `MEX` · `VEN` · `EUR` · `NGN` · `USD` · `COP` · `ECU`
|
|
165
|
+
`INR` · `IDR` · `BRL` · `ARS` · `MEX` · `VEN` · `BOB` · `EUR` · `NGN` · `USD` · `COP` · `ECU`
|
|
166
166
|
|
|
167
167
|
## Development
|
|
168
168
|
|
package/dist/country.cjs
CHANGED
|
@@ -23,11 +23,24 @@ __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,
|
|
42
|
+
validateBolivianAccount: () => validateBolivianAccount,
|
|
43
|
+
validateBolivianQr: () => validateBolivianQr,
|
|
31
44
|
validateColombianPaymentId: () => validateColombianPaymentId,
|
|
32
45
|
validateCubanCardNumber: () => validateCubanCardNumber,
|
|
33
46
|
validateCubanPhoneNumber: () => validateCubanPhoneNumber,
|
|
@@ -39,12 +52,19 @@ __export(country_exports, {
|
|
|
39
52
|
validateNigerianAccountName: () => validateNigerianAccountName,
|
|
40
53
|
validateNigerianAccountNumber: () => validateNigerianAccountNumber,
|
|
41
54
|
validatePIXId: () => validatePIXId,
|
|
55
|
+
validatePaymentIdFields: () => validatePaymentIdFields,
|
|
56
|
+
validatePeruvianCci: () => validatePeruvianCci,
|
|
57
|
+
validatePeruvianPaymentId: () => validatePeruvianPaymentId,
|
|
42
58
|
validatePeruvianPaymentKey: () => validatePeruvianPaymentKey,
|
|
59
|
+
validatePeruvianPhone: () => validatePeruvianPhone,
|
|
43
60
|
validatePeruvianQr: () => validatePeruvianQr,
|
|
44
61
|
validatePhilippinePhoneNumber: () => validatePhilippinePhoneNumber,
|
|
45
62
|
validateRevolutId: () => validateRevolutId,
|
|
63
|
+
validateStoredPaymentId: () => validateStoredPaymentId,
|
|
46
64
|
validateUPIId: () => validateUPIId,
|
|
65
|
+
validateVenezuelanPaymentId: () => validateVenezuelanPaymentId,
|
|
47
66
|
validateVenezuelanPhoneNumber: () => validateVenezuelanPhoneNumber,
|
|
67
|
+
validateVenezuelanQr: () => validateVenezuelanQr,
|
|
48
68
|
validateVenezuelanRif: () => validateVenezuelanRif
|
|
49
69
|
});
|
|
50
70
|
module.exports = __toCommonJS(country_exports);
|
|
@@ -57,6 +77,7 @@ var CURRENCY = {
|
|
|
57
77
|
ARS: "ARS",
|
|
58
78
|
MEX: "MEX",
|
|
59
79
|
VEN: "VEN",
|
|
80
|
+
BOB: "BOB",
|
|
60
81
|
EUR: "EUR",
|
|
61
82
|
NGN: "NGN",
|
|
62
83
|
USD: "USD",
|
|
@@ -132,6 +153,115 @@ var ARS_COUNTRY_OPTION = {
|
|
|
132
153
|
disabledPaymentTypes: []
|
|
133
154
|
};
|
|
134
155
|
|
|
156
|
+
// src/country/types.ts
|
|
157
|
+
var PACKED_PAYMENT_ID_SEP = "||";
|
|
158
|
+
|
|
159
|
+
// src/country/qr-validator.ts
|
|
160
|
+
function crc16ccitt(s) {
|
|
161
|
+
let crc = 65535;
|
|
162
|
+
for (let i = 0; i < s.length; i++) {
|
|
163
|
+
crc ^= s.charCodeAt(i) << 8;
|
|
164
|
+
for (let j = 0; j < 8; j++) {
|
|
165
|
+
crc = crc & 32768 ? crc << 1 ^ 4129 : crc << 1;
|
|
166
|
+
crc &= 65535;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return crc.toString(16).toUpperCase().padStart(4, "0");
|
|
170
|
+
}
|
|
171
|
+
function validateEmvcoQr(payload, country, currency) {
|
|
172
|
+
if (!payload || payload.trim().length === 0) return false;
|
|
173
|
+
const data = payload.trim();
|
|
174
|
+
const tags = {};
|
|
175
|
+
let pos = 0;
|
|
176
|
+
while (pos + 4 <= data.length) {
|
|
177
|
+
const tag = data.substring(pos, pos + 2);
|
|
178
|
+
const lengthStr = data.substring(pos + 2, pos + 4);
|
|
179
|
+
if (!/^[0-9]{2}$/.test(tag) || !/^[0-9]{2}$/.test(lengthStr)) break;
|
|
180
|
+
const length = Number.parseInt(lengthStr, 10);
|
|
181
|
+
if (pos + 4 + length > data.length) break;
|
|
182
|
+
tags[tag] = data.substring(pos + 4, pos + 4 + length);
|
|
183
|
+
pos += 4 + length;
|
|
184
|
+
}
|
|
185
|
+
if (tags["58"] !== country) return false;
|
|
186
|
+
if (tags["53"] !== currency) return false;
|
|
187
|
+
const crcTag = tags["63"];
|
|
188
|
+
if (!crcTag) return false;
|
|
189
|
+
const marker = data.lastIndexOf("6304");
|
|
190
|
+
if (marker === -1) return false;
|
|
191
|
+
const expected = crc16ccitt(data.substring(0, marker + 4));
|
|
192
|
+
return expected.toUpperCase() === crcTag.toUpperCase();
|
|
193
|
+
}
|
|
194
|
+
function validatePeruvianQr(payload) {
|
|
195
|
+
return validateEmvcoQr(payload, "PE", "604");
|
|
196
|
+
}
|
|
197
|
+
function isBolivianEncryptedQr(payload) {
|
|
198
|
+
const trimmed = payload.trim();
|
|
199
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
200
|
+
const sep = trimmed.lastIndexOf("|");
|
|
201
|
+
if (sep < 40) return false;
|
|
202
|
+
const blob = trimmed.slice(0, sep);
|
|
203
|
+
const tag = trimmed.slice(sep + 1);
|
|
204
|
+
if (blob.length % 4 !== 0) return false;
|
|
205
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
|
|
206
|
+
return /^(?:[0-9A-Fa-f]{24}|[0-9A-Fa-f]{32})$/.test(tag);
|
|
207
|
+
}
|
|
208
|
+
function validateBolivianQr(payload) {
|
|
209
|
+
if (!payload || payload.trim().length === 0) return false;
|
|
210
|
+
return isBolivianEncryptedQr(payload) || validateEmvcoQr(payload, "BO", "068");
|
|
211
|
+
}
|
|
212
|
+
function validateVenezuelanQr(payload) {
|
|
213
|
+
if (!payload || typeof payload !== "string") return false;
|
|
214
|
+
const trimmed = payload.trim();
|
|
215
|
+
if (trimmed.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
216
|
+
const qIdx = trimmed.indexOf("?");
|
|
217
|
+
if (qIdx < 40) return false;
|
|
218
|
+
const blob = trimmed.substring(0, qIdx);
|
|
219
|
+
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
220
|
+
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// src/country/currencies/bob.ts
|
|
224
|
+
var BOB_PLACEHOLDER = "Bank account number (8\u201320 digits)";
|
|
225
|
+
var BOB_VALIDATION_ERROR = "Please enter a valid Bolivian bank account number";
|
|
226
|
+
function validateBolivianAccount(account) {
|
|
227
|
+
if (!account || account.trim().length === 0) return false;
|
|
228
|
+
const cleaned = account.trim().replace(/[\s-]/g, "");
|
|
229
|
+
return /^\d{8,20}$/.test(cleaned);
|
|
230
|
+
}
|
|
231
|
+
var BOB_PAYMENT_FIELDS = [
|
|
232
|
+
{
|
|
233
|
+
key: "account",
|
|
234
|
+
label: "ACCOUNT_NUMBER",
|
|
235
|
+
placeholder: BOB_PLACEHOLDER,
|
|
236
|
+
displayLabel: "Cuenta",
|
|
237
|
+
validate: validateBolivianAccount,
|
|
238
|
+
validationErrorMessage: BOB_VALIDATION_ERROR
|
|
239
|
+
}
|
|
240
|
+
];
|
|
241
|
+
var BOB_COUNTRY_OPTION = {
|
|
242
|
+
country: "Bolivia",
|
|
243
|
+
currency: CURRENCY.BOB,
|
|
244
|
+
internationalFormat: "BOB",
|
|
245
|
+
symbolNative: "Bs.",
|
|
246
|
+
locale: "es-BO",
|
|
247
|
+
paymentMethod: "QR_SIMPLE",
|
|
248
|
+
paymentAddressName: "QR_SIMPLE_DETAILS",
|
|
249
|
+
timezone: "America/La_Paz",
|
|
250
|
+
timezone_name: "BOT",
|
|
251
|
+
flag: "\u{1F1E7}\u{1F1F4}",
|
|
252
|
+
flagUrl: "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f1e7-1f1f4.png",
|
|
253
|
+
phoneCode: "+591",
|
|
254
|
+
telegramSupportChannel: "https://t.me/p2pmebolivia",
|
|
255
|
+
twitterUsername: "p2pmebolivia",
|
|
256
|
+
smsCountryCodes: ["BO"],
|
|
257
|
+
precision: 2,
|
|
258
|
+
isAlpha: true,
|
|
259
|
+
disabled: false,
|
|
260
|
+
disabledPaymentTypes: [],
|
|
261
|
+
uploadPaymentQR: true,
|
|
262
|
+
validateQr: validateBolivianQr
|
|
263
|
+
};
|
|
264
|
+
|
|
135
265
|
// src/country/currencies/brl.ts
|
|
136
266
|
var BRL_PLACEHOLDER = "Chave pix ou pix copia e cola";
|
|
137
267
|
var BRL_VALIDATION_ERROR = "Please enter a valid PIX ID";
|
|
@@ -649,59 +779,133 @@ var NGN_COUNTRY_OPTION = {
|
|
|
649
779
|
};
|
|
650
780
|
|
|
651
781
|
// src/country/currencies/pen.ts
|
|
652
|
-
var
|
|
653
|
-
var
|
|
654
|
-
|
|
782
|
+
var PEN_PHONE_PLACEHOLDER = "PERU_PHONE_PLACEHOLDER";
|
|
783
|
+
var PEN_CCI_PLACEHOLDER = "PERU_CCI_PLACEHOLDER";
|
|
784
|
+
var PEN_PHONE_VALIDATION_ERROR = "Please enter a valid Yape/Plin phone (9XXXXXXXX)";
|
|
785
|
+
var PEN_CCI_VALIDATION_ERROR = "Please enter a valid 20-digit CCI";
|
|
786
|
+
function validatePeruvianCci(value) {
|
|
787
|
+
if (!value || value.trim().length === 0) return false;
|
|
788
|
+
return /^\d{20}$/.test(value.trim().replace(/\s+/g, ""));
|
|
789
|
+
}
|
|
790
|
+
function validatePeruvianPhone(value) {
|
|
655
791
|
if (!value || value.trim().length === 0) return false;
|
|
792
|
+
const phone = value.trim().replace(/\s+/g, "").replace(/^\+?51/, "");
|
|
793
|
+
return /^9\d{8}$/.test(phone);
|
|
794
|
+
}
|
|
795
|
+
function validatePeruvianPaymentKey(value) {
|
|
796
|
+
return validatePeruvianCci(value) || validatePeruvianPhone(value);
|
|
797
|
+
}
|
|
798
|
+
function normalizePeruvianPaymentKey(value) {
|
|
656
799
|
const trimmed = value.trim();
|
|
657
800
|
const cci = trimmed.replace(/\s+/g, "");
|
|
658
|
-
if (/^\d{20}$/.test(cci)) return
|
|
801
|
+
if (/^\d{20}$/.test(cci)) return cci;
|
|
659
802
|
const phone = trimmed.replace(/\s+/g, "").replace(/^\+?51/, "");
|
|
660
|
-
if (/^9\d{8}$/.test(phone)) return
|
|
661
|
-
return
|
|
803
|
+
if (/^9\d{8}$/.test(phone)) return phone;
|
|
804
|
+
return cci;
|
|
662
805
|
}
|
|
663
|
-
function
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
806
|
+
function looksLikeTlv(value) {
|
|
807
|
+
if (value.length < 5 || !/^\d{4}/.test(value)) return false;
|
|
808
|
+
const len = Number.parseInt(value.slice(2, 4), 10);
|
|
809
|
+
return !Number.isNaN(len) && len >= 0 && 4 + len <= value.length;
|
|
810
|
+
}
|
|
811
|
+
function phoneFromTlvValue(value) {
|
|
812
|
+
const trimmed = value.trim();
|
|
813
|
+
if (!trimmed) return null;
|
|
814
|
+
if (validatePeruvianPhone(trimmed)) return normalizePeruvianPaymentKey(trimmed);
|
|
815
|
+
if (/^[0-9a-f]+$/i.test(trimmed) && /[a-f]/i.test(trimmed)) return null;
|
|
816
|
+
const match = trimmed.match(/(^|[^0-9])(\+?51)?(9\d{8})(?![0-9])/);
|
|
817
|
+
if (!match) return null;
|
|
818
|
+
const candidate = `${match[2] ?? ""}${match[3]}`;
|
|
819
|
+
return validatePeruvianPhone(candidate) ? normalizePeruvianPaymentKey(candidate) : null;
|
|
820
|
+
}
|
|
821
|
+
function extractPeruvianPhoneFromQr(payload) {
|
|
822
|
+
let pos = 0;
|
|
823
|
+
while (pos + 4 <= payload.length) {
|
|
824
|
+
const tag = payload.slice(pos, pos + 2);
|
|
825
|
+
const len = Number.parseInt(payload.slice(pos + 2, pos + 4), 10);
|
|
826
|
+
if (Number.isNaN(len) || len < 0 || pos + 4 + len > payload.length) break;
|
|
827
|
+
const value = payload.slice(pos + 4, pos + 4 + len);
|
|
828
|
+
const direct = phoneFromTlvValue(value);
|
|
829
|
+
if (direct) return direct;
|
|
830
|
+
if (tag >= "02" && tag <= "51" || tag === "62" || tag === "64" || looksLikeTlv(value)) {
|
|
831
|
+
const nested = extractPeruvianPhoneFromQr(value);
|
|
832
|
+
if (nested) return nested;
|
|
670
833
|
}
|
|
834
|
+
pos += 4 + len;
|
|
671
835
|
}
|
|
672
|
-
|
|
836
|
+
const glued = payload.match(/\+51\s*9\d{8}/);
|
|
837
|
+
if (glued && validatePeruvianPhone(glued[0])) {
|
|
838
|
+
return normalizePeruvianPaymentKey(glued[0]);
|
|
839
|
+
}
|
|
840
|
+
return null;
|
|
673
841
|
}
|
|
674
|
-
function
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
const
|
|
678
|
-
let
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
842
|
+
function parsePeruvianFallback(value) {
|
|
843
|
+
const trimmed = value.trim();
|
|
844
|
+
if (!trimmed) return { phone: null, cci: null };
|
|
845
|
+
const tokens = trimmed.split("|").map((token) => token.trim()).filter(Boolean);
|
|
846
|
+
let phone = null;
|
|
847
|
+
let cci = null;
|
|
848
|
+
for (const token of tokens) {
|
|
849
|
+
if (!phone && validatePeruvianPhone(token)) {
|
|
850
|
+
phone = normalizePeruvianPaymentKey(token);
|
|
851
|
+
continue;
|
|
852
|
+
}
|
|
853
|
+
if (!cci && validatePeruvianCci(token)) {
|
|
854
|
+
cci = normalizePeruvianPaymentKey(token);
|
|
855
|
+
}
|
|
687
856
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
if (!
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
const
|
|
695
|
-
|
|
857
|
+
return { phone, cci };
|
|
858
|
+
}
|
|
859
|
+
function parsePeruvianPaymentId(value) {
|
|
860
|
+
if (!value || typeof value !== "string") {
|
|
861
|
+
return { qr: null, phone: null, cci: null };
|
|
862
|
+
}
|
|
863
|
+
const trimmed = value.trim();
|
|
864
|
+
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
865
|
+
if (sep >= 0) {
|
|
866
|
+
const left = trimmed.slice(0, sep);
|
|
867
|
+
const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
|
|
868
|
+
const fallback2 = parsePeruvianFallback(right);
|
|
869
|
+
const qr = validatePeruvianQr(left) ? left : null;
|
|
870
|
+
return {
|
|
871
|
+
qr,
|
|
872
|
+
phone: fallback2.phone ?? (qr ? extractPeruvianPhoneFromQr(qr) : null),
|
|
873
|
+
cci: fallback2.cci
|
|
874
|
+
};
|
|
875
|
+
}
|
|
876
|
+
if (validatePeruvianQr(trimmed)) {
|
|
877
|
+
return {
|
|
878
|
+
qr: trimmed,
|
|
879
|
+
phone: extractPeruvianPhoneFromQr(trimmed),
|
|
880
|
+
cci: null
|
|
881
|
+
};
|
|
882
|
+
}
|
|
883
|
+
const fallback = parsePeruvianFallback(trimmed);
|
|
884
|
+
return { qr: null, phone: fallback.phone, cci: fallback.cci };
|
|
885
|
+
}
|
|
886
|
+
function validatePeruvianPaymentId(value) {
|
|
887
|
+
if (!value || typeof value !== "string") return false;
|
|
888
|
+
const { qr, phone, cci } = parsePeruvianPaymentId(value);
|
|
889
|
+
return Boolean(qr || phone || cci);
|
|
696
890
|
}
|
|
697
891
|
var PEN_PAYMENT_FIELDS = [
|
|
698
892
|
{
|
|
699
|
-
key: "
|
|
700
|
-
label: "
|
|
701
|
-
placeholder:
|
|
702
|
-
displayLabel: "
|
|
703
|
-
validate:
|
|
704
|
-
validationErrorMessage:
|
|
893
|
+
key: "phone",
|
|
894
|
+
label: "PERU_PHONE_LABEL",
|
|
895
|
+
placeholder: PEN_PHONE_PLACEHOLDER,
|
|
896
|
+
displayLabel: "Yape / Plin phone",
|
|
897
|
+
validate: validatePeruvianPhone,
|
|
898
|
+
validationErrorMessage: PEN_PHONE_VALIDATION_ERROR,
|
|
899
|
+
optional: true
|
|
900
|
+
},
|
|
901
|
+
{
|
|
902
|
+
key: "cci",
|
|
903
|
+
label: "PERU_CCI_LABEL",
|
|
904
|
+
placeholder: PEN_CCI_PLACEHOLDER,
|
|
905
|
+
displayLabel: "CCI",
|
|
906
|
+
validate: validatePeruvianCci,
|
|
907
|
+
validationErrorMessage: PEN_CCI_VALIDATION_ERROR,
|
|
908
|
+
optional: true
|
|
705
909
|
}
|
|
706
910
|
];
|
|
707
911
|
var PEN_COUNTRY_OPTION = {
|
|
@@ -722,7 +926,13 @@ var PEN_COUNTRY_OPTION = {
|
|
|
722
926
|
precision: 2,
|
|
723
927
|
isAlpha: true,
|
|
724
928
|
disabled: false,
|
|
725
|
-
disabledPaymentTypes: []
|
|
929
|
+
disabledPaymentTypes: [],
|
|
930
|
+
uploadPaymentQR: true,
|
|
931
|
+
validateQr: validatePeruvianQr,
|
|
932
|
+
hydrateFieldsFromQr: (qr) => {
|
|
933
|
+
const phone = extractPeruvianPhoneFromQr(qr);
|
|
934
|
+
return phone ? { phone } : {};
|
|
935
|
+
}
|
|
726
936
|
};
|
|
727
937
|
|
|
728
938
|
// src/country/currencies/php.ts
|
|
@@ -831,6 +1041,32 @@ function validateVenezuelanRif(rif) {
|
|
|
831
1041
|
const trimmed = rif.trim().toUpperCase();
|
|
832
1042
|
return /^[VEJGRP]\d+$/.test(trimmed);
|
|
833
1043
|
}
|
|
1044
|
+
function isValidVenezuelanCompound(value) {
|
|
1045
|
+
const parts = value.split("|");
|
|
1046
|
+
if (parts.length !== 3) return false;
|
|
1047
|
+
return validateVenezuelanPhoneNumber(parts[0]) && validateVenezuelanRif(parts[1]) && parts[2].trim().length > 0;
|
|
1048
|
+
}
|
|
1049
|
+
function parseVenezuelanPaymentId(value) {
|
|
1050
|
+
if (!value || typeof value !== "string") return { qr: null, compound: null };
|
|
1051
|
+
const trimmed = value.trim();
|
|
1052
|
+
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
1053
|
+
if (sep >= 0) {
|
|
1054
|
+
const left = trimmed.slice(0, sep);
|
|
1055
|
+
const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
|
|
1056
|
+
return {
|
|
1057
|
+
qr: validateVenezuelanQr(left) ? left : null,
|
|
1058
|
+
compound: isValidVenezuelanCompound(right) ? right : null
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
if (validateVenezuelanQr(trimmed)) return { qr: trimmed, compound: null };
|
|
1062
|
+
if (isValidVenezuelanCompound(trimmed)) return { qr: null, compound: trimmed };
|
|
1063
|
+
return { qr: null, compound: null };
|
|
1064
|
+
}
|
|
1065
|
+
function validateVenezuelanPaymentId(value) {
|
|
1066
|
+
if (!value || typeof value !== "string") return false;
|
|
1067
|
+
const { qr, compound } = parseVenezuelanPaymentId(value);
|
|
1068
|
+
return qr !== null || compound !== null;
|
|
1069
|
+
}
|
|
834
1070
|
var VEN_PAYMENT_FIELDS = [
|
|
835
1071
|
{
|
|
836
1072
|
key: "phone",
|
|
@@ -876,27 +1112,11 @@ var VEN_COUNTRY_OPTION = {
|
|
|
876
1112
|
precision: 2,
|
|
877
1113
|
isAlpha: false,
|
|
878
1114
|
disabled: false,
|
|
879
|
-
disabledPaymentTypes: []
|
|
1115
|
+
disabledPaymentTypes: [],
|
|
1116
|
+
uploadPaymentQR: true,
|
|
1117
|
+
validateQr: validateVenezuelanQr
|
|
880
1118
|
};
|
|
881
1119
|
|
|
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
1120
|
// src/country/payment-fields.ts
|
|
901
1121
|
var PAYMENT_ID_FIELDS = {
|
|
902
1122
|
INR: INR_PAYMENT_FIELDS,
|
|
@@ -905,6 +1125,7 @@ var PAYMENT_ID_FIELDS = {
|
|
|
905
1125
|
ARS: ARS_PAYMENT_FIELDS,
|
|
906
1126
|
MEX: MEX_PAYMENT_FIELDS,
|
|
907
1127
|
VEN: VEN_PAYMENT_FIELDS,
|
|
1128
|
+
BOB: BOB_PAYMENT_FIELDS,
|
|
908
1129
|
NGN: NGN_PAYMENT_FIELDS,
|
|
909
1130
|
EUR: EUR_PAYMENT_FIELDS,
|
|
910
1131
|
USD: USD_PAYMENT_FIELDS,
|
|
@@ -915,6 +1136,39 @@ var PAYMENT_ID_FIELDS = {
|
|
|
915
1136
|
PHP: PHP_PAYMENT_FIELDS
|
|
916
1137
|
};
|
|
917
1138
|
|
|
1139
|
+
// src/country/countries.ts
|
|
1140
|
+
var COUNTRY_OPTIONS = [
|
|
1141
|
+
INR_COUNTRY_OPTION,
|
|
1142
|
+
IDR_COUNTRY_OPTION,
|
|
1143
|
+
BRL_COUNTRY_OPTION,
|
|
1144
|
+
ARS_COUNTRY_OPTION,
|
|
1145
|
+
MEX_COUNTRY_OPTION,
|
|
1146
|
+
VEN_COUNTRY_OPTION,
|
|
1147
|
+
BOB_COUNTRY_OPTION,
|
|
1148
|
+
NGN_COUNTRY_OPTION,
|
|
1149
|
+
COP_COUNTRY_OPTION,
|
|
1150
|
+
CUP_COUNTRY_OPTION,
|
|
1151
|
+
ECU_COUNTRY_OPTION,
|
|
1152
|
+
PEN_COUNTRY_OPTION,
|
|
1153
|
+
PHP_COUNTRY_OPTION,
|
|
1154
|
+
EUR_COUNTRY_OPTION,
|
|
1155
|
+
USD_COUNTRY_OPTION
|
|
1156
|
+
];
|
|
1157
|
+
function getCountryOption(currency) {
|
|
1158
|
+
if (!currency) return void 0;
|
|
1159
|
+
return COUNTRY_OPTIONS.find((c) => c.currency === currency);
|
|
1160
|
+
}
|
|
1161
|
+
function uploadsPaymentQR(currency) {
|
|
1162
|
+
return getCountryOption(currency)?.uploadPaymentQR === true;
|
|
1163
|
+
}
|
|
1164
|
+
function usesPackedPaymentId(currency) {
|
|
1165
|
+
return getCountryOption(currency)?.validateQr != null;
|
|
1166
|
+
}
|
|
1167
|
+
function usesCatalogPaymentForm(currency) {
|
|
1168
|
+
if (!currency) return false;
|
|
1169
|
+
return uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;
|
|
1170
|
+
}
|
|
1171
|
+
|
|
918
1172
|
// src/country/validators.ts
|
|
919
1173
|
function serializeCompoundPaymentId(...fields) {
|
|
920
1174
|
return fields.join("|");
|
|
@@ -924,18 +1178,175 @@ function deserializeCompoundPaymentId(paymentId) {
|
|
|
924
1178
|
}
|
|
925
1179
|
function formatCompoundPaymentIdForDisplay(paymentId, labels) {
|
|
926
1180
|
const parts = deserializeCompoundPaymentId(paymentId);
|
|
927
|
-
return parts.map((part, i) =>
|
|
1181
|
+
return parts.map((part, i) => {
|
|
1182
|
+
if (!part?.trim()) return null;
|
|
1183
|
+
return labels[i] ? `${labels[i]}: ${part}` : part;
|
|
1184
|
+
}).filter((part) => part !== null).join(" | ");
|
|
1185
|
+
}
|
|
1186
|
+
function validatePaymentIdFields(fields, paymentId) {
|
|
1187
|
+
if (!paymentId || paymentId.trim().length === 0) return false;
|
|
1188
|
+
if (!fields.length) return false;
|
|
1189
|
+
if (fields.length === 1) {
|
|
1190
|
+
return fields[0].validate(paymentId);
|
|
1191
|
+
}
|
|
1192
|
+
const parts = deserializeCompoundPaymentId(paymentId);
|
|
1193
|
+
if (parts.length === 1) {
|
|
1194
|
+
if (!fields.some((field) => field.optional)) return false;
|
|
1195
|
+
return fields.some((field) => field.validate(parts[0]));
|
|
1196
|
+
}
|
|
1197
|
+
const values = fields.map((_, i) => (parts[i] ?? "").trim());
|
|
1198
|
+
const eachOk = fields.every((field, i) => {
|
|
1199
|
+
const value = values[i];
|
|
1200
|
+
if (!value) return field.optional === true;
|
|
1201
|
+
return field.validate(value);
|
|
1202
|
+
});
|
|
1203
|
+
if (!eachOk) return false;
|
|
1204
|
+
return values.some((value) => value.length > 0);
|
|
1205
|
+
}
|
|
1206
|
+
function assignPaymentIdToFieldValues(fields, paymentId) {
|
|
1207
|
+
const result = {};
|
|
1208
|
+
for (const field of fields) result[field.key] = "";
|
|
1209
|
+
if (!paymentId) return result;
|
|
1210
|
+
const { rest } = unpackPackedPaymentId(paymentId);
|
|
1211
|
+
if (!rest) return result;
|
|
1212
|
+
const tokens = deserializeCompoundPaymentId(rest).map((part) => part.trim()).filter((part) => part.length > 0);
|
|
1213
|
+
const claimed = /* @__PURE__ */ new Set();
|
|
1214
|
+
for (const token of tokens) {
|
|
1215
|
+
const field = fields.find((item) => !claimed.has(item.key) && item.validate(token));
|
|
1216
|
+
if (field) {
|
|
1217
|
+
result[field.key] = token;
|
|
1218
|
+
claimed.add(field.key);
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
if (claimed.size === 0 && tokens.length === 1 && fields.length === 1) {
|
|
1222
|
+
result[fields[0].key] = tokens[0];
|
|
1223
|
+
return result;
|
|
1224
|
+
}
|
|
1225
|
+
if (claimed.size < Math.min(tokens.length, fields.length)) {
|
|
1226
|
+
fields.forEach((field, i) => {
|
|
1227
|
+
if (!result[field.key]) result[field.key] = tokens[i] ?? "";
|
|
1228
|
+
});
|
|
1229
|
+
}
|
|
1230
|
+
return result;
|
|
1231
|
+
}
|
|
1232
|
+
function unpackPackedPaymentId(paymentId) {
|
|
1233
|
+
const sep = paymentId.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
1234
|
+
if (sep < 0) return { qr: "", rest: paymentId };
|
|
1235
|
+
return {
|
|
1236
|
+
qr: paymentId.slice(0, sep),
|
|
1237
|
+
rest: paymentId.slice(sep + PACKED_PAYMENT_ID_SEP.length)
|
|
1238
|
+
};
|
|
1239
|
+
}
|
|
1240
|
+
function isStandaloneQr(validateQr, value) {
|
|
1241
|
+
return !!validateQr?.(value);
|
|
1242
|
+
}
|
|
1243
|
+
function getStoredQrPayload(currency, paymentId) {
|
|
1244
|
+
if (!currency || !paymentId) return null;
|
|
1245
|
+
const option = getCountryOption(currency);
|
|
1246
|
+
if (!option?.validateQr) return null;
|
|
1247
|
+
const trimmed = paymentId.trim();
|
|
1248
|
+
const { qr } = unpackPackedPaymentId(trimmed);
|
|
1249
|
+
if (qr && option.validateQr(qr)) return qr;
|
|
1250
|
+
if (isStandaloneQr(option.validateQr, trimmed)) return trimmed;
|
|
1251
|
+
return null;
|
|
1252
|
+
}
|
|
1253
|
+
function packedTypedRest(fields, fieldValues) {
|
|
1254
|
+
const parts = fields.map((field) => {
|
|
1255
|
+
const value = (fieldValues[field.key] ?? "").trim();
|
|
1256
|
+
if (!value) return "";
|
|
1257
|
+
return field.validate(value) ? value : "";
|
|
1258
|
+
});
|
|
1259
|
+
if (!parts.some((part) => part.length > 0)) return "";
|
|
1260
|
+
return serializeCompoundPaymentId(...parts);
|
|
1261
|
+
}
|
|
1262
|
+
function packStoredPaymentId(currency, qr, fieldValues) {
|
|
1263
|
+
const fields = PAYMENT_ID_FIELDS[currency] ?? [];
|
|
1264
|
+
const option = getCountryOption(currency);
|
|
1265
|
+
const trimmedQr = qr?.trim() ?? "";
|
|
1266
|
+
const q = trimmedQr && option?.validateQr?.(trimmedQr) ? trimmedQr : "";
|
|
1267
|
+
const rest = packedTypedRest(fields, fieldValues);
|
|
1268
|
+
if (q && rest) return `${q}${PACKED_PAYMENT_ID_SEP}${rest}`;
|
|
1269
|
+
return q || rest;
|
|
1270
|
+
}
|
|
1271
|
+
function fieldsMatchStoredId(fields, paymentId) {
|
|
1272
|
+
if (validatePaymentIdFields(fields, paymentId)) return true;
|
|
1273
|
+
const assigned = assignPaymentIdToFieldValues(fields, paymentId);
|
|
1274
|
+
const filled = fields.filter((field) => (assigned[field.key] || "").trim().length > 0);
|
|
1275
|
+
if (filled.length === 0) return false;
|
|
1276
|
+
return fields.every(
|
|
1277
|
+
(field) => field.optional === true || (assigned[field.key] || "").trim().length > 0
|
|
1278
|
+
);
|
|
1279
|
+
}
|
|
1280
|
+
function validateStoredPaymentId(currency, paymentId) {
|
|
1281
|
+
if (!paymentId || paymentId.trim().length === 0) return false;
|
|
1282
|
+
const fields = PAYMENT_ID_FIELDS[currency];
|
|
1283
|
+
if (!fields?.length) return false;
|
|
1284
|
+
const option = getCountryOption(currency);
|
|
1285
|
+
const trimmed = paymentId.trim();
|
|
1286
|
+
const { qr, rest } = unpackPackedPaymentId(trimmed);
|
|
1287
|
+
if (qr) {
|
|
1288
|
+
if (!option?.validateQr?.(qr)) return false;
|
|
1289
|
+
if (!rest.trim()) return true;
|
|
1290
|
+
return fieldsMatchStoredId(fields, rest);
|
|
1291
|
+
}
|
|
1292
|
+
if (isStandaloneQr(option?.validateQr, trimmed)) return true;
|
|
1293
|
+
return fieldsMatchStoredId(fields, trimmed);
|
|
1294
|
+
}
|
|
1295
|
+
function assignStoredPaymentIdToFieldValues(currency, paymentId) {
|
|
1296
|
+
const fields = PAYMENT_ID_FIELDS[currency] ?? [];
|
|
1297
|
+
const option = getCountryOption(currency);
|
|
1298
|
+
const trimmed = paymentId.trim();
|
|
1299
|
+
const { qr, rest } = unpackPackedPaymentId(trimmed);
|
|
1300
|
+
let qrPayload = "";
|
|
1301
|
+
let typed = rest.trim();
|
|
1302
|
+
if (qr && option?.validateQr?.(qr)) {
|
|
1303
|
+
qrPayload = qr;
|
|
1304
|
+
} else if (isStandaloneQr(option?.validateQr, trimmed)) {
|
|
1305
|
+
qrPayload = trimmed;
|
|
1306
|
+
typed = "";
|
|
1307
|
+
}
|
|
1308
|
+
const values = assignPaymentIdToFieldValues(fields, typed);
|
|
1309
|
+
if (qrPayload && option?.hydrateFieldsFromQr) {
|
|
1310
|
+
const extra = option.hydrateFieldsFromQr(qrPayload);
|
|
1311
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
1312
|
+
if (value && !values[key]) values[key] = value;
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
return values;
|
|
1316
|
+
}
|
|
1317
|
+
function formatStoredPaymentIdForDisplay(currency, paymentId) {
|
|
1318
|
+
const fields = PAYMENT_ID_FIELDS[currency] ?? [];
|
|
1319
|
+
const values = assignStoredPaymentIdToFieldValues(currency, paymentId);
|
|
1320
|
+
if (fields.length <= 1) return (values[fields[0]?.key ?? ""] || "").trim();
|
|
1321
|
+
return fields.map((field) => {
|
|
1322
|
+
const value = (values[field.key] || "").trim();
|
|
1323
|
+
if (!value) return null;
|
|
1324
|
+
return field.displayLabel ? `${field.displayLabel}: ${value}` : value;
|
|
1325
|
+
}).filter((part) => part !== null).join(" | ");
|
|
928
1326
|
}
|
|
929
1327
|
// Annotate the CommonJS export names for ESM import in node:
|
|
930
1328
|
0 && (module.exports = {
|
|
931
1329
|
COUNTRY_OPTIONS,
|
|
932
1330
|
CURRENCY,
|
|
933
1331
|
CURRENCY_CODES,
|
|
1332
|
+
PACKED_PAYMENT_ID_SEP,
|
|
934
1333
|
PAYMENT_ID_FIELDS,
|
|
1334
|
+
assignPaymentIdToFieldValues,
|
|
1335
|
+
assignStoredPaymentIdToFieldValues,
|
|
935
1336
|
deserializeCompoundPaymentId,
|
|
936
1337
|
formatCompoundPaymentIdForDisplay,
|
|
1338
|
+
formatStoredPaymentIdForDisplay,
|
|
1339
|
+
getCountryOption,
|
|
1340
|
+
getStoredQrPayload,
|
|
1341
|
+
packStoredPaymentId,
|
|
937
1342
|
serializeCompoundPaymentId,
|
|
1343
|
+
unpackPackedPaymentId,
|
|
1344
|
+
uploadsPaymentQR,
|
|
1345
|
+
usesCatalogPaymentForm,
|
|
1346
|
+
usesPackedPaymentId,
|
|
938
1347
|
validateArgentinePaymentId,
|
|
1348
|
+
validateBolivianAccount,
|
|
1349
|
+
validateBolivianQr,
|
|
939
1350
|
validateColombianPaymentId,
|
|
940
1351
|
validateCubanCardNumber,
|
|
941
1352
|
validateCubanPhoneNumber,
|
|
@@ -947,12 +1358,19 @@ function formatCompoundPaymentIdForDisplay(paymentId, labels) {
|
|
|
947
1358
|
validateNigerianAccountName,
|
|
948
1359
|
validateNigerianAccountNumber,
|
|
949
1360
|
validatePIXId,
|
|
1361
|
+
validatePaymentIdFields,
|
|
1362
|
+
validatePeruvianCci,
|
|
1363
|
+
validatePeruvianPaymentId,
|
|
950
1364
|
validatePeruvianPaymentKey,
|
|
1365
|
+
validatePeruvianPhone,
|
|
951
1366
|
validatePeruvianQr,
|
|
952
1367
|
validatePhilippinePhoneNumber,
|
|
953
1368
|
validateRevolutId,
|
|
1369
|
+
validateStoredPaymentId,
|
|
954
1370
|
validateUPIId,
|
|
1371
|
+
validateVenezuelanPaymentId,
|
|
955
1372
|
validateVenezuelanPhoneNumber,
|
|
1373
|
+
validateVenezuelanQr,
|
|
956
1374
|
validateVenezuelanRif
|
|
957
1375
|
});
|
|
958
1376
|
//# sourceMappingURL=country.cjs.map
|