@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 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 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
- }
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 parsePeruvianPaymentId(value) {
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 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
- };
895
+ const qrOk = validatePeruvianQr(left);
896
+ if (right.trim()) return qrOk && isValidPeruvianTypedRest(right);
897
+ return qrOk;
882
898
  }
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);
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 { qr, compound } = parseVenezuelanPaymentId(value);
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 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
- );
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,