@agent-cards/sdk 0.23.21 → 0.23.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/PREFLIGHT.md +4 -0
- package/README.md +27 -1
- package/dist/amadeus-checkout.generated.d.ts +6 -1
- package/dist/amadeus-checkout.generated.js +26 -2
- package/dist/card-fields.generated.js +1391 -104
- package/dist/cdp.js +53 -18
- package/dist/client.d.ts +73 -6
- package/dist/client.js +164 -24
- package/dist/creditguard.generated.js +4 -2
- package/dist/cse-body.js +11 -0
- package/dist/ebanx.d.ts +1 -1
- package/dist/ebanx.js +1 -1
- package/dist/eximbay.d.ts +46 -0
- package/dist/eximbay.js +69 -0
- package/dist/lifecycle.d.ts +9 -4
- package/dist/lifecycle.js +16 -4
- package/dist/paygent.generated.d.ts +60 -0
- package/dist/paygent.generated.js +425 -0
- package/dist/payrexx.d.ts +91 -0
- package/dist/payrexx.generated.d.ts +91 -0
- package/dist/payrexx.generated.js +536 -0
- package/dist/payrexx.js +141 -0
- package/dist/pre-claim.d.ts +23 -0
- package/dist/pre-claim.js +131 -20
- package/dist/prepared-processor.d.ts +7 -2
- package/dist/prepared-processor.js +16 -2
- package/dist/primer.generated.js +1427 -140
- package/dist/stripe-checkout.generated.js +289 -21
- package/dist/toast-seal.generated.d.ts +37 -0
- package/dist/toast-seal.generated.js +625 -0
- package/dist/toast.generated.d.ts +41 -0
- package/dist/toast.generated.js +113 -0
- package/package.json +2 -2
package/dist/primer.generated.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Generated from @agent-cards/payment-core. Do not edit.
|
|
3
|
-
// artifact-sha256:
|
|
3
|
+
// artifact-sha256: 2163d0faf9f17cfd1ca85cb205df104d44da2436468a05413932b6386c56d75d
|
|
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
|
|
113
|
-
const m = typeof
|
|
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
|
|
117
|
-
return Number.isSafeInteger(
|
|
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
|
|
369
|
-
return
|
|
368
|
+
const own10 = Object.keys(value);
|
|
369
|
+
return own10.length === keys.length && own10.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(
|
|
593
|
+
function utf8(text9) {
|
|
594
594
|
const out = [];
|
|
595
|
-
for (const char of
|
|
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
|
|
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
|
|
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) !==
|
|
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
|
|
783
|
-
return
|
|
782
|
+
const own10 = Object.keys(value);
|
|
783
|
+
return own10.length === keys.length && own10.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
|
|
1273
|
-
return
|
|
1272
|
+
const own10 = Object.keys(value);
|
|
1273
|
+
return own10.length === keys.length && own10.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
|
|
1303
|
+
const field2 = value[name];
|
|
1304
1304
|
if (!FIELD_NAME.test(name))
|
|
1305
1305
|
return false;
|
|
1306
|
-
if (!record6(
|
|
1307
|
-
return billingText(
|
|
1308
|
-
const nested = Object.keys(
|
|
1309
|
-
return nested.length <= MAX_NESTED_FIELDS && nested.every((key) => FIELD_NAME.test(key) && billingText(
|
|
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
|
|
1383
|
+
let exact5 = false;
|
|
1384
1384
|
try {
|
|
1385
|
-
|
|
1385
|
+
exact5 = body.length <= BODY_LIMIT6 && JSON.stringify(parsed) === body;
|
|
1386
1386
|
}
|
|
1387
1387
|
catch {
|
|
1388
|
-
|
|
1388
|
+
exact5 = false;
|
|
1389
1389
|
}
|
|
1390
|
-
return { parsed, exact:
|
|
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:
|
|
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 (!
|
|
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
|
|
1476
|
-
return
|
|
1475
|
+
const own10 = Object.keys(value);
|
|
1476
|
+
return own10.length === keys.length && own10.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(
|
|
1480
|
+
function luhn(digits4) {
|
|
1481
1481
|
let sum = 0;
|
|
1482
|
-
for (let at = 0; at <
|
|
1483
|
-
let digit = Number(
|
|
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(
|
|
1631
|
-
if (VISA2.test(
|
|
1630
|
+
function cardNetwork2(digits4) {
|
|
1631
|
+
if (VISA2.test(digits4))
|
|
1632
1632
|
return "visa";
|
|
1633
|
-
return MASTERCARD2.test(
|
|
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((
|
|
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
|
|
1707
|
-
return
|
|
1706
|
+
const own10 = Object.keys(value);
|
|
1707
|
+
return own10.length === keys.length && own10.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
|
|
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
|
-
|
|
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 = (
|
|
2109
|
+
var luhn2 = (digits4) => {
|
|
2099
2110
|
let sum = 0;
|
|
2100
|
-
for (let at = 0; at <
|
|
2101
|
-
let d =
|
|
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 = (
|
|
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(
|
|
2334
|
+
function luhn3(digits4) {
|
|
2324
2335
|
let sum = 0;
|
|
2325
|
-
for (let at = 0; at <
|
|
2326
|
-
let digit = Number(
|
|
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(
|
|
2341
|
-
if (typeof
|
|
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
|
|
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(
|
|
2357
|
-
const json = decodeBase64(
|
|
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(
|
|
2476
|
-
if (typeof
|
|
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(
|
|
2491
|
+
binary = atob(text9);
|
|
2481
2492
|
}
|
|
2482
2493
|
catch {
|
|
2483
2494
|
return null;
|
|
2484
2495
|
}
|
|
2485
|
-
if (btoa(binary) !==
|
|
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
|
|
2728
|
-
return
|
|
2738
|
+
const own10 = Object.keys(value);
|
|
2739
|
+
return own10.length === keys.length && own10.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,9 +2780,9 @@ 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
|
|
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
|
-
|
|
2785
|
+
pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
|
|
2775
2786
|
]);
|
|
2776
2787
|
// src/amazon-payment-services.js
|
|
2777
2788
|
var APS_PSP = "amazon_payment_services";
|
|
@@ -3057,14 +3068,14 @@ function cloverTokenUrl(url) {
|
|
|
3057
3068
|
return null;
|
|
3058
3069
|
return Object.freeze({ host: parsed.hostname, environment: CLOVER_TOKEN_HOSTS[parsed.hostname] });
|
|
3059
3070
|
}
|
|
3060
|
-
function cloverBrand(
|
|
3061
|
-
if (typeof
|
|
3071
|
+
function cloverBrand(digits4) {
|
|
3072
|
+
if (typeof digits4 !== "string" || !/^[0-9]{6,19}$/.test(digits4))
|
|
3062
3073
|
return null;
|
|
3063
|
-
const two = Number(
|
|
3064
|
-
const three = Number(
|
|
3065
|
-
const four = Number(
|
|
3066
|
-
const six = Number(
|
|
3067
|
-
if (
|
|
3074
|
+
const two = Number(digits4.slice(0, 2));
|
|
3075
|
+
const three = Number(digits4.slice(0, 3));
|
|
3076
|
+
const four = Number(digits4.slice(0, 4));
|
|
3077
|
+
const six = Number(digits4.slice(0, 6));
|
|
3078
|
+
if (digits4.startsWith("4"))
|
|
3068
3079
|
return "VISA";
|
|
3069
3080
|
if (two === 34 || two === 37)
|
|
3070
3081
|
return "AMEX";
|
|
@@ -3166,14 +3177,14 @@ var record16 = (value) => value !== null && typeof value === "object" && !Array.
|
|
|
3166
3177
|
function isTapPaymentsTokenUrl(url) {
|
|
3167
3178
|
return url === TAP_PAYMENTS_TOKEN_URL;
|
|
3168
3179
|
}
|
|
3169
|
-
var
|
|
3180
|
+
var pin7 = (fields) => Object.freeze({
|
|
3170
3181
|
...fields,
|
|
3171
3182
|
origins: Object.freeze([...fields.origins]),
|
|
3172
3183
|
sessions: Object.freeze({ ...fields.sessions }),
|
|
3173
3184
|
key: Object.freeze({ ...fields.key })
|
|
3174
3185
|
});
|
|
3175
3186
|
var TAP_PAYMENTS_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3176
|
-
|
|
3187
|
+
pin7({
|
|
3177
3188
|
id: "casefilegame",
|
|
3178
3189
|
merchant: "Casefilegame",
|
|
3179
3190
|
tapMerchantId: "67977048",
|
|
@@ -3437,7 +3448,7 @@ var YEAR11 = /^[0-9]{2}$/;
|
|
|
3437
3448
|
var CODE4 = /^[0-9]{3}$/;
|
|
3438
3449
|
var NAME_LIMIT3 = 100;
|
|
3439
3450
|
var NAME_WORD = /[a-z]+/gi;
|
|
3440
|
-
var printable2 = (
|
|
3451
|
+
var printable2 = (text9) => [...text9].every((character) => {
|
|
3441
3452
|
const point = character.codePointAt(0);
|
|
3442
3453
|
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
3443
3454
|
});
|
|
@@ -3446,15 +3457,15 @@ var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](
|
|
|
3446
3457
|
var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
|
|
3447
3458
|
var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3448
3459
|
var sameKeys8 = (value, keys) => {
|
|
3449
|
-
const
|
|
3450
|
-
return
|
|
3460
|
+
const own10 = Object.keys(value);
|
|
3461
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
3451
3462
|
};
|
|
3452
3463
|
var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3453
3464
|
var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3454
|
-
function luhn4(
|
|
3465
|
+
function luhn4(digits4) {
|
|
3455
3466
|
let sum = 0;
|
|
3456
|
-
for (let at = 0; at <
|
|
3457
|
-
let digit = Number(
|
|
3467
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
3468
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
3458
3469
|
if (at % 2 === 1) {
|
|
3459
3470
|
digit *= 2;
|
|
3460
3471
|
if (digit > 9)
|
|
@@ -3713,12 +3724,93 @@ var SUCCESS_RULES = {
|
|
|
3713
3724
|
cvvIncluded: (value) => typeof value === "boolean"
|
|
3714
3725
|
};
|
|
3715
3726
|
var SUCCESS_KEYS = Object.keys(SUCCESS_RULES);
|
|
3727
|
+
// src/openpay.js
|
|
3728
|
+
var OPENPAY_PSP = "openpay_bbva";
|
|
3729
|
+
var OPENPAY_API_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
3730
|
+
"api.openpay.mx": "production",
|
|
3731
|
+
"api.openpay.co": "production",
|
|
3732
|
+
"api.openpay.pe": "production",
|
|
3733
|
+
"sandbox-api.openpay.mx": "sandbox",
|
|
3734
|
+
"sandbox-api.openpay.co": "sandbox",
|
|
3735
|
+
"sandbox-api.openpay.pe": "sandbox"
|
|
3736
|
+
});
|
|
3737
|
+
var OPENPAY_CARD_KEYS = /* @__PURE__ */ Object.freeze(["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year", "address"]);
|
|
3738
|
+
var OPENPAY_ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["line1", "line2", "line3", "state", "city", "postal_code", "country_code"]);
|
|
3739
|
+
var BODY_LIMIT23 = 4096;
|
|
3740
|
+
var URL_LIMIT10 = 96;
|
|
3741
|
+
var TOKEN_URL = /^https:\/\/((?:sandbox-)?api\.openpay\.(?:mx|co|pe))\/v1\/([a-z0-9]{10,40})\/tokens$/;
|
|
3742
|
+
var NUMBER6 = /^[0-9]{12,19}$/;
|
|
3743
|
+
var SECURITY_CODE14 = /^[0-9]{3,4}$/;
|
|
3744
|
+
var MONTH_TEXT = /^(?:0?[1-9]|1[0-2])$/;
|
|
3745
|
+
var YEAR12 = /^[0-9]{2}$/;
|
|
3746
|
+
var COUNTRY3 = /^[A-Z]{2}$/;
|
|
3747
|
+
var LETTERS2 = "A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u017F";
|
|
3748
|
+
var PAGE_NAME3 = new RegExp(`^[${LETTERS2} .'-]{1,64}$`);
|
|
3749
|
+
var HAS_LETTER2 = new RegExp(`[${LETTERS2}]`);
|
|
3750
|
+
var ADDRESS_VALUE2 = new RegExp(`^[\\x20-\\x7e\\u00a0-\\u017f]{0,128}$`);
|
|
3751
|
+
var PAN_LIKE6 = new RegExp(`(?:[0-9][^0-9${LETTERS2}]*){12,}`);
|
|
3752
|
+
var record20 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3753
|
+
var hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);
|
|
3754
|
+
var refuse25 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3755
|
+
var CARD24 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3756
|
+
function openpayTokenTarget(url) {
|
|
3757
|
+
if (typeof url !== "string" || url.length > URL_LIMIT10)
|
|
3758
|
+
return null;
|
|
3759
|
+
const match = TOKEN_URL.exec(url);
|
|
3760
|
+
if (!match)
|
|
3761
|
+
return null;
|
|
3762
|
+
return Object.freeze({ environment: OPENPAY_API_HOSTS[match[1]], host: match[1], merchantId: match[2] });
|
|
3763
|
+
}
|
|
3764
|
+
function readJson6(body) {
|
|
3765
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT23)
|
|
3766
|
+
return null;
|
|
3767
|
+
try {
|
|
3768
|
+
const value = JSON.parse(body);
|
|
3769
|
+
return record20(value) && JSON.stringify(value) === body ? value : null;
|
|
3770
|
+
}
|
|
3771
|
+
catch {
|
|
3772
|
+
return null;
|
|
3773
|
+
}
|
|
3774
|
+
}
|
|
3775
|
+
var soundMonth = (value) => Number.isInteger(value) && value >= 1 && value <= 12 || typeof value === "string" && MONTH_TEXT.test(value);
|
|
3776
|
+
function soundAddress2(address2) {
|
|
3777
|
+
if (!record20(address2))
|
|
3778
|
+
return false;
|
|
3779
|
+
const keys = Object.keys(address2);
|
|
3780
|
+
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));
|
|
3781
|
+
}
|
|
3782
|
+
function openpayBodyVerdict(body, url) {
|
|
3783
|
+
if (url !== void 0 && openpayTokenTarget(url) === null)
|
|
3784
|
+
return refuse25("openpay_url_refused");
|
|
3785
|
+
const value = readJson6(body);
|
|
3786
|
+
if (value === null)
|
|
3787
|
+
return refuse25("openpay_body_unsupported");
|
|
3788
|
+
const keys = Object.keys(value);
|
|
3789
|
+
if (!keys.every((key) => OPENPAY_CARD_KEYS.includes(key)) || !["card_number", "holder_name", "cvv2", "expiration_month", "expiration_year"].every((key) => keys.includes(key))) {
|
|
3790
|
+
return refuse25("openpay_body_unsupported");
|
|
3791
|
+
}
|
|
3792
|
+
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)) {
|
|
3793
|
+
return refuse25("openpay_body_unsupported");
|
|
3794
|
+
}
|
|
3795
|
+
return CARD24;
|
|
3796
|
+
}
|
|
3797
|
+
var pin8 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), publicKeys: Object.freeze([...fields.publicKeys]) });
|
|
3798
|
+
var OPENPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3799
|
+
pin8({
|
|
3800
|
+
id: "diario_de_yucatan",
|
|
3801
|
+
merchant: "Diario de Yucatán",
|
|
3802
|
+
origins: ["https://www.yucatan.com.mx"],
|
|
3803
|
+
host: "api.openpay.mx",
|
|
3804
|
+
merchantId: "mqyloyrm8tsvtsgcrj0d",
|
|
3805
|
+
publicKeys: ["pk_260aa43616a445bb98472e6ca51da968"]
|
|
3806
|
+
})
|
|
3807
|
+
]);
|
|
3716
3808
|
// src/poynt.js
|
|
3717
3809
|
var POYNT_PSP = "poynt";
|
|
3718
3810
|
var UUID4 = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
3719
3811
|
var NONCE_URL = new RegExp(`^https://services\\.poynt\\.net/v1/commerce/stores/(${UUID4})/payment-tokens/generate-nonce$`);
|
|
3720
3812
|
var STORE_ID = new RegExp(`^${UUID4}$`);
|
|
3721
|
-
var
|
|
3813
|
+
var BODY_LIMIT24 = 8192;
|
|
3722
3814
|
var ROOT_KEYS8 = /* @__PURE__ */ Object.freeze(["applicationId", "channelId", "card", "verificationData"]);
|
|
3723
3815
|
var CARD_KEYS10 = /* @__PURE__ */ Object.freeze(["number", "expirationMonth", "expirationYear", "type", "cardHolderFirstName", "cardHolderLastName", "cardHolderFullName"]);
|
|
3724
3816
|
var ADDRESS_KEYS4 = /* @__PURE__ */ Object.freeze(["postalCode", "line1", "line2", "city", "territory", "countryCode", "postalCodeExtension"]);
|
|
@@ -3728,17 +3820,17 @@ var CARD_ON_FILE_KEYS = /* @__PURE__ */ Object.freeze(["saveFinancialInstrumentO
|
|
|
3728
3820
|
var CARD_TYPES = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMERICAN_EXPRESS", "DINERS_CLUB", "DISCOVER", "JCB", "UNIONPAY", "MAESTRO", "ELO", "HIPERCARD", "TROY", ""]);
|
|
3729
3821
|
var CARD_NUMBER12 = /^[0-9]{12,19}$/;
|
|
3730
3822
|
var MONTH12 = /^(?:0[1-9]|1[0-2])$/;
|
|
3731
|
-
var
|
|
3732
|
-
var
|
|
3823
|
+
var YEAR13 = /^20[0-9]{2}$/;
|
|
3824
|
+
var SECURITY_CODE15 = /^[0-9]{3,4}$/;
|
|
3733
3825
|
var IDENTIFIER = /^[A-Za-z0-9:._-]{1,128}$/;
|
|
3734
3826
|
var APPLICATION_ID = new RegExp(`^urn:aid:${UUID4}$`);
|
|
3735
3827
|
var POSTAL_CODE3 = /^[A-Za-z0-9_]{0,16}$/;
|
|
3736
|
-
var
|
|
3828
|
+
var COUNTRY4 = /^[A-Z]{2}$/;
|
|
3737
3829
|
var TEXT_LIMIT7 = 256;
|
|
3738
3830
|
var CONTROL10 = /[\u0000-\u001f\u007f]/;
|
|
3739
|
-
var cardLike2 = (
|
|
3831
|
+
var cardLike2 = (text9) => (text9.match(/[0-9]/g) ?? []).length >= 12;
|
|
3740
3832
|
var text5 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT7 && !CONTROL10.test(value) && !cardLike2(value);
|
|
3741
|
-
var
|
|
3833
|
+
var record21 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
3742
3834
|
var own5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
3743
3835
|
var inOrder4 = (value, order, required) => {
|
|
3744
3836
|
const keys = Object.keys(value);
|
|
@@ -3751,8 +3843,8 @@ var inOrder4 = (value, order, required) => {
|
|
|
3751
3843
|
}
|
|
3752
3844
|
return required.every((key) => keys.includes(key));
|
|
3753
3845
|
};
|
|
3754
|
-
var
|
|
3755
|
-
var
|
|
3846
|
+
var refuse26 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
3847
|
+
var CARD25 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
3756
3848
|
function poyntStoreId(url) {
|
|
3757
3849
|
const match = typeof url === "string" ? NONCE_URL.exec(url) : null;
|
|
3758
3850
|
return match ? match[1] : null;
|
|
@@ -3761,12 +3853,12 @@ function isPoyntNonceUrl(url) {
|
|
|
3761
3853
|
return poyntStoreId(url) !== null;
|
|
3762
3854
|
}
|
|
3763
3855
|
function readBody14(body) {
|
|
3764
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
3856
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT24)
|
|
3765
3857
|
return null;
|
|
3766
3858
|
let value;
|
|
3767
3859
|
try {
|
|
3768
3860
|
value = JSON.parse(body);
|
|
3769
|
-
if (!
|
|
3861
|
+
if (!record21(value) || JSON.stringify(value) !== body)
|
|
3770
3862
|
return null;
|
|
3771
3863
|
}
|
|
3772
3864
|
catch {
|
|
@@ -3777,32 +3869,32 @@ function readBody14(body) {
|
|
|
3777
3869
|
function poyntBodyVerdict(body) {
|
|
3778
3870
|
const value = readBody14(body);
|
|
3779
3871
|
if (value === null)
|
|
3780
|
-
return
|
|
3872
|
+
return refuse26("poynt_body_unsupported");
|
|
3781
3873
|
if (CARD_ON_FILE_KEYS.some((key) => own5(value, key)))
|
|
3782
|
-
return
|
|
3874
|
+
return refuse26("poynt_card_on_file");
|
|
3783
3875
|
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
|
|
3876
|
+
return refuse26("poynt_body_unsupported");
|
|
3785
3877
|
}
|
|
3786
3878
|
const { card, verificationData: verification } = value;
|
|
3787
|
-
if (!
|
|
3788
|
-
return
|
|
3879
|
+
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]))) {
|
|
3880
|
+
return refuse26("poynt_body_unsupported");
|
|
3789
3881
|
}
|
|
3790
|
-
if (!
|
|
3791
|
-
return
|
|
3882
|
+
if (!record21(verification) || Object.keys(verification).join() !== "cardHolderBillingAddress,cvData" || typeof verification.cvData !== "string" || !SECURITY_CODE15.test(verification.cvData))
|
|
3883
|
+
return refuse26("poynt_body_unsupported");
|
|
3792
3884
|
const address2 = verification.cardHolderBillingAddress;
|
|
3793
|
-
if (!
|
|
3794
|
-
return
|
|
3795
|
-
return
|
|
3885
|
+
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))
|
|
3886
|
+
return refuse26("poynt_body_unsupported");
|
|
3887
|
+
return CARD25;
|
|
3796
3888
|
}
|
|
3797
|
-
var
|
|
3889
|
+
var pin9 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), storeIds: Object.freeze([...fields.storeIds]) });
|
|
3798
3890
|
var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
3799
|
-
|
|
3891
|
+
pin9({
|
|
3800
3892
|
id: "yearning_for_learning",
|
|
3801
3893
|
merchant: "Yearning for Learning Publishing & Coaching",
|
|
3802
3894
|
origins: ["https://ff305485-ba6c-423a-87b0-cebe3f83ffe9.mysimplestore.com"],
|
|
3803
3895
|
storeIds: ["71ac12ed-e61f-4318-95db-db0e7c649d6f"]
|
|
3804
3896
|
}),
|
|
3805
|
-
|
|
3897
|
+
pin9({
|
|
3806
3898
|
id: "timber_ridge_bookkeeping",
|
|
3807
3899
|
merchant: "Timber Ridge Bookkeeping",
|
|
3808
3900
|
origins: ["https://d7d64ac3-0352-4e53-af9a-f6d8e7b5fb71.mysimplestore.com"],
|
|
@@ -3810,6 +3902,1175 @@ var POYNT_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
|
3810
3902
|
})
|
|
3811
3903
|
]);
|
|
3812
3904
|
var MAX_ANSWER_CHARS = 16 * 1024;
|
|
3905
|
+
// src/cardcom.js
|
|
3906
|
+
var CARDCOM_PSP = "cardcom";
|
|
3907
|
+
var CARDCOM_HOST = "secure.cardcom.solutions";
|
|
3908
|
+
var CARDCOM_ORIGIN = "https://secure.cardcom.solutions";
|
|
3909
|
+
var CARDCOM_SUBMIT_PATH = "/api/EA5/SubmitPayment";
|
|
3910
|
+
var CARDCOM_CURRENCIES = /* @__PURE__ */ Object.freeze({ 1: "ils", 826: "gbp", 840: "usd", 978: "eur" });
|
|
3911
|
+
var BODY_LIMIT25 = 65536;
|
|
3912
|
+
var TOP_KEYS2 = /* @__PURE__ */ Object.freeze(["GoogleToken", "UserAgent", "NumberOfTries", "GooglePayToken", "Store", "_3DSecureReq", "HooxReference"]);
|
|
3913
|
+
var STORE_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3914
|
+
"CommonStore",
|
|
3915
|
+
"CompanyInfoStore",
|
|
3916
|
+
"ProductsStore",
|
|
3917
|
+
"DeliveryStore",
|
|
3918
|
+
"DocumentStore",
|
|
3919
|
+
"DetailsStore",
|
|
3920
|
+
"PaymentStore"
|
|
3921
|
+
]);
|
|
3922
|
+
var THREE_DS_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3923
|
+
"TerminalNum",
|
|
3924
|
+
"CoinId",
|
|
3925
|
+
"CardNumber",
|
|
3926
|
+
"CardholderFullName",
|
|
3927
|
+
"CardholderPhone",
|
|
3928
|
+
"CardHolderEmail",
|
|
3929
|
+
"CVV",
|
|
3930
|
+
"CardExpireMonth",
|
|
3931
|
+
"CardExpireYear",
|
|
3932
|
+
"RequestedBillingAmount",
|
|
3933
|
+
"UserAgentHeader",
|
|
3934
|
+
"browserLanguage",
|
|
3935
|
+
"_3ds_browserjavaenabled",
|
|
3936
|
+
"_3ds_browserscreenheight",
|
|
3937
|
+
"_3ds_browserscreenwidth",
|
|
3938
|
+
"_3ds_browsercolordepth",
|
|
3939
|
+
"_3ds_challengewindowsize",
|
|
3940
|
+
"_3ds_channel",
|
|
3941
|
+
"_3ds_category",
|
|
3942
|
+
"_3ds_transtype",
|
|
3943
|
+
"ExternalAisurit4DealPageUID",
|
|
3944
|
+
"DealToSaveJSON",
|
|
3945
|
+
"GooglePayToken",
|
|
3946
|
+
"DirectDebitSplitPaymentsSum",
|
|
3947
|
+
"SapakMutav"
|
|
3948
|
+
]);
|
|
3949
|
+
var COMMON_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3950
|
+
"Uid",
|
|
3951
|
+
"OldUid",
|
|
3952
|
+
"TerminalNumber",
|
|
3953
|
+
"TerminalType",
|
|
3954
|
+
"StoreInitialized",
|
|
3955
|
+
"SuccessRedirectUrl",
|
|
3956
|
+
"ErrorRedirectUrl",
|
|
3957
|
+
"BackgroundImageUrl",
|
|
3958
|
+
"AdditionalDataJson",
|
|
3959
|
+
"Language",
|
|
3960
|
+
"UniqTempDealID",
|
|
3961
|
+
"IsError",
|
|
3962
|
+
"ErrorCode",
|
|
3963
|
+
"ErrorMessage",
|
|
3964
|
+
"OpeningText",
|
|
3965
|
+
"IsEA5SinglePage",
|
|
3966
|
+
"CurrentCardcomBitIntervalId",
|
|
3967
|
+
"SapakMutav",
|
|
3968
|
+
"ShowCookiesBanner",
|
|
3969
|
+
"HideFooter",
|
|
3970
|
+
"LPVersion"
|
|
3971
|
+
]);
|
|
3972
|
+
var COMPANY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3973
|
+
"CompanyNumber",
|
|
3974
|
+
"Name",
|
|
3975
|
+
"Address1",
|
|
3976
|
+
"Address2",
|
|
3977
|
+
"Address3",
|
|
3978
|
+
"Tel",
|
|
3979
|
+
"Email",
|
|
3980
|
+
"LogoURL",
|
|
3981
|
+
"LogoAlt",
|
|
3982
|
+
"YoutubeLink",
|
|
3983
|
+
"InstagramLink",
|
|
3984
|
+
"FacebookLink",
|
|
3985
|
+
"WhatsappLink",
|
|
3986
|
+
"Comments",
|
|
3987
|
+
"ShowGPayLogo",
|
|
3988
|
+
"ShowMasterCardLogo",
|
|
3989
|
+
"ShowVisaLogo",
|
|
3990
|
+
"ShowAmexLogo",
|
|
3991
|
+
"ShowDinersLogo",
|
|
3992
|
+
"ShowIsracardLogo",
|
|
3993
|
+
"MetaTitle",
|
|
3994
|
+
"MetaDescription",
|
|
3995
|
+
"MetaImage"
|
|
3996
|
+
]);
|
|
3997
|
+
var DELIVERY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
3998
|
+
"ShowDeliveryForm",
|
|
3999
|
+
"DeliveryMethodField",
|
|
4000
|
+
"CityField",
|
|
4001
|
+
"StreetField",
|
|
4002
|
+
"BuildingNumberField",
|
|
4003
|
+
"ApartmentNumberField",
|
|
4004
|
+
"FloorField",
|
|
4005
|
+
"EntranceField",
|
|
4006
|
+
"DeliveryNotesField",
|
|
4007
|
+
"Cities",
|
|
4008
|
+
"Streets"
|
|
4009
|
+
]);
|
|
4010
|
+
var DOCUMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4011
|
+
"ShowInvoiceForm",
|
|
4012
|
+
"Comments",
|
|
4013
|
+
"Title",
|
|
4014
|
+
"NameField",
|
|
4015
|
+
"IdField",
|
|
4016
|
+
"MobileField",
|
|
4017
|
+
"AdditionalPhoneField",
|
|
4018
|
+
"EmailField",
|
|
4019
|
+
"EmailConfirmField",
|
|
4020
|
+
"CityField",
|
|
4021
|
+
"StreetField",
|
|
4022
|
+
"ZipcodeField",
|
|
4023
|
+
"SendPreBuyDataToServer",
|
|
4024
|
+
"DocTypeToCreate"
|
|
4025
|
+
]);
|
|
4026
|
+
var DETAILS_KEYS = /* @__PURE__ */ Object.freeze(["ShowDetailsForm", "ShowCancelBtn", "CancelUrl", "Comments", "FormFields"]);
|
|
4027
|
+
var PAYMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4028
|
+
"Comments",
|
|
4029
|
+
"ButtonText",
|
|
4030
|
+
"ButtonTextZeroSum",
|
|
4031
|
+
"HideCreditCardFieldsOnZeroSum",
|
|
4032
|
+
"EmailField",
|
|
4033
|
+
"MobileField",
|
|
4034
|
+
"CardNumberField",
|
|
4035
|
+
"YearsField",
|
|
4036
|
+
"MonthsField",
|
|
4037
|
+
"CvvField",
|
|
4038
|
+
"CardOwnerNameField",
|
|
4039
|
+
"CardTZField",
|
|
4040
|
+
"PaymentsField",
|
|
4041
|
+
"OpenSumField",
|
|
4042
|
+
"CardOwnerCityField",
|
|
4043
|
+
"CardOwnerAddressField",
|
|
4044
|
+
"CardOwnerZipcodeField",
|
|
4045
|
+
"ApprovedTermsAndConditions",
|
|
4046
|
+
"ShowTermsAndConditions",
|
|
4047
|
+
"TermsAndConditionsUrl",
|
|
4048
|
+
"AllowMerchantMessages",
|
|
4049
|
+
"MustAllowMerchantMessages",
|
|
4050
|
+
"ShowMerchantMessages",
|
|
4051
|
+
"ShowPayPal",
|
|
4052
|
+
"ShowUpayBitButton",
|
|
4053
|
+
"ShowPayMeBitButton",
|
|
4054
|
+
"ShowCardcomBitButton",
|
|
4055
|
+
"ShowApplePay",
|
|
4056
|
+
"MerchantApplePayLogoUrl",
|
|
4057
|
+
"ShowGooglePay",
|
|
4058
|
+
"ShowRecaptcha",
|
|
4059
|
+
"RecaptchaVersion",
|
|
4060
|
+
"IsCredit",
|
|
4061
|
+
"NumOfRetriesAllowed",
|
|
4062
|
+
"Commissions",
|
|
4063
|
+
"Is3DSecureEnabled",
|
|
4064
|
+
"Was3DSActiveOnPageLoad",
|
|
4065
|
+
"ThreeDSecureTransactionId",
|
|
4066
|
+
"ShowSuccessPopup",
|
|
4067
|
+
"ShowErrorPopup",
|
|
4068
|
+
"DonationType",
|
|
4069
|
+
"ThreeDSecureCavv",
|
|
4070
|
+
"GoogleCardNumber",
|
|
4071
|
+
"GoogleExpirationYear",
|
|
4072
|
+
"GoogleExpirationMonth",
|
|
4073
|
+
"CanSkipAuthentication",
|
|
4074
|
+
"CartTitle",
|
|
4075
|
+
"IsDirectDebit",
|
|
4076
|
+
"EnableHooxOffers",
|
|
4077
|
+
"HooxID",
|
|
4078
|
+
"SupportedCardBrands",
|
|
4079
|
+
"IsDirectDebitSplitPayments",
|
|
4080
|
+
"ApplePayApplicationData",
|
|
4081
|
+
"ShowPaymentButton",
|
|
4082
|
+
"OrderSummeryTitle",
|
|
4083
|
+
"AllowBitEmptyCardOwnerName",
|
|
4084
|
+
"IsCreateToken",
|
|
4085
|
+
"TurnstileSiteKey",
|
|
4086
|
+
"PrivacyPolicyUrl",
|
|
4087
|
+
"DualCardsBINs",
|
|
4088
|
+
"IsHideCart",
|
|
4089
|
+
"IsJ5"
|
|
4090
|
+
]);
|
|
4091
|
+
var FIELD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4092
|
+
"Ref",
|
|
4093
|
+
"Id",
|
|
4094
|
+
"Order",
|
|
4095
|
+
"InputType",
|
|
4096
|
+
"Required",
|
|
4097
|
+
"PreventPaste",
|
|
4098
|
+
"Show",
|
|
4099
|
+
"Data",
|
|
4100
|
+
"Value",
|
|
4101
|
+
"Direction",
|
|
4102
|
+
"Disabled"
|
|
4103
|
+
]);
|
|
4104
|
+
var PRODUCT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4105
|
+
"MinQuantity",
|
|
4106
|
+
"MaxQuantity",
|
|
4107
|
+
"JumpsInQuantity",
|
|
4108
|
+
"SelectedBuyQuantity",
|
|
4109
|
+
"QuantityOptions",
|
|
4110
|
+
"Comments",
|
|
4111
|
+
"IsManualSum",
|
|
4112
|
+
"PaymentsOptions",
|
|
4113
|
+
"IsCouponActive",
|
|
4114
|
+
"ManualPrice",
|
|
4115
|
+
"ManualPriceTxt",
|
|
4116
|
+
"IsVatFree",
|
|
4117
|
+
"SpecialPrices",
|
|
4118
|
+
"PreConfiguredPrice",
|
|
4119
|
+
"IsPreSelected",
|
|
4120
|
+
"CurrentInventory",
|
|
4121
|
+
"CheckInventory",
|
|
4122
|
+
"uid",
|
|
4123
|
+
"imageUrl",
|
|
4124
|
+
"name",
|
|
4125
|
+
"description",
|
|
4126
|
+
"BasePrice",
|
|
4127
|
+
"PriceBeforeDiscount",
|
|
4128
|
+
"BaseISOCurrency",
|
|
4129
|
+
"PriceToShow",
|
|
4130
|
+
"PriceBeforeDiscountToShow",
|
|
4131
|
+
"IsCurrent"
|
|
4132
|
+
]);
|
|
4133
|
+
var CURRENCY_KEYS = /* @__PURE__ */ Object.freeze(["Code", "AlphabeticCode", "ValueToNis", "NameHeb", "NameEn", "CoinSing"]);
|
|
4134
|
+
var NO_COUPON = '{"IsActivatedByUser":false,"IsActive":false,"CouponCode":"","IsValid":false,"DiscountType":0,"DiscountValue":0,"CouponType":1}';
|
|
4135
|
+
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}';
|
|
4136
|
+
var DONATION = /* @__PURE__ */ Object.freeze({ none: 0, monthly: 1, multiple: 2, single: 3 });
|
|
4137
|
+
var PAGE_ID = /^[A-Za-z0-9_-]{16,32}$/;
|
|
4138
|
+
var DEAL_ID = /^[0-9a-z]{6,40}$/;
|
|
4139
|
+
var PRODUCT_ID = /^[A-Za-z0-9_-]{8,64}$/;
|
|
4140
|
+
var TOKEN3 = /^[A-Za-z0-9_.:+/=-]{1,8192}$/;
|
|
4141
|
+
var SCREEN = /^[0-9]{1,5}$/;
|
|
4142
|
+
var LANGUAGE2 = /^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{1,8}){0,3}$/;
|
|
4143
|
+
var CARD_NUMBER13 = /^[0-9]{12,19}$/;
|
|
4144
|
+
var MONTH13 = /^(?:[1-9]|1[0-2])$/;
|
|
4145
|
+
var YEAR14 = /^20[0-9]{2}$/;
|
|
4146
|
+
var CODE5 = /^[0-9]{3,4}$/;
|
|
4147
|
+
var TEXT_LIMIT8 = 256;
|
|
4148
|
+
var LONG_TEXT_LIMIT = BODY_LIMIT25;
|
|
4149
|
+
var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4150
|
+
var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4151
|
+
var sameKeys9 = (value, keys) => {
|
|
4152
|
+
const own10 = Object.keys(value);
|
|
4153
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
4154
|
+
};
|
|
4155
|
+
var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
|
|
4156
|
+
var printable3 = (text9) => [...text9].every((character) => {
|
|
4157
|
+
const point = character.codePointAt(0);
|
|
4158
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
4159
|
+
});
|
|
4160
|
+
var text6 = (value, limit = TEXT_LIMIT8) => typeof value === "string" && value.length <= limit && printable3(value);
|
|
4161
|
+
var pageText = (value, limit = LONG_TEXT_LIMIT) => value === null || typeof value === "string" && value.length <= limit;
|
|
4162
|
+
var whole = (value, min = 0, max = Number.MAX_SAFE_INTEGER) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
4163
|
+
var flag = (value) => typeof value === "boolean";
|
|
4164
|
+
var optionalFlag = (value) => value === null || flag(value);
|
|
4165
|
+
var refuse27 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4166
|
+
var CARD26 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4167
|
+
function luhn5(digits4) {
|
|
4168
|
+
let sum = 0;
|
|
4169
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
4170
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
4171
|
+
if (at % 2 === 1) {
|
|
4172
|
+
digit *= 2;
|
|
4173
|
+
if (digit > 9)
|
|
4174
|
+
digit -= 9;
|
|
4175
|
+
}
|
|
4176
|
+
sum += digit;
|
|
4177
|
+
}
|
|
4178
|
+
return sum % 10 === 0;
|
|
4179
|
+
}
|
|
4180
|
+
function cents(value) {
|
|
4181
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > 1e7)
|
|
4182
|
+
return null;
|
|
4183
|
+
const minor = Math.round(value * 100);
|
|
4184
|
+
return Math.abs(minor - value * 100) < 1e-6 ? minor : null;
|
|
4185
|
+
}
|
|
4186
|
+
function isCardcomSubmitUrl(url) {
|
|
4187
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
4188
|
+
return false;
|
|
4189
|
+
let parsed;
|
|
4190
|
+
try {
|
|
4191
|
+
parsed = new URL(url);
|
|
4192
|
+
}
|
|
4193
|
+
catch {
|
|
4194
|
+
return false;
|
|
4195
|
+
}
|
|
4196
|
+
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;
|
|
4197
|
+
}
|
|
4198
|
+
function readBody15(body) {
|
|
4199
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT25)
|
|
4200
|
+
return null;
|
|
4201
|
+
let value;
|
|
4202
|
+
try {
|
|
4203
|
+
value = JSON.parse(body);
|
|
4204
|
+
if (!record22(value) || JSON.stringify(value) !== body)
|
|
4205
|
+
return null;
|
|
4206
|
+
}
|
|
4207
|
+
catch {
|
|
4208
|
+
return null;
|
|
4209
|
+
}
|
|
4210
|
+
return value;
|
|
4211
|
+
}
|
|
4212
|
+
function field(value) {
|
|
4213
|
+
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);
|
|
4214
|
+
}
|
|
4215
|
+
var optionalField = (value) => value === null || field(value);
|
|
4216
|
+
function selectValues(value) {
|
|
4217
|
+
const list = field(value) ? value.Data.SelectList : null;
|
|
4218
|
+
if (!Array.isArray(list) || list.length === 0)
|
|
4219
|
+
return null;
|
|
4220
|
+
return list.map((option) => record22(option) && typeof option.value === "string" ? option.value : null);
|
|
4221
|
+
}
|
|
4222
|
+
function commonStore(value) {
|
|
4223
|
+
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;
|
|
4224
|
+
}
|
|
4225
|
+
function companyStore(value) {
|
|
4226
|
+
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]));
|
|
4227
|
+
}
|
|
4228
|
+
var SUM_TEXT = /^(?:0*[1-9][0-9]*(?:\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$/;
|
|
4229
|
+
var sumText = (text9, sum) => text9 === null || typeof text9 === "string" && SUM_TEXT.test(text9) && Number.parseFloat(text9) === sum;
|
|
4230
|
+
function chosenProduct(value) {
|
|
4231
|
+
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);
|
|
4232
|
+
}
|
|
4233
|
+
var DAY_RATES = /* @__PURE__ */ Object.freeze({ 1: 1, 826: 4.1194, 840: 3.089, 978: 3.4769 });
|
|
4234
|
+
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);
|
|
4235
|
+
function chargedCurrency(value) {
|
|
4236
|
+
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);
|
|
4237
|
+
}
|
|
4238
|
+
function freshProductsStore(products) {
|
|
4239
|
+
return {
|
|
4240
|
+
Title: "",
|
|
4241
|
+
isDonation: false,
|
|
4242
|
+
showCurrencyConvert: false,
|
|
4243
|
+
currencies: [],
|
|
4244
|
+
selectedCurrency: products.selectedCurrency,
|
|
4245
|
+
coupon: products.coupon,
|
|
4246
|
+
couponCalculatedDiscount: 0,
|
|
4247
|
+
CurrentCouponCode: "",
|
|
4248
|
+
products: products.products,
|
|
4249
|
+
deliveryMethods: products.deliveryMethods,
|
|
4250
|
+
haveImages: false,
|
|
4251
|
+
isCouponActive: false,
|
|
4252
|
+
ShowProductPrice: false,
|
|
4253
|
+
ShowTotalPrice: false,
|
|
4254
|
+
ItemsDisplayType: 0,
|
|
4255
|
+
ManualSumField: JSON.parse(FRESH_MANUAL_SUM),
|
|
4256
|
+
ShowVatInfo: false,
|
|
4257
|
+
Vat: 0,
|
|
4258
|
+
TotalPriceNotRequireVat: 0,
|
|
4259
|
+
TotalPriceRequireVat: 0,
|
|
4260
|
+
TotalVat: 0,
|
|
4261
|
+
DiscountSum: 0,
|
|
4262
|
+
ShowDonationAmountsButtons: false,
|
|
4263
|
+
DonationDescription: ""
|
|
4264
|
+
};
|
|
4265
|
+
}
|
|
4266
|
+
function productsStore(value) {
|
|
4267
|
+
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)
|
|
4268
|
+
return false;
|
|
4269
|
+
return JSON.stringify(freshProductsStore(value)) === JSON.stringify(value);
|
|
4270
|
+
}
|
|
4271
|
+
function deliveryStore(value) {
|
|
4272
|
+
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;
|
|
4273
|
+
}
|
|
4274
|
+
function documentStore(value) {
|
|
4275
|
+
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);
|
|
4276
|
+
}
|
|
4277
|
+
function detailsStore(value) {
|
|
4278
|
+
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);
|
|
4279
|
+
}
|
|
4280
|
+
function pageCard(payment) {
|
|
4281
|
+
const number = payment.CardNumberField.Value;
|
|
4282
|
+
const years = selectValues(payment.YearsField);
|
|
4283
|
+
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);
|
|
4284
|
+
}
|
|
4285
|
+
function paymentStore(value) {
|
|
4286
|
+
if (!record22(value) || !sameKeys9(value, PAYMENT_KEYS))
|
|
4287
|
+
return false;
|
|
4288
|
+
const fields = [
|
|
4289
|
+
"EmailField",
|
|
4290
|
+
"MobileField",
|
|
4291
|
+
"CardNumberField",
|
|
4292
|
+
"YearsField",
|
|
4293
|
+
"MonthsField",
|
|
4294
|
+
"CvvField",
|
|
4295
|
+
"CardOwnerNameField",
|
|
4296
|
+
"CardTZField",
|
|
4297
|
+
"PaymentsField",
|
|
4298
|
+
"OpenSumField"
|
|
4299
|
+
];
|
|
4300
|
+
const untouched = ["CardOwnerCityField", "CardOwnerAddressField", "CardOwnerZipcodeField"];
|
|
4301
|
+
const flags = [
|
|
4302
|
+
"HideCreditCardFieldsOnZeroSum",
|
|
4303
|
+
"ApprovedTermsAndConditions",
|
|
4304
|
+
"ShowTermsAndConditions",
|
|
4305
|
+
"AllowMerchantMessages",
|
|
4306
|
+
"MustAllowMerchantMessages",
|
|
4307
|
+
"ShowMerchantMessages",
|
|
4308
|
+
"ShowPayPal",
|
|
4309
|
+
"ShowUpayBitButton",
|
|
4310
|
+
"ShowPayMeBitButton",
|
|
4311
|
+
"ShowCardcomBitButton",
|
|
4312
|
+
"ShowApplePay",
|
|
4313
|
+
"ShowGooglePay",
|
|
4314
|
+
"ShowRecaptcha",
|
|
4315
|
+
"IsCredit",
|
|
4316
|
+
"Is3DSecureEnabled",
|
|
4317
|
+
"ShowSuccessPopup",
|
|
4318
|
+
"ShowErrorPopup",
|
|
4319
|
+
"CanSkipAuthentication",
|
|
4320
|
+
"IsDirectDebit",
|
|
4321
|
+
"EnableHooxOffers",
|
|
4322
|
+
"IsDirectDebitSplitPayments",
|
|
4323
|
+
"ShowPaymentButton",
|
|
4324
|
+
"AllowBitEmptyCardOwnerName",
|
|
4325
|
+
"IsCreateToken",
|
|
4326
|
+
"IsHideCart",
|
|
4327
|
+
"IsJ5"
|
|
4328
|
+
];
|
|
4329
|
+
const texts = [
|
|
4330
|
+
"Comments",
|
|
4331
|
+
"ButtonText",
|
|
4332
|
+
"ButtonTextZeroSum",
|
|
4333
|
+
"TermsAndConditionsUrl",
|
|
4334
|
+
"MerchantApplePayLogoUrl",
|
|
4335
|
+
"RecaptchaVersion",
|
|
4336
|
+
"CartTitle",
|
|
4337
|
+
"HooxID",
|
|
4338
|
+
"ApplePayApplicationData",
|
|
4339
|
+
"OrderSummeryTitle",
|
|
4340
|
+
"TurnstileSiteKey",
|
|
4341
|
+
"PrivacyPolicyUrl"
|
|
4342
|
+
];
|
|
4343
|
+
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);
|
|
4344
|
+
}
|
|
4345
|
+
function threeDsBlock(value, block) {
|
|
4346
|
+
const { CommonStore: common, ProductsStore: products, PaymentStore: payment } = value.Store;
|
|
4347
|
+
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))
|
|
4348
|
+
return false;
|
|
4349
|
+
const rebuilt = {
|
|
4350
|
+
TerminalNum: common.TerminalNumber,
|
|
4351
|
+
CoinId: products.selectedCurrency.Code,
|
|
4352
|
+
CardNumber: payment.CardNumberField.Value,
|
|
4353
|
+
CardholderFullName: payment.CardOwnerNameField.Value,
|
|
4354
|
+
CardholderPhone: payment.MobileField.Value,
|
|
4355
|
+
CardHolderEmail: payment.EmailField.Value,
|
|
4356
|
+
CVV: payment.CvvField.Value,
|
|
4357
|
+
CardExpireMonth: payment.MonthsField.Value,
|
|
4358
|
+
CardExpireYear: payment.YearsField.Value.substr(2, 2),
|
|
4359
|
+
RequestedBillingAmount: block.RequestedBillingAmount,
|
|
4360
|
+
UserAgentHeader: value.UserAgent,
|
|
4361
|
+
browserLanguage: block.browserLanguage,
|
|
4362
|
+
_3ds_browserjavaenabled: "true",
|
|
4363
|
+
_3ds_browserscreenheight: block._3ds_browserscreenheight,
|
|
4364
|
+
_3ds_browserscreenwidth: block._3ds_browserscreenwidth,
|
|
4365
|
+
_3ds_browsercolordepth: block._3ds_browsercolordepth,
|
|
4366
|
+
_3ds_challengewindowsize: "05",
|
|
4367
|
+
_3ds_channel: "02",
|
|
4368
|
+
_3ds_category: "01",
|
|
4369
|
+
_3ds_transtype: "01",
|
|
4370
|
+
ExternalAisurit4DealPageUID: common.Uid,
|
|
4371
|
+
DealToSaveJSON: "",
|
|
4372
|
+
GooglePayToken: "",
|
|
4373
|
+
DirectDebitSplitPaymentsSum: 0,
|
|
4374
|
+
SapakMutav: ""
|
|
4375
|
+
};
|
|
4376
|
+
return JSON.stringify(rebuilt) === JSON.stringify(block);
|
|
4377
|
+
}
|
|
4378
|
+
var hooxReference = (value) => value === null || value === "" || whole(value) || typeof value === "string" && /^[\x21-\x7e]{1,256}$/.test(value);
|
|
4379
|
+
function pageBody(body) {
|
|
4380
|
+
const value = readBody15(body);
|
|
4381
|
+
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))
|
|
4382
|
+
return null;
|
|
4383
|
+
const store = value.Store;
|
|
4384
|
+
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))
|
|
4385
|
+
return null;
|
|
4386
|
+
const product = store.ProductsStore.products[0];
|
|
4387
|
+
const price = cents(product.PriceToShow);
|
|
4388
|
+
if (price === null || cents(value._3DSecureReq.RequestedBillingAmount) !== price || product.BaseISOCurrency !== store.ProductsStore.selectedCurrency.Code || product.IsManualSum && product.ManualPrice !== product.PriceToShow)
|
|
4389
|
+
return null;
|
|
4390
|
+
if (store.PaymentStore.ShowRecaptcha !== (value.GoogleToken !== ""))
|
|
4391
|
+
return null;
|
|
4392
|
+
return value;
|
|
4393
|
+
}
|
|
4394
|
+
function cardcomBodyVerdict(body, url) {
|
|
4395
|
+
if (url !== void 0 && !isCardcomSubmitUrl(url))
|
|
4396
|
+
return refuse27("cardcom_url_refused");
|
|
4397
|
+
const value = pageBody(body);
|
|
4398
|
+
if (value === null)
|
|
4399
|
+
return refuse27("cardcom_body_unsupported");
|
|
4400
|
+
const payment = value.Store.PaymentStore;
|
|
4401
|
+
const receiptId = value.Store.DocumentStore.IdField;
|
|
4402
|
+
if (payment.Is3DSecureEnabled || payment.Was3DSActiveOnPageLoad === true || payment.ThreeDSecureTransactionId || payment.ThreeDSecureCavv) {
|
|
4403
|
+
return refuse27("cardcom_three_d_secure_refused");
|
|
4404
|
+
}
|
|
4405
|
+
if (payment.IsCreateToken || payment.IsJ5)
|
|
4406
|
+
return refuse27("cardcom_card_saving_refused");
|
|
4407
|
+
if (payment.IsDirectDebitSplitPayments || payment.PaymentsField.Value !== "1" || payment.DonationType === DONATION.monthly || payment.DonationType === DONATION.multiple || payment.IsDirectDebit && payment.DonationType !== DONATION.single) {
|
|
4408
|
+
return refuse27("cardcom_recurring_refused");
|
|
4409
|
+
}
|
|
4410
|
+
if (payment.CardTZField.Value !== "" || payment.CardTZField.Show && payment.CardTZField.Required || receiptId !== null && (receiptId.Value !== "" || receiptId.Show && receiptId.Required))
|
|
4411
|
+
return refuse27("cardcom_id_required");
|
|
4412
|
+
if (payment.ShowRecaptcha && payment.RecaptchaVersion !== "v3")
|
|
4413
|
+
return refuse27("cardcom_captcha_unsupported");
|
|
4414
|
+
return CARD26;
|
|
4415
|
+
}
|
|
4416
|
+
var CARDCOM_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
4417
|
+
Object.freeze({
|
|
4418
|
+
id: "machon_alte_usd",
|
|
4419
|
+
merchant: "Machon Alte",
|
|
4420
|
+
origins: Object.freeze([CARDCOM_ORIGIN]),
|
|
4421
|
+
page: "kzR5pTyr0kC3oqjpGbCMiQ",
|
|
4422
|
+
terminal: 162226,
|
|
4423
|
+
products: Object.freeze([Object.freeze({ uid: "JoQrlcuGCUWYM4I66eX7pw", currency: "usd", price: null })]),
|
|
4424
|
+
settings: "e38d7c7abce83a3a994a707e345595cf6ec2a15d77794a8eea70c0d5ce4773ab"
|
|
4425
|
+
})
|
|
4426
|
+
]);
|
|
4427
|
+
// src/nexi-checkout.js
|
|
4428
|
+
var NEXI_CHECKOUT_PSP = "nexi_checkout";
|
|
4429
|
+
var NEXI_CHECKOUT_PAY_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.dibspayment.eu": "production", "test.checkout.dibspayment.eu": "test" });
|
|
4430
|
+
var NEXI_CHECKOUT_PAY_PATH = "/api/v1/pay";
|
|
4431
|
+
var BODY_LIMIT26 = 4096;
|
|
4432
|
+
var BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4433
|
+
"type",
|
|
4434
|
+
"paymentType",
|
|
4435
|
+
"acceptedTermsAndConditions",
|
|
4436
|
+
"amountConfirmedByConsumer",
|
|
4437
|
+
"surchargeAmount",
|
|
4438
|
+
"consumerCheckedSaveNewPaymentMethod",
|
|
4439
|
+
"consumerHasConsentedToRememberingNewDevice",
|
|
4440
|
+
"consumerWantsToBeAnonymous",
|
|
4441
|
+
"language"
|
|
4442
|
+
]);
|
|
4443
|
+
var CARD_KEYS11 = /* @__PURE__ */ Object.freeze(["cardNumber", "cardVerificationCode", "cardholderName", "expiryMonth", "expiryYear"]);
|
|
4444
|
+
var CARD_NUMBER14 = /^[0-9]{13,19}$/;
|
|
4445
|
+
var MONTH14 = /^(?:0[1-9]|1[0-2])$/;
|
|
4446
|
+
var YEAR15 = /^[0-9]{2}$/;
|
|
4447
|
+
var CODE6 = /^[0-9]{3,4}$/;
|
|
4448
|
+
var TEXT_LIMIT9 = 128;
|
|
4449
|
+
var EMAIL_LIMIT2 = 254;
|
|
4450
|
+
var LANGUAGE3 = /^[a-z]{2}-[a-z]{2}$/i;
|
|
4451
|
+
var AMOUNT_LIMIT2 = 2147483647;
|
|
4452
|
+
var record23 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4453
|
+
var own6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4454
|
+
var sameKeys10 = (value, keys) => {
|
|
4455
|
+
const found = Object.keys(value);
|
|
4456
|
+
return found.length === keys.length && found.every((key, at) => key === keys[at]);
|
|
4457
|
+
};
|
|
4458
|
+
var refuse28 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4459
|
+
var CARD27 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4460
|
+
var printable4 = (text9) => [...text9].every((character) => {
|
|
4461
|
+
const point = character.codePointAt(0);
|
|
4462
|
+
return point >= 32 && !(point >= 127 && point <= 159) && point !== 8232 && point !== 8233;
|
|
4463
|
+
});
|
|
4464
|
+
var text7 = (value, limit) => typeof value === "string" && value.length <= limit && printable4(value);
|
|
4465
|
+
function luhn6(digits4) {
|
|
4466
|
+
let sum = 0;
|
|
4467
|
+
for (let at = 0; at < digits4.length; at += 1) {
|
|
4468
|
+
let digit = Number(digits4[digits4.length - 1 - at]);
|
|
4469
|
+
if (at % 2 === 1) {
|
|
4470
|
+
digit *= 2;
|
|
4471
|
+
if (digit > 9)
|
|
4472
|
+
digit -= 9;
|
|
4473
|
+
}
|
|
4474
|
+
sum += digit;
|
|
4475
|
+
}
|
|
4476
|
+
return sum % 10 === 0;
|
|
4477
|
+
}
|
|
4478
|
+
function nexiCheckoutPayUrl(url) {
|
|
4479
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
4480
|
+
return null;
|
|
4481
|
+
let parsed;
|
|
4482
|
+
try {
|
|
4483
|
+
parsed = new URL(url);
|
|
4484
|
+
}
|
|
4485
|
+
catch {
|
|
4486
|
+
return null;
|
|
4487
|
+
}
|
|
4488
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname !== NEXI_CHECKOUT_PAY_PATH)
|
|
4489
|
+
return null;
|
|
4490
|
+
if (!own6(NEXI_CHECKOUT_PAY_HOSTS, parsed.hostname))
|
|
4491
|
+
return null;
|
|
4492
|
+
return Object.freeze({ host: parsed.hostname, environment: NEXI_CHECKOUT_PAY_HOSTS[parsed.hostname] });
|
|
4493
|
+
}
|
|
4494
|
+
function isNexiCheckoutPayUrl(url) {
|
|
4495
|
+
return nexiCheckoutPayUrl(url) !== null;
|
|
4496
|
+
}
|
|
4497
|
+
function readBody16(body) {
|
|
4498
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT26)
|
|
4499
|
+
return null;
|
|
4500
|
+
let value;
|
|
4501
|
+
try {
|
|
4502
|
+
value = JSON.parse(body);
|
|
4503
|
+
if (!record23(value) || JSON.stringify(value) !== body)
|
|
4504
|
+
return null;
|
|
4505
|
+
}
|
|
4506
|
+
catch {
|
|
4507
|
+
return null;
|
|
4508
|
+
}
|
|
4509
|
+
return value;
|
|
4510
|
+
}
|
|
4511
|
+
function cardFormValues(card) {
|
|
4512
|
+
if (!record23(card))
|
|
4513
|
+
return false;
|
|
4514
|
+
const keys = Object.keys(card);
|
|
4515
|
+
const expected = own6(card, "email") ? CARD_KEYS11.length + 1 : CARD_KEYS11.length;
|
|
4516
|
+
if (keys.length !== expected || !CARD_KEYS11.every((key) => own6(card, key)))
|
|
4517
|
+
return false;
|
|
4518
|
+
if (own6(card, "email") && !text7(card.email, EMAIL_LIMIT2))
|
|
4519
|
+
return false;
|
|
4520
|
+
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);
|
|
4521
|
+
}
|
|
4522
|
+
var amount = (value, least) => Number.isSafeInteger(value) && value >= least && value <= AMOUNT_LIMIT2;
|
|
4523
|
+
var flag2 = (value) => typeof value === "boolean";
|
|
4524
|
+
function nexiCheckoutBodyVerdict(body, url) {
|
|
4525
|
+
if (url !== void 0 && !isNexiCheckoutPayUrl(url))
|
|
4526
|
+
return refuse28("nexi_checkout_url_refused");
|
|
4527
|
+
const value = readBody16(body);
|
|
4528
|
+
if (value === null || !sameKeys10(value, BODY_KEYS))
|
|
4529
|
+
return refuse28("nexi_checkout_body_unsupported");
|
|
4530
|
+
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))
|
|
4531
|
+
return refuse28("nexi_checkout_body_unsupported");
|
|
4532
|
+
if (value.consumerCheckedSaveNewPaymentMethod || value.consumerHasConsentedToRememberingNewDevice)
|
|
4533
|
+
return refuse28("nexi_checkout_card_saving_refused");
|
|
4534
|
+
if (value.surchargeAmount !== 0)
|
|
4535
|
+
return refuse28("nexi_checkout_surcharge_refused");
|
|
4536
|
+
return CARD27;
|
|
4537
|
+
}
|
|
4538
|
+
// src/toast.js
|
|
4539
|
+
var TOAST_PSP = "toast";
|
|
4540
|
+
var TOAST_PAYMENT_METHODS_URL = "https://payments.toasttab.com/v1/payment-methods";
|
|
4541
|
+
var TOAST_KEY_ID = "RSA-OAEP-SHA1::bacb4887-8314-4c23-98fc-d5ef7bc99e94_oo-legacy-browsers";
|
|
4542
|
+
var TOAST_SUBSTITUTION = /* @__PURE__ */ Object.freeze({ at: "card", fields: Object.freeze(["cardData"]) });
|
|
4543
|
+
var BODY_LIMIT27 = 8192;
|
|
4544
|
+
var ROOT_KEYS9 = /* @__PURE__ */ Object.freeze(["type", "card", "sessionSecret", "usage", "setupFutureUsage", "billingDetails"]);
|
|
4545
|
+
var CARD_KEYS12 = /* @__PURE__ */ Object.freeze(["keyId", "cardData"]);
|
|
4546
|
+
var WALLETS = /* @__PURE__ */ Object.freeze(["APPLE_PAY", "GOOGLE_PAY"]);
|
|
4547
|
+
var SESSION_SECRET = /^[\x21-\x7e]{1,1024}$/;
|
|
4548
|
+
var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
|
|
4549
|
+
var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
|
|
4550
|
+
var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4551
|
+
var sameKeys11 = (value, keys) => {
|
|
4552
|
+
const own10 = Object.keys(value);
|
|
4553
|
+
return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
|
|
4554
|
+
};
|
|
4555
|
+
var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4556
|
+
var failed = (code) => (
|
|
4557
|
+
/** @type {ToastBodyReadJs} */
|
|
4558
|
+
Object.freeze({ ok: false, code }));
|
|
4559
|
+
var CARD28 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4560
|
+
var CONTINUE10 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
4561
|
+
function isWalletBody(parsed) {
|
|
4562
|
+
const card = parsed.card;
|
|
4563
|
+
const rootOk = sameKeys11(parsed, ["type", "card", "sessionSecret"]) || sameKeys11(parsed, ["type", "card", "sessionSecret", "billingDetails"]) && record24(parsed.billingDetails);
|
|
4564
|
+
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";
|
|
4565
|
+
}
|
|
4566
|
+
function isToastPaymentMethodsUrl(url) {
|
|
4567
|
+
return url === TOAST_PAYMENT_METHODS_URL;
|
|
4568
|
+
}
|
|
4569
|
+
function isToastCiphertext(value) {
|
|
4570
|
+
return typeof value === "string" && CIPHERTEXT_B64.test(value);
|
|
4571
|
+
}
|
|
4572
|
+
function readToastBody(body) {
|
|
4573
|
+
const malformed = failed("toast_body_malformed");
|
|
4574
|
+
if (typeof body !== "string" || body.length > BODY_LIMIT27)
|
|
4575
|
+
return malformed;
|
|
4576
|
+
let parsed;
|
|
4577
|
+
try {
|
|
4578
|
+
parsed = JSON.parse(body);
|
|
4579
|
+
}
|
|
4580
|
+
catch {
|
|
4581
|
+
return malformed;
|
|
4582
|
+
}
|
|
4583
|
+
if (!record24(parsed) || JSON.stringify(parsed) !== body)
|
|
4584
|
+
return malformed;
|
|
4585
|
+
if (isWalletBody(parsed))
|
|
4586
|
+
return (
|
|
4587
|
+
/** @type {ToastBodyReadJs} */
|
|
4588
|
+
Object.freeze({ ok: false, wallet: true }));
|
|
4589
|
+
const card = parsed.card;
|
|
4590
|
+
if (!sameKeys11(parsed, ROOT_KEYS9) || parsed.type !== "CARD" || !record24(card) || !sameKeys11(card, CARD_KEYS12))
|
|
4591
|
+
return malformed;
|
|
4592
|
+
if (typeof card.keyId !== "string")
|
|
4593
|
+
return malformed;
|
|
4594
|
+
if (card.keyId !== TOAST_KEY_ID)
|
|
4595
|
+
return failed("toast_foreign_key");
|
|
4596
|
+
if (!isToastCiphertext(card.cardData))
|
|
4597
|
+
return malformed;
|
|
4598
|
+
if (typeof parsed.sessionSecret !== "string" || !SESSION_SECRET.test(parsed.sessionSecret))
|
|
4599
|
+
return malformed;
|
|
4600
|
+
if (parsed.usage !== null || parsed.setupFutureUsage !== null)
|
|
4601
|
+
return failed("toast_keeps_card");
|
|
4602
|
+
const billing = parsed.billingDetails;
|
|
4603
|
+
if (!record24(billing) || !sameKeys11(billing, ["postalCode"]) || typeof billing.postalCode !== "string" || !POSTAL_CODE4.test(billing.postalCode))
|
|
4604
|
+
return malformed;
|
|
4605
|
+
const read = { ok: true, sessionSecret: parsed.sessionSecret, postalCode: billing.postalCode, cardData: card.cardData };
|
|
4606
|
+
return Object.freeze(read);
|
|
4607
|
+
}
|
|
4608
|
+
function toastBodyVerdict(body) {
|
|
4609
|
+
const read = readToastBody(body);
|
|
4610
|
+
if (read.ok)
|
|
4611
|
+
return CARD28;
|
|
4612
|
+
return read.wallet ? CONTINUE10 : refuse29(read.code);
|
|
4613
|
+
}
|
|
4614
|
+
// src/fastspring.js
|
|
4615
|
+
var FASTSPRING_PSP = "fastspring";
|
|
4616
|
+
var FASTSPRING_STORE_PINS = /* @__PURE__ */ Object.freeze([
|
|
4617
|
+
Object.freeze({ environment: "production", store: "daisydisk", storefront: "", merchant: "DaisyDisk" })
|
|
4618
|
+
]);
|
|
4619
|
+
var URL_LIMIT11 = 256;
|
|
4620
|
+
var BODY_LIMIT28 = 32768;
|
|
4621
|
+
var STORE = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
|
|
4622
|
+
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$`);
|
|
4623
|
+
var DIGITS = /^[0-9]{12,19}$/;
|
|
4624
|
+
var MONTH15 = /^(?:0?[1-9]|1[0-2])$/;
|
|
4625
|
+
var YEAR16 = /^(?:[0-9]{2}|[0-9]{4})$/;
|
|
4626
|
+
var SECURITY_CODE16 = /^[0-9]{3,4}$/;
|
|
4627
|
+
var CARD_KEYS13 = /* @__PURE__ */ Object.freeze(["year", "month", "number", "security"]);
|
|
4628
|
+
var SAVED_CARD_KEYS = /* @__PURE__ */ Object.freeze(["savedCardId", "savedCardEnding", "savedCardBin", "variantType"]);
|
|
4629
|
+
var BODY_KEYS2 = /* @__PURE__ */ new Set([
|
|
4630
|
+
"contact",
|
|
4631
|
+
"card",
|
|
4632
|
+
"sepa",
|
|
4633
|
+
"ach",
|
|
4634
|
+
"pad",
|
|
4635
|
+
"bacs",
|
|
4636
|
+
"upi",
|
|
4637
|
+
"mercadopago",
|
|
4638
|
+
"cpfNumber",
|
|
4639
|
+
"dniNumber",
|
|
4640
|
+
"googlepay",
|
|
4641
|
+
"applepay",
|
|
4642
|
+
"paymentKlarna",
|
|
4643
|
+
"paymentType",
|
|
4644
|
+
"subscribe",
|
|
4645
|
+
"captcha",
|
|
4646
|
+
"recipientSelected",
|
|
4647
|
+
"recipient",
|
|
4648
|
+
"customerReference",
|
|
4649
|
+
"autoRenew",
|
|
4650
|
+
"fingerprint",
|
|
4651
|
+
"savedPaypalId",
|
|
4652
|
+
"savedVenmoId",
|
|
4653
|
+
"cashapp"
|
|
4654
|
+
]);
|
|
4655
|
+
var METHOD_KEYS = /* @__PURE__ */ Object.freeze(["sepa", "ach", "pad", "bacs", "upi", "mercadopago", "googlepay", "applepay", "paymentKlarna"]);
|
|
4656
|
+
var SAVED_METHOD_KEYS = /* @__PURE__ */ Object.freeze(["savedPaypalId", "savedVenmoId", "cashapp"]);
|
|
4657
|
+
var TEXT2 = /^[^\x00-\x1f\x7f]{0,256}$/;
|
|
4658
|
+
var IP_ADDRESS = /^[0-9A-Fa-f.:]{2,45}$/;
|
|
4659
|
+
var FINGERPRINT_KEYS = /* @__PURE__ */ Object.freeze(["uniqueId", "fingerprintHash"]);
|
|
4660
|
+
var CARD_MEMBER3 = /^(?:card_?number|cc_?number|pan|cvc2?|cvv2?|security_?code)$/i;
|
|
4661
|
+
var record25 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4662
|
+
var own7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4663
|
+
var nothing = (value) => value === void 0 || value === null || value === "" || value === false;
|
|
4664
|
+
var refuse30 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4665
|
+
var CARD29 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4666
|
+
var CONTINUE11 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
4667
|
+
function fastspringCardUrl(url) {
|
|
4668
|
+
if (typeof url !== "string" || url.length > URL_LIMIT11 || url.includes("?") || url.includes("#"))
|
|
4669
|
+
return null;
|
|
4670
|
+
let parsed;
|
|
4671
|
+
try {
|
|
4672
|
+
parsed = new URL(url);
|
|
4673
|
+
}
|
|
4674
|
+
catch {
|
|
4675
|
+
return null;
|
|
4676
|
+
}
|
|
4677
|
+
if (parsed.href !== url || parsed.port || parsed.username || parsed.password)
|
|
4678
|
+
return null;
|
|
4679
|
+
const match = CARD_URL.exec(url);
|
|
4680
|
+
if (!match)
|
|
4681
|
+
return null;
|
|
4682
|
+
return Object.freeze({
|
|
4683
|
+
environment: match[2] ? "sandbox" : "production",
|
|
4684
|
+
store: match[1],
|
|
4685
|
+
storefront: match[3],
|
|
4686
|
+
session: match[4],
|
|
4687
|
+
sessionUrl: url.slice(0, -"/payment".length)
|
|
4688
|
+
});
|
|
4689
|
+
}
|
|
4690
|
+
function isFastspringCardUrl(url) {
|
|
4691
|
+
return fastspringCardUrl(url) !== null;
|
|
4692
|
+
}
|
|
4693
|
+
function readJson7(body) {
|
|
4694
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT28)
|
|
4695
|
+
return { parsed: null, exact: false };
|
|
4696
|
+
let parsed;
|
|
4697
|
+
try {
|
|
4698
|
+
parsed = JSON.parse(body);
|
|
4699
|
+
}
|
|
4700
|
+
catch {
|
|
4701
|
+
return { parsed: null, exact: false };
|
|
4702
|
+
}
|
|
4703
|
+
let exact5 = false;
|
|
4704
|
+
try {
|
|
4705
|
+
exact5 = JSON.stringify(parsed) === body;
|
|
4706
|
+
}
|
|
4707
|
+
catch {
|
|
4708
|
+
exact5 = false;
|
|
4709
|
+
}
|
|
4710
|
+
return { parsed, exact: exact5 };
|
|
4711
|
+
}
|
|
4712
|
+
function numberDigits(number) {
|
|
4713
|
+
if (typeof number !== "string")
|
|
4714
|
+
return null;
|
|
4715
|
+
const digits4 = number.replace(/ /g, "");
|
|
4716
|
+
if (!DIGITS.test(digits4))
|
|
4717
|
+
return null;
|
|
4718
|
+
return number === digits4 || number === digits4.replace(/(.{4})/g, "$1 ").trim() ? digits4 : null;
|
|
4719
|
+
}
|
|
4720
|
+
function emptyDetails(key, value) {
|
|
4721
|
+
if (nothing(value))
|
|
4722
|
+
return true;
|
|
4723
|
+
if (!record25(value))
|
|
4724
|
+
return false;
|
|
4725
|
+
return Object.entries(value).every(([name, leaf]) => nothing(leaf) || key === "sepa" && name === "ipAddress" && typeof leaf === "string" && IP_ADDRESS.test(leaf));
|
|
4726
|
+
}
|
|
4727
|
+
function namesCardOutside(parsed) {
|
|
4728
|
+
const pending = Object.entries(parsed).filter(([key]) => key !== "card").map(([, value]) => value).filter((value) => value !== null && typeof value === "object");
|
|
4729
|
+
if (Object.keys(parsed).some((key) => key !== "card" && CARD_MEMBER3.test(key)))
|
|
4730
|
+
return true;
|
|
4731
|
+
while (pending.length > 0) {
|
|
4732
|
+
const node = pending.pop();
|
|
4733
|
+
for (const key of Object.keys(node)) {
|
|
4734
|
+
if (!Array.isArray(node) && CARD_MEMBER3.test(key))
|
|
4735
|
+
return true;
|
|
4736
|
+
const value = node[key];
|
|
4737
|
+
if (value !== null && typeof value === "object")
|
|
4738
|
+
pending.push(value);
|
|
4739
|
+
}
|
|
4740
|
+
}
|
|
4741
|
+
return false;
|
|
4742
|
+
}
|
|
4743
|
+
var cardValues = (card) => record25(card) && (!nothing(card.number) || !nothing(card.security));
|
|
4744
|
+
function judgeCard2(parsed) {
|
|
4745
|
+
const card = parsed.card;
|
|
4746
|
+
if (record25(card) && SAVED_CARD_KEYS.some((key) => own7(card, key)))
|
|
4747
|
+
return "fastspring_saved_card";
|
|
4748
|
+
if (SAVED_METHOD_KEYS.some((key) => own7(parsed, key)))
|
|
4749
|
+
return "fastspring_saved_card";
|
|
4750
|
+
if (!Object.keys(parsed).every((key) => BODY_KEYS2.has(key)) || namesCardOutside(parsed))
|
|
4751
|
+
return "fastspring_body_unsupported";
|
|
4752
|
+
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))
|
|
4753
|
+
return "fastspring_body_unsupported";
|
|
4754
|
+
if (parsed.recipientSelected === true || own7(parsed, "recipient"))
|
|
4755
|
+
return "fastspring_gift";
|
|
4756
|
+
if (typeof parsed.recipientSelected !== "boolean")
|
|
4757
|
+
return "fastspring_body_unsupported";
|
|
4758
|
+
if (parsed.autoRenew === true)
|
|
4759
|
+
return "fastspring_keep_on_file";
|
|
4760
|
+
if (!nothing(parsed.autoRenew))
|
|
4761
|
+
return "fastspring_body_unsupported";
|
|
4762
|
+
for (const key of ["cpfNumber", "dniNumber"]) {
|
|
4763
|
+
if (nothing(parsed[key]))
|
|
4764
|
+
continue;
|
|
4765
|
+
return typeof parsed[key] === "string" ? "fastspring_local_route" : "fastspring_body_unsupported";
|
|
4766
|
+
}
|
|
4767
|
+
const captcha = parsed.captcha;
|
|
4768
|
+
if (!record25(captcha) || Object.keys(captcha).length !== 2 || typeof captcha.token !== "string" || typeof captcha.captchaType !== "string")
|
|
4769
|
+
return "fastspring_body_unsupported";
|
|
4770
|
+
if (captcha.token !== "" || captcha.captchaType !== "")
|
|
4771
|
+
return "fastspring_captcha_unsupported";
|
|
4772
|
+
if (own7(parsed, "customerReference"))
|
|
4773
|
+
return "fastspring_body_unsupported";
|
|
4774
|
+
if (!METHOD_KEYS.every((key) => emptyDetails(key, parsed[key])))
|
|
4775
|
+
return "fastspring_body_unsupported";
|
|
4776
|
+
const contact = parsed.contact;
|
|
4777
|
+
if (!record25(contact) || !Object.values(contact).every((value) => value === null || typeof value === "boolean" || typeof value === "string" && TEXT2.test(value)))
|
|
4778
|
+
return "fastspring_body_unsupported";
|
|
4779
|
+
if (!(parsed.subscribe === void 0 || parsed.subscribe === null || typeof parsed.subscribe === "boolean"))
|
|
4780
|
+
return "fastspring_body_unsupported";
|
|
4781
|
+
const fingerprint = parsed.fingerprint;
|
|
4782
|
+
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))))
|
|
4783
|
+
return "fastspring_body_unsupported";
|
|
4784
|
+
return null;
|
|
4785
|
+
}
|
|
4786
|
+
function fastspringBodyVerdict(body) {
|
|
4787
|
+
const { parsed, exact: exact5 } = readJson7(body);
|
|
4788
|
+
if (!record25(parsed))
|
|
4789
|
+
return body === void 0 || body === null || body === "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
|
|
4790
|
+
if (parsed.paymentType !== "card") {
|
|
4791
|
+
if (cardValues(parsed.card) || namesCardOutside(parsed))
|
|
4792
|
+
return refuse30("fastspring_body_unsupported");
|
|
4793
|
+
return typeof parsed.paymentType === "string" && parsed.paymentType !== "" ? CONTINUE11 : refuse30("fastspring_body_unsupported");
|
|
4794
|
+
}
|
|
4795
|
+
if (!exact5)
|
|
4796
|
+
return refuse30("fastspring_body_unsupported");
|
|
4797
|
+
const code = judgeCard2(parsed);
|
|
4798
|
+
return code === null ? CARD29 : refuse30(code);
|
|
4799
|
+
}
|
|
4800
|
+
// src/omise.js
|
|
4801
|
+
var OMISE_PSP = "omise";
|
|
4802
|
+
var OMISE_TOKEN_URL = "https://vault.omise.co/tokens";
|
|
4803
|
+
var OMISE_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4804
|
+
"number",
|
|
4805
|
+
"name",
|
|
4806
|
+
"expiration_month",
|
|
4807
|
+
"expiration_year",
|
|
4808
|
+
"security_code",
|
|
4809
|
+
"email",
|
|
4810
|
+
"phone_number",
|
|
4811
|
+
"country",
|
|
4812
|
+
"state",
|
|
4813
|
+
"city",
|
|
4814
|
+
"postal_code",
|
|
4815
|
+
"street1",
|
|
4816
|
+
"street2"
|
|
4817
|
+
]);
|
|
4818
|
+
var BODY_LIMIT29 = 4096;
|
|
4819
|
+
var SECURITY_CODE17 = /^[0-9]{3,4}$/;
|
|
4820
|
+
var MONTH_TEXT2 = /^(?:0?[1-9]|1[0-2])$/;
|
|
4821
|
+
var YEAR_TEXT = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
4822
|
+
var COUNTRY5 = /^[A-Za-z]{2}$/;
|
|
4823
|
+
var PHONE3 = /^\+?[0-9 ()-]{6,24}$/;
|
|
4824
|
+
var POSTAL_NUMBER_LIMIT = 99999999999;
|
|
4825
|
+
var TEXT_LIMIT10 = 256;
|
|
4826
|
+
var CONTROL11 = /[\u0000-\u001f\u007f]/;
|
|
4827
|
+
var NUMBER_FIELD = /^[0-9]+(?: [0-9]+){0,6}$/;
|
|
4828
|
+
var record26 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4829
|
+
var own8 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4830
|
+
var wellFormed2 = (value) => {
|
|
4831
|
+
try {
|
|
4832
|
+
encodeURIComponent(value);
|
|
4833
|
+
return true;
|
|
4834
|
+
}
|
|
4835
|
+
catch {
|
|
4836
|
+
return false;
|
|
4837
|
+
}
|
|
4838
|
+
};
|
|
4839
|
+
var digits2 = (value) => (value.match(/\p{Nd}/gu) ?? []).length;
|
|
4840
|
+
var plainText5 = (value) => typeof value === "string" && value.length >= 1 && value.length <= TEXT_LIMIT10 && !CONTROL11.test(value) && digits2(value) < 12 && wellFormed2(value);
|
|
4841
|
+
var optionalText2 = (value) => value === "" || plainText5(value);
|
|
4842
|
+
function luhnValid(run) {
|
|
4843
|
+
let sum = 0;
|
|
4844
|
+
for (let i = 0; i < run.length; i += 1) {
|
|
4845
|
+
let digit = run.charCodeAt(run.length - 1 - i) - 48;
|
|
4846
|
+
if (i % 2 === 1)
|
|
4847
|
+
digit = digit * 2 > 9 ? digit * 2 - 9 : digit * 2;
|
|
4848
|
+
sum += digit;
|
|
4849
|
+
}
|
|
4850
|
+
return sum % 10 === 0;
|
|
4851
|
+
}
|
|
4852
|
+
function cardShaped(value) {
|
|
4853
|
+
const groups = value.match(/[0-9]+/g) ?? [];
|
|
4854
|
+
for (let first = 0; first < groups.length; first += 1) {
|
|
4855
|
+
let run = "";
|
|
4856
|
+
for (let last = first; last < groups.length && run.length < 19; last += 1) {
|
|
4857
|
+
run += groups[last];
|
|
4858
|
+
if (run.length >= 13 && run.length <= 19 && run[0] >= "2" && run[0] <= "6" && luhnValid(run))
|
|
4859
|
+
return true;
|
|
4860
|
+
}
|
|
4861
|
+
}
|
|
4862
|
+
return false;
|
|
4863
|
+
}
|
|
4864
|
+
var phoneNumber = (value) => typeof value === "string" && PHONE3.test(value) && digits2(value) >= 6 && digits2(value) <= 15 && !cardShaped(value);
|
|
4865
|
+
var numberField = (value) => typeof value === "string" && NUMBER_FIELD.test(value) && digits2(value) >= 12 && digits2(value) <= 19;
|
|
4866
|
+
var refuse31 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
4867
|
+
var CARD30 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
4868
|
+
function isOmiseTokenUrl(url) {
|
|
4869
|
+
return url === OMISE_TOKEN_URL;
|
|
4870
|
+
}
|
|
4871
|
+
function readBody17(body) {
|
|
4872
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT29)
|
|
4873
|
+
return null;
|
|
4874
|
+
let value;
|
|
4875
|
+
try {
|
|
4876
|
+
value = JSON.parse(body);
|
|
4877
|
+
if (!record26(value) || JSON.stringify(value) !== body)
|
|
4878
|
+
return null;
|
|
4879
|
+
}
|
|
4880
|
+
catch {
|
|
4881
|
+
return null;
|
|
4882
|
+
}
|
|
4883
|
+
return value;
|
|
4884
|
+
}
|
|
4885
|
+
function monthValue(value) {
|
|
4886
|
+
if (typeof value === "number")
|
|
4887
|
+
return Number.isSafeInteger(value) && value >= 1 && value <= 12;
|
|
4888
|
+
return typeof value === "string" && MONTH_TEXT2.test(value);
|
|
4889
|
+
}
|
|
4890
|
+
function yearValue(value) {
|
|
4891
|
+
if (typeof value === "number")
|
|
4892
|
+
return Number.isSafeInteger(value) && (value >= 0 && value <= 99 || value >= 2e3 && value <= 2099);
|
|
4893
|
+
return typeof value === "string" && YEAR_TEXT.test(value);
|
|
4894
|
+
}
|
|
4895
|
+
function cardMembers(card) {
|
|
4896
|
+
if (!record26(card) || !Object.keys(card).every((key) => OMISE_CARD_KEYS.includes(key)))
|
|
4897
|
+
return false;
|
|
4898
|
+
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))
|
|
4899
|
+
return false;
|
|
4900
|
+
for (const key of ["email", "state", "city", "street1", "street2"]) {
|
|
4901
|
+
if (own8(card, key) && !optionalText2(card[key]))
|
|
4902
|
+
return false;
|
|
4903
|
+
}
|
|
4904
|
+
if (own8(card, "country") && (typeof card.country !== "string" || !COUNTRY5.test(card.country)))
|
|
4905
|
+
return false;
|
|
4906
|
+
if (own8(card, "phone_number") && !(card.phone_number === "" || phoneNumber(card.phone_number)))
|
|
4907
|
+
return false;
|
|
4908
|
+
if (own8(card, "postal_code")) {
|
|
4909
|
+
const code = card.postal_code;
|
|
4910
|
+
const sound = typeof code === "number" ? Number.isSafeInteger(code) && code >= 0 && code <= POSTAL_NUMBER_LIMIT : optionalText2(code);
|
|
4911
|
+
if (!sound)
|
|
4912
|
+
return false;
|
|
4913
|
+
}
|
|
4914
|
+
return true;
|
|
4915
|
+
}
|
|
4916
|
+
function omiseBodyVerdict(body) {
|
|
4917
|
+
const value = readBody17(body);
|
|
4918
|
+
if (value === null)
|
|
4919
|
+
return refuse31("omise_body_unsupported");
|
|
4920
|
+
const keys = Object.keys(value);
|
|
4921
|
+
if (keys.length !== 1 || keys[0] !== "card" || !cardMembers(value.card))
|
|
4922
|
+
return refuse31("omise_body_unsupported");
|
|
4923
|
+
return CARD30;
|
|
4924
|
+
}
|
|
4925
|
+
var pin10 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), keys: Object.freeze([...fields.keys]) });
|
|
4926
|
+
var OMISE_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
4927
|
+
pin10({ id: "taejai", merchant: "Taejai", origins: ["https://taejai.com"], keys: ["pkey_53q6mm66esjr563ob0h"] }),
|
|
4928
|
+
pin10({ id: "socialgiver", merchant: "Socialgiver", origins: ["https://www.socialgiver.com"], keys: ["pkey_5d5o2iahksmyrkybemg"] }),
|
|
4929
|
+
pin10({ id: "thireq_pecko_links", merchant: "Thireq Pecko", origins: ["https://linksplus.omise.co"], keys: ["pkey_65w70xniwsinf0gm680"] })
|
|
4930
|
+
]);
|
|
4931
|
+
// src/xendit.js
|
|
4932
|
+
var XENDIT_PSP = "xendit";
|
|
4933
|
+
var XENDIT_TOKEN_URL = "https://api.xendit.co/v2/credit_card_tokens";
|
|
4934
|
+
var XENDIT_TOKEN_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4935
|
+
"is_single_use",
|
|
4936
|
+
"card_data",
|
|
4937
|
+
"should_authenticate",
|
|
4938
|
+
"billing_details",
|
|
4939
|
+
"fp_session_id",
|
|
4940
|
+
"metadata",
|
|
4941
|
+
"amount",
|
|
4942
|
+
"card_cvn",
|
|
4943
|
+
"currency",
|
|
4944
|
+
"mid_label",
|
|
4945
|
+
"external_id"
|
|
4946
|
+
]);
|
|
4947
|
+
var XENDIT_CARD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
4948
|
+
"account_number",
|
|
4949
|
+
"exp_month",
|
|
4950
|
+
"exp_year",
|
|
4951
|
+
"cvn",
|
|
4952
|
+
"card_holder_name",
|
|
4953
|
+
"card_holder_email",
|
|
4954
|
+
"card_holder_first_name",
|
|
4955
|
+
"card_holder_last_name",
|
|
4956
|
+
"card_holder_phone_number"
|
|
4957
|
+
]);
|
|
4958
|
+
var BODY_LIMIT30 = 8192;
|
|
4959
|
+
var CARD_NUMBER15 = /^[0-9]{12,19}$/;
|
|
4960
|
+
var SECURITY_CODE18 = /^[0-9]{3,4}$/;
|
|
4961
|
+
var MONTH16 = /^(?:0[1-9]|1[0-2])$/;
|
|
4962
|
+
var YEAR17 = /^20[0-9]{2}$/;
|
|
4963
|
+
var CURRENCY4 = /^[A-Z]{3}$/;
|
|
4964
|
+
var AMOUNT_LIMIT3 = 1e12;
|
|
4965
|
+
var FP_SESSION = /^[A-Za-z0-9._:-]{0,256}$/;
|
|
4966
|
+
var FORTER_TOKEN = /^[A-Za-z0-9._~:+/=-]{1,1024}$/;
|
|
4967
|
+
var MID_LABEL = /^[A-Za-z0-9_.-]{1,64}$/;
|
|
4968
|
+
var EXTERNAL_ID = /^[\x21-\x7e]{1,255}$/;
|
|
4969
|
+
var PHONE4 = /^\+?[0-9]{6,15}$/;
|
|
4970
|
+
var TEXT_LIMIT11 = 256;
|
|
4971
|
+
var CONTROL12 = /[\u0000-\u001f\u007f]/;
|
|
4972
|
+
var BILLING_KEYS = /* @__PURE__ */ Object.freeze(["given_names", "surname", "email", "mobile_number", "phone_number", "address"]);
|
|
4973
|
+
var ADDRESS_KEYS5 = /* @__PURE__ */ Object.freeze(["country", "street_line1", "street_line2", "city", "province_state", "postal_code", "category"]);
|
|
4974
|
+
var AMOUNT_TEXT = /^[0-9]{1,13}(?:\.[0-9]{1,2})?$/;
|
|
4975
|
+
var record27 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4976
|
+
var own9 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
4977
|
+
var inOrder5 = (value, keys) => {
|
|
4978
|
+
let at = 0;
|
|
4979
|
+
for (const name of Object.keys(value)) {
|
|
4980
|
+
while (at < keys.length && keys[at] !== name)
|
|
4981
|
+
at += 1;
|
|
4982
|
+
if (at === keys.length)
|
|
4983
|
+
return false;
|
|
4984
|
+
at += 1;
|
|
4985
|
+
}
|
|
4986
|
+
return true;
|
|
4987
|
+
};
|
|
4988
|
+
var wellFormed3 = (value) => {
|
|
4989
|
+
try {
|
|
4990
|
+
encodeURIComponent(value);
|
|
4991
|
+
return true;
|
|
4992
|
+
}
|
|
4993
|
+
catch {
|
|
4994
|
+
return false;
|
|
4995
|
+
}
|
|
4996
|
+
};
|
|
4997
|
+
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);
|
|
4998
|
+
var reference = (value) => typeof value === "string" && EXTERNAL_ID.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
4999
|
+
var refuse32 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
5000
|
+
var CARD31 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
5001
|
+
function isXenditTokenUrl(url) {
|
|
5002
|
+
return url === XENDIT_TOKEN_URL;
|
|
5003
|
+
}
|
|
5004
|
+
function readBody18(body) {
|
|
5005
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT30)
|
|
5006
|
+
return null;
|
|
5007
|
+
let value;
|
|
5008
|
+
try {
|
|
5009
|
+
value = JSON.parse(body);
|
|
5010
|
+
if (!record27(value) || JSON.stringify(value) !== body)
|
|
5011
|
+
return null;
|
|
5012
|
+
}
|
|
5013
|
+
catch {
|
|
5014
|
+
return null;
|
|
5015
|
+
}
|
|
5016
|
+
return value;
|
|
5017
|
+
}
|
|
5018
|
+
function amountValue(value) {
|
|
5019
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
5020
|
+
return false;
|
|
5021
|
+
const text9 = typeof value === "number" ? String(value) : value;
|
|
5022
|
+
if (typeof text9 !== "string" || !AMOUNT_TEXT.test(text9))
|
|
5023
|
+
return false;
|
|
5024
|
+
const amount2 = Number(text9);
|
|
5025
|
+
return amount2 > 0 && amount2 <= AMOUNT_LIMIT3;
|
|
5026
|
+
}
|
|
5027
|
+
function billingDetails(value) {
|
|
5028
|
+
if (!record27(value) || !inOrder5(value, BILLING_KEYS))
|
|
5029
|
+
return false;
|
|
5030
|
+
return Object.keys(value).every((key) => {
|
|
5031
|
+
const field2 = value[key];
|
|
5032
|
+
if (key !== "address")
|
|
5033
|
+
return key === "mobile_number" || key === "phone_number" ? typeof field2 === "string" && PHONE4.test(field2) : plainText6(field2);
|
|
5034
|
+
return record27(field2) && inOrder5(field2, ADDRESS_KEYS5) && Object.keys(field2).every((name) => plainText6(field2[name]));
|
|
5035
|
+
});
|
|
5036
|
+
}
|
|
5037
|
+
function cardData(value) {
|
|
5038
|
+
if (!record27(value) || !inOrder5(value, XENDIT_CARD_KEYS))
|
|
5039
|
+
return false;
|
|
5040
|
+
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))
|
|
5041
|
+
return false;
|
|
5042
|
+
for (const key of ["card_holder_name", "card_holder_email", "card_holder_first_name", "card_holder_last_name"]) {
|
|
5043
|
+
if (own9(value, key) && !plainText6(value[key]))
|
|
5044
|
+
return false;
|
|
5045
|
+
}
|
|
5046
|
+
return !own9(value, "card_holder_phone_number") || typeof value.card_holder_phone_number === "string" && PHONE4.test(value.card_holder_phone_number);
|
|
5047
|
+
}
|
|
5048
|
+
function xenditBodyVerdict(body) {
|
|
5049
|
+
const value = readBody18(body);
|
|
5050
|
+
if (value === null || !inOrder5(value, XENDIT_TOKEN_KEYS) || !own9(value, "is_single_use") || !own9(value, "card_data")) {
|
|
5051
|
+
return refuse32("xendit_body_unsupported");
|
|
5052
|
+
}
|
|
5053
|
+
if (value.is_single_use !== true)
|
|
5054
|
+
return value.is_single_use === false ? refuse32("xendit_multiple_use") : refuse32("xendit_body_unsupported");
|
|
5055
|
+
if (!cardData(value.card_data) || value.should_authenticate !== true || !amountValue(value.amount) || typeof value.currency !== "string" || !CURRENCY4.test(value.currency))
|
|
5056
|
+
return refuse32("xendit_body_unsupported");
|
|
5057
|
+
if (own9(value, "card_cvn") && value.card_cvn !== value.card_data.cvn)
|
|
5058
|
+
return refuse32("xendit_body_unsupported");
|
|
5059
|
+
if (own9(value, "billing_details") && !billingDetails(value.billing_details))
|
|
5060
|
+
return refuse32("xendit_body_unsupported");
|
|
5061
|
+
if (own9(value, "fp_session_id") && (typeof value.fp_session_id !== "string" || !FP_SESSION.test(value.fp_session_id)))
|
|
5062
|
+
return refuse32("xendit_body_unsupported");
|
|
5063
|
+
if (own9(value, "metadata")) {
|
|
5064
|
+
const metadata = value.metadata;
|
|
5065
|
+
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))
|
|
5066
|
+
return refuse32("xendit_body_unsupported");
|
|
5067
|
+
}
|
|
5068
|
+
if (own9(value, "mid_label") && (typeof value.mid_label !== "string" || !MID_LABEL.test(value.mid_label)))
|
|
5069
|
+
return refuse32("xendit_body_unsupported");
|
|
5070
|
+
if (own9(value, "external_id") && !reference(value.external_id))
|
|
5071
|
+
return refuse32("xendit_body_unsupported");
|
|
5072
|
+
return CARD31;
|
|
5073
|
+
}
|
|
3813
5074
|
// src/card-fields.js
|
|
3814
5075
|
function processorGate(recognizer, url, body) {
|
|
3815
5076
|
if (recognizer && recognizer.psp === LYRA_PSP)
|
|
@@ -3833,11 +5094,20 @@ function processorGate(recognizer, url, body) {
|
|
|
3833
5094
|
}
|
|
3834
5095
|
if (recognizer && recognizer.psp === MAKECOMMERCE_PSP)
|
|
3835
5096
|
return makecommerceBodyVerdict(body, url);
|
|
5097
|
+
if (recognizer && recognizer.psp === OPENPAY_PSP)
|
|
5098
|
+
return openpayBodyVerdict(body, url);
|
|
3836
5099
|
if (recognizer && recognizer.psp === POYNT_PSP) {
|
|
3837
5100
|
if (url !== void 0 && !isPoyntNonceUrl(url))
|
|
3838
5101
|
return { verdict: "refuse", code: "poynt_url_refused" };
|
|
3839
5102
|
return poyntBodyVerdict(body);
|
|
3840
5103
|
}
|
|
5104
|
+
if (recognizer && recognizer.psp === CARDCOM_PSP)
|
|
5105
|
+
return cardcomBodyVerdict(body, url);
|
|
5106
|
+
if (recognizer && recognizer.psp === TOAST_PSP) {
|
|
5107
|
+
if (url !== void 0 && !isToastPaymentMethodsUrl(url))
|
|
5108
|
+
return { verdict: "refuse", code: "toast_url_refused" };
|
|
5109
|
+
return toastBodyVerdict(body);
|
|
5110
|
+
}
|
|
3841
5111
|
if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
|
|
3842
5112
|
if (url !== void 0 && !isPaddleVgsCardsUrl(url))
|
|
3843
5113
|
return { verdict: "refuse", code: "paddle_vgs_url_refused" };
|
|
@@ -3904,6 +5174,23 @@ function processorGate(recognizer, url, body) {
|
|
|
3904
5174
|
}
|
|
3905
5175
|
if (recognizer && recognizer.psp === TOKENEX_IFRAME_PSP)
|
|
3906
5176
|
return tokenexIframeBodyVerdict(body, url);
|
|
5177
|
+
if (recognizer && recognizer.psp === NEXI_CHECKOUT_PSP)
|
|
5178
|
+
return nexiCheckoutBodyVerdict(body, url);
|
|
5179
|
+
if (recognizer && recognizer.psp === FASTSPRING_PSP) {
|
|
5180
|
+
if (url !== void 0 && !isFastspringCardUrl(url))
|
|
5181
|
+
return { verdict: "refuse", code: "fastspring_url_refused" };
|
|
5182
|
+
return fastspringBodyVerdict(body);
|
|
5183
|
+
}
|
|
5184
|
+
if (recognizer && recognizer.psp === OMISE_PSP) {
|
|
5185
|
+
if (url !== void 0 && !isOmiseTokenUrl(url))
|
|
5186
|
+
return { verdict: "refuse", code: "omise_url_refused" };
|
|
5187
|
+
return omiseBodyVerdict(body);
|
|
5188
|
+
}
|
|
5189
|
+
if (recognizer && recognizer.psp === XENDIT_PSP) {
|
|
5190
|
+
if (url !== void 0 && !isXenditTokenUrl(url))
|
|
5191
|
+
return { verdict: "refuse", code: "xendit_url_refused" };
|
|
5192
|
+
return xenditBodyVerdict(body);
|
|
5193
|
+
}
|
|
3907
5194
|
if (recognizer && recognizer.psp === GRAVY_PSP)
|
|
3908
5195
|
return gravyBodyVerdict(body);
|
|
3909
5196
|
if (recognizer && recognizer.psp === MONERIS_PSP) {
|
|
@@ -3933,7 +5220,7 @@ function carriesCardFields(recognizer, body) {
|
|
|
3933
5220
|
if (typeof body !== "string" || body === "")
|
|
3934
5221
|
return false;
|
|
3935
5222
|
const anyCase = recognizer.caseInsensitiveFormKeys === true;
|
|
3936
|
-
const wanted = anyCase ? fields.map((
|
|
5223
|
+
const wanted = anyCase ? fields.map((field2) => String(field2).toLowerCase()) : fields;
|
|
3937
5224
|
for (const chunk of body.split("&")) {
|
|
3938
5225
|
const eq = chunk.indexOf("=");
|
|
3939
5226
|
if (eq <= 0 || eq === chunk.length - 1)
|
|
@@ -4024,20 +5311,20 @@ var KEEP_ON_FILE_REFUSAL = "Refusing to pay: this Primer payment would keep the
|
|
|
4024
5311
|
var UNSUPPORTED_SDK_REFUSAL = "Refusing to pay: this checkout uses a Primer SDK Agentcard does not support yet. Nothing was sent.";
|
|
4025
5312
|
var NETWORK_MISMATCH_REFUSAL = "Refusing to pay: this Primer payment names a card network that is not your card's. Nothing was sent.";
|
|
4026
5313
|
var FILL_REFUSAL = "Could not fill the card fields for Primer. Nothing was sent.";
|
|
4027
|
-
var
|
|
5314
|
+
var BODY_LIMIT31 = 16384;
|
|
4028
5315
|
var RESPONSE_LIMIT = 32768;
|
|
4029
|
-
var
|
|
5316
|
+
var ROOT_KEYS10 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
|
|
4030
5317
|
var INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear", "cardholderName", "preferredNetwork"];
|
|
4031
5318
|
var REQUIRED_INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear"];
|
|
4032
|
-
var
|
|
4033
|
-
var
|
|
4034
|
-
var
|
|
4035
|
-
var
|
|
4036
|
-
var
|
|
5319
|
+
var record28 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
5320
|
+
var owns7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
5321
|
+
var exact4 = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
|
|
5322
|
+
var text8 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
|
|
5323
|
+
var digits3 = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
|
|
4037
5324
|
var panLike2 = (value) => /(?:[0-9][ _.:-]*){12,}/.test(value);
|
|
4038
|
-
var plain2 = (value, max) =>
|
|
4039
|
-
var
|
|
4040
|
-
var
|
|
5325
|
+
var plain2 = (value, max) => text8(value, max) && !panLike2(value);
|
|
5326
|
+
var MONTH17 = /^(?:0[1-9]|1[0-2])$/;
|
|
5327
|
+
var YEAR18 = /^20[0-9]{2}$/;
|
|
4041
5328
|
var NETWORK2 = /^[A-Z][A-Z_]{1,31}$/;
|
|
4042
5329
|
function isPrimerTokenizeUrl(url, method = "POST") {
|
|
4043
5330
|
if (method !== "POST" || typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
|
|
@@ -4052,7 +5339,7 @@ function isPrimerTokenizeUrl(url, method = "POST") {
|
|
|
4052
5339
|
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
5340
|
}
|
|
4054
5341
|
function judgeBody5(body) {
|
|
4055
|
-
if (typeof body !== "string" || body === "" || body.length >
|
|
5342
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT31)
|
|
4056
5343
|
return null;
|
|
4057
5344
|
let value;
|
|
4058
5345
|
try {
|
|
@@ -4061,18 +5348,18 @@ function judgeBody5(body) {
|
|
|
4061
5348
|
catch {
|
|
4062
5349
|
return null;
|
|
4063
5350
|
}
|
|
4064
|
-
if (!
|
|
5351
|
+
if (!record28(value) || !roundTrips(value, body))
|
|
4065
5352
|
return null;
|
|
4066
|
-
if (!Object.keys(value).every((key) =>
|
|
5353
|
+
if (!Object.keys(value).every((key) => ROOT_KEYS10.includes(key)) || !owns7(value, "paymentInstrument"))
|
|
4067
5354
|
return null;
|
|
4068
5355
|
const instrument = value.paymentInstrument;
|
|
4069
|
-
if (!
|
|
5356
|
+
if (!record28(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns7(instrument, key)))
|
|
4070
5357
|
return null;
|
|
4071
|
-
if (!
|
|
5358
|
+
if (!digits3(instrument.number, 12, 19) || !digits3(instrument.cvv, 3, 4) || !exact4(MONTH17, instrument.expirationMonth) || !exact4(YEAR18, instrument.expirationYear))
|
|
4072
5359
|
return null;
|
|
4073
|
-
if (
|
|
5360
|
+
if (owns7(instrument, "cardholderName") && instrument.cardholderName !== null && !plain2(instrument.cardholderName, 256) || owns7(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact4(NETWORK2, instrument.preferredNetwork) || owns7(value, "userDescription") && value.userDescription !== null && !plain2(value.userDescription, 256) || owns7(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns7(value, "paymentFlow") && value.paymentFlow !== "VAULT")
|
|
4074
5361
|
return null;
|
|
4075
|
-
return { value, keepOnFile:
|
|
5362
|
+
return { value, keepOnFile: owns7(value, "tokenType") || owns7(value, "paymentFlow") };
|
|
4076
5363
|
}
|
|
4077
5364
|
function primerBodyRefusal(body) {
|
|
4078
5365
|
const judged = judgeBody5(body);
|
|
@@ -4094,7 +5381,7 @@ var CLIENT_TOKEN = /^[A-Za-z0-9._~+/=-]{16,4096}$/;
|
|
|
4094
5381
|
var REQUEST_ID = /^[A-Za-z0-9-]{1,64}$/;
|
|
4095
5382
|
var API_VERSION = /^2\.[0-9]{1,2}$/;
|
|
4096
5383
|
function readHeaders(headers) {
|
|
4097
|
-
if (!
|
|
5384
|
+
if (!record28(headers))
|
|
4098
5385
|
return null;
|
|
4099
5386
|
const folded = /* @__PURE__ */ new Map();
|
|
4100
5387
|
for (const [name, value] of Object.entries(headers)) {
|
|
@@ -4112,9 +5399,9 @@ function headersRefusal(headers) {
|
|
|
4112
5399
|
const version = folded.get("primer-sdk-version");
|
|
4113
5400
|
if (typeof version !== "string")
|
|
4114
5401
|
return "unsupported";
|
|
4115
|
-
if (!
|
|
5402
|
+
if (!exact4(LEGACY_SDK_VERSION, version))
|
|
4116
5403
|
return "unsupported_sdk";
|
|
4117
|
-
if (!
|
|
5404
|
+
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
5405
|
return "unsupported";
|
|
4119
5406
|
return null;
|
|
4120
5407
|
}
|
|
@@ -4141,7 +5428,7 @@ function onTokenizePath(url) {
|
|
|
4141
5428
|
}
|
|
4142
5429
|
}
|
|
4143
5430
|
function primerTokenizeRefusal(request) {
|
|
4144
|
-
if (!
|
|
5431
|
+
if (!record28(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
|
|
4145
5432
|
return "unsupported";
|
|
4146
5433
|
return headersRefusal(request.headers) ?? primerBodyRefusal(request.body);
|
|
4147
5434
|
}
|
|
@@ -4156,7 +5443,7 @@ function primerCardOnFileRefusal(url, options, policy = PRIMER_SESSION_CARD_ON_F
|
|
|
4156
5443
|
return "unsupported";
|
|
4157
5444
|
if (new URL(url).hostname !== LIVE_PCI_HOST)
|
|
4158
5445
|
return null;
|
|
4159
|
-
return primerCardOnFileDisclosure(url, policy) &&
|
|
5446
|
+
return primerCardOnFileDisclosure(url, policy) && record28(options) && options.keepOnFile === true ? null : "keep_on_file";
|
|
4160
5447
|
}
|
|
4161
5448
|
function primerRefusalMessage(reason) {
|
|
4162
5449
|
if (reason === "keep_on_file")
|
|
@@ -4168,7 +5455,7 @@ function primerRefusalMessage(reason) {
|
|
|
4168
5455
|
return UNSUPPORTED_REFUSAL;
|
|
4169
5456
|
}
|
|
4170
5457
|
function primerCardNetwork(number) {
|
|
4171
|
-
if (!
|
|
5458
|
+
if (!digits3(number, 12, 19))
|
|
4172
5459
|
return null;
|
|
4173
5460
|
const two = Number(number.slice(0, 2));
|
|
4174
5461
|
const four = Number(number.slice(0, 4));
|
|
@@ -4196,9 +5483,9 @@ function injectPrimerCard(body, card) {
|
|
|
4196
5483
|
throw new Error(UNSUPPORTED_REFUSAL);
|
|
4197
5484
|
if (judged.keepOnFile)
|
|
4198
5485
|
throw new Error(KEEP_ON_FILE_REFUSAL);
|
|
4199
|
-
const month = card && (Number.isInteger(card.month) ||
|
|
4200
|
-
const year = card && (Number.isInteger(card.year) ||
|
|
4201
|
-
if (!card || !
|
|
5486
|
+
const month = card && (Number.isInteger(card.month) || digits3(card.month, 1, 2)) ? Number(card.month) : NaN;
|
|
5487
|
+
const year = card && (Number.isInteger(card.year) || digits3(card.year, 2, 4)) ? Number(card.year) : NaN;
|
|
5488
|
+
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
5489
|
throw new Error(FILL_REFUSAL);
|
|
4203
5490
|
}
|
|
4204
5491
|
if (primerNetworkRefusal(body, card) !== null)
|
|
@@ -4215,9 +5502,9 @@ function injectPrimerCard(body, card) {
|
|
|
4215
5502
|
}
|
|
4216
5503
|
return { body: JSON.stringify(judged.value), where };
|
|
4217
5504
|
}
|
|
4218
|
-
var
|
|
5505
|
+
var TOKEN4 = /^[A-Za-z0-9_-]{8,256}$/;
|
|
4219
5506
|
var ERROR_ID = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/;
|
|
4220
|
-
var
|
|
5507
|
+
var CODE7 = /^[A-Z][A-Z0-9_]{0,63}$/;
|
|
4221
5508
|
var NETWORK_NAME = /^[A-Za-z][A-Za-z0-9 _-]{0,31}$/;
|
|
4222
5509
|
var RESPONSE_MONTH = /^(?:0?[1-9]|1[0-2])$/;
|
|
4223
5510
|
var RESPONSE_YEAR = /^(?:[0-9]{2}|20[0-9]{2})$/;
|
|
@@ -4240,28 +5527,28 @@ function readAnswer(body) {
|
|
|
4240
5527
|
return null;
|
|
4241
5528
|
try {
|
|
4242
5529
|
const value = JSON.parse(body);
|
|
4243
|
-
return
|
|
5530
|
+
return record28(value) ? value : null;
|
|
4244
5531
|
}
|
|
4245
5532
|
catch {
|
|
4246
5533
|
return null;
|
|
4247
5534
|
}
|
|
4248
5535
|
}
|
|
4249
|
-
var tokenValue = (value) =>
|
|
4250
|
-
var optional = (value, key, check) => !
|
|
5536
|
+
var tokenValue = (value) => exact4(TOKEN4, value) && !panLike2(value);
|
|
5537
|
+
var optional = (value, key, check) => !owns7(value, key) || value[key] === null || check(value[key]);
|
|
4251
5538
|
function cardDetails(data) {
|
|
4252
|
-
if (!
|
|
5539
|
+
if (!record28(data) || !exact4(/^[0-9]{4}$/, data.last4Digits))
|
|
4253
5540
|
return null;
|
|
4254
|
-
if (!optional(data, "first6Digits", (v) =>
|
|
5541
|
+
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", record28))
|
|
4255
5542
|
return null;
|
|
4256
5543
|
const safe = { last4Digits: data.last4Digits };
|
|
4257
5544
|
for (const key of ["first6Digits", "expirationMonth", "expirationYear", "cardholderName", "network", "isNetworkTokenized"]) {
|
|
4258
|
-
if (
|
|
5545
|
+
if (owns7(data, key) && data[key] !== null)
|
|
4259
5546
|
safe[key] = data[key];
|
|
4260
5547
|
}
|
|
4261
|
-
if (
|
|
5548
|
+
if (record28(data.binData)) {
|
|
4262
5549
|
const bin = {};
|
|
4263
5550
|
for (const key of BIN_KEYS) {
|
|
4264
|
-
if (!
|
|
5551
|
+
if (!owns7(data.binData, key) || data.binData[key] === null)
|
|
4265
5552
|
continue;
|
|
4266
5553
|
if (!plain2(data.binData[key], 128))
|
|
4267
5554
|
return null;
|
|
@@ -4274,11 +5561,11 @@ function cardDetails(data) {
|
|
|
4274
5561
|
function threeDsSummary(value) {
|
|
4275
5562
|
if (value === void 0 || value === null)
|
|
4276
5563
|
return null;
|
|
4277
|
-
if (!
|
|
5564
|
+
if (!record28(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(PROTOCOL, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
|
|
4278
5565
|
return void 0;
|
|
4279
5566
|
const safe = { responseCode: value.responseCode };
|
|
4280
5567
|
for (const key of ["reasonCode", "reasonText", "protocolVersion", "challengeIssued"]) {
|
|
4281
|
-
if (
|
|
5568
|
+
if (owns7(value, key) && value[key] !== null)
|
|
4282
5569
|
safe[key] = value[key];
|
|
4283
5570
|
}
|
|
4284
5571
|
return safe;
|
|
@@ -4291,7 +5578,7 @@ function rebuildToken(value) {
|
|
|
4291
5578
|
if (!details || threeDs === void 0)
|
|
4292
5579
|
return null;
|
|
4293
5580
|
const safe = { token: value.token };
|
|
4294
|
-
if (
|
|
5581
|
+
if (owns7(value, "analyticsId") && value.analyticsId !== null)
|
|
4295
5582
|
safe.analyticsId = value.analyticsId;
|
|
4296
5583
|
safe.tokenType = "SINGLE_USE";
|
|
4297
5584
|
safe.paymentInstrumentType = "PAYMENT_CARD";
|
|
@@ -4302,8 +5589,8 @@ function rebuildToken(value) {
|
|
|
4302
5589
|
}
|
|
4303
5590
|
function primerErrorId(body) {
|
|
4304
5591
|
const value = readAnswer(body);
|
|
4305
|
-
const id = value &&
|
|
4306
|
-
return
|
|
5592
|
+
const id = value && record28(value.error) ? value.error.errorId : null;
|
|
5593
|
+
return exact4(ERROR_ID, id) && !panLike2(id) ? id : null;
|
|
4307
5594
|
}
|
|
4308
5595
|
function matchesCard(details, card) {
|
|
4309
5596
|
const number = card && typeof card.number === "string" ? card.number : "";
|