@agent-cards/sdk 0.23.21 → 0.23.23

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.
Files changed (56) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/PREFLIGHT.md +4 -0
  3. package/README.md +53 -4
  4. package/dist/aci.generated.js +3 -3
  5. package/dist/agent-amount.generated.d.ts +7 -0
  6. package/dist/agent-amount.generated.js +3 -0
  7. package/dist/amadeus-checkout.generated.d.ts +6 -1
  8. package/dist/amadeus-checkout.generated.js +26 -2
  9. package/dist/capabilities.generated.d.ts +2 -0
  10. package/dist/capabilities.generated.js +3 -0
  11. package/dist/card-fields.generated.js +2574 -186
  12. package/dist/cdp.js +103 -29
  13. package/dist/client.d.ts +130 -9
  14. package/dist/client.js +304 -115
  15. package/dist/creditguard.generated.js +4 -2
  16. package/dist/cse-body.js +11 -0
  17. package/dist/ebanx.d.ts +1 -1
  18. package/dist/ebanx.js +1 -1
  19. package/dist/eximbay.d.ts +46 -0
  20. package/dist/eximbay.js +69 -0
  21. package/dist/hosted-entry.js +2 -1
  22. package/dist/hosted-form.d.ts +5 -0
  23. package/dist/hosted-form.js +5 -0
  24. package/dist/lifecycle.d.ts +9 -4
  25. package/dist/lifecycle.js +16 -4
  26. package/dist/paygent.generated.d.ts +60 -0
  27. package/dist/paygent.generated.js +425 -0
  28. package/dist/payrexx.d.ts +91 -0
  29. package/dist/payrexx.generated.d.ts +91 -0
  30. package/dist/payrexx.generated.js +536 -0
  31. package/dist/payrexx.js +141 -0
  32. package/dist/paytrail.d.ts +58 -0
  33. package/dist/paytrail.js +98 -0
  34. package/dist/pre-claim.d.ts +27 -0
  35. package/dist/pre-claim.js +175 -20
  36. package/dist/prepared-processor.d.ts +7 -2
  37. package/dist/prepared-processor.js +16 -2
  38. package/dist/primer.generated.js +2709 -321
  39. package/dist/registry.d.ts +4 -3
  40. package/dist/registry.js +12 -4
  41. package/dist/sbps.d.ts +57 -0
  42. package/dist/sbps.generated.d.ts +96 -0
  43. package/dist/sbps.generated.js +427 -0
  44. package/dist/sbps.js +90 -0
  45. package/dist/stripe-checkout.generated.js +744 -27
  46. package/dist/toast-seal.generated.d.ts +37 -0
  47. package/dist/toast-seal.generated.js +625 -0
  48. package/dist/toast.generated.d.ts +41 -0
  49. package/dist/toast.generated.js +113 -0
  50. package/dist/transbank.d.ts +33 -0
  51. package/dist/transbank.js +62 -0
  52. package/dist/url-mask-parts.d.ts +24 -0
  53. package/dist/url-mask-parts.js +22 -0
  54. package/dist/url-masks.generated.d.ts +3 -0
  55. package/dist/url-masks.generated.js +2 -0
  56. package/package.json +4 -4
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: 2212f400551ed9deef56926befac7e0a0704717658d13228b1245199050dad1d
3
+ // artifact-sha256: cd9e71f205ba2b11824dd49d5dd2fb4ebd67f5bb0c38dfe974bbace93f7b018b
4
4
  // src/card-number-key.js
5
5
  var CARD_NUMBER_KEY = /^(number|card_number|cardnumber|cardNum|card_num|pan)$/i;
6
6
  // src/json-path.js
@@ -109,12 +109,12 @@ function parseConvergeBody(body) {
109
109
  return parsed;
110
110
  }
111
111
  function convergeAmountCents(value) {
112
- const text7 = typeof value === "number" && Number.isFinite(value) ? String(value) : value;
113
- const m = typeof text7 === "string" ? AMOUNT.exec(text7) : null;
112
+ const text9 = typeof value === "number" && Number.isFinite(value) ? String(value) : value;
113
+ const m = typeof text9 === "string" ? AMOUNT.exec(text9) : null;
114
114
  if (!m)
115
115
  return null;
116
- const cents = Number(m[1]) * 100 + Number(((m[2] ?? "") + "00").slice(0, 2));
117
- return Number.isSafeInteger(cents) && cents > 0 ? cents : null;
116
+ const cents2 = Number(m[1]) * 100 + Number(((m[2] ?? "") + "00").slice(0, 2));
117
+ return Number.isSafeInteger(cents2) && cents2 > 0 ? cents2 : null;
118
118
  }
119
119
  function convergeBodyVerdict(body) {
120
120
  const parsed = parseConvergeBody(body);
@@ -365,8 +365,8 @@ var CONTROL = /[\u0000-\u001f\u007f]/;
365
365
  var cardLikeName = (name) => (name.match(/[0-9]/g) ?? []).length >= 12;
366
366
  var record3 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
367
367
  var sameKeys = (value, keys) => {
368
- const own6 = Object.keys(value);
369
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
368
+ const own12 = Object.keys(value);
369
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
370
370
  };
371
371
  var refuse4 = (code) => Object.freeze({ verdict: "refuse", code });
372
372
  var CARD4 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -590,9 +590,9 @@ var K = /* @__PURE__ */ new Uint32Array([
590
590
  3329325298
591
591
  ]);
592
592
  var rotr = (x, n) => x >>> n | x << 32 - n;
593
- function utf8(text7) {
593
+ function utf8(text9) {
594
594
  const out = [];
595
- for (const char of text7) {
595
+ for (const char of text9) {
596
596
  let cp = char.codePointAt(0);
597
597
  if (cp >= 55296 && cp <= 57343)
598
598
  cp = 65533;
@@ -671,13 +671,13 @@ var TYPED_ARRAY = Object.getPrototypeOf(Uint8Array.prototype);
671
671
  var typedArrayName = Object.getOwnPropertyDescriptor(TYPED_ARRAY, Symbol.toStringTag).get;
672
672
  function parseRsaPublicKey(key) {
673
673
  const spki = key && typeof key === "object" ? key.spki : void 0;
674
- const pin8 = key && typeof key === "object" ? key.sha256 : void 0;
674
+ const pin11 = key && typeof key === "object" ? key.sha256 : void 0;
675
675
  const named = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "exponent") ? key.exponent : void 0;
676
676
  if (named !== void 0 && named !== 17)
677
677
  throw refuse6("key");
678
678
  if (typeof spki !== "string" || spki.length > 1024 || spki.length % 4 !== 0 || !BASE64.test(spki))
679
679
  throw refuse6("key");
680
- if (typeof pin8 !== "string" || !SHA256_HEX.test(pin8))
680
+ if (typeof pin11 !== "string" || !SHA256_HEX.test(pin11))
681
681
  throw refuse6("key");
682
682
  let binary;
683
683
  try {
@@ -689,7 +689,7 @@ function parseRsaPublicKey(key) {
689
689
  if (btoa(binary) !== spki)
690
690
  throw refuse6("key");
691
691
  const der = Uint8Array.from(binary, (c) => c.charCodeAt(0));
692
- if (sha256Hex(der) !== pin8)
692
+ if (sha256Hex(der) !== pin11)
693
693
  throw refuse6("key");
694
694
  const outer = readElement(der, 0, 48);
695
695
  if (outer.end !== der.length || outer.start + RSA_ALGORITHM.length > der.length)
@@ -779,8 +779,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
779
779
  var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
780
780
  var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
781
781
  var sameKeys2 = (value, keys) => {
782
- const own6 = Object.keys(value);
783
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
782
+ const own12 = Object.keys(value);
783
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
784
784
  };
785
785
  var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
786
786
  var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -1269,8 +1269,8 @@ var TEXT_LIMIT = 256;
1269
1269
  var CONTROL4 = /[\u0000-\u001f\u007f]/;
1270
1270
  var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1271
1271
  var sameKeys3 = (value, keys) => {
1272
- const own6 = Object.keys(value);
1273
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
1272
+ const own12 = Object.keys(value);
1273
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
1274
1274
  };
1275
1275
  var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
1276
1276
  var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
@@ -1300,13 +1300,13 @@ function billingFields(value) {
1300
1300
  if (names.length > MAX_FIELDS)
1301
1301
  return false;
1302
1302
  return names.every((name) => {
1303
- const field = value[name];
1303
+ const field2 = value[name];
1304
1304
  if (!FIELD_NAME.test(name))
1305
1305
  return false;
1306
- if (!record6(field))
1307
- return billingText(field);
1308
- const nested = Object.keys(field);
1309
- return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(field[key]));
1306
+ if (!record6(field2))
1307
+ return billingText(field2);
1308
+ const nested = Object.keys(field2);
1309
+ return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(field2[key]));
1310
1310
  });
1311
1311
  }
1312
1312
  function wixPaymentsBodyVerdict(body) {
@@ -1380,14 +1380,14 @@ function readJson2(body) {
1380
1380
  catch {
1381
1381
  return { parsed: null, exact: false };
1382
1382
  }
1383
- let exact4 = false;
1383
+ let exact5 = false;
1384
1384
  try {
1385
- exact4 = body.length <= BODY_LIMIT6 && JSON.stringify(parsed) === body;
1385
+ exact5 = body.length <= BODY_LIMIT6 && JSON.stringify(parsed) === body;
1386
1386
  }
1387
1387
  catch {
1388
- exact4 = false;
1388
+ exact5 = false;
1389
1389
  }
1390
- return { parsed, exact: exact4 };
1390
+ return { parsed, exact: exact5 };
1391
1391
  }
1392
1392
  function billingValue(value) {
1393
1393
  if (value === UNDEFINED)
@@ -1442,14 +1442,14 @@ function attachType(parsed) {
1442
1442
  return typeof type === "string" ? type : null;
1443
1443
  }
1444
1444
  function paymongoBodyVerdict(body, session) {
1445
- const { parsed, exact: exact4 } = readJson2(body);
1445
+ const { parsed, exact: exact5 } = readJson2(body);
1446
1446
  const type = parsed === null ? null : attachType(parsed);
1447
1447
  if (type !== "card") {
1448
1448
  if (parsed === null)
1449
1449
  return body === void 0 || body === null || body === "" ? CONTINUE4 : refuse10("paymongo_body_unsupported");
1450
1450
  return namesCardValue(parsed) ? refuse10("paymongo_body_unsupported") : CONTINUE4;
1451
1451
  }
1452
- if (!exact4)
1452
+ if (!exact5)
1453
1453
  return refuse10("paymongo_body_unsupported");
1454
1454
  const code = judgeCardAttach(parsed, session);
1455
1455
  return code === null ? CARD9 : refuse10(code);
@@ -1472,15 +1472,15 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
1472
1472
  var CARD_PAYMENT = "PAYMENT_CARD";
1473
1473
  var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1474
1474
  var sameKeys4 = (value, keys) => {
1475
- const own6 = Object.keys(value);
1476
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
1475
+ const own12 = Object.keys(value);
1476
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
1477
1477
  };
1478
1478
  var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
1479
1479
  var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
1480
- function luhn(digits3) {
1480
+ function luhn(digits4) {
1481
1481
  let sum = 0;
1482
- for (let at = 0; at < digits3.length; at += 1) {
1483
- let digit = Number(digits3[digits3.length - 1 - at]);
1482
+ for (let at = 0; at < digits4.length; at += 1) {
1483
+ let digit = Number(digits4[digits4.length - 1 - at]);
1484
1484
  if (at % 2 === 1) {
1485
1485
  digit *= 2;
1486
1486
  if (digit > 9)
@@ -1627,10 +1627,10 @@ function readForm2(body) {
1627
1627
  return null;
1628
1628
  }
1629
1629
  }
1630
- function cardNetwork2(digits3) {
1631
- if (VISA2.test(digits3))
1630
+ function cardNetwork2(digits4) {
1631
+ if (VISA2.test(digits4))
1632
1632
  return "visa";
1633
- return MASTERCARD2.test(digits3) ? "mastercard" : null;
1633
+ return MASTERCARD2.test(digits4) ? "mastercard" : null;
1634
1634
  }
1635
1635
  function judgeBody2(body) {
1636
1636
  const pairs = readForm2(body);
@@ -1654,7 +1654,7 @@ function judgeBody2(body) {
1654
1654
  }
1655
1655
  const number = value["card[number]"];
1656
1656
  const network = GROUPED.test(number) ? cardNetwork2(number.replace(/ /g, "")) : null;
1657
- if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((flag) => value[flag] === "true" || value[flag] === "false")) {
1657
+ if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((flag3) => value[flag3] === "true" || value[flag3] === "false")) {
1658
1658
  return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
1659
1659
  }
1660
1660
  if (value.isTokenization === "true" || value.isSubscription === "true")
@@ -1703,8 +1703,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
1703
1703
  var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
1704
1704
  var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1705
1705
  var sameKeys5 = (value, keys) => {
1706
- const own6 = Object.keys(value);
1707
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
1706
+ const own12 = Object.keys(value);
1707
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
1708
1708
  };
1709
1709
  var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
1710
1710
  var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -1870,6 +1870,17 @@ function paygentRequestVerdict(url, body) {
1870
1870
  const key = pairs[1][1];
1871
1871
  return (environment2 === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
1872
1872
  }
1873
+ var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]) });
1874
+ var PAYGENT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
1875
+ pin4({
1876
+ id: "fundex_tcs_eng",
1877
+ merchant: "Tokyo Chinese School",
1878
+ merchantId: "60362",
1879
+ keySha256: "6073dee112b1e4089025d1c1f3c4cfad818c314a81943ffa55b839cb2df51018",
1880
+ origins: ["https://fundexapp.jp"],
1881
+ currency: "jpy"
1882
+ })
1883
+ ]);
1873
1884
  // src/multipart-form.js
1874
1885
  var BODY_LIMIT11 = 65536;
1875
1886
  var CRLF = "\r\n";
@@ -1977,9 +1988,9 @@ var PAY_NL_CARD_PARTS = /* @__PURE__ */ Object.freeze([
1977
1988
  "payment[card][expire_month]",
1978
1989
  "payment[card][expire_year]"
1979
1990
  ]);
1980
- var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
1991
+ var pin5 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
1981
1992
  var PAY_NL_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
1982
- pin4({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
1993
+ pin5({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
1983
1994
  ]);
1984
1995
  var RULE = /* @__PURE__ */ Object.freeze({ parts: PAY_NL_PARTS, card: PAY_NL_CARD_PARTS });
1985
1996
  var SERVICE_ID = /^SL-\d{4}-\d{4}$/;
@@ -2095,10 +2106,10 @@ var wellFormed = (value) => {
2095
2106
  var plainText2 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT2 && !CONTROL5.test(value) && (value.match(/[0-9]/g) ?? []).length < 12 && wellFormed(value);
2096
2107
  var between = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
2097
2108
  var NETWORK = /^(?:4[0-9]{15}|4[0-9]{12}|5[1-5][0-9]{14}|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[01][0-9]|20))[0-9]{12}|3[47][0-9]{13})$/;
2098
- var luhn2 = (digits3) => {
2109
+ var luhn2 = (digits4) => {
2099
2110
  let sum = 0;
2100
- for (let at = 0; at < digits3.length; at += 1) {
2101
- let d = digits3.charCodeAt(digits3.length - 1 - at) - 48;
2111
+ for (let at = 0; at < digits4.length; at += 1) {
2112
+ let d = digits4.charCodeAt(digits4.length - 1 - at) - 48;
2102
2113
  if (at % 2 === 1) {
2103
2114
  d *= 2;
2104
2115
  if (d > 9)
@@ -2109,7 +2120,7 @@ var luhn2 = (digits3) => {
2109
2120
  return sum % 10 === 0;
2110
2121
  };
2111
2122
  var ANY_NETWORK = /^[2-6][0-9]{12,18}$/;
2112
- var holdsCardShape = (text7, shape = NETWORK) => (text7.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
2123
+ var holdsCardShape = (text9, shape = NETWORK) => (text9.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
2113
2124
  var phone = (value) => typeof value === "string" && PHONE.test(value) && (value.match(/[0-9]/g) ?? []).length >= 6 && (value.match(/[0-9]/g) ?? []).length <= 15;
2114
2125
  var refuse16 = (code) => Object.freeze({ verdict: "refuse", code });
2115
2126
  var CARD15 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -2320,10 +2331,10 @@ function orderedSubset(value, keys) {
2320
2331
  }
2321
2332
  return true;
2322
2333
  }
2323
- function luhn3(digits3) {
2334
+ function luhn3(digits4) {
2324
2335
  let sum = 0;
2325
- for (let at = 0; at < digits3.length; at += 1) {
2326
- let digit = Number(digits3[digits3.length - 1 - at]);
2336
+ for (let at = 0; at < digits4.length; at += 1) {
2337
+ let digit = Number(digits4[digits4.length - 1 - at]);
2327
2338
  if (at % 2 === 1) {
2328
2339
  digit *= 2;
2329
2340
  if (digit > 9)
@@ -2337,13 +2348,13 @@ var printable = (value) => [...value].every((ch) => ch.charCodeAt(0) >= 32 && ch
2337
2348
  function typed(value, limit = 256) {
2338
2349
  return typeof value === "string" && value.length >= 1 && value.length <= limit && !PAN_LIKE4.test(value) && printable(value);
2339
2350
  }
2340
- function decodeBase64(text7) {
2341
- if (typeof text7 !== "string" || !BASE643.test(text7) || text7.length % 4 !== 0)
2351
+ function decodeBase64(text9) {
2352
+ if (typeof text9 !== "string" || !BASE643.test(text9) || text9.length % 4 !== 0)
2342
2353
  return null;
2343
2354
  let bits = 0;
2344
2355
  let value = 0;
2345
2356
  let out = "";
2346
- for (const ch of text7.replace(/=+$/, "")) {
2357
+ for (const ch of text9.replace(/=+$/, "")) {
2347
2358
  value = (value << 6 | BASE64_ALPHABET.indexOf(ch)) & 16777215;
2348
2359
  bits += 6;
2349
2360
  if (bits >= 8) {
@@ -2353,8 +2364,8 @@ function decodeBase64(text7) {
2353
2364
  }
2354
2365
  return out;
2355
2366
  }
2356
- function soundDevice(text7) {
2357
- const json = decodeBase64(text7);
2367
+ function soundDevice(text9) {
2368
+ const json = decodeBase64(text9);
2358
2369
  if (json === null)
2359
2370
  return false;
2360
2371
  let value;
@@ -2472,17 +2483,17 @@ function sumupBodyVerdict(body, url) {
2472
2483
  var SALTED = /* @__PURE__ */ Object.freeze([83, 97, 108, 116, 101, 100, 95, 95]);
2473
2484
  var B64 = /^[A-Za-z0-9+/]+={0,2}$/;
2474
2485
  var FIELD_LIMIT = 1024;
2475
- function decodeCanonical(text7) {
2476
- if (typeof text7 !== "string" || text7.length === 0 || text7.length % 4 !== 0 || !B64.test(text7))
2486
+ function decodeCanonical(text9) {
2487
+ if (typeof text9 !== "string" || text9.length === 0 || text9.length % 4 !== 0 || !B64.test(text9))
2477
2488
  return null;
2478
2489
  let binary;
2479
2490
  try {
2480
- binary = atob(text7);
2491
+ binary = atob(text9);
2481
2492
  }
2482
2493
  catch {
2483
2494
  return null;
2484
2495
  }
2485
- if (btoa(binary) !== text7)
2496
+ if (btoa(binary) !== text9)
2486
2497
  return null;
2487
2498
  return Uint8Array.from(binary, (char) => char.charCodeAt(0));
2488
2499
  }
@@ -2724,8 +2735,8 @@ var TEXT_LIMIT3 = 256;
2724
2735
  var CONTROL7 = /[\u0000-\u001f\u007f]/;
2725
2736
  var record13 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2726
2737
  var sameKeys7 = (value, keys) => {
2727
- const own6 = Object.keys(value);
2728
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
2738
+ const own12 = Object.keys(value);
2739
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
2729
2740
  };
2730
2741
  var plainText3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT3 && !CONTROL7.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
2731
2742
  var refuse19 = (code) => Object.freeze({ verdict: "refuse", code });
@@ -2769,10 +2780,19 @@ function hipayBodyVerdict(body) {
2769
2780
  return refuse19("hipay_keeps_card");
2770
2781
  return value.multi_use === 0 ? CARD18 : refuse19("hipay_body_unsupported");
2771
2782
  }
2772
- var pin5 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), usernames: Object.freeze([...fields.usernames]) });
2783
+ var pin6 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), usernames: Object.freeze([...fields.usernames]) });
2773
2784
  var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2774
- pin5({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
2785
+ pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
2775
2786
  ]);
2787
+ // src/deep-freeze.js
2788
+ function deepFreeze(value) {
2789
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
2790
+ for (const child of Object.values(value))
2791
+ deepFreeze(child);
2792
+ Object.freeze(value);
2793
+ }
2794
+ return value;
2795
+ }
2776
2796
  // src/amazon-payment-services.js
2777
2797
  var APS_PSP = "amazon_payment_services";
2778
2798
  var APS_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.payfort.com": "production", "sbcheckout.payfort.com": "sandbox" });
@@ -3057,14 +3077,14 @@ function cloverTokenUrl(url) {
3057
3077
  return null;
3058
3078
  return Object.freeze({ host: parsed.hostname, environment: CLOVER_TOKEN_HOSTS[parsed.hostname] });
3059
3079
  }
3060
- function cloverBrand(digits3) {
3061
- if (typeof digits3 !== "string" || !/^[0-9]{6,19}$/.test(digits3))
3080
+ function cloverBrand(digits4) {
3081
+ if (typeof digits4 !== "string" || !/^[0-9]{6,19}$/.test(digits4))
3062
3082
  return null;
3063
- const two = Number(digits3.slice(0, 2));
3064
- const three = Number(digits3.slice(0, 3));
3065
- const four = Number(digits3.slice(0, 4));
3066
- const six = Number(digits3.slice(0, 6));
3067
- if (digits3.startsWith("4"))
3083
+ const two = Number(digits4.slice(0, 2));
3084
+ const three = Number(digits4.slice(0, 3));
3085
+ const four = Number(digits4.slice(0, 4));
3086
+ const six = Number(digits4.slice(0, 6));
3087
+ if (digits4.startsWith("4"))
3068
3088
  return "VISA";
3069
3089
  if (two === 34 || two === 37)
3070
3090
  return "AMEX";
@@ -3166,14 +3186,14 @@ var record16 = (value) => value !== null && typeof value === "object" && !Array.
3166
3186
  function isTapPaymentsTokenUrl(url) {
3167
3187
  return url === TAP_PAYMENTS_TOKEN_URL;
3168
3188
  }
3169
- var pin6 = (fields) => Object.freeze({
3189
+ var pin7 = (fields) => Object.freeze({
3170
3190
  ...fields,
3171
3191
  origins: Object.freeze([...fields.origins]),
3172
3192
  sessions: Object.freeze({ ...fields.sessions }),
3173
3193
  key: Object.freeze({ ...fields.key })
3174
3194
  });
3175
3195
  var TAP_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3176
- pin6({
3196
+ pin7({
3177
3197
  id: "casefilegame",
3178
3198
  merchant: "Casefilegame",
3179
3199
  tapMerchantId: "67977048",
@@ -3437,7 +3457,7 @@ var YEAR11 = /^[0-9]{2}$/;
3437
3457
  var CODE4 = /^[0-9]{3}$/;
3438
3458
  var NAME_LIMIT3 = 100;
3439
3459
  var NAME_WORD = /[a-z]+/gi;
3440
- var printable2 = (text7) => [...text7].every((character) => {
3460
+ var printable2 = (text9) => [...text9].every((character) => {
3441
3461
  const point = character.codePointAt(0);
3442
3462
  return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
3443
3463
  });
@@ -3446,15 +3466,15 @@ var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](
3446
3466
  var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
3447
3467
  var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
3448
3468
  var sameKeys8 = (value, keys) => {
3449
- const own6 = Object.keys(value);
3450
- return own6.length === keys.length && own6.every((key, at) => key === keys[at]);
3469
+ const own12 = Object.keys(value);
3470
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
3451
3471
  };
3452
3472
  var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
3453
3473
  var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
3454
- function luhn4(digits3) {
3474
+ function luhn4(digits4) {
3455
3475
  let sum = 0;
3456
- for (let at = 0; at < digits3.length; at += 1) {
3457
- let digit = Number(digits3[digits3.length - 1 - at]);
3476
+ for (let at = 0; at < digits4.length; at += 1) {
3477
+ let digit = Number(digits4[digits4.length - 1 - at]);
3458
3478
  if (at % 2 === 1) {
3459
3479
  digit *= 2;
3460
3480
  if (digit > 9)
@@ -3713,12 +3733,93 @@ var SUCCESS_RULES = {
3713
3733
  cvvIncluded: (value) => typeof value === "boolean"
3714
3734
  };
3715
3735
  var SUCCESS_KEYS = Object.keys(SUCCESS_RULES);
3736
+ // src/openpay.js
3737
+ var OPENPAY_PSP = "openpay_bbva";
3738
+ var OPENPAY_API_HOSTS = /* @__PURE__ */ Object.freeze({
3739
+ "api.openpay.mx": "production",
3740
+ "api.openpay.co": "production",
3741
+ "api.openpay.pe": "production",
3742
+ "sandbox-api.openpay.mx": "sandbox",
3743
+ "sandbox-api.openpay.co": "sandbox",
3744
+ "sandbox-api.openpay.pe": "sandbox"
3745
+ });
3746
+ var OPENPAY_CARD_KEYS = /* @__PURE__ */ Object.freeze(["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year", "address"]);
3747
+ var OPENPAY_ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["line1", "line2", "line3", "state", "city", "postal_code", "country_code"]);
3748
+ var BODY_LIMIT23 = 4096;
3749
+ var URL_LIMIT10 = 96;
3750
+ var TOKEN_URL = /^https:\/\/((?:sandbox-)?api\.openpay\.(?:mx|co|pe))\/v1\/([a-z0-9]{10,40})\/tokens$/;
3751
+ var NUMBER6 = /^[0-9]{12,19}$/;
3752
+ var SECURITY_CODE14 = /^[0-9]{3,4}$/;
3753
+ var MONTH_TEXT = /^(?:0?[1-9]|1[0-2])$/;
3754
+ var YEAR12 = /^[0-9]{2}$/;
3755
+ var COUNTRY3 = /^[A-Z]{2}$/;
3756
+ var LETTERS2 = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
3757
+ var PAGE_NAME3 = new RegExp(`^[${LETTERS2} .'-]{1,64}$`);
3758
+ var HAS_LETTER2 = new RegExp(`[${LETTERS2}]`);
3759
+ var ADDRESS_VALUE2 = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
3760
+ var PAN_LIKE6 = new RegExp(`(?:[0-9][^0-9${LETTERS2}]*){12,}`);
3761
+ var record20 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
3762
+ var hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);
3763
+ var refuse25 = (code) => Object.freeze({ verdict: "refuse", code });
3764
+ var CARD24 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
3765
+ function openpayTokenTarget(url) {
3766
+ if (typeof url !== "string" || url.length > URL_LIMIT10)
3767
+ return null;
3768
+ const match = TOKEN_URL.exec(url);
3769
+ if (!match)
3770
+ return null;
3771
+ return Object.freeze({ environment: OPENPAY_API_HOSTS[match[1]], host: match[1], merchantId: match[2] });
3772
+ }
3773
+ function readJson6(body) {
3774
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT23)
3775
+ return null;
3776
+ try {
3777
+ const value = JSON.parse(body);
3778
+ return record20(value) && JSON.stringify(value) === body ? value : null;
3779
+ }
3780
+ catch {
3781
+ return null;
3782
+ }
3783
+ }
3784
+ var soundMonth = (value) => Number.isInteger(value) && value >= 1 && value <= 12 || typeof value === "string" && MONTH_TEXT.test(value);
3785
+ function soundAddress2(address2) {
3786
+ if (!record20(address2))
3787
+ return false;
3788
+ const keys = Object.keys(address2);
3789
+ return keys.length > 0 && keys.every((key) => OPENPAY_ADDRESS_KEYS.includes(key) && typeof address2[key] === "string" && ADDRESS_VALUE2.test(address2[key]) && !PAN_LIKE6.test(address2[key])) && keys.some((key) => address2[key] !== "") && (!hasOwn(address2, "country_code") || COUNTRY3.test(address2.country_code));
3790
+ }
3791
+ function openpayBodyVerdict(body, url) {
3792
+ if (url !== void 0 && openpayTokenTarget(url) === null)
3793
+ return refuse25("openpay_url_refused");
3794
+ const value = readJson6(body);
3795
+ if (value === null)
3796
+ return refuse25("openpay_body_unsupported");
3797
+ const keys = Object.keys(value);
3798
+ if (!keys.every((key) => OPENPAY_CARD_KEYS.includes(key)) || !["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year"].every((key) => keys.includes(key))) {
3799
+ return refuse25("openpay_body_unsupported");
3800
+ }
3801
+ if (typeof value.card_number !== "string" || !NUMBER6.test(value.card_number) || typeof value.cvv2 !== "string" || !SECURITY_CODE14.test(value.cvv2) || !soundMonth(value.expiration_month) || typeof value.expiration_year !== "string" || !YEAR12.test(value.expiration_year) || typeof value.holder_name !== "string" || !PAGE_NAME3.test(value.holder_name) || !HAS_LETTER2.test(value.holder_name) || keys.includes("address") && !soundAddress2(value.address)) {
3802
+ return refuse25("openpay_body_unsupported");
3803
+ }
3804
+ return CARD24;
3805
+ }
3806
+ var pin8 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), publicKeys: Object.freeze([...fields.publicKeys]) });
3807
+ var OPENPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3808
+ pin8({
3809
+ id: "diario_de_yucatan",
3810
+ merchant: "Diario de Yucatán",
3811
+ origins: ["https://www.yucatan.com.mx"],
3812
+ host: "api.openpay.mx",
3813
+ merchantId: "mqyloyrm8tsvtsgcrj0d",
3814
+ publicKeys: ["pk_260aa43616a445bb98472e6ca51da968"]
3815
+ })
3816
+ ]);
3716
3817
  // src/poynt.js
3717
3818
  var POYNT_PSP = "poynt";
3718
3819
  var UUID4 = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
3719
3820
  var NONCE_URL = new RegExp(`^https://services\\.poynt\\.net/v1/commerce/stores/(${UUID4})/payment-tokens/generate-nonce$`);
3720
3821
  var STORE_ID = new RegExp(`^${UUID4}$`);
3721
- var BODY_LIMIT23 = 8192;
3822
+ var BODY_LIMIT24 = 8192;
3722
3823
  var ROOT_KEYS8 = /* @__PURE__ */ Object.freeze(["applicationId", "channelId", "card", "verificationData"]);
3723
3824
  var CARD_KEYS10 = /* @__PURE__ */ Object.freeze(["number", "expirationMonth", "expirationYear", "type", "cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"]);
3724
3825
  var ADDRESS_KEYS4 = /* @__PURE__ */ Object.freeze(["postalCode", "line1", "line2", "city", "territory", "countryCode", "postalCodeExtension"]);
@@ -3728,17 +3829,17 @@ var CARD_ON_FILE_KEYS = /* @__PURE__ */ Object.freeze(["saveFinancialInstrumentO
3728
3829
  var CARD_TYPES = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMERICAN_EXPRESS", "DINERS_CLUB", "DISCOVER", "JCB", "UNIONPAY", "MAESTRO", "ELO", "HIPERCARD", "TROY", ""]);
3729
3830
  var CARD_NUMBER12 = /^[0-9]{12,19}$/;
3730
3831
  var MONTH12 = /^(?:0[1-9]|1[0-2])$/;
3731
- var YEAR12 = /^20[0-9]{2}$/;
3732
- var SECURITY_CODE14 = /^[0-9]{3,4}$/;
3832
+ var YEAR13 = /^20[0-9]{2}$/;
3833
+ var SECURITY_CODE15 = /^[0-9]{3,4}$/;
3733
3834
  var IDENTIFIER = /^[A-Za-z0-9:._-]{1,128}$/;
3734
3835
  var APPLICATION_ID = new RegExp(`^urn:aid:${UUID4}$`);
3735
3836
  var POSTAL_CODE3 = /^[A-Za-z0-9_]{0,16}$/;
3736
- var COUNTRY3 = /^[A-Z]{2}$/;
3837
+ var COUNTRY4 = /^[A-Z]{2}$/;
3737
3838
  var TEXT_LIMIT7 = 256;
3738
3839
  var CONTROL10 = /[\u0000-\u001f\u007f]/;
3739
- var cardLike2 = (text7) => (text7.match(/[0-9]/g) ?? []).length >= 12;
3840
+ var cardLike2 = (text9) => (text9.match(/[0-9]/g) ?? []).length >= 12;
3740
3841
  var text5 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT7 && !CONTROL10.test(value) && !cardLike2(value);
3741
- var record20 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
3842
+ var record21 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
3742
3843
  var own5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
3743
3844
  var inOrder4 = (value, order, required) => {
3744
3845
  const keys = Object.keys(value);
@@ -3751,8 +3852,8 @@ var inOrder4 = (value, order, required) => {
3751
3852
  }
3752
3853
  return required.every((key) => keys.includes(key));
3753
3854
  };
3754
- var refuse25 = (code) => Object.freeze({ verdict: "refuse", code });
3755
- var CARD24 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
3855
+ var refuse26 = (code) => Object.freeze({ verdict: "refuse", code });
3856
+ var CARD25 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
3756
3857
  function poyntStoreId(url) {
3757
3858
  const match = typeof url === "string" ? NONCE_URL.exec(url) : null;
3758
3859
  return match ? match[1] : null;
@@ -3761,12 +3862,12 @@ function isPoyntNonceUrl(url) {
3761
3862
  return poyntStoreId(url) !== null;
3762
3863
  }
3763
3864
  function readBody14(body) {
3764
- if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT23)
3865
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT24)
3765
3866
  return null;
3766
3867
  let value;
3767
3868
  try {
3768
3869
  value = JSON.parse(body);
3769
- if (!record20(value) || JSON.stringify(value) !== body)
3870
+ if (!record21(value) || JSON.stringify(value) !== body)
3770
3871
  return null;
3771
3872
  }
3772
3873
  catch {
@@ -3777,32 +3878,32 @@ function readBody14(body) {
3777
3878
  function poyntBodyVerdict(body) {
3778
3879
  const value = readBody14(body);
3779
3880
  if (value === null)
3780
- return refuse25("poynt_body_unsupported");
3881
+ return refuse26("poynt_body_unsupported");
3781
3882
  if (CARD_ON_FILE_KEYS.some((key) => own5(value, key)))
3782
- return refuse25("poynt_card_on_file");
3883
+ return refuse26("poynt_card_on_file");
3783
3884
  if (!inOrder4(value, ROOT_KEYS8, REQUIRED_ROOT) || typeof value.applicationId !== "string" || !APPLICATION_ID.test(value.applicationId) || own5(value, "channelId") && (typeof value.channelId !== "string" || !IDENTIFIER.test(value.channelId))) {
3784
- return refuse25("poynt_body_unsupported");
3885
+ return refuse26("poynt_body_unsupported");
3785
3886
  }
3786
3887
  const { card, verificationData: verification } = value;
3787
- if (!record20(card) || !inOrder4(card, CARD_KEYS10, REQUIRED_CARD) || typeof card.number !== "string" || !CARD_NUMBER12.test(card.number) || typeof card.expirationMonth !== "string" || !MONTH12.test(card.expirationMonth) || typeof card.expirationYear !== "string" || !YEAR12.test(card.expirationYear) || !CARD_TYPES.includes(card.type) || !["cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"].every((key) => !own5(card, key) || text5(card[key]))) {
3788
- return refuse25("poynt_body_unsupported");
3888
+ if (!record21(card) || !inOrder4(card, CARD_KEYS10, REQUIRED_CARD) || typeof card.number !== "string" || !CARD_NUMBER12.test(card.number) || typeof card.expirationMonth !== "string" || !MONTH12.test(card.expirationMonth) || typeof card.expirationYear !== "string" || !YEAR13.test(card.expirationYear) || !CARD_TYPES.includes(card.type) || !["cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"].every((key) => !own5(card, key) || text5(card[key]))) {
3889
+ return refuse26("poynt_body_unsupported");
3789
3890
  }
3790
- if (!record20(verification) || Object.keys(verification).join() !== "cardHolderBillingAddress,cvData" || typeof verification.cvData !== "string" || !SECURITY_CODE14.test(verification.cvData))
3791
- return refuse25("poynt_body_unsupported");
3891
+ if (!record21(verification) || Object.keys(verification).join() !== "cardHolderBillingAddress,cvData" || typeof verification.cvData !== "string" || !SECURITY_CODE15.test(verification.cvData))
3892
+ return refuse26("poynt_body_unsupported");
3792
3893
  const address2 = verification.cardHolderBillingAddress;
3793
- if (!record20(address2) || !inOrder4(address2, ADDRESS_KEYS4, []) || !Object.values(address2).every(text5) || own5(address2, "postalCode") && !POSTAL_CODE3.test(address2.postalCode) || own5(address2, "postalCodeExtension") && !POSTAL_CODE3.test(address2.postalCodeExtension) || own5(address2, "countryCode") && !COUNTRY3.test(address2.countryCode))
3794
- return refuse25("poynt_body_unsupported");
3795
- return CARD24;
3894
+ if (!record21(address2) || !inOrder4(address2, ADDRESS_KEYS4, []) || !Object.values(address2).every(text5) || own5(address2, "postalCode") && !POSTAL_CODE3.test(address2.postalCode) || own5(address2, "postalCodeExtension") && !POSTAL_CODE3.test(address2.postalCodeExtension) || own5(address2, "countryCode") && !COUNTRY4.test(address2.countryCode))
3895
+ return refuse26("poynt_body_unsupported");
3896
+ return CARD25;
3796
3897
  }
3797
- var pin7 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
3898
+ var pin9 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
3798
3899
  var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3799
- pin7({
3900
+ pin9({
3800
3901
  id: "yearning_for_learning",
3801
3902
  merchant: "Yearning for Learning Publishing & Coaching",
3802
3903
  origins: ["https://ff305485-ba6c-423a-87b0-cebe3f83ffe9.mysimplestore.com"],
3803
3904
  storeIds: ["71ac12ed-e61f-4318-95db-db0e7c649d6f"]
3804
3905
  }),
3805
- pin7({
3906
+ pin9({
3806
3907
  id: "timber_ridge_bookkeeping",
3807
3908
  merchant: "Timber Ridge Bookkeeping",
3808
3909
  origins: ["https://d7d64ac3-0352-4e53-af9a-f6d8e7b5fb71.mysimplestore.com"],
@@ -3810,196 +3911,2483 @@ var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
3810
3911
  })
3811
3912
  ]);
3812
3913
  var MAX_ANSWER_CHARS = 16 * 1024;
3813
- // src/card-fields.js
3814
- function processorGate(recognizer, url, body) {
3815
- if (recognizer && recognizer.psp === LYRA_PSP)
3816
- return lyraBodyVerdict(body, url);
3817
- if (recognizer && recognizer.psp === WIX_PAYMENTS_PSP) {
3818
- if (url !== void 0 && !isWixPaymentsTokenizeUrl(url))
3819
- return { verdict: "refuse", code: "wix_payments_url_refused" };
3820
- return wixPaymentsBodyVerdict(body);
3821
- }
3822
- if (recognizer && recognizer.psp === KOMOJU_PSP)
3823
- return komojuBodyVerdict(body, url);
3824
- if (recognizer && recognizer.psp === HIPAY_PSP) {
3825
- if (url !== void 0 && !isHipayTokenUrl(url))
3826
- return { verdict: "refuse", code: "hipay_url_refused" };
3827
- return hipayBodyVerdict(body);
3828
- }
3829
- if (recognizer && recognizer.psp === PAYPAL_PSP) {
3830
- if (url !== void 0 && !isPaypalConfirmUrl(url))
3831
- return { verdict: "refuse", code: "paypal_url_refused" };
3832
- return paypalBodyVerdict(body);
3833
- }
3834
- if (recognizer && recognizer.psp === MAKECOMMERCE_PSP)
3835
- return makecommerceBodyVerdict(body, url);
3836
- if (recognizer && recognizer.psp === POYNT_PSP) {
3837
- if (url !== void 0 && !isPoyntNonceUrl(url))
3838
- return { verdict: "refuse", code: "poynt_url_refused" };
3839
- return poyntBodyVerdict(body);
3840
- }
3841
- if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
3842
- if (url !== void 0 && !isPaddleVgsCardsUrl(url))
3843
- return { verdict: "refuse", code: "paddle_vgs_url_refused" };
3844
- return paddleVgsBodyVerdict(body);
3845
- }
3846
- if (recognizer && recognizer.psp === PAYFAST_PSP) {
3847
- if (url !== void 0 && !isPayfastPayUrl(url))
3848
- return { verdict: "refuse", code: "payfast_url_refused" };
3849
- return payfastBodyVerdict(body);
3850
- }
3851
- if (recognizer && recognizer.psp === PAYREXX_PSP) {
3852
- return url !== void 0 ? payrexxGateVerdict(url, body) : payrexxBodyVerdict(body);
3853
- }
3854
- if (recognizer && recognizer.psp === PAYGENT_PSP) {
3855
- return url !== void 0 ? paygentRequestVerdict(url, body) : paygentBodyVerdict(body);
3856
- }
3857
- if (recognizer && recognizer.psp === PAY_NL_PSP) {
3858
- if (url !== void 0 && !isPayNlTokenUrl(url))
3859
- return { verdict: "refuse", code: "pay_nl_url_refused" };
3860
- return payNlBodyVerdict(body);
3861
- }
3862
- if (recognizer && recognizer.psp === TWOC2P_PSP) {
3863
- if (url === void 0)
3864
- return twoC2pBodyVerdict(body);
3865
- const target = twoC2pPaymentTarget(url);
3866
- if (target === null)
3867
- return { verdict: "refuse", code: "twoc2p_url_refused" };
3868
- if (!target.reviewed)
3869
- return twoC2pPaymentCarriesCard(body) ? { verdict: "refuse", code: "twoc2p_build_unreviewed" } : { verdict: "continue" };
3870
- const keyBytes = twoC2pKeyBytes(target.environment);
3871
- return keyBytes === null ? { verdict: "refuse", code: "twoc2p_field_unreviewed" } : twoC2pBodyVerdict(body, keyBytes, target.environment);
3872
- }
3873
- if (recognizer && recognizer.psp === APS_PSP)
3874
- return apsBodyVerdict(body, url);
3875
- if (recognizer && recognizer.psp === CONEKTA_PSP)
3876
- return conektaBodyVerdict(body, url);
3877
- if (recognizer && recognizer.psp === PADDLE_TOKENEX_PSP) {
3878
- const target = url !== void 0 ? paddleTokenexPayTarget(url) : null;
3879
- if (url !== void 0 && target === null)
3880
- return { verdict: "refuse", code: "paddle_tokenex_pay_unsupported" };
3881
- return paddleTokenexBodyVerdict(body, target ? target.line : void 0);
3882
- }
3883
- if (recognizer && recognizer.psp === PAYMONGO_PSP) {
3884
- const session = url !== void 0 ? paymongoCheckoutSession(url) : void 0;
3885
- if (url !== void 0 && session === null)
3886
- return { verdict: "refuse", code: "paymongo_url_refused" };
3887
- return paymongoBodyVerdict(body, session);
3888
- }
3889
- if (recognizer && recognizer.psp === GOPAY_PSP)
3890
- return gopayBodyVerdict(body, url);
3891
- if (recognizer && recognizer.psp === REVOLUT_PSP) {
3892
- if (url !== void 0 && !isRevolutPaymentsUrl(url))
3893
- return { verdict: "refuse", code: "revolut_url_refused" };
3894
- return revolutBodyVerdict(body);
3895
- }
3896
- if (recognizer && recognizer.psp === SUMUP_PSP)
3897
- return sumupBodyVerdict(body, url);
3898
- if (recognizer && recognizer.psp === CLOVER_PSP)
3899
- return cloverBodyVerdict(body, url);
3900
- if (recognizer && recognizer.psp === TAP_PAYMENTS_PSP) {
3901
- if (url !== void 0 && !isTapPaymentsTokenUrl(url))
3902
- return { verdict: "refuse", code: "tap_payments_url_refused" };
3903
- return tapPaymentsBodyVerdict(body);
3904
- }
3905
- if (recognizer && recognizer.psp === TOKENEX_IFRAME_PSP)
3906
- return tokenexIframeBodyVerdict(body, url);
3907
- if (recognizer && recognizer.psp === GRAVY_PSP)
3908
- return gravyBodyVerdict(body);
3909
- if (recognizer && recognizer.psp === MONERIS_PSP) {
3910
- if (url !== void 0 && !isMonerisTokenizeUrl(url))
3911
- return { verdict: "refuse", code: "moneris_url_refused" };
3912
- return monerisBodyVerdict(body);
3914
+ // src/cardcom.js
3915
+ var CARDCOM_PSP = "cardcom";
3916
+ var CARDCOM_HOST = "secure.cardcom.solutions";
3917
+ var CARDCOM_ORIGIN = "https://secure.cardcom.solutions";
3918
+ var CARDCOM_SUBMIT_PATH = "/api/EA5/SubmitPayment";
3919
+ var CARDCOM_CURRENCIES = /* @__PURE__ */ Object.freeze({ 1: "ils", 826: "gbp", 840: "usd", 978: "eur" });
3920
+ var BODY_LIMIT25 = 65536;
3921
+ var TOP_KEYS2 = /* @__PURE__ */ Object.freeze(["GoogleToken", "UserAgent", "NumberOfTries", "GooglePayToken", "Store", "_3DSecureReq", "HooxReference"]);
3922
+ var STORE_KEYS = /* @__PURE__ */ Object.freeze([
3923
+ "CommonStore",
3924
+ "CompanyInfoStore",
3925
+ "ProductsStore",
3926
+ "DeliveryStore",
3927
+ "DocumentStore",
3928
+ "DetailsStore",
3929
+ "PaymentStore"
3930
+ ]);
3931
+ var THREE_DS_KEYS = /* @__PURE__ */ Object.freeze([
3932
+ "TerminalNum",
3933
+ "CoinId",
3934
+ "CardNumber",
3935
+ "CardholderFullName",
3936
+ "CardholderPhone",
3937
+ "CardHolderEmail",
3938
+ "CVV",
3939
+ "CardExpireMonth",
3940
+ "CardExpireYear",
3941
+ "RequestedBillingAmount",
3942
+ "UserAgentHeader",
3943
+ "browserLanguage",
3944
+ "_3ds_browserjavaenabled",
3945
+ "_3ds_browserscreenheight",
3946
+ "_3ds_browserscreenwidth",
3947
+ "_3ds_browsercolordepth",
3948
+ "_3ds_challengewindowsize",
3949
+ "_3ds_channel",
3950
+ "_3ds_category",
3951
+ "_3ds_transtype",
3952
+ "ExternalAisurit4DealPageUID",
3953
+ "DealToSaveJSON",
3954
+ "GooglePayToken",
3955
+ "DirectDebitSplitPaymentsSum",
3956
+ "SapakMutav"
3957
+ ]);
3958
+ var COMMON_KEYS = /* @__PURE__ */ Object.freeze([
3959
+ "Uid",
3960
+ "OldUid",
3961
+ "TerminalNumber",
3962
+ "TerminalType",
3963
+ "StoreInitialized",
3964
+ "SuccessRedirectUrl",
3965
+ "ErrorRedirectUrl",
3966
+ "BackgroundImageUrl",
3967
+ "AdditionalDataJson",
3968
+ "Language",
3969
+ "UniqTempDealID",
3970
+ "IsError",
3971
+ "ErrorCode",
3972
+ "ErrorMessage",
3973
+ "OpeningText",
3974
+ "IsEA5SinglePage",
3975
+ "CurrentCardcomBitIntervalId",
3976
+ "SapakMutav",
3977
+ "ShowCookiesBanner",
3978
+ "HideFooter",
3979
+ "LPVersion"
3980
+ ]);
3981
+ var COMPANY_KEYS = /* @__PURE__ */ Object.freeze([
3982
+ "CompanyNumber",
3983
+ "Name",
3984
+ "Address1",
3985
+ "Address2",
3986
+ "Address3",
3987
+ "Tel",
3988
+ "Email",
3989
+ "LogoURL",
3990
+ "LogoAlt",
3991
+ "YoutubeLink",
3992
+ "InstagramLink",
3993
+ "FacebookLink",
3994
+ "WhatsappLink",
3995
+ "Comments",
3996
+ "ShowGPayLogo",
3997
+ "ShowMasterCardLogo",
3998
+ "ShowVisaLogo",
3999
+ "ShowAmexLogo",
4000
+ "ShowDinersLogo",
4001
+ "ShowIsracardLogo",
4002
+ "MetaTitle",
4003
+ "MetaDescription",
4004
+ "MetaImage"
4005
+ ]);
4006
+ var DELIVERY_KEYS = /* @__PURE__ */ Object.freeze([
4007
+ "ShowDeliveryForm",
4008
+ "DeliveryMethodField",
4009
+ "CityField",
4010
+ "StreetField",
4011
+ "BuildingNumberField",
4012
+ "ApartmentNumberField",
4013
+ "FloorField",
4014
+ "EntranceField",
4015
+ "DeliveryNotesField",
4016
+ "Cities",
4017
+ "Streets"
4018
+ ]);
4019
+ var DOCUMENT_KEYS = /* @__PURE__ */ Object.freeze([
4020
+ "ShowInvoiceForm",
4021
+ "Comments",
4022
+ "Title",
4023
+ "NameField",
4024
+ "IdField",
4025
+ "MobileField",
4026
+ "AdditionalPhoneField",
4027
+ "EmailField",
4028
+ "EmailConfirmField",
4029
+ "CityField",
4030
+ "StreetField",
4031
+ "ZipcodeField",
4032
+ "SendPreBuyDataToServer",
4033
+ "DocTypeToCreate"
4034
+ ]);
4035
+ var DETAILS_KEYS = /* @__PURE__ */ Object.freeze(["ShowDetailsForm", "ShowCancelBtn", "CancelUrl", "Comments", "FormFields"]);
4036
+ var PAYMENT_KEYS = /* @__PURE__ */ Object.freeze([
4037
+ "Comments",
4038
+ "ButtonText",
4039
+ "ButtonTextZeroSum",
4040
+ "HideCreditCardFieldsOnZeroSum",
4041
+ "EmailField",
4042
+ "MobileField",
4043
+ "CardNumberField",
4044
+ "YearsField",
4045
+ "MonthsField",
4046
+ "CvvField",
4047
+ "CardOwnerNameField",
4048
+ "CardTZField",
4049
+ "PaymentsField",
4050
+ "OpenSumField",
4051
+ "CardOwnerCityField",
4052
+ "CardOwnerAddressField",
4053
+ "CardOwnerZipcodeField",
4054
+ "ApprovedTermsAndConditions",
4055
+ "ShowTermsAndConditions",
4056
+ "TermsAndConditionsUrl",
4057
+ "AllowMerchantMessages",
4058
+ "MustAllowMerchantMessages",
4059
+ "ShowMerchantMessages",
4060
+ "ShowPayPal",
4061
+ "ShowUpayBitButton",
4062
+ "ShowPayMeBitButton",
4063
+ "ShowCardcomBitButton",
4064
+ "ShowApplePay",
4065
+ "MerchantApplePayLogoUrl",
4066
+ "ShowGooglePay",
4067
+ "ShowRecaptcha",
4068
+ "RecaptchaVersion",
4069
+ "IsCredit",
4070
+ "NumOfRetriesAllowed",
4071
+ "Commissions",
4072
+ "Is3DSecureEnabled",
4073
+ "Was3DSActiveOnPageLoad",
4074
+ "ThreeDSecureTransactionId",
4075
+ "ShowSuccessPopup",
4076
+ "ShowErrorPopup",
4077
+ "DonationType",
4078
+ "ThreeDSecureCavv",
4079
+ "GoogleCardNumber",
4080
+ "GoogleExpirationYear",
4081
+ "GoogleExpirationMonth",
4082
+ "CanSkipAuthentication",
4083
+ "CartTitle",
4084
+ "IsDirectDebit",
4085
+ "EnableHooxOffers",
4086
+ "HooxID",
4087
+ "SupportedCardBrands",
4088
+ "IsDirectDebitSplitPayments",
4089
+ "ApplePayApplicationData",
4090
+ "ShowPaymentButton",
4091
+ "OrderSummeryTitle",
4092
+ "AllowBitEmptyCardOwnerName",
4093
+ "IsCreateToken",
4094
+ "TurnstileSiteKey",
4095
+ "PrivacyPolicyUrl",
4096
+ "DualCardsBINs",
4097
+ "IsHideCart",
4098
+ "IsJ5"
4099
+ ]);
4100
+ var FIELD_KEYS = /* @__PURE__ */ Object.freeze([
4101
+ "Ref",
4102
+ "Id",
4103
+ "Order",
4104
+ "InputType",
4105
+ "Required",
4106
+ "PreventPaste",
4107
+ "Show",
4108
+ "Data",
4109
+ "Value",
4110
+ "Direction",
4111
+ "Disabled"
4112
+ ]);
4113
+ var PRODUCT_KEYS = /* @__PURE__ */ Object.freeze([
4114
+ "MinQuantity",
4115
+ "MaxQuantity",
4116
+ "JumpsInQuantity",
4117
+ "SelectedBuyQuantity",
4118
+ "QuantityOptions",
4119
+ "Comments",
4120
+ "IsManualSum",
4121
+ "PaymentsOptions",
4122
+ "IsCouponActive",
4123
+ "ManualPrice",
4124
+ "ManualPriceTxt",
4125
+ "IsVatFree",
4126
+ "SpecialPrices",
4127
+ "PreConfiguredPrice",
4128
+ "IsPreSelected",
4129
+ "CurrentInventory",
4130
+ "CheckInventory",
4131
+ "uid",
4132
+ "imageUrl",
4133
+ "name",
4134
+ "description",
4135
+ "BasePrice",
4136
+ "PriceBeforeDiscount",
4137
+ "BaseISOCurrency",
4138
+ "PriceToShow",
4139
+ "PriceBeforeDiscountToShow",
4140
+ "IsCurrent"
4141
+ ]);
4142
+ var CURRENCY_KEYS = /* @__PURE__ */ Object.freeze(["Code", "AlphabeticCode", "ValueToNis", "NameHeb", "NameEn", "CoinSing"]);
4143
+ var NO_COUPON = '{"IsActivatedByUser":false,"IsActive":false,"CouponCode":"","IsValid":false,"DiscountType":0,"DiscountValue":0,"CouponType":1}';
4144
+ var FRESH_MANUAL_SUM = '{"Ref":"","Id":0,"Order":0,"InputType":0,"Required":false,"PreventPaste":false,"Show":true,"Data":{"Label":"","validators":[],"SelectList":[]},"Value":"","Direction":0,"Disabled":false}';
4145
+ var DONATION = /* @__PURE__ */ Object.freeze({ none: 0, monthly: 1, multiple: 2, single: 3 });
4146
+ var PAGE_ID = /^[A-Za-z0-9_-]{16,32}$/;
4147
+ var DEAL_ID = /^[0-9a-z]{6,40}$/;
4148
+ var PRODUCT_ID = /^[A-Za-z0-9_-]{8,64}$/;
4149
+ var TOKEN3 = /^[A-Za-z0-9_.:+/=-]{1,8192}$/;
4150
+ var SCREEN = /^[0-9]{1,5}$/;
4151
+ var LANGUAGE2 = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8}){0,3}$/;
4152
+ var CARD_NUMBER13 = /^[0-9]{12,19}$/;
4153
+ var MONTH13 = /^(?:[1-9]|1[0-2])$/;
4154
+ var YEAR14 = /^20[0-9]{2}$/;
4155
+ var CODE5 = /^[0-9]{3,4}$/;
4156
+ var TEXT_LIMIT8 = 256;
4157
+ var LONG_TEXT_LIMIT = BODY_LIMIT25;
4158
+ var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4159
+ var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4160
+ var sameKeys9 = (value, keys) => {
4161
+ const own12 = Object.keys(value);
4162
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
4163
+ };
4164
+ var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
4165
+ var printable3 = (text9) => [...text9].every((character) => {
4166
+ const point = character.codePointAt(0);
4167
+ return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
4168
+ });
4169
+ var text6 = (value, limit = TEXT_LIMIT8) => typeof value === "string" && value.length <= limit && printable3(value);
4170
+ var pageText = (value, limit = LONG_TEXT_LIMIT) => value === null || typeof value === "string" && value.length <= limit;
4171
+ var whole = (value, min = 0, max = Number.MAX_SAFE_INTEGER) => Number.isSafeInteger(value) && value >= min && value <= max;
4172
+ var flag = (value) => typeof value === "boolean";
4173
+ var optionalFlag = (value) => value === null || flag(value);
4174
+ var refuse27 = (code) => Object.freeze({ verdict: "refuse", code });
4175
+ var CARD26 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
4176
+ function luhn5(digits4) {
4177
+ let sum = 0;
4178
+ for (let at = 0; at < digits4.length; at += 1) {
4179
+ let digit = Number(digits4[digits4.length - 1 - at]);
4180
+ if (at % 2 === 1) {
4181
+ digit *= 2;
4182
+ if (digit > 9)
4183
+ digit -= 9;
4184
+ }
4185
+ sum += digit;
3913
4186
  }
3914
- if (!recognizer || recognizer.psp !== "elavon_converge")
4187
+ return sum % 10 === 0;
4188
+ }
4189
+ function cents(value) {
4190
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > 1e7)
3915
4191
  return null;
3916
- if (url !== void 0 && !isConvergeProcessUrl(url))
3917
- return { verdict: "refuse", code: "converge_url_refused" };
3918
- return convergeBodyVerdict(body);
4192
+ const minor = Math.round(value * 100);
4193
+ return Math.abs(minor - value * 100) < 1e-6 ? minor : null;
3919
4194
  }
3920
- function carriesCardFields(recognizer, body) {
3921
- const gate = processorGate(recognizer, void 0, body);
3922
- if (gate !== null)
3923
- return gate.verdict === "card";
3924
- if (recognizer && recognizer.encoding === "json") {
3925
- const claimed = carriesJsonCardFields(recognizer.jsonCardFields, body, DECLARED_PATHS_ONLY.has(recognizer.psp));
3926
- return claimed && recognizer.psp === "amadeus_checkout" ? amadeusBodyKind(body) === "card" : claimed;
3927
- }
3928
- const fields = recognizer && recognizer.cardFields;
3929
- if (!Array.isArray(fields) || fields.length === 0)
3930
- return true;
3931
- if (recognizer.encoding !== "form")
3932
- return true;
3933
- if (typeof body !== "string" || body === "")
4195
+ function isCardcomSubmitUrl(url) {
4196
+ if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
3934
4197
  return false;
3935
- const anyCase = recognizer.caseInsensitiveFormKeys === true;
3936
- const wanted = anyCase ? fields.map((field) => String(field).toLowerCase()) : fields;
3937
- for (const chunk of body.split("&")) {
3938
- const eq = chunk.indexOf("=");
3939
- if (eq <= 0 || eq === chunk.length - 1)
3940
- continue;
3941
- let key;
3942
- try {
3943
- key = decodeURIComponent(chunk.slice(0, eq).replace(/\+/g, " "));
3944
- }
3945
- catch {
3946
- continue;
3947
- }
3948
- if (wanted.includes(anyCase ? key.trim().toLowerCase() : key))
3949
- return true;
3950
- }
3951
- return false;
3952
- }
3953
- var DECLARED_PATHS_ONLY = /* @__PURE__ */ new Set(["primer", "pelecard", "creditguard", "payrails"]);
3954
- function carriesJsonCardFields(paths, body, declaredOnly) {
3955
- if (!Array.isArray(paths) || paths.length === 0 || !paths.every((path) => isJsonPath(path) && path.length > 0))
3956
- return true;
3957
- if (declaredOnly)
3958
- return declaredPathHoldsCard(paths, body);
3959
4198
  let parsed;
3960
4199
  try {
3961
- parsed = typeof body === "string" ? JSON.parse(body) : void 0;
4200
+ parsed = new URL(url);
3962
4201
  }
3963
4202
  catch {
3964
- return true;
3965
- }
3966
- if (!isPlainObject(parsed))
3967
- return true;
3968
- if (paths.some((path) => {
3969
- const at = jsonAt(parsed, path);
3970
- return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
3971
- }))
3972
- return true;
3973
- const declared = /* @__PURE__ */ new Set();
3974
- for (const path of paths) {
3975
- const last = path[path.length - 1];
3976
- if (typeof last === "string")
3977
- declared.add(last.toLowerCase());
4203
+ return false;
3978
4204
  }
3979
- return namesCardNumber(parsed, declared);
4205
+ return parsed.href === url && parsed.protocol === "https:" && !parsed.port && !parsed.username && !parsed.password && !parsed.search && !parsed.hash && parsed.hostname === CARDCOM_HOST && parsed.pathname === CARDCOM_SUBMIT_PATH;
3980
4206
  }
3981
- function declaredPathHoldsCard(paths, body) {
3982
- if (typeof body !== "string" || body === "")
3983
- return false;
3984
- let parsed;
4207
+ function readBody15(body) {
4208
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT25)
4209
+ return null;
4210
+ let value;
3985
4211
  try {
3986
- parsed = JSON.parse(body);
4212
+ value = JSON.parse(body);
4213
+ if (!record22(value) || JSON.stringify(value) !== body)
4214
+ return null;
3987
4215
  }
3988
4216
  catch {
3989
- return false;
4217
+ return null;
3990
4218
  }
3991
- return paths.some((path) => {
3992
- const at = jsonAt(parsed, path);
3993
- return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
3994
- });
4219
+ return value;
3995
4220
  }
3996
- function namesCardNumber(root, declared) {
3997
- const pending = [root];
3998
- while (pending.length > 0) {
3999
- const node = pending.pop();
4000
- const named = !Array.isArray(node);
4001
- for (const key of Object.keys(node)) {
4002
- if (named) {
4221
+ function field(value) {
4222
+ return record22(value) && sameKeys9(value, FIELD_KEYS) && text6(value.Ref, 64) && whole(value.Id) && whole(value.Order) && whole(value.InputType) && flag(value.Required) && flag(value.PreventPaste) && flag(value.Show) && record22(value.Data) && typeof value.Value === "string" && value.Value.length <= 4096 && whole(value.Direction) && flag(value.Disabled);
4223
+ }
4224
+ var optionalField = (value) => value === null || field(value);
4225
+ function selectValues(value) {
4226
+ const list = field(value) ? value.Data.SelectList : null;
4227
+ if (!Array.isArray(list) || list.length === 0)
4228
+ return null;
4229
+ return list.map((option) => record22(option) && typeof option.value === "string" ? option.value : null);
4230
+ }
4231
+ function commonStore(value) {
4232
+ return record22(value) && sameKeys9(value, COMMON_KEYS) && exact3(PAGE_ID, value.Uid) && (value.OldUid === null || value.OldUid === "" || value.OldUid === value.Uid) && whole(value.TerminalNumber, 1, 99999999) && whole(value.TerminalType) && value.StoreInitialized === true && pageText(value.SuccessRedirectUrl) && pageText(value.ErrorRedirectUrl) && pageText(value.BackgroundImageUrl) && pageText(value.AdditionalDataJson) && exact3(LANGUAGE2, value.Language) && exact3(DEAL_ID, value.UniqTempDealID) && value.IsError === false && value.ErrorCode === 0 && value.ErrorMessage === "" && value.OpeningText === "" && flag(value.IsEA5SinglePage) && whole(value.CurrentCardcomBitIntervalId) && value.SapakMutav === "" && flag(value.ShowCookiesBanner) && flag(value.HideFooter) && value.LPVersion === 0;
4233
+ }
4234
+ function companyStore(value) {
4235
+ return record22(value) && sameKeys9(value, COMPANY_KEYS) && whole(value.CompanyNumber, 1) && COMPANY_KEYS.slice(1).every((key) => key.startsWith("Show") ? flag(value[key]) : pageText(value[key]));
4236
+ }
4237
+ var SUM_TEXT = /^(?:0*[1-9][0-9]*(?:\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$/;
4238
+ var sumText = (text9, sum) => text9 === null || typeof text9 === "string" && SUM_TEXT.test(text9) && Number.parseFloat(text9) === sum;
4239
+ function chosenProduct(value) {
4240
+ return record22(value) && sameKeys9(value, PRODUCT_KEYS) && whole(value.MinQuantity) && whole(value.MaxQuantity) && whole(value.JumpsInQuantity) && value.SelectedBuyQuantity === 1 && Array.isArray(value.QuantityOptions) && value.QuantityOptions.length === 0 && pageText(value.Comments) && flag(value.IsManualSum) && Array.isArray(value.PaymentsOptions) && flag(value.IsCouponActive) && typeof value.ManualPrice === "number" && sumText(value.ManualPriceTxt, value.ManualPrice) && flag(value.IsVatFree) && Array.isArray(value.SpecialPrices) && (value.PreConfiguredPrice === null || typeof value.PreConfiguredPrice === "number") && flag(value.IsPreSelected) && typeof value.CurrentInventory === "number" && flag(value.CheckInventory) && exact3(PRODUCT_ID, value.uid) && pageText(value.imageUrl) && typeof value.name === "string" && pageText(value.name) && pageText(value.description) && typeof value.BasePrice === "number" && typeof value.PriceBeforeDiscount === "number" && whole(value.BaseISOCurrency) && typeof value.PriceToShow === "number" && typeof value.PriceBeforeDiscountToShow === "number" && flag(value.IsCurrent);
4241
+ }
4242
+ var DAY_RATES = /* @__PURE__ */ Object.freeze({ 1: 1, 826: 4.1194, 840: 3.089, 978: 3.4769 });
4243
+ var dayRate = (code, rate) => typeof rate === "number" && Number.isFinite(rate) && (code === 1 ? rate === 1 : rate >= DAY_RATES[code] * 0.75 && rate <= DAY_RATES[code] * 1.25);
4244
+ function chargedCurrency(value) {
4245
+ return record22(value) && sameKeys9(value, CURRENCY_KEYS) && whole(value.Code) && owns6(CARDCOM_CURRENCIES, value.Code) && value.AlphabeticCode === CARDCOM_CURRENCIES[value.Code].toUpperCase() && dayRate(value.Code, value.ValueToNis) && pageText(value.NameHeb) && pageText(value.NameEn) && pageText(value.CoinSing);
4246
+ }
4247
+ function freshProductsStore(products) {
4248
+ return {
4249
+ Title: "",
4250
+ isDonation: false,
4251
+ showCurrencyConvert: false,
4252
+ currencies: [],
4253
+ selectedCurrency: products.selectedCurrency,
4254
+ coupon: products.coupon,
4255
+ couponCalculatedDiscount: 0,
4256
+ CurrentCouponCode: "",
4257
+ products: products.products,
4258
+ deliveryMethods: products.deliveryMethods,
4259
+ haveImages: false,
4260
+ isCouponActive: false,
4261
+ ShowProductPrice: false,
4262
+ ShowTotalPrice: false,
4263
+ ItemsDisplayType: 0,
4264
+ ManualSumField: JSON.parse(FRESH_MANUAL_SUM),
4265
+ ShowVatInfo: false,
4266
+ Vat: 0,
4267
+ TotalPriceNotRequireVat: 0,
4268
+ TotalPriceRequireVat: 0,
4269
+ TotalVat: 0,
4270
+ DiscountSum: 0,
4271
+ ShowDonationAmountsButtons: false,
4272
+ DonationDescription: ""
4273
+ };
4274
+ }
4275
+ function productsStore(value) {
4276
+ if (!record22(value) || !Array.isArray(value.products) || value.products.length !== 1 || !chosenProduct(value.products[0]) || !chargedCurrency(value.selectedCurrency) || !Array.isArray(value.deliveryMethods) || !value.deliveryMethods.every((method) => record22(method) && method.IsCurrent === false && typeof method.PriceToShow === "number") || JSON.stringify(value.coupon) !== NO_COUPON)
4277
+ return false;
4278
+ return JSON.stringify(freshProductsStore(value)) === JSON.stringify(value);
4279
+ }
4280
+ function deliveryStore(value) {
4281
+ return record22(value) && sameKeys9(value, DELIVERY_KEYS) && flag(value.ShowDeliveryForm) && DELIVERY_KEYS.slice(1, 9).every((key) => optionalField(value[key])) && Array.isArray(value.Cities) && value.Cities.length === 0 && Array.isArray(value.Streets) && value.Streets.length === 0;
4282
+ }
4283
+ function documentStore(value) {
4284
+ return record22(value) && sameKeys9(value, DOCUMENT_KEYS) && flag(value.ShowInvoiceForm) && pageText(value.Comments) && pageText(value.Title) && DOCUMENT_KEYS.slice(3, 12).every((key) => optionalField(value[key])) && flag(value.SendPreBuyDataToServer) && whole(value.DocTypeToCreate);
4285
+ }
4286
+ function detailsStore(value) {
4287
+ return record22(value) && sameKeys9(value, DETAILS_KEYS) && flag(value.ShowDetailsForm) && value.ShowCancelBtn === false && value.CancelUrl === "" && pageText(value.Comments) && Array.isArray(value.FormFields) && value.FormFields.every(field);
4288
+ }
4289
+ function pageCard(payment) {
4290
+ const number = payment.CardNumberField.Value;
4291
+ const years = selectValues(payment.YearsField);
4292
+ return CARD_NUMBER13.test(number) && luhn5(number) && MONTH13.test(payment.MonthsField.Value) && YEAR14.test(payment.YearsField.Value) && (years === null || years.includes(payment.YearsField.Value)) && CODE5.test(payment.CvvField.Value) && payment.CardOwnerNameField.Value.length >= 2 && text6(payment.CardOwnerNameField.Value, 100);
4293
+ }
4294
+ function paymentStore(value) {
4295
+ if (!record22(value) || !sameKeys9(value, PAYMENT_KEYS))
4296
+ return false;
4297
+ const fields = [
4298
+ "EmailField",
4299
+ "MobileField",
4300
+ "CardNumberField",
4301
+ "YearsField",
4302
+ "MonthsField",
4303
+ "CvvField",
4304
+ "CardOwnerNameField",
4305
+ "CardTZField",
4306
+ "PaymentsField",
4307
+ "OpenSumField"
4308
+ ];
4309
+ const untouched = ["CardOwnerCityField", "CardOwnerAddressField", "CardOwnerZipcodeField"];
4310
+ const flags = [
4311
+ "HideCreditCardFieldsOnZeroSum",
4312
+ "ApprovedTermsAndConditions",
4313
+ "ShowTermsAndConditions",
4314
+ "AllowMerchantMessages",
4315
+ "MustAllowMerchantMessages",
4316
+ "ShowMerchantMessages",
4317
+ "ShowPayPal",
4318
+ "ShowUpayBitButton",
4319
+ "ShowPayMeBitButton",
4320
+ "ShowCardcomBitButton",
4321
+ "ShowApplePay",
4322
+ "ShowGooglePay",
4323
+ "ShowRecaptcha",
4324
+ "IsCredit",
4325
+ "Is3DSecureEnabled",
4326
+ "ShowSuccessPopup",
4327
+ "ShowErrorPopup",
4328
+ "CanSkipAuthentication",
4329
+ "IsDirectDebit",
4330
+ "EnableHooxOffers",
4331
+ "IsDirectDebitSplitPayments",
4332
+ "ShowPaymentButton",
4333
+ "AllowBitEmptyCardOwnerName",
4334
+ "IsCreateToken",
4335
+ "IsHideCart",
4336
+ "IsJ5"
4337
+ ];
4338
+ const texts = [
4339
+ "Comments",
4340
+ "ButtonText",
4341
+ "ButtonTextZeroSum",
4342
+ "TermsAndConditionsUrl",
4343
+ "MerchantApplePayLogoUrl",
4344
+ "RecaptchaVersion",
4345
+ "CartTitle",
4346
+ "HooxID",
4347
+ "ApplePayApplicationData",
4348
+ "OrderSummeryTitle",
4349
+ "TurnstileSiteKey",
4350
+ "PrivacyPolicyUrl"
4351
+ ];
4352
+ return fields.every((key) => field(value[key])) && untouched.every((key) => JSON.stringify(value[key]) === "{}") && flags.every((key) => flag(value[key])) && texts.every((key) => pageText(value[key])) && whole(value.NumOfRetriesAllowed, 0, 99) && Array.isArray(value.Commissions) && value.Commissions.every(record22) && optionalFlag(value.Was3DSActiveOnPageLoad) && pageText(value.ThreeDSecureTransactionId) && pageText(value.ThreeDSecureCavv) && Object.values(DONATION).includes(value.DonationType) && value.GoogleCardNumber === "" && value.GoogleExpirationYear === "0" && value.GoogleExpirationMonth === "0" && Array.isArray(value.SupportedCardBrands) && value.SupportedCardBrands.every((brand) => text6(brand, 32)) && Array.isArray(value.DualCardsBINs) && value.DualCardsBINs.every(record22) && pageCard(value);
4353
+ }
4354
+ function threeDsBlock(value, block) {
4355
+ const { CommonStore: common, ProductsStore: products, PaymentStore: payment } = value.Store;
4356
+ if (!record22(block) || !sameKeys9(block, THREE_DS_KEYS) || typeof block.RequestedBillingAmount !== "number" || !exact3(LANGUAGE2, block.browserLanguage) || !exact3(SCREEN, block._3ds_browserscreenheight) || !exact3(SCREEN, block._3ds_browserscreenwidth) || !exact3(SCREEN, block._3ds_browsercolordepth))
4357
+ return false;
4358
+ const rebuilt = {
4359
+ TerminalNum: common.TerminalNumber,
4360
+ CoinId: products.selectedCurrency.Code,
4361
+ CardNumber: payment.CardNumberField.Value,
4362
+ CardholderFullName: payment.CardOwnerNameField.Value,
4363
+ CardholderPhone: payment.MobileField.Value,
4364
+ CardHolderEmail: payment.EmailField.Value,
4365
+ CVV: payment.CvvField.Value,
4366
+ CardExpireMonth: payment.MonthsField.Value,
4367
+ CardExpireYear: payment.YearsField.Value.substr(2, 2),
4368
+ RequestedBillingAmount: block.RequestedBillingAmount,
4369
+ UserAgentHeader: value.UserAgent,
4370
+ browserLanguage: block.browserLanguage,
4371
+ _3ds_browserjavaenabled: "true",
4372
+ _3ds_browserscreenheight: block._3ds_browserscreenheight,
4373
+ _3ds_browserscreenwidth: block._3ds_browserscreenwidth,
4374
+ _3ds_browsercolordepth: block._3ds_browsercolordepth,
4375
+ _3ds_challengewindowsize: "05",
4376
+ _3ds_channel: "02",
4377
+ _3ds_category: "01",
4378
+ _3ds_transtype: "01",
4379
+ ExternalAisurit4DealPageUID: common.Uid,
4380
+ DealToSaveJSON: "",
4381
+ GooglePayToken: "",
4382
+ DirectDebitSplitPaymentsSum: 0,
4383
+ SapakMutav: ""
4384
+ };
4385
+ return JSON.stringify(rebuilt) === JSON.stringify(block);
4386
+ }
4387
+ var hooxReference = (value) => value === null || value === "" || whole(value) || typeof value === "string" && /^[\x21-\x7e]{1,256}$/.test(value);
4388
+ function pageBody(body) {
4389
+ const value = readBody15(body);
4390
+ if (value === null || !sameKeys9(value, TOP_KEYS2) || typeof value.GoogleToken !== "string" || value.GoogleToken !== "" && !TOKEN3.test(value.GoogleToken) || value.UserAgent === "" || !text6(value.UserAgent, 1024) || !whole(value.NumberOfTries, 1, 10) || value.GooglePayToken !== "" || !hooxReference(value.HooxReference) || !record22(value.Store) || !sameKeys9(value.Store, STORE_KEYS))
4391
+ return null;
4392
+ const store = value.Store;
4393
+ if (!commonStore(store.CommonStore) || !companyStore(store.CompanyInfoStore) || !productsStore(store.ProductsStore) || !deliveryStore(store.DeliveryStore) || !documentStore(store.DocumentStore) || !detailsStore(store.DetailsStore) || !paymentStore(store.PaymentStore) || !threeDsBlock(value, value._3DSecureReq))
4394
+ return null;
4395
+ const product = store.ProductsStore.products[0];
4396
+ const price = cents(product.PriceToShow);
4397
+ if (price === null || cents(value._3DSecureReq.RequestedBillingAmount) !== price || product.BaseISOCurrency !== store.ProductsStore.selectedCurrency.Code || product.IsManualSum && product.ManualPrice !== product.PriceToShow)
4398
+ return null;
4399
+ if (store.PaymentStore.ShowRecaptcha !== (value.GoogleToken !== ""))
4400
+ return null;
4401
+ return value;
4402
+ }
4403
+ function cardcomBodyVerdict(body, url) {
4404
+ if (url !== void 0 && !isCardcomSubmitUrl(url))
4405
+ return refuse27("cardcom_url_refused");
4406
+ const value = pageBody(body);
4407
+ if (value === null)
4408
+ return refuse27("cardcom_body_unsupported");
4409
+ const payment = value.Store.PaymentStore;
4410
+ const receiptId = value.Store.DocumentStore.IdField;
4411
+ if (payment.Is3DSecureEnabled || payment.Was3DSActiveOnPageLoad === true || payment.ThreeDSecureTransactionId || payment.ThreeDSecureCavv) {
4412
+ return refuse27("cardcom_three_d_secure_refused");
4413
+ }
4414
+ if (payment.IsCreateToken || payment.IsJ5)
4415
+ return refuse27("cardcom_card_saving_refused");
4416
+ if (payment.IsDirectDebitSplitPayments || payment.PaymentsField.Value !== "1" || payment.DonationType === DONATION.monthly || payment.DonationType === DONATION.multiple || payment.IsDirectDebit && payment.DonationType !== DONATION.single) {
4417
+ return refuse27("cardcom_recurring_refused");
4418
+ }
4419
+ if (payment.CardTZField.Value !== "" || payment.CardTZField.Show && payment.CardTZField.Required || receiptId !== null && (receiptId.Value !== "" || receiptId.Show && receiptId.Required))
4420
+ return refuse27("cardcom_id_required");
4421
+ if (payment.ShowRecaptcha && payment.RecaptchaVersion !== "v3")
4422
+ return refuse27("cardcom_captcha_unsupported");
4423
+ return CARD26;
4424
+ }
4425
+ var CARDCOM_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
4426
+ Object.freeze({
4427
+ id: "machon_alte_usd",
4428
+ merchant: "Machon Alte",
4429
+ origins: Object.freeze([CARDCOM_ORIGIN]),
4430
+ page: "kzR5pTyr0kC3oqjpGbCMiQ",
4431
+ terminal: 162226,
4432
+ products: Object.freeze([Object.freeze({ uid: "JoQrlcuGCUWYM4I66eX7pw", currency: "usd", price: null })]),
4433
+ settings: "e38d7c7abce83a3a994a707e345595cf6ec2a15d77794a8eea70c0d5ce4773ab"
4434
+ })
4435
+ ]);
4436
+ // src/nexi-checkout.js
4437
+ var NEXI_CHECKOUT_PSP = "nexi_checkout";
4438
+ var NEXI_CHECKOUT_PAY_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.dibspayment.eu": "production", "test.checkout.dibspayment.eu": "test" });
4439
+ var NEXI_CHECKOUT_PAY_PATH = "/api/v1/pay";
4440
+ var BODY_LIMIT26 = 4096;
4441
+ var BODY_KEYS = /* @__PURE__ */ Object.freeze([
4442
+ "type",
4443
+ "paymentType",
4444
+ "acceptedTermsAndConditions",
4445
+ "amountConfirmedByConsumer",
4446
+ "surchargeAmount",
4447
+ "consumerCheckedSaveNewPaymentMethod",
4448
+ "consumerHasConsentedToRememberingNewDevice",
4449
+ "consumerWantsToBeAnonymous",
4450
+ "language"
4451
+ ]);
4452
+ var CARD_KEYS11 = /* @__PURE__ */ Object.freeze(["cardNumber", "cardVerificationCode", "cardholderName", "expiryMonth", "expiryYear"]);
4453
+ var CARD_NUMBER14 = /^[0-9]{13,19}$/;
4454
+ var MONTH14 = /^(?:0[1-9]|1[0-2])$/;
4455
+ var YEAR15 = /^[0-9]{2}$/;
4456
+ var CODE6 = /^[0-9]{3,4}$/;
4457
+ var TEXT_LIMIT9 = 128;
4458
+ var EMAIL_LIMIT2 = 254;
4459
+ var LANGUAGE3 = /^[a-z]{2}-[a-z]{2}$/i;
4460
+ var AMOUNT_LIMIT2 = 2147483647;
4461
+ var record23 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4462
+ var own6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4463
+ var sameKeys10 = (value, keys) => {
4464
+ const found = Object.keys(value);
4465
+ return found.length === keys.length && found.every((key, at) => key === keys[at]);
4466
+ };
4467
+ var refuse28 = (code) => Object.freeze({ verdict: "refuse", code });
4468
+ var CARD27 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
4469
+ var printable4 = (text9) => [...text9].every((character) => {
4470
+ const point = character.codePointAt(0);
4471
+ return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
4472
+ });
4473
+ var text7 = (value, limit) => typeof value === "string" && value.length <= limit && printable4(value);
4474
+ function luhn6(digits4) {
4475
+ let sum = 0;
4476
+ for (let at = 0; at < digits4.length; at += 1) {
4477
+ let digit = Number(digits4[digits4.length - 1 - at]);
4478
+ if (at % 2 === 1) {
4479
+ digit *= 2;
4480
+ if (digit > 9)
4481
+ digit -= 9;
4482
+ }
4483
+ sum += digit;
4484
+ }
4485
+ return sum % 10 === 0;
4486
+ }
4487
+ function nexiCheckoutPayUrl(url) {
4488
+ if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
4489
+ return null;
4490
+ let parsed;
4491
+ try {
4492
+ parsed = new URL(url);
4493
+ }
4494
+ catch {
4495
+ return null;
4496
+ }
4497
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname !== NEXI_CHECKOUT_PAY_PATH)
4498
+ return null;
4499
+ if (!own6(NEXI_CHECKOUT_PAY_HOSTS, parsed.hostname))
4500
+ return null;
4501
+ return Object.freeze({ host: parsed.hostname, environment: NEXI_CHECKOUT_PAY_HOSTS[parsed.hostname] });
4502
+ }
4503
+ function isNexiCheckoutPayUrl(url) {
4504
+ return nexiCheckoutPayUrl(url) !== null;
4505
+ }
4506
+ function readBody16(body) {
4507
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT26)
4508
+ return null;
4509
+ let value;
4510
+ try {
4511
+ value = JSON.parse(body);
4512
+ if (!record23(value) || JSON.stringify(value) !== body)
4513
+ return null;
4514
+ }
4515
+ catch {
4516
+ return null;
4517
+ }
4518
+ return value;
4519
+ }
4520
+ function cardFormValues(card) {
4521
+ if (!record23(card))
4522
+ return false;
4523
+ const keys = Object.keys(card);
4524
+ const expected = own6(card, "email") ? CARD_KEYS11.length + 1 : CARD_KEYS11.length;
4525
+ if (keys.length !== expected || !CARD_KEYS11.every((key) => own6(card, key)))
4526
+ return false;
4527
+ if (own6(card, "email") && !text7(card.email, EMAIL_LIMIT2))
4528
+ return false;
4529
+ return typeof card.cardNumber === "string" && CARD_NUMBER14.test(card.cardNumber) && luhn6(card.cardNumber) && typeof card.cardVerificationCode === "string" && CODE6.test(card.cardVerificationCode) && text7(card.cardholderName, TEXT_LIMIT9) && card.cardholderName.trim() !== "" && typeof card.expiryMonth === "string" && MONTH14.test(card.expiryMonth) && typeof card.expiryYear === "string" && YEAR15.test(card.expiryYear);
4530
+ }
4531
+ var amount = (value, least) => Number.isSafeInteger(value) && value >= least && value <= AMOUNT_LIMIT2;
4532
+ var flag2 = (value) => typeof value === "boolean";
4533
+ function nexiCheckoutBodyVerdict(body, url) {
4534
+ if (url !== void 0 && !isNexiCheckoutPayUrl(url))
4535
+ return refuse28("nexi_checkout_url_refused");
4536
+ const value = readBody16(body);
4537
+ if (value === null || !sameKeys10(value, BODY_KEYS))
4538
+ return refuse28("nexi_checkout_body_unsupported");
4539
+ if (value.type !== "card" || !record23(value.paymentType) || !sameKeys10(value.paymentType, ["card"]) || !cardFormValues(value.paymentType.card) || !flag2(value.acceptedTermsAndConditions) || !amount(value.amountConfirmedByConsumer, 1) || !amount(value.surchargeAmount, 0) || !flag2(value.consumerCheckedSaveNewPaymentMethod) || !flag2(value.consumerHasConsentedToRememberingNewDevice) || !flag2(value.consumerWantsToBeAnonymous) || typeof value.language !== "string" || value.language !== "" && !LANGUAGE3.test(value.language))
4540
+ return refuse28("nexi_checkout_body_unsupported");
4541
+ if (value.consumerCheckedSaveNewPaymentMethod || value.consumerHasConsentedToRememberingNewDevice)
4542
+ return refuse28("nexi_checkout_card_saving_refused");
4543
+ if (value.surchargeAmount !== 0)
4544
+ return refuse28("nexi_checkout_surcharge_refused");
4545
+ return CARD27;
4546
+ }
4547
+ // src/toast.js
4548
+ var TOAST_PSP = "toast";
4549
+ var TOAST_PAYMENT_METHODS_URL = "https://payments.toasttab.com/v1/payment-methods";
4550
+ var TOAST_KEY_ID = "RSA-OAEP-SHA1::bacb4887-8314-4c23-98fc-d5ef7bc99e94_oo-legacy-browsers";
4551
+ var TOAST_SUBSTITUTION = /* @__PURE__ */ Object.freeze({ at: "card", fields: Object.freeze(["cardData"]) });
4552
+ var BODY_LIMIT27 = 8192;
4553
+ var ROOT_KEYS9 = /* @__PURE__ */ Object.freeze(["type", "card", "sessionSecret", "usage", "setupFutureUsage", "billingDetails"]);
4554
+ var CARD_KEYS12 = /* @__PURE__ */ Object.freeze(["keyId", "cardData"]);
4555
+ var WALLETS = /* @__PURE__ */ Object.freeze(["APPLE_PAY", "GOOGLE_PAY"]);
4556
+ var SESSION_SECRET = /^[\x21-\x7e]{1,1024}$/;
4557
+ var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
4558
+ var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
4559
+ var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4560
+ var sameKeys11 = (value, keys) => {
4561
+ const own12 = Object.keys(value);
4562
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
4563
+ };
4564
+ var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
4565
+ var failed = (code) => (
4566
+ /** @type {ToastBodyReadJs} */
4567
+ Object.freeze({ ok: false, code }));
4568
+ var CARD28 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
4569
+ var CONTINUE10 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
4570
+ function isWalletBody(parsed) {
4571
+ const card = parsed.card;
4572
+ const rootOk = sameKeys11(parsed, ["type", "card", "sessionSecret"]) || sameKeys11(parsed, ["type", "card", "sessionSecret", "billingDetails"]) && record24(parsed.billingDetails);
4573
+ return rootOk && WALLETS.includes(parsed.type) && record24(card) && sameKeys11(card, ["keyId", "cardData", "wallet"]) && card.keyId === null && typeof card.cardData === "string" && record24(card.wallet) && sameKeys11(card.wallet, ["type"]) && card.wallet.type === parsed.type && typeof parsed.sessionSecret === "string";
4574
+ }
4575
+ function isToastPaymentMethodsUrl(url) {
4576
+ return url === TOAST_PAYMENT_METHODS_URL;
4577
+ }
4578
+ function isToastCiphertext(value) {
4579
+ return typeof value === "string" && CIPHERTEXT_B64.test(value);
4580
+ }
4581
+ function readToastBody(body) {
4582
+ const malformed = failed("toast_body_malformed");
4583
+ if (typeof body !== "string" || body.length > BODY_LIMIT27)
4584
+ return malformed;
4585
+ let parsed;
4586
+ try {
4587
+ parsed = JSON.parse(body);
4588
+ }
4589
+ catch {
4590
+ return malformed;
4591
+ }
4592
+ if (!record24(parsed) || JSON.stringify(parsed) !== body)
4593
+ return malformed;
4594
+ if (isWalletBody(parsed))
4595
+ return (
4596
+ /** @type {ToastBodyReadJs} */
4597
+ Object.freeze({ ok: false, wallet: true }));
4598
+ const card = parsed.card;
4599
+ if (!sameKeys11(parsed, ROOT_KEYS9) || parsed.type !== "CARD" || !record24(card) || !sameKeys11(card, CARD_KEYS12))
4600
+ return malformed;
4601
+ if (typeof card.keyId !== "string")
4602
+ return malformed;
4603
+ if (card.keyId !== TOAST_KEY_ID)
4604
+ return failed("toast_foreign_key");
4605
+ if (!isToastCiphertext(card.cardData))
4606
+ return malformed;
4607
+ if (typeof parsed.sessionSecret !== "string" || !SESSION_SECRET.test(parsed.sessionSecret))
4608
+ return malformed;
4609
+ if (parsed.usage !== null || parsed.setupFutureUsage !== null)
4610
+ return failed("toast_keeps_card");
4611
+ const billing = parsed.billingDetails;
4612
+ if (!record24(billing) || !sameKeys11(billing, ["postalCode"]) || typeof billing.postalCode !== "string" || !POSTAL_CODE4.test(billing.postalCode))
4613
+ return malformed;
4614
+ const read = { ok: true, sessionSecret: parsed.sessionSecret, postalCode: billing.postalCode, cardData: card.cardData };
4615
+ return Object.freeze(read);
4616
+ }
4617
+ function toastBodyVerdict(body) {
4618
+ const read = readToastBody(body);
4619
+ if (read.ok)
4620
+ return CARD28;
4621
+ return read.wallet ? CONTINUE10 : refuse29(read.code);
4622
+ }
4623
+ // src/fastspring.js
4624
+ var FASTSPRING_PSP = "fastspring";
4625
+ var FASTSPRING_STORE_PINS = /* @__PURE__ */ Object.freeze([
4626
+ Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" })
4627
+ ]);
4628
+ var URL_LIMIT11 = 256;
4629
+ var BODY_LIMIT28 = 32768;
4630
+ var STORE = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
4631
+ var CARD_URL = new RegExp(`^https://(${STORE})(\\.test)?\\.onfastspring\\.com((?:/(?:popup|embedded)-[A-Za-z0-9_-]{1,64})?)/session/([A-Za-z0-9_-]{16,64})/payment$`);
4632
+ var DIGITS = /^[0-9]{12,19}$/;
4633
+ var MONTH15 = /^(?:0?[1-9]|1[0-2])$/;
4634
+ var YEAR16 = /^(?:[0-9]{2}|[0-9]{4})$/;
4635
+ var SECURITY_CODE16 = /^[0-9]{3,4}$/;
4636
+ var CARD_KEYS13 = /* @__PURE__ */ Object.freeze(["year", "month", "number", "security"]);
4637
+ var SAVED_CARD_KEYS = /* @__PURE__ */ Object.freeze(["savedCardId", "savedCardEnding", "savedCardBin", "variantType"]);
4638
+ var BODY_KEYS2 = /* @__PURE__ */ new Set([
4639
+ "contact",
4640
+ "card",
4641
+ "sepa",
4642
+ "ach",
4643
+ "pad",
4644
+ "bacs",
4645
+ "upi",
4646
+ "mercadopago",
4647
+ "cpfNumber",
4648
+ "dniNumber",
4649
+ "googlepay",
4650
+ "applepay",
4651
+ "paymentKlarna",
4652
+ "paymentType",
4653
+ "subscribe",
4654
+ "captcha",
4655
+ "recipientSelected",
4656
+ "recipient",
4657
+ "customerReference",
4658
+ "autoRenew",
4659
+ "fingerprint",
4660
+ "savedPaypalId",
4661
+ "savedVenmoId",
4662
+ "cashapp"
4663
+ ]);
4664
+ var METHOD_KEYS = /* @__PURE__ */ Object.freeze(["sepa", "ach", "pad", "bacs", "upi", "mercadopago", "googlepay", "applepay", "paymentKlarna"]);
4665
+ var SAVED_METHOD_KEYS = /* @__PURE__ */ Object.freeze(["savedPaypalId", "savedVenmoId", "cashapp"]);
4666
+ var TEXT2 = /^[^\x00-\x1f\x7f]{0,256}$/;
4667
+ var IP_ADDRESS = /^[0-9A-Fa-f.:]{2,45}$/;
4668
+ var FINGERPRINT_KEYS = /* @__PURE__ */ Object.freeze(["uniqueId", "fingerprintHash"]);
4669
+ var CARD_MEMBER3 = /^(?:card_?number|cc_?number|pan|cvc2?|cvv2?|security_?code)$/i;
4670
+ var record25 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4671
+ var own7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4672
+ var nothing = (value) => value === void 0 || value === null || value === "" || value === false;
4673
+ var refuse30 = (code) => Object.freeze({ verdict: "refuse", code });
4674
+ var CARD29 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
4675
+ var CONTINUE11 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
4676
+ function fastspringCardUrl(url) {
4677
+ if (typeof url !== "string" || url.length > URL_LIMIT11 || url.includes("?") || url.includes("#"))
4678
+ return null;
4679
+ let parsed;
4680
+ try {
4681
+ parsed = new URL(url);
4682
+ }
4683
+ catch {
4684
+ return null;
4685
+ }
4686
+ if (parsed.href !== url || parsed.port || parsed.username || parsed.password)
4687
+ return null;
4688
+ const match = CARD_URL.exec(url);
4689
+ if (!match)
4690
+ return null;
4691
+ return Object.freeze({
4692
+ environment: match[2] ? "sandbox" : "production",
4693
+ store: match[1],
4694
+ storefront: match[3],
4695
+ session: match[4],
4696
+ sessionUrl: url.slice(0, -"/payment".length)
4697
+ });
4698
+ }
4699
+ function isFastspringCardUrl(url) {
4700
+ return fastspringCardUrl(url) !== null;
4701
+ }
4702
+ function readJson7(body) {
4703
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT28)
4704
+ return { parsed: null, exact: false };
4705
+ let parsed;
4706
+ try {
4707
+ parsed = JSON.parse(body);
4708
+ }
4709
+ catch {
4710
+ return { parsed: null, exact: false };
4711
+ }
4712
+ let exact5 = false;
4713
+ try {
4714
+ exact5 = JSON.stringify(parsed) === body;
4715
+ }
4716
+ catch {
4717
+ exact5 = false;
4718
+ }
4719
+ return { parsed, exact: exact5 };
4720
+ }
4721
+ function numberDigits(number) {
4722
+ if (typeof number !== "string")
4723
+ return null;
4724
+ const digits4 = number.replace(/ /g, "");
4725
+ if (!DIGITS.test(digits4))
4726
+ return null;
4727
+ return number === digits4 || number === digits4.replace(/(.{4})/g, "$1 ").trim() ? digits4 : null;
4728
+ }
4729
+ function emptyDetails(key, value) {
4730
+ if (nothing(value))
4731
+ return true;
4732
+ if (!record25(value))
4733
+ return false;
4734
+ return Object.entries(value).every(([name, leaf]) => nothing(leaf) || key === "sepa" && name === "ipAddress" && typeof leaf === "string" && IP_ADDRESS.test(leaf));
4735
+ }
4736
+ function namesCardOutside(parsed) {
4737
+ const pending = Object.entries(parsed).filter(([key]) => key !== "card").map(([, value]) => value).filter((value) => value !== null && typeof value === "object");
4738
+ if (Object.keys(parsed).some((key) => key !== "card" && CARD_MEMBER3.test(key)))
4739
+ return true;
4740
+ while (pending.length > 0) {
4741
+ const node = pending.pop();
4742
+ for (const key of Object.keys(node)) {
4743
+ if (!Array.isArray(node) && CARD_MEMBER3.test(key))
4744
+ return true;
4745
+ const value = node[key];
4746
+ if (value !== null && typeof value === "object")
4747
+ pending.push(value);
4748
+ }
4749
+ }
4750
+ return false;
4751
+ }
4752
+ var cardValues = (card) => record25(card) && (!nothing(card.number) || !nothing(card.security));
4753
+ function judgeCard2(parsed) {
4754
+ const card = parsed.card;
4755
+ if (record25(card) && SAVED_CARD_KEYS.some((key) => own7(card, key)))
4756
+ return "fastspring_saved_card";
4757
+ if (SAVED_METHOD_KEYS.some((key) => own7(parsed, key)))
4758
+ return "fastspring_saved_card";
4759
+ if (!Object.keys(parsed).every((key) => BODY_KEYS2.has(key)) || namesCardOutside(parsed))
4760
+ return "fastspring_body_unsupported";
4761
+ if (!record25(card) || Object.keys(card).length !== CARD_KEYS13.length || !CARD_KEYS13.every((key) => own7(card, key)) || numberDigits(card.number) === null || typeof card.month !== "string" || !MONTH15.test(card.month) || typeof card.year !== "string" || !YEAR16.test(card.year) || typeof card.security !== "string" || !SECURITY_CODE16.test(card.security))
4762
+ return "fastspring_body_unsupported";
4763
+ if (parsed.recipientSelected === true || own7(parsed, "recipient"))
4764
+ return "fastspring_gift";
4765
+ if (typeof parsed.recipientSelected !== "boolean")
4766
+ return "fastspring_body_unsupported";
4767
+ if (parsed.autoRenew === true)
4768
+ return "fastspring_keep_on_file";
4769
+ if (!nothing(parsed.autoRenew))
4770
+ return "fastspring_body_unsupported";
4771
+ for (const key of ["cpfNumber", "dniNumber"]) {
4772
+ if (nothing(parsed[key]))
4773
+ continue;
4774
+ return typeof parsed[key] === "string" ? "fastspring_local_route" : "fastspring_body_unsupported";
4775
+ }
4776
+ const captcha = parsed.captcha;
4777
+ if (!record25(captcha) || Object.keys(captcha).length !== 2 || typeof captcha.token !== "string" || typeof captcha.captchaType !== "string")
4778
+ return "fastspring_body_unsupported";
4779
+ if (captcha.token !== "" || captcha.captchaType !== "")
4780
+ return "fastspring_captcha_unsupported";
4781
+ if (own7(parsed, "customerReference"))
4782
+ return "fastspring_body_unsupported";
4783
+ if (!METHOD_KEYS.every((key) => emptyDetails(key, parsed[key])))
4784
+ return "fastspring_body_unsupported";
4785
+ const contact = parsed.contact;
4786
+ if (!record25(contact) || !Object.values(contact).every((value) => value === null || typeof value === "boolean" || typeof value === "string" && TEXT2.test(value)))
4787
+ return "fastspring_body_unsupported";
4788
+ if (!(parsed.subscribe === void 0 || parsed.subscribe === null || typeof parsed.subscribe === "boolean"))
4789
+ return "fastspring_body_unsupported";
4790
+ const fingerprint = parsed.fingerprint;
4791
+ if (fingerprint !== void 0 && !(record25(fingerprint) && Object.keys(fingerprint).every((key) => FINGERPRINT_KEYS.includes(key)) && Object.values(fingerprint).every((value) => value === null || typeof value === "number" && Number.isFinite(value) || typeof value === "string" && TEXT2.test(value))))
4792
+ return "fastspring_body_unsupported";
4793
+ return null;
4794
+ }
4795
+ function fastspringBodyVerdict(body) {
4796
+ const { parsed, exact: exact5 } = readJson7(body);
4797
+ if (!record25(parsed))
4798
+ return body === void 0 || body === null || body === "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
4799
+ if (parsed.paymentType !== "card") {
4800
+ if (cardValues(parsed.card) || namesCardOutside(parsed))
4801
+ return refuse30("fastspring_body_unsupported");
4802
+ return typeof parsed.paymentType === "string" && parsed.paymentType !== "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
4803
+ }
4804
+ if (!exact5)
4805
+ return refuse30("fastspring_body_unsupported");
4806
+ const code = judgeCard2(parsed);
4807
+ return code === null ? CARD29 : refuse30(code);
4808
+ }
4809
+ // src/omise.js
4810
+ var OMISE_PSP = "omise";
4811
+ var OMISE_TOKEN_URL = "https://vault.omise.co/tokens";
4812
+ var OMISE_CARD_KEYS = /* @__PURE__ */ Object.freeze([
4813
+ "number",
4814
+ "name",
4815
+ "expiration_month",
4816
+ "expiration_year",
4817
+ "security_code",
4818
+ "email",
4819
+ "phone_number",
4820
+ "country",
4821
+ "state",
4822
+ "city",
4823
+ "postal_code",
4824
+ "street1",
4825
+ "street2"
4826
+ ]);
4827
+ var BODY_LIMIT29 = 4096;
4828
+ var SECURITY_CODE17 = /^[0-9]{3,4}$/;
4829
+ var MONTH_TEXT2 = /^(?:0?[1-9]|1[0-2])$/;
4830
+ var YEAR_TEXT = /^(?:[0-9]{2}|20[0-9]{2})$/;
4831
+ var COUNTRY5 = /^[A-Za-z]{2}$/;
4832
+ var PHONE3 = /^\+?[0-9 ()-]{6,24}$/;
4833
+ var POSTAL_NUMBER_LIMIT = 99999999999;
4834
+ var TEXT_LIMIT10 = 256;
4835
+ var CONTROL11 = /[\u0000-\u001f\u007f]/;
4836
+ var NUMBER_FIELD = /^[0-9]+(?: [0-9]+){0,6}$/;
4837
+ var record26 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4838
+ var own8 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4839
+ var wellFormed2 = (value) => {
4840
+ try {
4841
+ encodeURIComponent(value);
4842
+ return true;
4843
+ }
4844
+ catch {
4845
+ return false;
4846
+ }
4847
+ };
4848
+ var digits2 = (value) => (value.match(/\p{Nd}/gu) ?? []).length;
4849
+ var plainText5 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT10 && !CONTROL11.test(value) && digits2(value) < 12 && wellFormed2(value);
4850
+ var optionalText2 = (value) => value === "" || plainText5(value);
4851
+ function luhnValid(run) {
4852
+ let sum = 0;
4853
+ for (let i = 0; i < run.length; i += 1) {
4854
+ let digit = run.charCodeAt(run.length - 1 - i) - 48;
4855
+ if (i % 2 === 1)
4856
+ digit = digit * 2 > 9 ? digit * 2 - 9 : digit * 2;
4857
+ sum += digit;
4858
+ }
4859
+ return sum % 10 === 0;
4860
+ }
4861
+ function cardShaped(value) {
4862
+ const groups = value.match(/[0-9]+/g) ?? [];
4863
+ for (let first = 0; first < groups.length; first += 1) {
4864
+ let run = "";
4865
+ for (let last = first; last < groups.length && run.length < 19; last += 1) {
4866
+ run += groups[last];
4867
+ if (run.length >= 13 && run.length <= 19 && run[0] >= "2" && run[0] <= "6" && luhnValid(run))
4868
+ return true;
4869
+ }
4870
+ }
4871
+ return false;
4872
+ }
4873
+ var phoneNumber = (value) => typeof value === "string" && PHONE3.test(value) && digits2(value) >= 6 && digits2(value) <= 15 && !cardShaped(value);
4874
+ var numberField = (value) => typeof value === "string" && NUMBER_FIELD.test(value) && digits2(value) >= 12 && digits2(value) <= 19;
4875
+ var refuse31 = (code) => Object.freeze({ verdict: "refuse", code });
4876
+ var CARD30 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
4877
+ function isOmiseTokenUrl(url) {
4878
+ return url === OMISE_TOKEN_URL;
4879
+ }
4880
+ function readBody17(body) {
4881
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT29)
4882
+ return null;
4883
+ let value;
4884
+ try {
4885
+ value = JSON.parse(body);
4886
+ if (!record26(value) || JSON.stringify(value) !== body)
4887
+ return null;
4888
+ }
4889
+ catch {
4890
+ return null;
4891
+ }
4892
+ return value;
4893
+ }
4894
+ function monthValue(value) {
4895
+ if (typeof value === "number")
4896
+ return Number.isSafeInteger(value) && value >= 1 && value <= 12;
4897
+ return typeof value === "string" && MONTH_TEXT2.test(value);
4898
+ }
4899
+ function yearValue(value) {
4900
+ if (typeof value === "number")
4901
+ return Number.isSafeInteger(value) && (value >= 0 && value <= 99 || value >= 2e3 && value <= 2099);
4902
+ return typeof value === "string" && YEAR_TEXT.test(value);
4903
+ }
4904
+ function cardMembers(card) {
4905
+ if (!record26(card) || !Object.keys(card).every((key) => OMISE_CARD_KEYS.includes(key)))
4906
+ return false;
4907
+ if (!numberField(card.number) || !plainText5(card.name) || !monthValue(card.expiration_month) || !yearValue(card.expiration_year) || typeof card.security_code !== "string" || !SECURITY_CODE17.test(card.security_code))
4908
+ return false;
4909
+ for (const key of ["email", "state", "city", "street1", "street2"]) {
4910
+ if (own8(card, key) && !optionalText2(card[key]))
4911
+ return false;
4912
+ }
4913
+ if (own8(card, "country") && (typeof card.country !== "string" || !COUNTRY5.test(card.country)))
4914
+ return false;
4915
+ if (own8(card, "phone_number") && !(card.phone_number === "" || phoneNumber(card.phone_number)))
4916
+ return false;
4917
+ if (own8(card, "postal_code")) {
4918
+ const code = card.postal_code;
4919
+ const sound = typeof code === "number" ? Number.isSafeInteger(code) && code >= 0 && code <= POSTAL_NUMBER_LIMIT : optionalText2(code);
4920
+ if (!sound)
4921
+ return false;
4922
+ }
4923
+ return true;
4924
+ }
4925
+ function omiseBodyVerdict(body) {
4926
+ const value = readBody17(body);
4927
+ if (value === null)
4928
+ return refuse31("omise_body_unsupported");
4929
+ const keys = Object.keys(value);
4930
+ if (keys.length !== 1 || keys[0] !== "card" || !cardMembers(value.card))
4931
+ return refuse31("omise_body_unsupported");
4932
+ return CARD30;
4933
+ }
4934
+ var pin10 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), keys: Object.freeze([...fields.keys]) });
4935
+ var OMISE_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
4936
+ pin10({ id: "taejai", merchant: "Taejai", origins: ["https://taejai.com"], keys: ["pkey_53q6mm66esjr563ob0h"] }),
4937
+ pin10({ id: "socialgiver", merchant: "Socialgiver", origins: ["https://www.socialgiver.com"], keys: ["pkey_5d5o2iahksmyrkybemg"] }),
4938
+ pin10({ id: "thireq_pecko_links", merchant: "Thireq Pecko", origins: ["https://linksplus.omise.co"], keys: ["pkey_65w70xniwsinf0gm680"] })
4939
+ ]);
4940
+ // src/xendit.js
4941
+ var XENDIT_PSP = "xendit";
4942
+ var XENDIT_TOKEN_URL = "https://api.xendit.co/v2/credit_card_tokens";
4943
+ var XENDIT_TOKEN_KEYS = /* @__PURE__ */ Object.freeze([
4944
+ "is_single_use",
4945
+ "card_data",
4946
+ "should_authenticate",
4947
+ "billing_details",
4948
+ "fp_session_id",
4949
+ "metadata",
4950
+ "amount",
4951
+ "card_cvn",
4952
+ "currency",
4953
+ "mid_label",
4954
+ "external_id"
4955
+ ]);
4956
+ var XENDIT_CARD_KEYS = /* @__PURE__ */ Object.freeze([
4957
+ "account_number",
4958
+ "exp_month",
4959
+ "exp_year",
4960
+ "cvn",
4961
+ "card_holder_name",
4962
+ "card_holder_email",
4963
+ "card_holder_first_name",
4964
+ "card_holder_last_name",
4965
+ "card_holder_phone_number"
4966
+ ]);
4967
+ var BODY_LIMIT30 = 8192;
4968
+ var CARD_NUMBER15 = /^[0-9]{12,19}$/;
4969
+ var SECURITY_CODE18 = /^[0-9]{3,4}$/;
4970
+ var MONTH16 = /^(?:0[1-9]|1[0-2])$/;
4971
+ var YEAR17 = /^20[0-9]{2}$/;
4972
+ var CURRENCY4 = /^[A-Z]{3}$/;
4973
+ var AMOUNT_LIMIT3 = 1e12;
4974
+ var FP_SESSION = /^[A-Za-z0-9._:-]{0,256}$/;
4975
+ var FORTER_TOKEN = /^[A-Za-z0-9._~:+/=-]{1,1024}$/;
4976
+ var MID_LABEL = /^[A-Za-z0-9_.-]{1,64}$/;
4977
+ var EXTERNAL_ID = /^[\x21-\x7e]{1,255}$/;
4978
+ var PHONE4 = /^\+?[0-9]{6,15}$/;
4979
+ var TEXT_LIMIT11 = 256;
4980
+ var CONTROL12 = /[\u0000-\u001f\u007f]/;
4981
+ var BILLING_KEYS = /* @__PURE__ */ Object.freeze(["given_names", "surname", "email", "mobile_number", "phone_number", "address"]);
4982
+ var ADDRESS_KEYS5 = /* @__PURE__ */ Object.freeze(["country", "street_line1", "street_line2", "city", "province_state", "postal_code", "category"]);
4983
+ var AMOUNT_TEXT = /^[0-9]{1,13}(?:\.[0-9]{1,2})?$/;
4984
+ var record27 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4985
+ var own9 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4986
+ var inOrder5 = (value, keys) => {
4987
+ let at = 0;
4988
+ for (const name of Object.keys(value)) {
4989
+ while (at < keys.length && keys[at] !== name)
4990
+ at += 1;
4991
+ if (at === keys.length)
4992
+ return false;
4993
+ at += 1;
4994
+ }
4995
+ return true;
4996
+ };
4997
+ var wellFormed3 = (value) => {
4998
+ try {
4999
+ encodeURIComponent(value);
5000
+ return true;
5001
+ }
5002
+ catch {
5003
+ return false;
5004
+ }
5005
+ };
5006
+ var plainText6 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT11 && !CONTROL12.test(value) && (value.match(/[0-9]/g) ?? []).length < 12 && wellFormed3(value);
5007
+ var reference = (value) => typeof value === "string" && EXTERNAL_ID.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
5008
+ var refuse32 = (code) => Object.freeze({ verdict: "refuse", code });
5009
+ var CARD31 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5010
+ function isXenditTokenUrl(url) {
5011
+ return url === XENDIT_TOKEN_URL;
5012
+ }
5013
+ function readBody18(body) {
5014
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT30)
5015
+ return null;
5016
+ let value;
5017
+ try {
5018
+ value = JSON.parse(body);
5019
+ if (!record27(value) || JSON.stringify(value) !== body)
5020
+ return null;
5021
+ }
5022
+ catch {
5023
+ return null;
5024
+ }
5025
+ return value;
5026
+ }
5027
+ function amountValue(value) {
5028
+ if (typeof value === "number" && !Number.isFinite(value))
5029
+ return false;
5030
+ const text9 = typeof value === "number" ? String(value) : value;
5031
+ if (typeof text9 !== "string" || !AMOUNT_TEXT.test(text9))
5032
+ return false;
5033
+ const amount2 = Number(text9);
5034
+ return amount2 > 0 && amount2 <= AMOUNT_LIMIT3;
5035
+ }
5036
+ function billingDetails(value) {
5037
+ if (!record27(value) || !inOrder5(value, BILLING_KEYS))
5038
+ return false;
5039
+ return Object.keys(value).every((key) => {
5040
+ const field2 = value[key];
5041
+ if (key !== "address")
5042
+ return key === "mobile_number" || key === "phone_number" ? typeof field2 === "string" && PHONE4.test(field2) : plainText6(field2);
5043
+ return record27(field2) && inOrder5(field2, ADDRESS_KEYS5) && Object.keys(field2).every((name) => plainText6(field2[name]));
5044
+ });
5045
+ }
5046
+ function cardData(value) {
5047
+ if (!record27(value) || !inOrder5(value, XENDIT_CARD_KEYS))
5048
+ return false;
5049
+ if (typeof value.account_number !== "string" || !CARD_NUMBER15.test(value.account_number) || typeof value.exp_month !== "string" || !MONTH16.test(value.exp_month) || typeof value.exp_year !== "string" || !YEAR17.test(value.exp_year) || typeof value.cvn !== "string" || !SECURITY_CODE18.test(value.cvn))
5050
+ return false;
5051
+ for (const key of ["card_holder_name", "card_holder_email", "card_holder_first_name", "card_holder_last_name"]) {
5052
+ if (own9(value, key) && !plainText6(value[key]))
5053
+ return false;
5054
+ }
5055
+ return !own9(value, "card_holder_phone_number") || typeof value.card_holder_phone_number === "string" && PHONE4.test(value.card_holder_phone_number);
5056
+ }
5057
+ function xenditBodyVerdict(body) {
5058
+ const value = readBody18(body);
5059
+ if (value === null || !inOrder5(value, XENDIT_TOKEN_KEYS) || !own9(value, "is_single_use") || !own9(value, "card_data")) {
5060
+ return refuse32("xendit_body_unsupported");
5061
+ }
5062
+ if (value.is_single_use !== true)
5063
+ return value.is_single_use === false ? refuse32("xendit_multiple_use") : refuse32("xendit_body_unsupported");
5064
+ if (!cardData(value.card_data) || value.should_authenticate !== true || !amountValue(value.amount) || typeof value.currency !== "string" || !CURRENCY4.test(value.currency))
5065
+ return refuse32("xendit_body_unsupported");
5066
+ if (own9(value, "card_cvn") && value.card_cvn !== value.card_data.cvn)
5067
+ return refuse32("xendit_body_unsupported");
5068
+ if (own9(value, "billing_details") && !billingDetails(value.billing_details))
5069
+ return refuse32("xendit_body_unsupported");
5070
+ if (own9(value, "fp_session_id") && (typeof value.fp_session_id !== "string" || !FP_SESSION.test(value.fp_session_id)))
5071
+ return refuse32("xendit_body_unsupported");
5072
+ if (own9(value, "metadata")) {
5073
+ const metadata = value.metadata;
5074
+ if (!record27(metadata) || Object.keys(metadata).length !== 1 || !record27(metadata._forter) || Object.keys(metadata._forter).length !== 1 || typeof metadata._forter.token !== "string" || !FORTER_TOKEN.test(metadata._forter.token))
5075
+ return refuse32("xendit_body_unsupported");
5076
+ }
5077
+ if (own9(value, "mid_label") && (typeof value.mid_label !== "string" || !MID_LABEL.test(value.mid_label)))
5078
+ return refuse32("xendit_body_unsupported");
5079
+ if (own9(value, "external_id") && !reference(value.external_id))
5080
+ return refuse32("xendit_body_unsupported");
5081
+ return CARD31;
5082
+ }
5083
+ // src/tappay.js
5084
+ var TAPPAY_PSP = "tappay";
5085
+ var TAPPAY_GETPRIME_URL = "https://js.tappaysdk.com/payment/tpdirect/production/getprime";
5086
+ var BODY_LIMIT31 = 8192;
5087
+ var REQUIRED_KEYS3 = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "protocol", "tappay_sdk_version", "cardholder_info"]);
5088
+ var KEY_ORDER = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "port", "protocol", "tappay_sdk_version", "cardholder_info", "cardccv", "device_id"]);
5089
+ var OPTIONAL_KEYS2 = /* @__PURE__ */ Object.freeze(["port", "cardccv", "device_id"]);
5090
+ var CARDHOLDER_KEYS = /* @__PURE__ */ Object.freeze(["name_en", "email", "phone_number_country_code", "phone_number"]);
5091
+ var CARD_NUMBER16 = /^[0-9]{12,19}$/;
5092
+ var CARD_DUE_DATE = /^20[0-9]{2}(?:0[1-9]|1[0-2])$/;
5093
+ var SECURITY_CODE19 = /^[0-9]{3,4}$/;
5094
+ var APP_KEY = /^[A-Za-z0-9_-]{16,512}$/;
5095
+ var SDK_VERSION = /^v[0-9]+(?:\.[0-9]+){1,3}$/;
5096
+ var HOSTNAME2 = /^[A-Za-z0-9.:-]{1,255}$/;
5097
+ var ORIGIN_URL = /^https?:\/\/[A-Za-z0-9.:_/-]{1,255}$/;
5098
+ var PROTOCOL = /^https?:$/;
5099
+ var PORT = /^[0-9]{0,5}$/;
5100
+ var CONTROL13 = /[\u0000-\u001f\u007f]/;
5101
+ var TEXT_LIMIT12 = 256;
5102
+ var DEVICE_ID = /^[A-Za-z0-9_-]{1,128}$/;
5103
+ var record28 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
5104
+ var plainText7 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT12 && !CONTROL13.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
5105
+ var holderField = (value) => value === null || plainText7(value);
5106
+ var refuse33 = (code) => Object.freeze({ verdict: "refuse", code });
5107
+ var CARD32 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5108
+ function isTappayGetPrimeUrl(url) {
5109
+ return url === TAPPAY_GETPRIME_URL;
5110
+ }
5111
+ function readBody19(body) {
5112
+ if (typeof body !== "string" || body.length > BODY_LIMIT31)
5113
+ return null;
5114
+ const eq = body.indexOf("=");
5115
+ if (eq !== "jsonString".length || body.slice(0, eq) !== "jsonString")
5116
+ return null;
5117
+ const json = body.slice(eq + 1);
5118
+ let value;
5119
+ try {
5120
+ value = JSON.parse(json);
5121
+ if (!record28(value) || JSON.stringify(value) !== json)
5122
+ return null;
5123
+ }
5124
+ catch {
5125
+ return null;
5126
+ }
5127
+ return value;
5128
+ }
5129
+ function keysInOrder(value) {
5130
+ const keys = Object.keys(value);
5131
+ for (const key of REQUIRED_KEYS3) {
5132
+ if (!keys.includes(key))
5133
+ return false;
5134
+ }
5135
+ for (const key of keys) {
5136
+ if (!KEY_ORDER.includes(key) || !REQUIRED_KEYS3.includes(key) && !OPTIONAL_KEYS2.includes(key))
5137
+ return false;
5138
+ }
5139
+ const rank = (key) => KEY_ORDER.indexOf(key);
5140
+ for (let at = 1; at < keys.length; at += 1) {
5141
+ if (rank(keys[at]) <= rank(keys[at - 1]))
5142
+ return false;
5143
+ }
5144
+ return true;
5145
+ }
5146
+ function cardholderInfo(value) {
5147
+ if (!record28(value))
5148
+ return false;
5149
+ const keys = Object.keys(value);
5150
+ return keys.length <= CARDHOLDER_KEYS.length && keys.every((key) => CARDHOLDER_KEYS.includes(key) && holderField(value[key]));
5151
+ }
5152
+ function tappayBodyVerdict(body) {
5153
+ const value = readBody19(body);
5154
+ if (value === null || !keysInOrder(value))
5155
+ return refuse33("tappay_body_unsupported");
5156
+ if (typeof value.cardnumber !== "string" || !CARD_NUMBER16.test(value.cardnumber) || typeof value.cardduedate !== "string" || !CARD_DUE_DATE.test(value.cardduedate) || !Number.isInteger(value.appid) || value.appid < 0 || typeof value.appkey !== "string" || !APP_KEY.test(value.appkey) || typeof value.appname !== "string" || !HOSTNAME2.test(value.appname) || typeof value.url !== "string" || !ORIGIN_URL.test(value.url) || typeof value.protocol !== "string" || !PROTOCOL.test(value.protocol) || typeof value.tappay_sdk_version !== "string" || !SDK_VERSION.test(value.tappay_sdk_version) || !cardholderInfo(value.cardholder_info)) {
5157
+ return refuse33("tappay_body_unsupported");
5158
+ }
5159
+ if (Object.prototype.hasOwnProperty.call(value, "port") && (typeof value.port !== "string" || !PORT.test(value.port)))
5160
+ return refuse33("tappay_body_unsupported");
5161
+ if (Object.prototype.hasOwnProperty.call(value, "cardccv") && (typeof value.cardccv !== "string" || !SECURITY_CODE19.test(value.cardccv)))
5162
+ return refuse33("tappay_body_unsupported");
5163
+ if (Object.prototype.hasOwnProperty.call(value, "device_id") && (typeof value.device_id !== "string" || !DEVICE_ID.test(value.device_id)))
5164
+ return refuse33("tappay_body_unsupported");
5165
+ return CARD32;
5166
+ }
5167
+ // src/paymob.js
5168
+ var PAYMOB_PSP = "paymob";
5169
+ var PAYMOB_HOSTS = /* @__PURE__ */ Object.freeze(["accept.paymob.com", "uae.paymob.com", "ksa.paymob.com", "oman.paymob.com", "accept.paymobsolutions.com"]);
5170
+ var PAYMOB_PAY_PATH = "/api/acceptance/payments/pay";
5171
+ var URL_LIMIT12 = 128;
5172
+ var BODY_LIMIT32 = 16384;
5173
+ var KEY_LIMIT = 8192;
5174
+ var NUMBER7 = /^[0-9]{12,19}$/;
5175
+ var MONTH17 = /^(?:0[1-9]|1[0-2])$/;
5176
+ var YEAR18 = /^[0-9]{2}$/;
5177
+ var SECURITY_CODE20 = /^[0-9]{3,4}$/;
5178
+ var TEXT3 = /^[^\x00-\x1f\x7f]{0,256}$/;
5179
+ var HOLDER_TEXT = /^[^\x00-\x1f\x7f]{0,128}$/;
5180
+ var FIELD = /^[a-z][a-z0-9_]{0,39}$/;
5181
+ var FINGERPRINT3 = /^[\x21-\x7e]{1,256}$/;
5182
+ var ORIGIN2 = /^https?:\/\/[A-Za-z0-9.-]{1,253}(?::[0-9]{1,5})?$/;
5183
+ var SWITCH = /* @__PURE__ */ new Set(["True", "False"]);
5184
+ var SOURCE_FOR = /* @__PURE__ */ Object.freeze({ IFRAME: "True", PIXEL: "False" });
5185
+ var CARD_MEMBER4 = /^(?:card_?number|pan|cvv|cvc|cvn|card_pin|card_expiry|expiry_month|expiry_year|security_code)$/i;
5186
+ var SAVED_CARD = "TOKEN";
5187
+ var OTHER_CARD_SUBTYPES = /* @__PURE__ */ new Set(["OMANNET", "PREMIUM", "PREMIUM6_ONLINE", "SYMPL"]);
5188
+ var CARD_SOURCE_KEYS = /* @__PURE__ */ new Set(["identifier", "sourceholder_name", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"]);
5189
+ var TOP_KEYS3 = /* @__PURE__ */ new Set([
5190
+ "source",
5191
+ "billing",
5192
+ "shipping_data",
5193
+ "payment_token",
5194
+ "api_source",
5195
+ "unified_checkout",
5196
+ "save_card",
5197
+ "fingerprint",
5198
+ "merchant-domain",
5199
+ "customer",
5200
+ "converted_currency",
5201
+ "no_of_cards_selected",
5202
+ "split_payment_amount"
5203
+ ]);
5204
+ var REQUIRED_TOP_KEYS = ["source", "payment_token", "api_source", "unified_checkout", "save_card"];
5205
+ var REQUIRED_SOURCE_KEYS = ["identifier", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"];
5206
+ var record29 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
5207
+ var own10 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
5208
+ var refuse34 = (code) => Object.freeze({ verdict: "refuse", code });
5209
+ var CARD33 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5210
+ var CONTINUE12 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
5211
+ function paymobPayHost(url) {
5212
+ if (typeof url !== "string" || url.length > URL_LIMIT12 || url.includes("?") || url.includes("#"))
5213
+ return null;
5214
+ let parsed;
5215
+ try {
5216
+ parsed = new URL(url);
5217
+ }
5218
+ catch {
5219
+ return null;
5220
+ }
5221
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !PAYMOB_HOSTS.includes(parsed.hostname) || parsed.pathname !== PAYMOB_PAY_PATH)
5222
+ return null;
5223
+ return parsed.hostname;
5224
+ }
5225
+ function isPaymobPayUrl(url) {
5226
+ return paymobPayHost(url) !== null;
5227
+ }
5228
+ var BASE645 = /^[A-Za-z0-9+/]+={0,2}$/;
5229
+ var BASE64URL = /^[A-Za-z0-9_-]+$/;
5230
+ var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
5231
+ function decodeBase642(text9, url) {
5232
+ if (typeof text9 !== "string" || text9 === "")
5233
+ return null;
5234
+ let body = text9;
5235
+ if (url) {
5236
+ if (!BASE64URL.test(body) || body.length % 4 === 1)
5237
+ return null;
5238
+ }
5239
+ else {
5240
+ if (!BASE645.test(body) || body.length % 4 !== 0)
5241
+ return null;
5242
+ body = body.replace(/=+$/, "");
5243
+ }
5244
+ const extra = url ? "-_" : "+/";
5245
+ const bytes = new Uint8Array(Math.floor(body.length * 3 / 4));
5246
+ let buffer = 0;
5247
+ let bits = 0;
5248
+ let at = 0;
5249
+ for (const char of body) {
5250
+ const value = (ALPHABET + extra).indexOf(char);
5251
+ if (value < 0)
5252
+ return null;
5253
+ buffer = buffer << 6 | value;
5254
+ bits += 6;
5255
+ if (bits >= 8) {
5256
+ bits -= 8;
5257
+ bytes[at++] = buffer >> bits & 255;
5258
+ }
5259
+ }
5260
+ if (buffer & (1 << bits) - 1)
5261
+ return null;
5262
+ return bytes.subarray(0, at);
5263
+ }
5264
+ function jsonOf(bytes) {
5265
+ if (!bytes)
5266
+ return null;
5267
+ let text9;
5268
+ try {
5269
+ text9 = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
5270
+ }
5271
+ catch {
5272
+ return null;
5273
+ }
5274
+ try {
5275
+ const value = JSON.parse(text9);
5276
+ return record29(value) ? value : null;
5277
+ }
5278
+ catch {
5279
+ return null;
5280
+ }
5281
+ }
5282
+ var positive = (value) => Number.isSafeInteger(value) && value > 0;
5283
+ var CURRENCY5 = /^[A-Z]{3}$/;
5284
+ var KEY_CLAIMS = /* @__PURE__ */ new Set([
5285
+ "user_id",
5286
+ "integration_id",
5287
+ "order_id",
5288
+ "amount_cents",
5289
+ "currency",
5290
+ "exp",
5291
+ "billing_data",
5292
+ "extra",
5293
+ "notification_url",
5294
+ "redirection_url",
5295
+ "redirect_url",
5296
+ "lock_order_when_paid",
5297
+ "single_payment_attempt",
5298
+ "next_payment_intention",
5299
+ "created_by",
5300
+ "is_partner",
5301
+ "split_payment_methods"
5302
+ ]);
5303
+ var SUBSCRIPTION_CLAIMS = /* @__PURE__ */ new Set(["subscription_plan_id", "subscription_start_date"]);
5304
+ var UNREADABLE_KEY = /* @__PURE__ */ Object.freeze({ facts: null, code: "paymob_payment_key_unreadable" });
5305
+ function readPaymentKey(key) {
5306
+ if (typeof key !== "string" || key.length > KEY_LIMIT)
5307
+ return UNREADABLE_KEY;
5308
+ const outer = decodeBase642(key, false);
5309
+ if (!outer)
5310
+ return UNREADABLE_KEY;
5311
+ let jwt;
5312
+ try {
5313
+ jwt = new TextDecoder("utf-8", { fatal: true }).decode(outer);
5314
+ }
5315
+ catch {
5316
+ return UNREADABLE_KEY;
5317
+ }
5318
+ const parts = jwt.split(".");
5319
+ if (parts.length !== 3 || parts.some((part) => part === "" || !BASE64URL.test(part)))
5320
+ return UNREADABLE_KEY;
5321
+ const header = jsonOf(decodeBase642(parts[0], true));
5322
+ if (!header || Object.keys(header).length !== 2 || header.alg !== "HS512" || header.typ !== "JWT")
5323
+ return UNREADABLE_KEY;
5324
+ const signature = decodeBase642(parts[2], true);
5325
+ if (!signature || signature.length !== 64)
5326
+ return UNREADABLE_KEY;
5327
+ const payload = jsonOf(decodeBase642(parts[1], true));
5328
+ if (!payload)
5329
+ return UNREADABLE_KEY;
5330
+ const claims = Object.keys(payload);
5331
+ if (claims.some((claim) => SUBSCRIPTION_CLAIMS.has(claim) && payload[claim] !== null))
5332
+ return Object.freeze({ facts: null, code: "paymob_subscription" });
5333
+ if (claims.some((claim) => !KEY_CLAIMS.has(claim) && !SUBSCRIPTION_CLAIMS.has(claim)))
5334
+ return UNREADABLE_KEY;
5335
+ const { user_id: merchantId, integration_id: integrationId, order_id: orderId, amount_cents: amountCents, currency, exp } = payload;
5336
+ if (!positive(merchantId) || !positive(integrationId) || !positive(orderId) || !Number.isSafeInteger(amountCents) || amountCents < 0 || typeof currency !== "string" || !CURRENCY5.test(currency) || own10(payload, "exp") && !positive(exp))
5337
+ return UNREADABLE_KEY;
5338
+ if (amountCents === 0)
5339
+ return Object.freeze({ facts: null, code: "paymob_no_amount" });
5340
+ return Object.freeze({ facts: Object.freeze({ merchantId, integrationId, orderId, amountCents, currency, expiresAt: own10(payload, "exp") ? exp : null }), code: null });
5341
+ }
5342
+ function readJson8(body) {
5343
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT32)
5344
+ return { parsed: null, exact: false };
5345
+ let parsed;
5346
+ try {
5347
+ parsed = JSON.parse(body);
5348
+ }
5349
+ catch {
5350
+ return { parsed: null, exact: false };
5351
+ }
5352
+ let exact5 = false;
5353
+ try {
5354
+ exact5 = body.length <= BODY_LIMIT32 && JSON.stringify(parsed) === body;
5355
+ }
5356
+ catch {
5357
+ exact5 = false;
5358
+ }
5359
+ return { parsed, exact: exact5 };
5360
+ }
5361
+ function namesCardValue3(parsed) {
5362
+ const pending = parsed !== null && typeof parsed === "object" ? [parsed] : [];
5363
+ while (pending.length > 0) {
5364
+ const node = pending.pop();
5365
+ for (const key of Object.keys(node)) {
5366
+ if (!Array.isArray(node) && CARD_MEMBER4.test(key))
5367
+ return true;
5368
+ const value = node[key];
5369
+ if (value !== null && typeof value === "object")
5370
+ pending.push(value);
5371
+ }
5372
+ }
5373
+ return false;
5374
+ }
5375
+ function addressBlock(value) {
5376
+ return record29(value) && Object.keys(value).length <= 32 && Object.entries(value).every(([key, text9]) => FIELD.test(key) && !CARD_MEMBER4.test(key) && (text9 === null || typeof text9 === "string" && TEXT3.test(text9)));
5377
+ }
5378
+ function judgeCardPayment(parsed) {
5379
+ const source = parsed.source;
5380
+ for (const key of Object.keys(parsed))
5381
+ if (!TOP_KEYS3.has(key))
5382
+ return "paymob_body_unsupported";
5383
+ for (const key of Object.keys(source)) {
5384
+ if (key === "is_card_to_installment" || key === "tenure")
5385
+ return "paymob_installments";
5386
+ if (!CARD_SOURCE_KEYS.has(key))
5387
+ return "paymob_body_unsupported";
5388
+ }
5389
+ if (own10(parsed, "customer"))
5390
+ return "paymob_account";
5391
+ if (own10(parsed, "no_of_cards_selected") || own10(parsed, "split_payment_amount"))
5392
+ return "paymob_split_payment";
5393
+ if (own10(parsed, "converted_currency"))
5394
+ return "paymob_currency_conversion";
5395
+ if (!REQUIRED_TOP_KEYS.every((key) => own10(parsed, key)) || !REQUIRED_SOURCE_KEYS.every((key) => own10(source, key)))
5396
+ return "paymob_body_unsupported";
5397
+ if (source.save_card === true || parsed.save_card === true)
5398
+ return "paymob_keep_on_file";
5399
+ if (source.save_card !== false || parsed.save_card !== false)
5400
+ return "paymob_body_unsupported";
5401
+ if (typeof source.identifier !== "string" || !NUMBER7.test(source.identifier) || typeof source.expiry_month !== "string" || !MONTH17.test(source.expiry_month) || typeof source.expiry_year !== "string" || !YEAR18.test(source.expiry_year) || typeof source.cvn !== "string" || !SECURITY_CODE20.test(source.cvn) || own10(source, "sourceholder_name") && !(typeof source.sourceholder_name === "string" && HOLDER_TEXT.test(source.sourceholder_name))) {
5402
+ return "paymob_body_unsupported";
5403
+ }
5404
+ if (!own10(SOURCE_FOR, parsed.api_source) || !SWITCH.has(parsed.unified_checkout) || parsed.unified_checkout !== SOURCE_FOR[parsed.api_source] || source.unified_checkout !== parsed.unified_checkout)
5405
+ return "paymob_body_unsupported";
5406
+ if (own10(parsed, "billing") && !addressBlock(parsed.billing) || own10(parsed, "shipping_data") && !addressBlock(parsed.shipping_data)) {
5407
+ return "paymob_body_unsupported";
5408
+ }
5409
+ if (own10(parsed, "fingerprint") && parsed.fingerprint !== null && !(typeof parsed.fingerprint === "string" && FINGERPRINT3.test(parsed.fingerprint))) {
5410
+ return "paymob_body_unsupported";
5411
+ }
5412
+ if (own10(parsed, "merchant-domain") && !(typeof parsed["merchant-domain"] === "string" && ORIGIN2.test(parsed["merchant-domain"]))) {
5413
+ return "paymob_body_unsupported";
5414
+ }
5415
+ return readPaymentKey(parsed.payment_token).code;
5416
+ }
5417
+ function paymobBodyVerdict(body) {
5418
+ if (body === void 0 || body === null || body === "")
5419
+ return CONTINUE12;
5420
+ const { parsed, exact: exact5 } = readJson8(body);
5421
+ if (!exact5 || !record29(parsed) || !record29(parsed.source) || typeof parsed.source.subtype !== "string")
5422
+ return refuse34("paymob_body_unsupported");
5423
+ const subtype = parsed.source.subtype;
5424
+ if (subtype === "CARD") {
5425
+ const code = judgeCardPayment(parsed);
5426
+ return code === null ? CARD33 : refuse34(code);
5427
+ }
5428
+ if (subtype === SAVED_CARD)
5429
+ return refuse34("paymob_saved_card");
5430
+ if (OTHER_CARD_SUBTYPES.has(subtype) || namesCardValue3(parsed))
5431
+ return refuse34("paymob_body_unsupported");
5432
+ return CONTINUE12;
5433
+ }
5434
+ // src/payu-latam.js
5435
+ var PAYU_LATAM_PSP = "payu_latam";
5436
+ var PAYU_LATAM_HOSTS = /* @__PURE__ */ Object.freeze({
5437
+ production: Object.freeze(["checkout.payulatam.com"]),
5438
+ sandbox: Object.freeze(["sandbox.checkout.payulatam.com"])
5439
+ });
5440
+ var PAYU_LATAM_COUNTRIES = /* @__PURE__ */ Object.freeze(["cl", "co", "mx", "pa", "pe"]);
5441
+ var UNREVIEWED_COUNTRIES = /* @__PURE__ */ Object.freeze(["ar", "br"]);
5442
+ var PAYU_LATAM_CARD_BRANDS = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMEX", "DINERS"]);
5443
+ var BODY_LIMIT33 = 65536;
5444
+ var URL_LIMIT13 = 256;
5445
+ var SUBMIT_PATH = /^\/ppp-web-gateway-payu\/checkout\/submit\/([a-z]{2})\/credit_card\/([0-9a-f]{32})$/;
5446
+ var KEY = /^[0-9a-f]{32}$/;
5447
+ var CARD_KEYS14 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear", "cardType"]);
5448
+ var CARD_REQUIRED2 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear"]);
5449
+ var CARD_TYPES2 = /* @__PURE__ */ Object.freeze(["CREDIT", "DEBIT", "PREPAID"]);
5450
+ var NOT_THE_CARD_FORM = /* @__PURE__ */ Object.freeze([
5451
+ "checkoutPaymentMethod",
5452
+ "response",
5453
+ "checkoutPse",
5454
+ "checkoutKhipu",
5455
+ "smsCode",
5456
+ "checkoutDebitCard"
5457
+ ]);
5458
+ var TRANSACTION_MEMBERS = /* @__PURE__ */ Object.freeze([
5459
+ "id",
5460
+ "key",
5461
+ "isPaymentAttempt",
5462
+ "payer",
5463
+ "state",
5464
+ "merchantId",
5465
+ "orderId",
5466
+ "order",
5467
+ "checkoutPaymentMethod",
5468
+ "paymentNetwork",
5469
+ "paymentMethodType",
5470
+ "paymentMethodMain",
5471
+ "bank",
5472
+ "paymentAgreementId",
5473
+ "paymentCountry",
5474
+ "paymentExchangeRate",
5475
+ "response",
5476
+ "expirationDate",
5477
+ "lastUpdatedDate",
5478
+ "creationDate",
5479
+ "termsAndConditionId",
5480
+ "installments",
5481
+ "installmentValue",
5482
+ "internationalCard",
5483
+ "checkoutVersion",
5484
+ "payerCommissionValue",
5485
+ "payerInterestValue",
5486
+ "payerPricingValue",
5487
+ "promotionId",
5488
+ "shippingValue",
5489
+ "shipmentMerchantValue",
5490
+ "additionalValue",
5491
+ "administrativeFee",
5492
+ "payerTotalAmount",
5493
+ "source",
5494
+ "integrationMethod",
5495
+ "cardType",
5496
+ "creditCardCountry",
5497
+ "shippingInfo",
5498
+ "questionnaire",
5499
+ "merchantSoftDescriptor",
5500
+ "pmNetworkValue",
5501
+ "tea",
5502
+ "cft",
5503
+ "hasPaymentByPoints",
5504
+ "loyaltyProgramRedeemedAmount",
5505
+ "loyaltyProgramRedeemedPoints",
5506
+ "lendingEligible",
5507
+ "registerLendingDevice",
5508
+ "lendingDeviceToken",
5509
+ "abandonedLendingTransaction",
5510
+ "masterpassObfuscateCreditCardNumber",
5511
+ "isMasterpass",
5512
+ "brandName",
5513
+ "transactionType",
5514
+ "nossoNumero",
5515
+ "paymentTaxesDetails",
5516
+ "shopifyGid",
5517
+ "shopifyVersion",
5518
+ "shopifyShopDomain",
5519
+ "shopifyRedirectTime",
5520
+ "paymentCancelUrl",
5521
+ "checkoutCreditCard",
5522
+ "isRegisterPayer",
5523
+ "creditCardTokenId",
5524
+ "checkoutPse",
5525
+ "checkoutKhipu",
5526
+ "smsCode",
5527
+ "checkoutDebitCard"
5528
+ ]);
5529
+ var ADDRESS = ["street1", "street2", "street3", "city", "state", "country", "postalCode", "phone"];
5530
+ var PERSON = [
5531
+ "fullName",
5532
+ "emailAddress",
5533
+ "contactPhone",
5534
+ "phoneCountryCode",
5535
+ "dniNumber",
5536
+ "isDniNumberEncrypt",
5537
+ "dniType",
5538
+ "personType",
5539
+ "businessName",
5540
+ "cnpj",
5541
+ "gender"
5542
+ ];
5543
+ var MONEY = ["value", "symbol", "currency"];
5544
+ var RECORD_MEMBERS = /* @__PURE__ */ Object.freeze({
5545
+ payer: [...PERSON, "merchantBuyerId", "billingAddress", "birthDate", "identificationNumber", "identificationType"],
5546
+ "payer.billingAddress": ADDRESS,
5547
+ order: [
5548
+ "id",
5549
+ "referenceCode",
5550
+ "airlineCode",
5551
+ "description",
5552
+ "isTest",
5553
+ "signature",
5554
+ "language",
5555
+ "buyer",
5556
+ "shipment",
5557
+ "state",
5558
+ "status",
5559
+ "paymentApprovalDate",
5560
+ "creationDate",
5561
+ "accountId",
5562
+ "amount",
5563
+ "tax",
5564
+ "totalPurchase",
5565
+ "currency",
5566
+ "amountConvertedValue",
5567
+ "taxConvertedValue",
5568
+ "taxReturnBase",
5569
+ "taxReturnBaseConvertedValue",
5570
+ "additionalValue",
5571
+ "administrativeFee",
5572
+ "taxAdministrativeFee",
5573
+ "taxAdministrativeFeeReturnBase",
5574
+ "enabledPaymentMethods",
5575
+ "enabledInstallments",
5576
+ "enabledPaymentMethodTypes",
5577
+ "enabledIin",
5578
+ "enabledPseBanks",
5579
+ "enabledKhipuBanks",
5580
+ "paymentMethodsDescription",
5581
+ "urlEncodedId",
5582
+ "shippingValue",
5583
+ "paymentRequestLinkId",
5584
+ "airlineDescription",
5585
+ "displayShipping",
5586
+ "displayBuyerComments",
5587
+ "buyerCommentsLabel",
5588
+ "extraParameters",
5589
+ "dispersion"
5590
+ ],
5591
+ "order.buyer": [...PERSON, "merchantBuyerId", "buyerAddress", "comments"],
5592
+ "order.buyer.buyerAddress": ADDRESS,
5593
+ "order.shipment": [...PERSON, "merchantShipmentId", "shippingAddress", "comments"],
5594
+ "order.shipment.shippingAddress": ADDRESS,
5595
+ "order.amount": MONEY,
5596
+ "order.tax": MONEY,
5597
+ "order.totalPurchase": MONEY,
5598
+ "order.amountConvertedValue": MONEY,
5599
+ "order.taxConvertedValue": MONEY,
5600
+ "order.taxReturnBase": MONEY,
5601
+ "order.taxReturnBaseConvertedValue": MONEY,
5602
+ shippingInfo: [
5603
+ "userLogin",
5604
+ "id",
5605
+ "reference",
5606
+ "description",
5607
+ "currency",
5608
+ "deliveryCity",
5609
+ "deliveryCityName",
5610
+ "deliveryAddress1",
5611
+ "deliveryAddress2",
5612
+ "deliveryAddress3",
5613
+ "postalCode",
5614
+ "fullName",
5615
+ "documentType",
5616
+ "document",
5617
+ "phoneNumber",
5618
+ "observationsReceivingShipment",
5619
+ "destinationState",
5620
+ "destinationStateName",
5621
+ "destinationCountry",
5622
+ "destinationEmail",
5623
+ "originFullName",
5624
+ "originIdentificationType",
5625
+ "originIdentification",
5626
+ "originCity",
5627
+ "originState",
5628
+ "originCountry",
5629
+ "originAddress",
5630
+ "originZipCode",
5631
+ "originPhone",
5632
+ "originEmail",
5633
+ "kilogramWeight",
5634
+ "volumetricWeight",
5635
+ "totalValue",
5636
+ "declaredValue",
5637
+ "shippingValue",
5638
+ "guideNumber",
5639
+ "enlistmentApplies",
5640
+ "deliveryDate",
5641
+ "deliveryDays",
5642
+ "minDeliveryDays",
5643
+ "packageHeight",
5644
+ "packageWidth",
5645
+ "packageLength",
5646
+ "shippingProvider",
5647
+ "shippingState",
5648
+ "creationDate",
5649
+ "lastUpdateDate",
5650
+ "expirationDate",
5651
+ "signature",
5652
+ "strCreationDate",
5653
+ "comment",
5654
+ "warehouseId",
5655
+ "additionalDeliveryDays",
5656
+ "shippingMerchantValue"
5657
+ ],
5658
+ // PayU's own ten, as transaction/create names them, and the merchant's extra1 to extra4 (the payment form's
5659
+ // optional fields), each text or nothing.
5660
+ "order.extraParameters": [
5661
+ "CURRENCY",
5662
+ "LANGUAGE",
5663
+ "ACCOUNT_ID",
5664
+ "ALGORITHM_SIGNATURE",
5665
+ "CHECKOUT_VERSION",
5666
+ "RESPONSE_URL",
5667
+ "IS_TEST",
5668
+ "SIGNATURE",
5669
+ "NOTIFY_URL",
5670
+ "IP_COUNTRY",
5671
+ "EXTRA1",
5672
+ "EXTRA2",
5673
+ "EXTRA3",
5674
+ "EXTRA4"
5675
+ ]
5676
+ });
5677
+ var TEXT_RECORDS = /* @__PURE__ */ Object.freeze(["order.extraParameters"]);
5678
+ var CARD_WORDS = /* @__PURE__ */ Object.freeze([
5679
+ "card",
5680
+ "cards",
5681
+ "pan",
5682
+ "cvv",
5683
+ "cvv2",
5684
+ "cvc",
5685
+ "cvd",
5686
+ "csc",
5687
+ "ccv",
5688
+ "cc",
5689
+ "token",
5690
+ "masterpass",
5691
+ "wallet",
5692
+ "register",
5693
+ "recurring",
5694
+ "recurrent",
5695
+ "recurrence",
5696
+ "keep",
5697
+ "store",
5698
+ "save",
5699
+ "saved",
5700
+ "vault",
5701
+ "exp",
5702
+ "expiry",
5703
+ "expiration",
5704
+ "expiracion",
5705
+ "tarjeta",
5706
+ "tarjetas",
5707
+ "vencimiento"
5708
+ ]);
5709
+ var OWN_CARD_MEMBERS = /* @__PURE__ */ Object.freeze([
5710
+ "checkoutCreditCard",
5711
+ "cardType",
5712
+ "internationalCard",
5713
+ "creditCardCountry",
5714
+ "isMasterpass",
5715
+ "masterpassObfuscateCreditCardNumber",
5716
+ "isRegisterPayer",
5717
+ "registerLendingDevice",
5718
+ "lendingDeviceToken",
5719
+ "creditCardTokenId",
5720
+ "checkoutDebitCard",
5721
+ "expirationDate",
5722
+ "shippingInfo.expirationDate"
5723
+ ]);
5724
+ var SIGNATURE2 = /^[0-9a-f]{32,128}$/i;
5725
+ var OPAQUE_MEMBERS = /* @__PURE__ */ Object.freeze({
5726
+ key: /^[0-9a-f]{32}$/,
5727
+ "order.signature": SIGNATURE2,
5728
+ "order.extraParameters.SIGNATURE": SIGNATURE2,
5729
+ "shippingInfo.signature": SIGNATURE2,
5730
+ "order.urlEncodedId": /^[A-Za-z0-9+/=_-]{1,256}$/,
5731
+ shopifyGid: /^gid:\/\/shopify\/[A-Za-z]+\/[0-9]{1,20}$/
5732
+ });
5733
+ var IS_TEST_TEXT = /* @__PURE__ */ Object.freeze({ true: ["true", "1"], false: ["false", "0"] });
5734
+ var MASKS = /* @__PURE__ */ Object.freeze({ VISA: [4, 4, 4, 4], MASTERCARD: [4, 4, 4, 4], AMEX: [4, 6, 5], DINERS: [4, 6, 4] });
5735
+ var NETWORK2 = /* @__PURE__ */ Object.freeze({
5736
+ VISA: /^4(?:[0-9]{12}|[0-9]{15})$/,
5737
+ MASTERCARD: /^(?:5[1-5][0-9]{14}|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[01][0-9]|20))[0-9]{12})$/,
5738
+ AMEX: /^3[47][0-9]{13}$/,
5739
+ DINERS: /^(?:3(?:0[0-5]|[68][0-9])[0-9]{11}|3095[0-9]{10}|3[89][0-9]{12})$/
5740
+ });
5741
+ var SECURITY_CODE21 = /^[0-9]{3,4}$/;
5742
+ var COUNTRY6 = /^[A-Z]{2}$/;
5743
+ var record30 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
5744
+ var owns7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
5745
+ var refuse35 = (code) => Object.freeze({ verdict: "refuse", code });
5746
+ var CARD34 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5747
+ var absent = (value, key) => !owns7(value, key) || value[key] === null;
5748
+ function payuLatamSubmitTarget(url) {
5749
+ if (typeof url !== "string" || url.length > URL_LIMIT13 || url.includes("?") || url.includes("#"))
5750
+ return null;
5751
+ let parsed;
5752
+ try {
5753
+ parsed = new URL(url);
5754
+ }
5755
+ catch {
5756
+ return null;
5757
+ }
5758
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
5759
+ return null;
5760
+ const environment2 = PAYU_LATAM_HOSTS.production.includes(parsed.hostname) ? "production" : PAYU_LATAM_HOSTS.sandbox.includes(parsed.hostname) ? "sandbox" : null;
5761
+ const match = environment2 === null ? null : SUBMIT_PATH.exec(parsed.pathname);
5762
+ if (match === null || !(PAYU_LATAM_COUNTRIES.includes(match[1]) || UNREVIEWED_COUNTRIES.includes(match[1])))
5763
+ return null;
5764
+ return Object.freeze({ host: parsed.hostname, environment: environment2, country: match[1], key: match[2] });
5765
+ }
5766
+ function readJson9(body) {
5767
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT33)
5768
+ return null;
5769
+ let at = 0;
5770
+ let nodes = 0;
5771
+ const fail = () => {
5772
+ throw new Error("invalid_payu_latam_json");
5773
+ };
5774
+ const space = () => {
5775
+ while (" \r\n".includes(body[at] ?? "\0"))
5776
+ at += 1;
5777
+ };
5778
+ const string = () => {
5779
+ space();
5780
+ const start = at;
5781
+ if (body[at++] !== '"')
5782
+ fail();
5783
+ while (at < body.length) {
5784
+ const character = body[at++];
5785
+ if (character === "\\") {
5786
+ at += 1;
5787
+ continue;
5788
+ }
5789
+ if (character === '"')
5790
+ return JSON.parse(body.slice(start, at));
5791
+ }
5792
+ return fail();
5793
+ };
5794
+ const value = (depth) => {
5795
+ if (depth > 8 || ++nodes > 4096)
5796
+ fail();
5797
+ space();
5798
+ const character = body[at];
5799
+ if (character === '"')
5800
+ return string();
5801
+ if (character === "{") {
5802
+ at += 1;
5803
+ const result = /* @__PURE__ */ Object.create(null);
5804
+ const seen = /* @__PURE__ */ new Set();
5805
+ space();
5806
+ if (body[at] === "}") {
5807
+ at += 1;
5808
+ return result;
5809
+ }
5810
+ for (;;) {
5811
+ const key = string();
5812
+ if (seen.has(key) || ["__proto__", "prototype", "constructor"].includes(key))
5813
+ fail();
5814
+ seen.add(key);
5815
+ space();
5816
+ if (body[at++] !== ":")
5817
+ fail();
5818
+ result[key] = value(depth + 1);
5819
+ space();
5820
+ const next = body[at++];
5821
+ if (next === "}")
5822
+ return result;
5823
+ if (next !== ",")
5824
+ fail();
5825
+ }
5826
+ }
5827
+ if (character === "[") {
5828
+ at += 1;
5829
+ const result = [];
5830
+ space();
5831
+ if (body[at] === "]") {
5832
+ at += 1;
5833
+ return result;
5834
+ }
5835
+ for (;;) {
5836
+ result.push(value(depth + 1));
5837
+ space();
5838
+ const next = body[at++];
5839
+ if (next === "]")
5840
+ return result;
5841
+ if (next !== ",")
5842
+ fail();
5843
+ }
5844
+ }
5845
+ for (const literal of ["true", "false", "null"]) {
5846
+ if (body.startsWith(literal, at)) {
5847
+ at += literal.length;
5848
+ return JSON.parse(literal);
5849
+ }
5850
+ }
5851
+ const number = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/.exec(body.slice(at, at + 32));
5852
+ if (!number || /^-?[0-9]{16,}$/.test(number[0]))
5853
+ fail();
5854
+ at += number[0].length;
5855
+ const parsed = Number(number[0]);
5856
+ if (!Number.isFinite(parsed))
5857
+ fail();
5858
+ return parsed;
5859
+ };
5860
+ try {
5861
+ const parsed = value(0);
5862
+ space();
5863
+ return at === body.length && record30(parsed) ? parsed : null;
5864
+ }
5865
+ catch {
5866
+ return null;
5867
+ }
5868
+ }
5869
+ function cardNamed2(key) {
5870
+ const words = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map((word) => word.toLowerCase());
5871
+ const phrase = words.join(" ");
5872
+ return words.some((word) => CARD_WORDS.includes(word)) || ["security code", "codigo seguridad", "codigo verificacion"].some((said) => phrase.includes(said));
5873
+ }
5874
+ function carriesCardNumber(text9) {
5875
+ for (const [run] of text9.matchAll(/[0-9]+(?:[ ._/,-][0-9]+)*/g)) {
5876
+ const groups = run.split(/[ ._/,-]/);
5877
+ for (let first = 0; first < groups.length; first += 1) {
5878
+ let digits4 = "";
5879
+ for (let last = first; last < groups.length && digits4.length + groups[last].length <= 19; last += 1) {
5880
+ digits4 += groups[last];
5881
+ if (digits4.length >= 13 && digits4[0] >= "2" && digits4[0] <= "6" && luhn7(digits4))
5882
+ return true;
5883
+ }
5884
+ }
5885
+ }
5886
+ return false;
5887
+ }
5888
+ var wholeCardNumber = (text9) => /^[2-6][0-9]{12,18}$/.test(text9) && luhn7(text9);
5889
+ function membersRefusal(root) {
5890
+ const pending = [[root, ""]];
5891
+ while (pending.length > 0) {
5892
+ const [node, path] = pending.pop();
5893
+ const own12 = path === "" ? TRANSACTION_MEMBERS : owns7(RECORD_MEMBERS, path) ? RECORD_MEMBERS[path] : null;
5894
+ for (const [key, child] of Object.entries(node)) {
5895
+ const at = Array.isArray(node) ? path : path === "" ? key : `${path}.${key}`;
5896
+ if (at === "checkoutCreditCard")
5897
+ continue;
5898
+ if (own12 !== null && !own12.includes(key))
5899
+ return true;
5900
+ if (TEXT_RECORDS.includes(path) && child !== null && typeof child !== "string")
5901
+ return true;
5902
+ if (!Array.isArray(node) && owns7(OPAQUE_MEMBERS, at)) {
5903
+ if (child !== null && (typeof child !== "string" || !OPAQUE_MEMBERS[at].test(child) || wholeCardNumber(child)))
5904
+ return true;
5905
+ continue;
5906
+ }
5907
+ if (!Array.isArray(node) && !OWN_CARD_MEMBERS.includes(at) && cardNamed2(key) && child !== null && child !== false)
5908
+ return true;
5909
+ if (typeof child === "string" && carriesCardNumber(child))
5910
+ return true;
5911
+ if (typeof child === "number" && (!/Date$/.test(key) || String(child).length > 13) && carriesCardNumber(String(child)))
5912
+ return true;
5913
+ if (child !== null && typeof child === "object")
5914
+ pending.push([child, at]);
5915
+ }
5916
+ }
5917
+ return false;
5918
+ }
5919
+ function cardDigits(number, brand) {
5920
+ if (typeof number !== "string")
5921
+ return null;
5922
+ if (/^[0-9]{12,19}$/.test(number))
5923
+ return number;
5924
+ const groups = number.split(" ");
5925
+ const mask = MASKS[brand];
5926
+ if (!mask || groups.length !== mask.length || !groups.every((group, at) => group.length === mask[at] && /^[0-9]+$/.test(group)))
5927
+ return null;
5928
+ return groups.join("");
5929
+ }
5930
+ function luhn7(digits4) {
5931
+ let sum = 0;
5932
+ for (let at = digits4.length - 1, double = false; at >= 0; at -= 1, double = !double) {
5933
+ let digit = digits4.charCodeAt(at) - 48;
5934
+ if (double) {
5935
+ digit *= 2;
5936
+ if (digit > 9)
5937
+ digit -= 9;
5938
+ }
5939
+ sum += digit;
5940
+ }
5941
+ return sum % 10 === 0;
5942
+ }
5943
+ function cardRefusal(card, brand) {
5944
+ if (!record30(card) || !Object.keys(card).every((key) => CARD_KEYS14.includes(key)) || !CARD_REQUIRED2.every((key) => owns7(card, key))) {
5945
+ return "payu_latam_body_unsupported";
5946
+ }
5947
+ const digits4 = cardDigits(card.number, brand);
5948
+ if (digits4 === null || !NETWORK2[brand].test(digits4) || !luhn7(digits4))
5949
+ return "payu_latam_body_unsupported";
5950
+ const code = card.securityCode;
5951
+ if (typeof code !== "string" || !SECURITY_CODE21.test(code) || code.length !== (brand === "AMEX" ? 4 : 3))
5952
+ return "payu_latam_body_unsupported";
5953
+ const { expirationDateMonth: month, expirationDateYear: year } = card;
5954
+ if (!Number.isSafeInteger(month) || month < 1 || month > 12 || !Number.isSafeInteger(year) || year < 0 || year > 99)
5955
+ return "payu_latam_body_unsupported";
5956
+ if (!absent(card, "cardType") && !CARD_TYPES2.includes(card.cardType))
5957
+ return "payu_latam_body_unsupported";
5958
+ return null;
5959
+ }
5960
+ function judgeBody5(body, target) {
5961
+ const value = readJson9(body);
5962
+ if (value === null || value.paymentMethodType !== "CREDIT_CARD" || typeof value.key !== "string" || !KEY.test(value.key) || !record30(value.order) || !record30(value.payer))
5963
+ return { code: "payu_latam_body_unsupported", value: null };
5964
+ if (target !== void 0 && value.key !== target.key)
5965
+ return { code: "payu_latam_session_mismatch", value: null };
5966
+ if (!absent(value, "creditCardTokenId") || value.isMasterpass === true || !absent(value, "masterpassObfuscateCreditCardNumber")) {
5967
+ return { code: "payu_latam_saved_card", value: null };
5968
+ }
5969
+ if (NOT_THE_CARD_FORM.some((key) => !absent(value, key)) || membersRefusal(value) || !absent(value, "lendingDeviceToken") || !absent(value, "questionnaire") || !(absent(value, "registerLendingDevice") || value.registerLendingDevice === false))
5970
+ return { code: "payu_latam_body_unsupported", value: null };
5971
+ const brand = value.paymentMethodMain;
5972
+ if (typeof brand !== "string" || !PAYU_LATAM_CARD_BRANDS.includes(brand))
5973
+ return { code: "payu_latam_card_unsupported", value: null };
5974
+ const card = cardRefusal(value.checkoutCreditCard, brand);
5975
+ if (card !== null)
5976
+ return { code: card, value: null };
5977
+ if (value.installments !== 1 && value.installments !== "1")
5978
+ return { code: "payu_latam_installments_unsupported", value: null };
5979
+ if (!absent(value, "cardType") && !CARD_TYPES2.includes(value.cardType) || !absent(value, "internationalCard") && typeof value.internationalCard !== "boolean" || !absent(value, "creditCardCountry") && (typeof value.creditCardCountry !== "string" || !COUNTRY6.test(value.creditCardCountry)) || !absent(value, "transactionType") && value.transactionType !== "AUTHORIZATION_AND_CAPTURE" || !absent(value, "isMasterpass") && typeof value.isMasterpass !== "boolean" || typeof value.order.isTest !== "boolean")
5980
+ return { code: "payu_latam_body_unsupported", value: null };
5981
+ const extra = value.order.extraParameters;
5982
+ if (!record30(extra) || !IS_TEST_TEXT[value.order.isTest].includes(extra.IS_TEST)) {
5983
+ return { code: "payu_latam_body_unsupported", value: null };
5984
+ }
5985
+ if (value.isRegisterPayer === true)
5986
+ return { code: "payu_latam_keep_on_file", value: null };
5987
+ if (!absent(value, "isRegisterPayer") && value.isRegisterPayer !== false)
5988
+ return { code: "payu_latam_body_unsupported", value: null };
5989
+ if (target !== void 0 && target.environment === "production" && value.order.isTest)
5990
+ return { code: "payu_latam_environment_mismatch", value: null };
5991
+ return { code: null, value };
5992
+ }
5993
+ function payuLatamBodyVerdict(body, url) {
5994
+ let target;
5995
+ if (url !== void 0) {
5996
+ target = payuLatamSubmitTarget(url);
5997
+ if (target === null)
5998
+ return refuse35("payu_latam_url_refused");
5999
+ if (!PAYU_LATAM_COUNTRIES.includes(target.country))
6000
+ return refuse35("payu_latam_country_unreviewed");
6001
+ }
6002
+ const { code } = judgeBody5(body, target);
6003
+ return code === null ? CARD34 : refuse35(code);
6004
+ }
6005
+ // src/registration.js
6006
+ var PARTS = { psp: "id", definitions: "list", refusedOperations: "list", settlementReadback: "any", exactUrl: "rule", bodyGate: "rule", amount: "rule" };
6007
+ var PSP_ID = /^[a-z][a-z0-9_]*$/;
6008
+ var registrationProblems = (spec) => problemsOf(spec, PARTS);
6009
+ function problemsOf(spec, parts) {
6010
+ if (!spec || typeof spec !== "object")
6011
+ return ["a registration is an object"];
6012
+ const psp = spec.psp;
6013
+ if (typeof psp !== "string" || !PSP_ID.test(psp))
6014
+ return [`${JSON.stringify(psp)} is not a processor id`];
6015
+ const problems2 = Object.keys(spec).filter((key) => !(key in parts)).map((key) => `${psp}: ${key} is no registration part`);
6016
+ for (const [key, kind] of Object.entries(parts)) {
6017
+ const value = spec[key];
6018
+ if (value === void 0)
6019
+ continue;
6020
+ if (kind === "rule" && typeof value !== "function")
6021
+ problems2.push(`${psp}: ${key} is not a function`);
6022
+ if (kind === "numbers" && !((Array.isArray(value) || value instanceof Set) && [...value].every((n) => typeof n === "string" && /^\d{12,19}$/.test(n)))) {
6023
+ problems2.push(`${psp}: ${key} is not a list of card numbers`);
6024
+ }
6025
+ }
6026
+ if ("definitions" in parts) {
6027
+ if (!Array.isArray(spec.definitions) || spec.definitions.length === 0)
6028
+ problems2.push(`${psp}: names no definition`);
6029
+ else if (spec.definitions.some((definition) => definition?.psp !== psp))
6030
+ problems2.push(`${psp}: a definition names another processor`);
6031
+ for (const id of spec.refusedOperations ?? []) {
6032
+ if (typeof id !== "string" || !id.startsWith(`${psp}.`))
6033
+ problems2.push(`${psp}: ${JSON.stringify(id)} is not one of its operations`);
6034
+ }
6035
+ }
6036
+ return problems2;
6037
+ }
6038
+ function registered(spec, parts) {
6039
+ const problems2 = problemsOf(spec, parts);
6040
+ if (problems2.length)
6041
+ throw new Error(`payment-core registration refused: ${problems2.join("; ")}`);
6042
+ return deepFreeze({ ...spec });
6043
+ }
6044
+ function registerProcessor(spec) {
6045
+ return registered(spec, PARTS);
6046
+ }
6047
+ // src/processors/midtrans.js
6048
+ var MIDTRANS_PSP = "midtrans";
6049
+ var MIDTRANS_OPERATION = "midtrans.card_request";
6050
+ var MIDTRANS_TOKEN_URL = "https://api.midtrans.com/v2/token";
6051
+ var MIDTRANS_SANDBOX_TOKEN_URL = "https://api.sandbox.midtrans.com/v2/token";
6052
+ var MIDTRANS_TOKEN_KEYS = /* @__PURE__ */ Object.freeze(["card_cvv", "card_number", "card_exp_month", "card_exp_year", "installment_term"]);
6053
+ var BODY_LIMIT34 = 4096;
6054
+ var CARD_NUMBER17 = /^[0-9]{12,19}$/;
6055
+ var SECURITY_CODE22 = /^[0-9]{3,4}$/;
6056
+ var MONTH18 = /^(?:0[1-9]|1[0-2])$/;
6057
+ var YEAR19 = /^20[0-9]{2}$/;
6058
+ var TERM = /^[0-9]{1,3}$/;
6059
+ var record31 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
6060
+ var own11 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
6061
+ var inOrder6 = (value, keys) => {
6062
+ let at = 0;
6063
+ for (const name of Object.keys(value)) {
6064
+ while (at < keys.length && keys[at] !== name)
6065
+ at += 1;
6066
+ if (at === keys.length)
6067
+ return false;
6068
+ at += 1;
6069
+ }
6070
+ return true;
6071
+ };
6072
+ var refuse36 = (code) => Object.freeze({ verdict: "refuse", code });
6073
+ var CARD35 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
6074
+ function isMidtransTokenUrl(url) {
6075
+ return url === MIDTRANS_TOKEN_URL || url === MIDTRANS_SANDBOX_TOKEN_URL;
6076
+ }
6077
+ function readBody20(body) {
6078
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT34)
6079
+ return null;
6080
+ let value;
6081
+ try {
6082
+ value = JSON.parse(body);
6083
+ if (!record31(value) || JSON.stringify(value) !== body)
6084
+ return null;
6085
+ }
6086
+ catch {
6087
+ return null;
6088
+ }
6089
+ return value;
6090
+ }
6091
+ function midtransBodyVerdict(body) {
6092
+ const value = readBody20(body);
6093
+ if (value === null || !inOrder6(value, MIDTRANS_TOKEN_KEYS)) {
6094
+ if (record31(value) && (own11(value, "token_id") || own11(value, "two_click")) && !own11(value, "card_number"))
6095
+ return refuse36("midtrans_saved_card");
6096
+ return refuse36("midtrans_body_unsupported");
6097
+ }
6098
+ if (!own11(value, "card_cvv") || !own11(value, "card_number") || !own11(value, "card_exp_month") || !own11(value, "card_exp_year")) {
6099
+ return refuse36("midtrans_body_unsupported");
6100
+ }
6101
+ if (typeof value.card_cvv !== "string" || !SECURITY_CODE22.test(value.card_cvv) || typeof value.card_number !== "string" || !CARD_NUMBER17.test(value.card_number) || typeof value.card_exp_month !== "string" || !MONTH18.test(value.card_exp_month) || typeof value.card_exp_year !== "string" || !YEAR19.test(value.card_exp_year))
6102
+ return refuse36("midtrans_body_unsupported");
6103
+ if (own11(value, "installment_term") && (typeof value.installment_term !== "string" || !TERM.test(value.installment_term)))
6104
+ return refuse36("midtrans_body_unsupported");
6105
+ return CARD35;
6106
+ }
6107
+ var midtrans_default = /* @__PURE__ */ registerProcessor({
6108
+ psp: MIDTRANS_PSP,
6109
+ definitions: [
6110
+ {
6111
+ psp: "midtrans",
6112
+ // Snap's token request, as the header above reads it. Sandbox has its own host, so the device sends a
6113
+ // test-mode request only Midtrans' documented test cards (hostEnvironmentPinned, device-replay.js S7).
6114
+ // Ships dark: served only to a client that declares `midtrans_card_token`, gated off for every org until an
6115
+ // operator lists one (`midtrans:<org>`), and the backend's gate serves only Agentcard's own company until the
6116
+ // token's publishable key is bound to the merchant (backend config.ts MIDTRANS_KEY_BOUND_TO_MERCHANT).
6117
+ capability: "midtrans_card_token",
6118
+ match: "api\\.(?:sandbox\\.)?midtrans\\.com/v2/token",
6119
+ hosts: ["^api\\.midtrans\\.com$", "^api\\.sandbox\\.midtrans\\.com$"],
6120
+ sandboxHosts: ["^api\\.sandbox\\.midtrans\\.com$"],
6121
+ hostEnvironmentPinned: true,
6122
+ encoding: "json",
6123
+ // Snap's own headers: the publishable client key (Authorization Basic) and X-Service. Origin, Referer and
6124
+ // cookies never ride.
6125
+ passthroughHeaders: ["^authorization$", "^x-service$"],
6126
+ jsonCardFields: [["card_number"]]
6127
+ }
6128
+ ],
6129
+ // Only the cardholder's device sends a token, after a person approves; no reviewed list names midtrans.
6130
+ refusedOperations: [MIDTRANS_OPERATION],
6131
+ // Not surveyed: the token moves no money, and the merchant's own charge names its status by the order id alone.
6132
+ settlementReadback: "not_surveyed",
6133
+ exactUrl: isMidtransTokenUrl,
6134
+ bodyGate: (url, body) => url !== void 0 && !isMidtransTokenUrl(url) ? { verdict: "refuse", code: "midtrans_url_refused" } : midtransBodyVerdict(body)
6135
+ });
6136
+ // src/processors/index.generated.js
6137
+ var REGISTERED_MODULES = Object.freeze({
6138
+ midtrans: midtrans_default
6139
+ });
6140
+ // src/registry.js
6141
+ var REGISTERED_PROCESSORS = Object.values(REGISTERED_MODULES);
6142
+ var ids = REGISTERED_PROCESSORS.map((processor) => processor.psp);
6143
+ var problems = REGISTERED_PROCESSORS.flatMap(registrationProblems);
6144
+ for (const [name, processor] of Object.entries(REGISTERED_MODULES)) {
6145
+ if (processor.psp !== name)
6146
+ problems.push(`processors/${name}.js registers ${JSON.stringify(processor.psp)}`);
6147
+ }
6148
+ if (ids.some((id, i) => i > 0 && ids[i - 1] >= id))
6149
+ problems.push(`registered processors out of id order: ${ids.join(", ")}`);
6150
+ if (problems.length)
6151
+ throw new Error(`payment-core registry refused: ${problems.join("; ")}`);
6152
+ var BY_PSP = new Map(REGISTERED_PROCESSORS.map((processor) => [processor.psp, processor]));
6153
+ var REGISTERED_IDS = Object.freeze(ids);
6154
+ var REGISTERED_DEFINITIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.definitions));
6155
+ var REGISTERED_REFUSED_OPERATIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.refusedOperations ?? []));
6156
+ var REGISTERED_SETTLEMENT_READBACK = Object.freeze(REGISTERED_PROCESSORS.filter((processor) => processor.settlementReadback !== void 0).map((processor) => [processor.psp, processor.settlementReadback]));
6157
+ function registeredRule(psp, name) {
6158
+ return typeof psp === "string" ? BY_PSP.get(psp)?.[name] : void 0;
6159
+ }
6160
+ // src/card-fields.js
6161
+ function processorGate(recognizer, url, body) {
6162
+ if (recognizer && recognizer.psp === LYRA_PSP)
6163
+ return lyraBodyVerdict(body, url);
6164
+ if (recognizer && recognizer.psp === WIX_PAYMENTS_PSP) {
6165
+ if (url !== void 0 && !isWixPaymentsTokenizeUrl(url))
6166
+ return { verdict: "refuse", code: "wix_payments_url_refused" };
6167
+ return wixPaymentsBodyVerdict(body);
6168
+ }
6169
+ if (recognizer && recognizer.psp === KOMOJU_PSP)
6170
+ return komojuBodyVerdict(body, url);
6171
+ if (recognizer && recognizer.psp === HIPAY_PSP) {
6172
+ if (url !== void 0 && !isHipayTokenUrl(url))
6173
+ return { verdict: "refuse", code: "hipay_url_refused" };
6174
+ return hipayBodyVerdict(body);
6175
+ }
6176
+ if (recognizer && recognizer.psp === PAYPAL_PSP) {
6177
+ if (url !== void 0 && !isPaypalConfirmUrl(url))
6178
+ return { verdict: "refuse", code: "paypal_url_refused" };
6179
+ return paypalBodyVerdict(body);
6180
+ }
6181
+ if (recognizer && recognizer.psp === MAKECOMMERCE_PSP)
6182
+ return makecommerceBodyVerdict(body, url);
6183
+ if (recognizer && recognizer.psp === OPENPAY_PSP)
6184
+ return openpayBodyVerdict(body, url);
6185
+ if (recognizer && recognizer.psp === POYNT_PSP) {
6186
+ if (url !== void 0 && !isPoyntNonceUrl(url))
6187
+ return { verdict: "refuse", code: "poynt_url_refused" };
6188
+ return poyntBodyVerdict(body);
6189
+ }
6190
+ if (recognizer && recognizer.psp === CARDCOM_PSP)
6191
+ return cardcomBodyVerdict(body, url);
6192
+ if (recognizer && recognizer.psp === TOAST_PSP) {
6193
+ if (url !== void 0 && !isToastPaymentMethodsUrl(url))
6194
+ return { verdict: "refuse", code: "toast_url_refused" };
6195
+ return toastBodyVerdict(body);
6196
+ }
6197
+ if (recognizer && recognizer.psp === PAYU_LATAM_PSP)
6198
+ return payuLatamBodyVerdict(body, url);
6199
+ if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
6200
+ if (url !== void 0 && !isPaddleVgsCardsUrl(url))
6201
+ return { verdict: "refuse", code: "paddle_vgs_url_refused" };
6202
+ return paddleVgsBodyVerdict(body);
6203
+ }
6204
+ if (recognizer && recognizer.psp === PAYFAST_PSP) {
6205
+ if (url !== void 0 && !isPayfastPayUrl(url))
6206
+ return { verdict: "refuse", code: "payfast_url_refused" };
6207
+ return payfastBodyVerdict(body);
6208
+ }
6209
+ if (recognizer && recognizer.psp === PAYREXX_PSP) {
6210
+ return url !== void 0 ? payrexxGateVerdict(url, body) : payrexxBodyVerdict(body);
6211
+ }
6212
+ if (recognizer && recognizer.psp === PAYGENT_PSP) {
6213
+ return url !== void 0 ? paygentRequestVerdict(url, body) : paygentBodyVerdict(body);
6214
+ }
6215
+ if (recognizer && recognizer.psp === PAY_NL_PSP) {
6216
+ if (url !== void 0 && !isPayNlTokenUrl(url))
6217
+ return { verdict: "refuse", code: "pay_nl_url_refused" };
6218
+ return payNlBodyVerdict(body);
6219
+ }
6220
+ if (recognizer && recognizer.psp === TWOC2P_PSP) {
6221
+ if (url === void 0)
6222
+ return twoC2pBodyVerdict(body);
6223
+ const target = twoC2pPaymentTarget(url);
6224
+ if (target === null)
6225
+ return { verdict: "refuse", code: "twoc2p_url_refused" };
6226
+ if (!target.reviewed)
6227
+ return twoC2pPaymentCarriesCard(body) ? { verdict: "refuse", code: "twoc2p_build_unreviewed" } : { verdict: "continue" };
6228
+ const keyBytes = twoC2pKeyBytes(target.environment);
6229
+ return keyBytes === null ? { verdict: "refuse", code: "twoc2p_field_unreviewed" } : twoC2pBodyVerdict(body, keyBytes, target.environment);
6230
+ }
6231
+ if (recognizer && recognizer.psp === APS_PSP)
6232
+ return apsBodyVerdict(body, url);
6233
+ if (recognizer && recognizer.psp === CONEKTA_PSP)
6234
+ return conektaBodyVerdict(body, url);
6235
+ if (recognizer && recognizer.psp === PADDLE_TOKENEX_PSP) {
6236
+ const target = url !== void 0 ? paddleTokenexPayTarget(url) : null;
6237
+ if (url !== void 0 && target === null)
6238
+ return { verdict: "refuse", code: "paddle_tokenex_pay_unsupported" };
6239
+ return paddleTokenexBodyVerdict(body, target ? target.line : void 0);
6240
+ }
6241
+ if (recognizer && recognizer.psp === PAYMONGO_PSP) {
6242
+ const session = url !== void 0 ? paymongoCheckoutSession(url) : void 0;
6243
+ if (url !== void 0 && session === null)
6244
+ return { verdict: "refuse", code: "paymongo_url_refused" };
6245
+ return paymongoBodyVerdict(body, session);
6246
+ }
6247
+ if (recognizer && recognizer.psp === GOPAY_PSP)
6248
+ return gopayBodyVerdict(body, url);
6249
+ if (recognizer && recognizer.psp === REVOLUT_PSP) {
6250
+ if (url !== void 0 && !isRevolutPaymentsUrl(url))
6251
+ return { verdict: "refuse", code: "revolut_url_refused" };
6252
+ return revolutBodyVerdict(body);
6253
+ }
6254
+ if (recognizer && recognizer.psp === SUMUP_PSP)
6255
+ return sumupBodyVerdict(body, url);
6256
+ if (recognizer && recognizer.psp === CLOVER_PSP)
6257
+ return cloverBodyVerdict(body, url);
6258
+ if (recognizer && recognizer.psp === TAP_PAYMENTS_PSP) {
6259
+ if (url !== void 0 && !isTapPaymentsTokenUrl(url))
6260
+ return { verdict: "refuse", code: "tap_payments_url_refused" };
6261
+ return tapPaymentsBodyVerdict(body);
6262
+ }
6263
+ if (recognizer && recognizer.psp === TOKENEX_IFRAME_PSP)
6264
+ return tokenexIframeBodyVerdict(body, url);
6265
+ if (recognizer && recognizer.psp === NEXI_CHECKOUT_PSP)
6266
+ return nexiCheckoutBodyVerdict(body, url);
6267
+ if (recognizer && recognizer.psp === FASTSPRING_PSP) {
6268
+ if (url !== void 0 && !isFastspringCardUrl(url))
6269
+ return { verdict: "refuse", code: "fastspring_url_refused" };
6270
+ return fastspringBodyVerdict(body);
6271
+ }
6272
+ if (recognizer && recognizer.psp === OMISE_PSP) {
6273
+ if (url !== void 0 && !isOmiseTokenUrl(url))
6274
+ return { verdict: "refuse", code: "omise_url_refused" };
6275
+ return omiseBodyVerdict(body);
6276
+ }
6277
+ if (recognizer && recognizer.psp === XENDIT_PSP) {
6278
+ if (url !== void 0 && !isXenditTokenUrl(url))
6279
+ return { verdict: "refuse", code: "xendit_url_refused" };
6280
+ return xenditBodyVerdict(body);
6281
+ }
6282
+ if (recognizer && recognizer.psp === PAYMOB_PSP) {
6283
+ if (url !== void 0 && !isPaymobPayUrl(url))
6284
+ return { verdict: "refuse", code: "paymob_url_refused" };
6285
+ return paymobBodyVerdict(body);
6286
+ }
6287
+ if (recognizer && recognizer.psp === GRAVY_PSP)
6288
+ return gravyBodyVerdict(body);
6289
+ if (recognizer && recognizer.psp === MONERIS_PSP) {
6290
+ if (url !== void 0 && !isMonerisTokenizeUrl(url))
6291
+ return { verdict: "refuse", code: "moneris_url_refused" };
6292
+ return monerisBodyVerdict(body);
6293
+ }
6294
+ if (recognizer && recognizer.psp === TAPPAY_PSP) {
6295
+ if (url !== void 0 && !isTappayGetPrimeUrl(url))
6296
+ return { verdict: "refuse", code: "tappay_url_refused" };
6297
+ return tappayBodyVerdict(body);
6298
+ }
6299
+ const ownGate = registeredRule(recognizer?.psp, "bodyGate");
6300
+ if (ownGate)
6301
+ return ownGate(url, body);
6302
+ if (!recognizer || recognizer.psp !== "elavon_converge")
6303
+ return null;
6304
+ if (url !== void 0 && !isConvergeProcessUrl(url))
6305
+ return { verdict: "refuse", code: "converge_url_refused" };
6306
+ return convergeBodyVerdict(body);
6307
+ }
6308
+ function carriesCardFields(recognizer, body) {
6309
+ const gate = processorGate(recognizer, void 0, body);
6310
+ if (gate !== null)
6311
+ return gate.verdict === "card";
6312
+ if (recognizer && recognizer.encoding === "json") {
6313
+ const claimed = carriesJsonCardFields(recognizer.jsonCardFields, body, DECLARED_PATHS_ONLY.has(recognizer.psp));
6314
+ return claimed && recognizer.psp === "amadeus_checkout" ? amadeusBodyKind(body) === "card" : claimed;
6315
+ }
6316
+ const fields = recognizer && recognizer.cardFields;
6317
+ if (!Array.isArray(fields) || fields.length === 0)
6318
+ return true;
6319
+ if (recognizer.encoding !== "form")
6320
+ return true;
6321
+ if (typeof body !== "string" || body === "")
6322
+ return false;
6323
+ const anyCase = recognizer.caseInsensitiveFormKeys === true;
6324
+ const wanted = anyCase ? fields.map((field2) => String(field2).toLowerCase()) : fields;
6325
+ for (const chunk of body.split("&")) {
6326
+ const eq = chunk.indexOf("=");
6327
+ if (eq <= 0 || eq === chunk.length - 1)
6328
+ continue;
6329
+ let key;
6330
+ try {
6331
+ key = decodeURIComponent(chunk.slice(0, eq).replace(/\+/g, " "));
6332
+ }
6333
+ catch {
6334
+ continue;
6335
+ }
6336
+ if (wanted.includes(anyCase ? key.trim().toLowerCase() : key))
6337
+ return true;
6338
+ }
6339
+ return false;
6340
+ }
6341
+ var DECLARED_PATHS_ONLY = /* @__PURE__ */ new Set(["primer", "pelecard", "creditguard", "payrails"]);
6342
+ function carriesJsonCardFields(paths, body, declaredOnly) {
6343
+ if (!Array.isArray(paths) || paths.length === 0 || !paths.every((path) => isJsonPath(path) && path.length > 0))
6344
+ return true;
6345
+ if (declaredOnly)
6346
+ return declaredPathHoldsCard(paths, body);
6347
+ let parsed;
6348
+ try {
6349
+ parsed = typeof body === "string" ? JSON.parse(body) : void 0;
6350
+ }
6351
+ catch {
6352
+ return true;
6353
+ }
6354
+ if (!isPlainObject(parsed))
6355
+ return true;
6356
+ if (paths.some((path) => {
6357
+ const at = jsonAt(parsed, path);
6358
+ return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
6359
+ }))
6360
+ return true;
6361
+ const declared = /* @__PURE__ */ new Set();
6362
+ for (const path of paths) {
6363
+ const last = path[path.length - 1];
6364
+ if (typeof last === "string")
6365
+ declared.add(last.toLowerCase());
6366
+ }
6367
+ return namesCardNumber(parsed, declared);
6368
+ }
6369
+ function declaredPathHoldsCard(paths, body) {
6370
+ if (typeof body !== "string" || body === "")
6371
+ return false;
6372
+ let parsed;
6373
+ try {
6374
+ parsed = JSON.parse(body);
6375
+ }
6376
+ catch {
6377
+ return false;
6378
+ }
6379
+ return paths.some((path) => {
6380
+ const at = jsonAt(parsed, path);
6381
+ return at.found && (typeof at.value === "string" && at.value !== "" || typeof at.value === "number");
6382
+ });
6383
+ }
6384
+ function namesCardNumber(root, declared) {
6385
+ const pending = [root];
6386
+ while (pending.length > 0) {
6387
+ const node = pending.pop();
6388
+ const named = !Array.isArray(node);
6389
+ for (const key of Object.keys(node)) {
6390
+ if (named) {
4003
6391
  const name = key.slice(key.lastIndexOf(".") + 1).toLowerCase();
4004
6392
  if (declared.has(name) || CARD_NUMBER_KEY.test(name) || name.endsWith("cardnumber"))
4005
6393
  return true;
@@ -4024,21 +6412,21 @@ var KEEP_ON_FILE_REFUSAL = "Refusing to pay: this Primer payment would keep the
4024
6412
  var UNSUPPORTED_SDK_REFUSAL = "Refusing to pay: this checkout uses a Primer SDK Agentcard does not support yet. Nothing was sent.";
4025
6413
  var NETWORK_MISMATCH_REFUSAL = "Refusing to pay: this Primer payment names a card network that is not your card's. Nothing was sent.";
4026
6414
  var FILL_REFUSAL = "Could not fill the card fields for Primer. Nothing was sent.";
4027
- var BODY_LIMIT24 = 16384;
6415
+ var BODY_LIMIT35 = 16384;
4028
6416
  var RESPONSE_LIMIT = 32768;
4029
- var ROOT_KEYS9 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
6417
+ var ROOT_KEYS10 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
4030
6418
  var INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear", "cardholderName", "preferredNetwork"];
4031
6419
  var REQUIRED_INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear"];
4032
- var record21 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4033
- var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4034
- var exact3 = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
4035
- var text6 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
4036
- var digits2 = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
6420
+ var record32 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
6421
+ var owns8 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
6422
+ var exact4 = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
6423
+ var text8 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
6424
+ var digits3 = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
4037
6425
  var panLike2 = (value) => /(?:[0-9][ _.:-]*){12,}/.test(value);
4038
- var plain2 = (value, max) => text6(value, max) && !panLike2(value);
4039
- var MONTH13 = /^(?:0[1-9]|1[0-2])$/;
4040
- var YEAR13 = /^20[0-9]{2}$/;
4041
- var NETWORK2 = /^[A-Z][A-Z_]{1,31}$/;
6426
+ var plain2 = (value, max) => text8(value, max) && !panLike2(value);
6427
+ var MONTH19 = /^(?:0[1-9]|1[0-2])$/;
6428
+ var YEAR20 = /^20[0-9]{2}$/;
6429
+ var NETWORK3 = /^[A-Z][A-Z_]{1,31}$/;
4042
6430
  function isPrimerTokenizeUrl(url, method = "POST") {
4043
6431
  if (method !== "POST" || typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
4044
6432
  return false;
@@ -4051,8 +6439,8 @@ function isPrimerTokenizeUrl(url, method = "POST") {
4051
6439
  }
4052
6440
  return parsed.href === url && parsed.protocol === "https:" && !parsed.port && !parsed.username && !parsed.password && !parsed.search && !parsed.hash && PRIMER_PCI_HOSTS.includes(parsed.hostname) && parsed.pathname === PRIMER_TOKENIZE_PATH;
4053
6441
  }
4054
- function judgeBody5(body) {
4055
- if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT24)
6442
+ function judgeBody6(body) {
6443
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT35)
4056
6444
  return null;
4057
6445
  let value;
4058
6446
  try {
@@ -4061,21 +6449,21 @@ function judgeBody5(body) {
4061
6449
  catch {
4062
6450
  return null;
4063
6451
  }
4064
- if (!record21(value) || !roundTrips(value, body))
6452
+ if (!record32(value) || !roundTrips(value, body))
4065
6453
  return null;
4066
- if (!Object.keys(value).every((key) => ROOT_KEYS9.includes(key)) || !owns6(value, "paymentInstrument"))
6454
+ if (!Object.keys(value).every((key) => ROOT_KEYS10.includes(key)) || !owns8(value, "paymentInstrument"))
4067
6455
  return null;
4068
6456
  const instrument = value.paymentInstrument;
4069
- if (!record21(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns6(instrument, key)))
6457
+ if (!record32(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns8(instrument, key)))
4070
6458
  return null;
4071
- if (!digits2(instrument.number, 12, 19) || !digits2(instrument.cvv, 3, 4) || !exact3(MONTH13, instrument.expirationMonth) || !exact3(YEAR13, instrument.expirationYear))
6459
+ if (!digits3(instrument.number, 12, 19) || !digits3(instrument.cvv, 3, 4) || !exact4(MONTH19, instrument.expirationMonth) || !exact4(YEAR20, instrument.expirationYear))
4072
6460
  return null;
4073
- if (owns6(instrument, "cardholderName") && instrument.cardholderName !== null && !plain2(instrument.cardholderName, 256) || owns6(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact3(NETWORK2, instrument.preferredNetwork) || owns6(value, "userDescription") && value.userDescription !== null && !plain2(value.userDescription, 256) || owns6(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns6(value, "paymentFlow") && value.paymentFlow !== "VAULT")
6461
+ if (owns8(instrument, "cardholderName") && instrument.cardholderName !== null && !plain2(instrument.cardholderName, 256) || owns8(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact4(NETWORK3, instrument.preferredNetwork) || owns8(value, "userDescription") && value.userDescription !== null && !plain2(value.userDescription, 256) || owns8(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns8(value, "paymentFlow") && value.paymentFlow !== "VAULT")
4074
6462
  return null;
4075
- return { value, keepOnFile: owns6(value, "tokenType") || owns6(value, "paymentFlow") };
6463
+ return { value, keepOnFile: owns8(value, "tokenType") || owns8(value, "paymentFlow") };
4076
6464
  }
4077
6465
  function primerBodyRefusal(body) {
4078
- const judged = judgeBody5(body);
6466
+ const judged = judgeBody6(body);
4079
6467
  if (!judged)
4080
6468
  return "unsupported";
4081
6469
  return judged.keepOnFile ? "keep_on_file" : null;
@@ -4084,7 +6472,7 @@ function isPrimerNewCardBody(body) {
4084
6472
  return primerBodyRefusal(body) === null;
4085
6473
  }
4086
6474
  function primerKeepOnFileRequested(body) {
4087
- const judged = judgeBody5(body);
6475
+ const judged = judgeBody6(body);
4088
6476
  return judged ? judged.keepOnFile : null;
4089
6477
  }
4090
6478
  var CARD_GATE = /* @__PURE__ */ Object.freeze({ psp: "primer", encoding: "json", jsonCardFields: [["paymentInstrument", "number"]] });
@@ -4094,7 +6482,7 @@ var CLIENT_TOKEN = /^[A-Za-z0-9._~+/=-]{16,4096}$/;
4094
6482
  var REQUEST_ID = /^[A-Za-z0-9-]{1,64}$/;
4095
6483
  var API_VERSION = /^2\.[0-9]{1,2}$/;
4096
6484
  function readHeaders(headers) {
4097
- if (!record21(headers))
6485
+ if (!record32(headers))
4098
6486
  return null;
4099
6487
  const folded = /* @__PURE__ */ new Map();
4100
6488
  for (const [name, value] of Object.entries(headers)) {
@@ -4112,9 +6500,9 @@ function headersRefusal(headers) {
4112
6500
  const version = folded.get("primer-sdk-version");
4113
6501
  if (typeof version !== "string")
4114
6502
  return "unsupported";
4115
- if (!exact3(LEGACY_SDK_VERSION, version))
6503
+ if (!exact4(LEGACY_SDK_VERSION, version))
4116
6504
  return "unsupported_sdk";
4117
- if (!exact3(CONTENT_TYPE2, folded.get("content-type")) || !exact3(CLIENT_TOKEN, folded.get("primer-client-token")) || folded.has("primer-sdk-client") && folded.get("primer-sdk-client") !== "WEB" || folded.has("x-api-version") && !exact3(API_VERSION, folded.get("x-api-version")) || folded.has("primer-sdk-checkout-session-id") && !exact3(REQUEST_ID, folded.get("primer-sdk-checkout-session-id")) || folded.has("x-request-id") && !exact3(REQUEST_ID, folded.get("x-request-id")))
6505
+ if (!exact4(CONTENT_TYPE2, folded.get("content-type")) || !exact4(CLIENT_TOKEN, folded.get("primer-client-token")) || folded.has("primer-sdk-client") && folded.get("primer-sdk-client") !== "WEB" || folded.has("x-api-version") && !exact4(API_VERSION, folded.get("x-api-version")) || folded.has("primer-sdk-checkout-session-id") && !exact4(REQUEST_ID, folded.get("primer-sdk-checkout-session-id")) || folded.has("x-request-id") && !exact4(REQUEST_ID, folded.get("x-request-id")))
4118
6506
  return "unsupported";
4119
6507
  return null;
4120
6508
  }
@@ -4141,7 +6529,7 @@ function onTokenizePath(url) {
4141
6529
  }
4142
6530
  }
4143
6531
  function primerTokenizeRefusal(request) {
4144
- if (!record21(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
6532
+ if (!record32(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
4145
6533
  return "unsupported";
4146
6534
  return headersRefusal(request.headers) ?? primerBodyRefusal(request.body);
4147
6535
  }
@@ -4156,7 +6544,7 @@ function primerCardOnFileRefusal(url, options, policy = PRIMER_SESSION_CARD_ON_F
4156
6544
  return "unsupported";
4157
6545
  if (new URL(url).hostname !== LIVE_PCI_HOST)
4158
6546
  return null;
4159
- return primerCardOnFileDisclosure(url, policy) && record21(options) && options.keepOnFile === true ? null : "keep_on_file";
6547
+ return primerCardOnFileDisclosure(url, policy) && record32(options) && options.keepOnFile === true ? null : "keep_on_file";
4160
6548
  }
4161
6549
  function primerRefusalMessage(reason) {
4162
6550
  if (reason === "keep_on_file")
@@ -4168,7 +6556,7 @@ function primerRefusalMessage(reason) {
4168
6556
  return UNSUPPORTED_REFUSAL;
4169
6557
  }
4170
6558
  function primerCardNetwork(number) {
4171
- if (!digits2(number, 12, 19))
6559
+ if (!digits3(number, 12, 19))
4172
6560
  return null;
4173
6561
  const two = Number(number.slice(0, 2));
4174
6562
  const four = Number(number.slice(0, 4));
@@ -4181,7 +6569,7 @@ function primerCardNetwork(number) {
4181
6569
  return null;
4182
6570
  }
4183
6571
  function primerNetworkRefusal(body, card) {
4184
- const judged = judgeBody5(body);
6572
+ const judged = judgeBody6(body);
4185
6573
  if (!judged)
4186
6574
  return "unsupported";
4187
6575
  const preferred = judged.value.paymentInstrument.preferredNetwork;
@@ -4191,14 +6579,14 @@ function primerNetworkRefusal(body, card) {
4191
6579
  return network !== null && network === preferred ? null : "network_mismatch";
4192
6580
  }
4193
6581
  function injectPrimerCard(body, card) {
4194
- const judged = judgeBody5(body);
6582
+ const judged = judgeBody6(body);
4195
6583
  if (!judged)
4196
6584
  throw new Error(UNSUPPORTED_REFUSAL);
4197
6585
  if (judged.keepOnFile)
4198
6586
  throw new Error(KEEP_ON_FILE_REFUSAL);
4199
- const month = card && (Number.isInteger(card.month) || digits2(card.month, 1, 2)) ? Number(card.month) : NaN;
4200
- const year = card && (Number.isInteger(card.year) || digits2(card.year, 2, 4)) ? Number(card.year) : NaN;
4201
- if (!card || !digits2(card.number, 12, 19) || !(month >= 1 && month <= 12) || !(year >= 0 && year <= 99 || year >= 2e3 && year <= 2099) || !digits2(card.cvc, 3, 4)) {
6587
+ const month = card && (Number.isInteger(card.month) || digits3(card.month, 1, 2)) ? Number(card.month) : NaN;
6588
+ const year = card && (Number.isInteger(card.year) || digits3(card.year, 2, 4)) ? Number(card.year) : NaN;
6589
+ if (!card || !digits3(card.number, 12, 19) || !(month >= 1 && month <= 12) || !(year >= 0 && year <= 99 || year >= 2e3 && year <= 2099) || !digits3(card.cvc, 3, 4)) {
4202
6590
  throw new Error(FILL_REFUSAL);
4203
6591
  }
4204
6592
  if (primerNetworkRefusal(body, card) !== null)
@@ -4215,13 +6603,13 @@ function injectPrimerCard(body, card) {
4215
6603
  }
4216
6604
  return { body: JSON.stringify(judged.value), where };
4217
6605
  }
4218
- var TOKEN3 = /^[A-Za-z0-9_-]{8,256}$/;
6606
+ var TOKEN4 = /^[A-Za-z0-9_-]{8,256}$/;
4219
6607
  var ERROR_ID = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/;
4220
- var CODE5 = /^[A-Z][A-Z0-9_]{0,63}$/;
6608
+ var CODE7 = /^[A-Z][A-Z0-9_]{0,63}$/;
4221
6609
  var NETWORK_NAME = /^[A-Za-z][A-Za-z0-9 _-]{0,31}$/;
4222
6610
  var RESPONSE_MONTH = /^(?:0?[1-9]|1[0-2])$/;
4223
6611
  var RESPONSE_YEAR = /^(?:[0-9]{2}|20[0-9]{2})$/;
4224
- var PROTOCOL = /^[0-9]{1,2}(?:\.[0-9]{1,2}){0,2}$/;
6612
+ var PROTOCOL2 = /^[0-9]{1,2}(?:\.[0-9]{1,2}){0,2}$/;
4225
6613
  var BIN_KEYS = [
4226
6614
  "network",
4227
6615
  "issuerCountryCode",
@@ -4240,28 +6628,28 @@ function readAnswer(body) {
4240
6628
  return null;
4241
6629
  try {
4242
6630
  const value = JSON.parse(body);
4243
- return record21(value) ? value : null;
6631
+ return record32(value) ? value : null;
4244
6632
  }
4245
6633
  catch {
4246
6634
  return null;
4247
6635
  }
4248
6636
  }
4249
- var tokenValue = (value) => exact3(TOKEN3, value) && !panLike2(value);
4250
- var optional = (value, key, check) => !owns6(value, key) || value[key] === null || check(value[key]);
6637
+ var tokenValue = (value) => exact4(TOKEN4, value) && !panLike2(value);
6638
+ var optional = (value, key, check) => !owns8(value, key) || value[key] === null || check(value[key]);
4251
6639
  function cardDetails(data) {
4252
- if (!record21(data) || !exact3(/^[0-9]{4}$/, data.last4Digits))
6640
+ if (!record32(data) || !exact4(/^[0-9]{4}$/, data.last4Digits))
4253
6641
  return null;
4254
- if (!optional(data, "first6Digits", (v) => exact3(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact3(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact3(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain2(v, 256)) || !optional(data, "network", (v) => exact3(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record21))
6642
+ if (!optional(data, "first6Digits", (v) => exact4(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact4(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact4(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain2(v, 256)) || !optional(data, "network", (v) => exact4(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record32))
4255
6643
  return null;
4256
6644
  const safe = { last4Digits: data.last4Digits };
4257
6645
  for (const key of ["first6Digits", "expirationMonth", "expirationYear", "cardholderName", "network", "isNetworkTokenized"]) {
4258
- if (owns6(data, key) && data[key] !== null)
6646
+ if (owns8(data, key) && data[key] !== null)
4259
6647
  safe[key] = data[key];
4260
6648
  }
4261
- if (record21(data.binData)) {
6649
+ if (record32(data.binData)) {
4262
6650
  const bin = {};
4263
6651
  for (const key of BIN_KEYS) {
4264
- if (!owns6(data.binData, key) || data.binData[key] === null)
6652
+ if (!owns8(data.binData, key) || data.binData[key] === null)
4265
6653
  continue;
4266
6654
  if (!plain2(data.binData[key], 128))
4267
6655
  return null;
@@ -4274,11 +6662,11 @@ function cardDetails(data) {
4274
6662
  function threeDsSummary(value) {
4275
6663
  if (value === void 0 || value === null)
4276
6664
  return null;
4277
- if (!record21(value) || !exact3(CODE5, value.responseCode) || !optional(value, "reasonCode", (v) => exact3(CODE5, v)) || !optional(value, "reasonText", (v) => plain2(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact3(PROTOCOL, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
6665
+ if (!record32(value) || !exact4(CODE7, value.responseCode) || !optional(value, "reasonCode", (v) => exact4(CODE7, v)) || !optional(value, "reasonText", (v) => plain2(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact4(PROTOCOL2, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
4278
6666
  return void 0;
4279
6667
  const safe = { responseCode: value.responseCode };
4280
6668
  for (const key of ["reasonCode", "reasonText", "protocolVersion", "challengeIssued"]) {
4281
- if (owns6(value, key) && value[key] !== null)
6669
+ if (owns8(value, key) && value[key] !== null)
4282
6670
  safe[key] = value[key];
4283
6671
  }
4284
6672
  return safe;
@@ -4291,7 +6679,7 @@ function rebuildToken(value) {
4291
6679
  if (!details || threeDs === void 0)
4292
6680
  return null;
4293
6681
  const safe = { token: value.token };
4294
- if (owns6(value, "analyticsId") && value.analyticsId !== null)
6682
+ if (owns8(value, "analyticsId") && value.analyticsId !== null)
4295
6683
  safe.analyticsId = value.analyticsId;
4296
6684
  safe.tokenType = "SINGLE_USE";
4297
6685
  safe.paymentInstrumentType = "PAYMENT_CARD";
@@ -4302,8 +6690,8 @@ function rebuildToken(value) {
4302
6690
  }
4303
6691
  function primerErrorId(body) {
4304
6692
  const value = readAnswer(body);
4305
- const id = value && record21(value.error) ? value.error.errorId : null;
4306
- return exact3(ERROR_ID, id) && !panLike2(id) ? id : null;
6693
+ const id = value && record32(value.error) ? value.error.errorId : null;
6694
+ return exact4(ERROR_ID, id) && !panLike2(id) ? id : null;
4307
6695
  }
4308
6696
  function matchesCard(details, card) {
4309
6697
  const number = card && typeof card.number === "string" ? card.number : "";