@p2pdotme/sdk 1.2.19 → 1.2.20
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 +107 -56
- package/dist/country.cjs.map +1 -1
- package/dist/country.d.cts +40 -8
- package/dist/country.d.ts +40 -8
- package/dist/country.mjs +104 -56
- package/dist/country.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/qr-parsers.cjs +93 -28
- package/dist/qr-parsers.cjs.map +1 -1
- package/dist/qr-parsers.d.cts +6 -3
- package/dist/qr-parsers.d.ts +6 -3
- package/dist/qr-parsers.mjs +93 -28
- package/dist/qr-parsers.mjs.map +1 -1
- package/package.json +1 -1
package/dist/country.cjs
CHANGED
|
@@ -31,7 +31,9 @@ __export(country_exports, {
|
|
|
31
31
|
formatCompoundPaymentIdForDisplay: () => formatCompoundPaymentIdForDisplay,
|
|
32
32
|
formatStoredPaymentIdForDisplay: () => formatStoredPaymentIdForDisplay,
|
|
33
33
|
getCountryOption: () => getCountryOption,
|
|
34
|
+
getPayQrPayload: () => getPayQrPayload,
|
|
34
35
|
getStoredQrPayload: () => getStoredQrPayload,
|
|
36
|
+
getTransferWarning: () => getTransferWarning,
|
|
35
37
|
packStoredPaymentId: () => packStoredPaymentId,
|
|
36
38
|
serializeCompoundPaymentId: () => serializeCompoundPaymentId,
|
|
37
39
|
unpackPackedPaymentId: () => unpackPackedPaymentId,
|
|
@@ -41,6 +43,7 @@ __export(country_exports, {
|
|
|
41
43
|
validateArgentinePaymentId: () => validateArgentinePaymentId,
|
|
42
44
|
validateBolivianAccount: () => validateBolivianAccount,
|
|
43
45
|
validateBolivianQr: () => validateBolivianQr,
|
|
46
|
+
validateCatalogPaymentDraft: () => validateCatalogPaymentDraft,
|
|
44
47
|
validateColombianPaymentId: () => validateColombianPaymentId,
|
|
45
48
|
validateCubanCardNumber: () => validateCubanCardNumber,
|
|
46
49
|
validateCubanPhoneNumber: () => validateCubanPhoneNumber,
|
|
@@ -219,6 +222,39 @@ function validateVenezuelanQr(payload) {
|
|
|
219
222
|
if (!/^[A-Za-z0-9+/=]+$/.test(blob)) return false;
|
|
220
223
|
return /(?:^|[?&])merchantId=\d{3,4}(?:&|$)/.test(trimmed.substring(qIdx));
|
|
221
224
|
}
|
|
225
|
+
function payQrCandidate(paymentId) {
|
|
226
|
+
const trimmed = paymentId.trim();
|
|
227
|
+
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
228
|
+
return (sep >= 0 ? trimmed.slice(0, sep) : trimmed).trim();
|
|
229
|
+
}
|
|
230
|
+
function isPeruvianPayQr(payload) {
|
|
231
|
+
if (!payload.startsWith("0002")) return false;
|
|
232
|
+
return payload.includes("5802PE") && payload.includes("5303604");
|
|
233
|
+
}
|
|
234
|
+
function isVenezuelanPayQr(payload) {
|
|
235
|
+
if (!payload || payload.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
236
|
+
const qIdx = payload.indexOf("?");
|
|
237
|
+
if (qIdx === -1) return false;
|
|
238
|
+
const blob = payload.slice(0, qIdx);
|
|
239
|
+
return blob.length > 0 && /^[A-Za-z0-9+/=]+$/.test(blob);
|
|
240
|
+
}
|
|
241
|
+
function isPhilippinePayQr(payload) {
|
|
242
|
+
if (!payload.startsWith("0002")) return false;
|
|
243
|
+
return payload.includes("5802PH") && payload.includes("5303608");
|
|
244
|
+
}
|
|
245
|
+
function isBolivianPayQr(payload) {
|
|
246
|
+
if (!payload || payload.includes(PACKED_PAYMENT_ID_SEP)) return false;
|
|
247
|
+
if (payload.startsWith("0002") && payload.includes("5802BO") && payload.includes("5303068")) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
const sep = payload.lastIndexOf("|");
|
|
251
|
+
if (sep < 40) return false;
|
|
252
|
+
const blob = payload.slice(0, sep);
|
|
253
|
+
const tag = payload.slice(sep + 1);
|
|
254
|
+
if (blob.length % 4 !== 0) return false;
|
|
255
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(blob)) return false;
|
|
256
|
+
return /^[0-9A-Fa-f]{16,64}$/.test(tag);
|
|
257
|
+
}
|
|
222
258
|
|
|
223
259
|
// src/country/currencies/bob.ts
|
|
224
260
|
var BOB_PLACEHOLDER = "Bank account number (8\u201320 digits)";
|
|
@@ -259,7 +295,11 @@ var BOB_COUNTRY_OPTION = {
|
|
|
259
295
|
disabled: false,
|
|
260
296
|
disabledPaymentTypes: [],
|
|
261
297
|
uploadPaymentQR: true,
|
|
262
|
-
validateQr: validateBolivianQr
|
|
298
|
+
validateQr: validateBolivianQr,
|
|
299
|
+
getPayQrPayload: (paymentId) => {
|
|
300
|
+
const candidate = payQrCandidate(paymentId);
|
|
301
|
+
return isBolivianPayQr(candidate) ? candidate : null;
|
|
302
|
+
}
|
|
263
303
|
};
|
|
264
304
|
|
|
265
305
|
// src/country/currencies/brl.ts
|
|
@@ -442,7 +482,8 @@ var CUP_COUNTRY_OPTION = {
|
|
|
442
482
|
precision: 2,
|
|
443
483
|
isAlpha: true,
|
|
444
484
|
disabled: false,
|
|
445
|
-
disabledPaymentTypes: []
|
|
485
|
+
disabledPaymentTypes: [],
|
|
486
|
+
transferWarning: "CUP_BANDEC_WARNING"
|
|
446
487
|
};
|
|
447
488
|
|
|
448
489
|
// src/country/currencies/ecu.ts
|
|
@@ -839,54 +880,24 @@ function extractPeruvianPhoneFromQr(payload) {
|
|
|
839
880
|
}
|
|
840
881
|
return null;
|
|
841
882
|
}
|
|
842
|
-
function
|
|
843
|
-
const
|
|
844
|
-
if (
|
|
845
|
-
|
|
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
|
-
}
|
|
856
|
-
}
|
|
857
|
-
return { phone, cci };
|
|
883
|
+
function isValidPeruvianTypedRest(value) {
|
|
884
|
+
const nonempty = value.split("|").map((token) => token.trim()).filter((token) => token.length > 0);
|
|
885
|
+
if (nonempty.length === 0) return false;
|
|
886
|
+
return nonempty.every((token) => validatePeruvianPhone(token) || validatePeruvianCci(token));
|
|
858
887
|
}
|
|
859
|
-
function
|
|
860
|
-
if (!value || typeof value !== "string")
|
|
861
|
-
return { qr: null, phone: null, cci: null };
|
|
862
|
-
}
|
|
888
|
+
function validatePeruvianPaymentId(value) {
|
|
889
|
+
if (!value || typeof value !== "string") return false;
|
|
863
890
|
const trimmed = value.trim();
|
|
864
891
|
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
865
892
|
if (sep >= 0) {
|
|
866
893
|
const left = trimmed.slice(0, sep);
|
|
867
894
|
const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
|
|
868
|
-
const
|
|
869
|
-
|
|
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
|
-
};
|
|
895
|
+
const qrOk = validatePeruvianQr(left);
|
|
896
|
+
if (right.trim()) return qrOk && isValidPeruvianTypedRest(right);
|
|
897
|
+
return qrOk;
|
|
882
898
|
}
|
|
883
|
-
|
|
884
|
-
return
|
|
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);
|
|
899
|
+
if (validatePeruvianQr(trimmed)) return true;
|
|
900
|
+
return isValidPeruvianTypedRest(trimmed);
|
|
890
901
|
}
|
|
891
902
|
var PEN_PAYMENT_FIELDS = [
|
|
892
903
|
{
|
|
@@ -929,6 +940,10 @@ var PEN_COUNTRY_OPTION = {
|
|
|
929
940
|
disabledPaymentTypes: [],
|
|
930
941
|
uploadPaymentQR: true,
|
|
931
942
|
validateQr: validatePeruvianQr,
|
|
943
|
+
getPayQrPayload: (paymentId) => {
|
|
944
|
+
const candidate = payQrCandidate(paymentId);
|
|
945
|
+
return isPeruvianPayQr(candidate) ? candidate : null;
|
|
946
|
+
},
|
|
932
947
|
hydrateFieldsFromQr: (qr) => {
|
|
933
948
|
const phone = extractPeruvianPhoneFromQr(qr);
|
|
934
949
|
return phone ? { phone } : {};
|
|
@@ -985,7 +1000,11 @@ var PHP_COUNTRY_OPTION = {
|
|
|
985
1000
|
precision: 2,
|
|
986
1001
|
isAlpha: true,
|
|
987
1002
|
disabled: false,
|
|
988
|
-
disabledPaymentTypes: []
|
|
1003
|
+
disabledPaymentTypes: [],
|
|
1004
|
+
getPayQrPayload: (paymentId) => {
|
|
1005
|
+
const candidate = payQrCandidate(paymentId);
|
|
1006
|
+
return isPhilippinePayQr(candidate) ? candidate : null;
|
|
1007
|
+
}
|
|
989
1008
|
};
|
|
990
1009
|
|
|
991
1010
|
// src/country/currencies/usd.ts
|
|
@@ -1064,7 +1083,16 @@ function parseVenezuelanPaymentId(value) {
|
|
|
1064
1083
|
}
|
|
1065
1084
|
function validateVenezuelanPaymentId(value) {
|
|
1066
1085
|
if (!value || typeof value !== "string") return false;
|
|
1067
|
-
const
|
|
1086
|
+
const trimmed = value.trim();
|
|
1087
|
+
const sep = trimmed.indexOf(PACKED_PAYMENT_ID_SEP);
|
|
1088
|
+
if (sep >= 0) {
|
|
1089
|
+
const left = trimmed.slice(0, sep);
|
|
1090
|
+
const right = trimmed.slice(sep + PACKED_PAYMENT_ID_SEP.length);
|
|
1091
|
+
const qrOk = validateVenezuelanQr(left);
|
|
1092
|
+
if (right.trim()) return qrOk && isValidVenezuelanCompound(right);
|
|
1093
|
+
return qrOk;
|
|
1094
|
+
}
|
|
1095
|
+
const { qr, compound } = parseVenezuelanPaymentId(trimmed);
|
|
1068
1096
|
return qr !== null || compound !== null;
|
|
1069
1097
|
}
|
|
1070
1098
|
var VEN_PAYMENT_FIELDS = [
|
|
@@ -1114,7 +1142,11 @@ var VEN_COUNTRY_OPTION = {
|
|
|
1114
1142
|
disabled: false,
|
|
1115
1143
|
disabledPaymentTypes: [],
|
|
1116
1144
|
uploadPaymentQR: true,
|
|
1117
|
-
validateQr: validateVenezuelanQr
|
|
1145
|
+
validateQr: validateVenezuelanQr,
|
|
1146
|
+
getPayQrPayload: (paymentId) => {
|
|
1147
|
+
const candidate = payQrCandidate(paymentId);
|
|
1148
|
+
return isVenezuelanPayQr(candidate) ? candidate : null;
|
|
1149
|
+
}
|
|
1118
1150
|
};
|
|
1119
1151
|
|
|
1120
1152
|
// src/country/payment-fields.ts
|
|
@@ -1168,6 +1200,9 @@ function usesCatalogPaymentForm(currency) {
|
|
|
1168
1200
|
if (!currency) return false;
|
|
1169
1201
|
return uploadsPaymentQR(currency) || (PAYMENT_ID_FIELDS[currency]?.length ?? 0) > 1;
|
|
1170
1202
|
}
|
|
1203
|
+
function getTransferWarning(currency) {
|
|
1204
|
+
return getCountryOption(currency)?.transferWarning ?? null;
|
|
1205
|
+
}
|
|
1171
1206
|
|
|
1172
1207
|
// src/country/validators.ts
|
|
1173
1208
|
function serializeCompoundPaymentId(...fields) {
|
|
@@ -1250,12 +1285,14 @@ function getStoredQrPayload(currency, paymentId) {
|
|
|
1250
1285
|
if (isStandaloneQr(option.validateQr, trimmed)) return trimmed;
|
|
1251
1286
|
return null;
|
|
1252
1287
|
}
|
|
1288
|
+
function getPayQrPayload(currency, paymentId) {
|
|
1289
|
+
if (!currency || !paymentId) return null;
|
|
1290
|
+
const stored = getStoredQrPayload(currency, paymentId);
|
|
1291
|
+
if (stored) return stored;
|
|
1292
|
+
return getCountryOption(currency)?.getPayQrPayload?.(paymentId.trim()) ?? null;
|
|
1293
|
+
}
|
|
1253
1294
|
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
|
-
});
|
|
1295
|
+
const parts = fields.map((field) => (fieldValues[field.key] ?? "").trim());
|
|
1259
1296
|
if (!parts.some((part) => part.length > 0)) return "";
|
|
1260
1297
|
return serializeCompoundPaymentId(...parts);
|
|
1261
1298
|
}
|
|
@@ -1271,11 +1308,16 @@ function packStoredPaymentId(currency, qr, fieldValues) {
|
|
|
1271
1308
|
function fieldsMatchStoredId(fields, paymentId) {
|
|
1272
1309
|
if (validatePaymentIdFields(fields, paymentId)) return true;
|
|
1273
1310
|
const assigned = assignPaymentIdToFieldValues(fields, paymentId);
|
|
1274
|
-
const
|
|
1275
|
-
if (
|
|
1276
|
-
return fields.every(
|
|
1277
|
-
|
|
1278
|
-
|
|
1311
|
+
const values = fields.map((field) => (assigned[field.key] || "").trim());
|
|
1312
|
+
if (!values.some((value) => value.length > 0)) return false;
|
|
1313
|
+
return fields.every((field, i) => {
|
|
1314
|
+
const value = values[i];
|
|
1315
|
+
if (!value) return field.optional === true;
|
|
1316
|
+
return field.validate(value);
|
|
1317
|
+
});
|
|
1318
|
+
}
|
|
1319
|
+
function validateCatalogPaymentDraft(currency, qr, fieldValues) {
|
|
1320
|
+
return validateStoredPaymentId(currency, packStoredPaymentId(currency, qr, fieldValues));
|
|
1279
1321
|
}
|
|
1280
1322
|
function validateStoredPaymentId(currency, paymentId) {
|
|
1281
1323
|
if (!paymentId || paymentId.trim().length === 0) return false;
|
|
@@ -1304,6 +1346,12 @@ function assignStoredPaymentIdToFieldValues(currency, paymentId) {
|
|
|
1304
1346
|
} else if (isStandaloneQr(option?.validateQr, trimmed)) {
|
|
1305
1347
|
qrPayload = trimmed;
|
|
1306
1348
|
typed = "";
|
|
1349
|
+
} else {
|
|
1350
|
+
const payQr = option?.getPayQrPayload?.(trimmed);
|
|
1351
|
+
if (payQr) {
|
|
1352
|
+
qrPayload = payQr;
|
|
1353
|
+
typed = qr && payQr === qr ? rest.trim() : "";
|
|
1354
|
+
}
|
|
1307
1355
|
}
|
|
1308
1356
|
const values = assignPaymentIdToFieldValues(fields, typed);
|
|
1309
1357
|
if (qrPayload && option?.hydrateFieldsFromQr) {
|
|
@@ -1337,7 +1385,9 @@ function formatStoredPaymentIdForDisplay(currency, paymentId) {
|
|
|
1337
1385
|
formatCompoundPaymentIdForDisplay,
|
|
1338
1386
|
formatStoredPaymentIdForDisplay,
|
|
1339
1387
|
getCountryOption,
|
|
1388
|
+
getPayQrPayload,
|
|
1340
1389
|
getStoredQrPayload,
|
|
1390
|
+
getTransferWarning,
|
|
1341
1391
|
packStoredPaymentId,
|
|
1342
1392
|
serializeCompoundPaymentId,
|
|
1343
1393
|
unpackPackedPaymentId,
|
|
@@ -1347,6 +1397,7 @@ function formatStoredPaymentIdForDisplay(currency, paymentId) {
|
|
|
1347
1397
|
validateArgentinePaymentId,
|
|
1348
1398
|
validateBolivianAccount,
|
|
1349
1399
|
validateBolivianQr,
|
|
1400
|
+
validateCatalogPaymentDraft,
|
|
1350
1401
|
validateColombianPaymentId,
|
|
1351
1402
|
validateCubanCardNumber,
|
|
1352
1403
|
validateCubanPhoneNumber,
|