@agent-cards/sdk 0.23.17 → 0.23.19
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 +19 -1
- package/README.md +17 -4
- package/dist/aci.d.ts +0 -7
- package/dist/aci.js +0 -19
- package/dist/card-fields.generated.js +963 -33
- package/dist/client.d.ts +24 -1
- package/dist/client.js +198 -57
- package/dist/datatrans.d.ts +2 -2
- package/dist/datatrans.generated.js +16 -11
- package/dist/datatrans.js +2 -2
- package/dist/pelecard.generated.d.ts +2 -1
- package/dist/pelecard.generated.js +14 -5
- package/dist/primer.generated.js +987 -57
- package/dist/stripe-checkout.generated.js +491 -1
- package/package.json +1 -1
|
@@ -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: d59cc35c7ffec2b7a8aa6b52e65fd0a6a22465f4e60812b87ec23256ea9e8885
|
|
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
|
|
@@ -302,11 +302,11 @@ var MONERIS_TOKENIZE_PATH = "/HPPtoken/request.php";
|
|
|
302
302
|
function monerisTokenizeEnvironment(url) {
|
|
303
303
|
if (typeof url !== "string")
|
|
304
304
|
return null;
|
|
305
|
-
for (const
|
|
305
|
+
for (const environment2 of
|
|
306
306
|
/** @type {const} */
|
|
307
307
|
["production", "sandbox"]) {
|
|
308
|
-
if (MONERIS_TOKENIZE_HOSTS[
|
|
309
|
-
return
|
|
308
|
+
if (MONERIS_TOKENIZE_HOSTS[environment2].some((host) => url === `https://${host}${MONERIS_TOKENIZE_PATH}`))
|
|
309
|
+
return environment2;
|
|
310
310
|
}
|
|
311
311
|
return null;
|
|
312
312
|
}
|
|
@@ -357,8 +357,8 @@ var CONTROL = /[\u0000-\u001f\u007f]/;
|
|
|
357
357
|
var cardLikeName = (name) => (name.match(/[0-9]/g) ?? []).length >= 12;
|
|
358
358
|
var record3 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
359
359
|
var sameKeys = (value, keys) => {
|
|
360
|
-
const
|
|
361
|
-
return
|
|
360
|
+
const own3 = Object.keys(value);
|
|
361
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
362
362
|
};
|
|
363
363
|
var refuse4 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
364
364
|
var CARD4 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -663,10 +663,10 @@ var TYPED_ARRAY = Object.getPrototypeOf(Uint8Array.prototype);
|
|
|
663
663
|
var typedArrayName = Object.getOwnPropertyDescriptor(TYPED_ARRAY, Symbol.toStringTag).get;
|
|
664
664
|
function parseRsaPublicKey(key) {
|
|
665
665
|
const spki = key && typeof key === "object" ? key.spki : void 0;
|
|
666
|
-
const
|
|
666
|
+
const pin5 = key && typeof key === "object" ? key.sha256 : void 0;
|
|
667
667
|
if (typeof spki !== "string" || spki.length > 1024 || spki.length % 4 !== 0 || !BASE64.test(spki))
|
|
668
668
|
throw refuse6("key");
|
|
669
|
-
if (typeof
|
|
669
|
+
if (typeof pin5 !== "string" || !SHA256_HEX.test(pin5))
|
|
670
670
|
throw refuse6("key");
|
|
671
671
|
let binary;
|
|
672
672
|
try {
|
|
@@ -678,7 +678,7 @@ function parseRsaPublicKey(key) {
|
|
|
678
678
|
if (btoa(binary) !== spki)
|
|
679
679
|
throw refuse6("key");
|
|
680
680
|
const der = Uint8Array.from(binary, (c) => c.charCodeAt(0));
|
|
681
|
-
if (sha256Hex(der) !==
|
|
681
|
+
if (sha256Hex(der) !== pin5)
|
|
682
682
|
throw refuse6("key");
|
|
683
683
|
const outer = readElement(der, 0, 48);
|
|
684
684
|
if (outer.end !== der.length || outer.start + RSA_ALGORITHM.length > der.length)
|
|
@@ -746,13 +746,13 @@ var PADDLE_TOKENEX_KEYS = /* @__PURE__ */ Object.freeze({
|
|
|
746
746
|
sha256: "92529bd289bb24d52a1bdcc42edc9ac0bb1dacbb58f7568573d44771e1287762"
|
|
747
747
|
})
|
|
748
748
|
});
|
|
749
|
-
function paddleTokenexKey(
|
|
750
|
-
if (
|
|
749
|
+
function paddleTokenexKey(environment2) {
|
|
750
|
+
if (environment2 !== "sandbox" && environment2 !== "production")
|
|
751
751
|
return null;
|
|
752
|
-
return PADDLE_TOKENEX_KEYS[
|
|
752
|
+
return PADDLE_TOKENEX_KEYS[environment2] ?? null;
|
|
753
753
|
}
|
|
754
|
-
function paddleTokenexKeyBytes(
|
|
755
|
-
const key = paddleTokenexKey(
|
|
754
|
+
function paddleTokenexKeyBytes(environment2) {
|
|
755
|
+
const key = paddleTokenexKey(environment2);
|
|
756
756
|
if (!key)
|
|
757
757
|
return null;
|
|
758
758
|
try {
|
|
@@ -767,8 +767,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
|
|
|
767
767
|
var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
|
|
768
768
|
var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
769
769
|
var sameKeys2 = (value, keys) => {
|
|
770
|
-
const
|
|
771
|
-
return
|
|
770
|
+
const own3 = Object.keys(value);
|
|
771
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
772
772
|
};
|
|
773
773
|
var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
774
774
|
var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -813,11 +813,11 @@ function isBase64OfBytes(value, bytes) {
|
|
|
813
813
|
const pad = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
|
|
814
814
|
return value.length / 4 * 3 - pad === bytes && btoa(atob(value)) === value;
|
|
815
815
|
}
|
|
816
|
-
function isPaddleTokenexCiphertext(value,
|
|
817
|
-
const bytes = paddleTokenexKeyBytes(
|
|
816
|
+
function isPaddleTokenexCiphertext(value, environment2) {
|
|
817
|
+
const bytes = paddleTokenexKeyBytes(environment2);
|
|
818
818
|
return bytes !== null && isBase64OfBytes(value, bytes);
|
|
819
819
|
}
|
|
820
|
-
function readPay(body, line,
|
|
820
|
+
function readPay(body, line, environment2) {
|
|
821
821
|
if (typeof body !== "string" || body === "" || body.length > PAY_BODY_LIMIT)
|
|
822
822
|
return null;
|
|
823
823
|
let value;
|
|
@@ -849,11 +849,11 @@ function readPay(body, line, environment) {
|
|
|
849
849
|
return null;
|
|
850
850
|
for (const name of CARD_KEYS3) {
|
|
851
851
|
const blob = tokenex[name];
|
|
852
|
-
if (
|
|
852
|
+
if (environment2 === void 0) {
|
|
853
853
|
if (typeof blob !== "string" || !BASE642.test(blob) || blob.length < 4 || blob.length > 4096)
|
|
854
854
|
return null;
|
|
855
855
|
}
|
|
856
|
-
else if (!isPaddleTokenexCiphertext(blob,
|
|
856
|
+
else if (!isPaddleTokenexCiphertext(blob, environment2))
|
|
857
857
|
return null;
|
|
858
858
|
}
|
|
859
859
|
if (tokenex.encrypted_card_number === tokenex.encrypted_cvv)
|
|
@@ -1257,8 +1257,8 @@ var TEXT_LIMIT = 256;
|
|
|
1257
1257
|
var CONTROL4 = /[\u0000-\u001f\u007f]/;
|
|
1258
1258
|
var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1259
1259
|
var sameKeys3 = (value, keys) => {
|
|
1260
|
-
const
|
|
1261
|
-
return
|
|
1260
|
+
const own3 = Object.keys(value);
|
|
1261
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
1262
1262
|
};
|
|
1263
1263
|
var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
|
|
1264
1264
|
var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
@@ -1460,8 +1460,8 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
|
|
|
1460
1460
|
var CARD_PAYMENT = "PAYMENT_CARD";
|
|
1461
1461
|
var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1462
1462
|
var sameKeys4 = (value, keys) => {
|
|
1463
|
-
const
|
|
1464
|
-
return
|
|
1463
|
+
const own3 = Object.keys(value);
|
|
1464
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
1465
1465
|
};
|
|
1466
1466
|
var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1467
1467
|
var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
@@ -1490,8 +1490,8 @@ function gopayCardFormUrl(url) {
|
|
|
1490
1490
|
}
|
|
1491
1491
|
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
1492
1492
|
return null;
|
|
1493
|
-
const
|
|
1494
|
-
if (
|
|
1493
|
+
const environment2 = Object.prototype.hasOwnProperty.call(GOPAY_CARD_FORM_HOSTS, parsed.hostname) ? GOPAY_CARD_FORM_HOSTS[parsed.hostname] : null;
|
|
1494
|
+
if (environment2 === null || !parsed.pathname.startsWith(GOPAY_CARD_FORM_PATH))
|
|
1495
1495
|
return null;
|
|
1496
1496
|
if (!TOKEN2.test(parsed.pathname.slice(GOPAY_CARD_FORM_PATH.length)))
|
|
1497
1497
|
return null;
|
|
@@ -1503,7 +1503,7 @@ function gopayCardFormUrl(url) {
|
|
|
1503
1503
|
const version = parsed.searchParams.get("ver");
|
|
1504
1504
|
if (signature === null || !SIGNATURE.test(signature) || language !== null && !LANGUAGE.test(language) || version !== null && !VERSION.test(version))
|
|
1505
1505
|
return null;
|
|
1506
|
-
return Object.freeze({ host: parsed.hostname, environment, signature });
|
|
1506
|
+
return Object.freeze({ host: parsed.hostname, environment: environment2, signature });
|
|
1507
1507
|
}
|
|
1508
1508
|
function readBody4(body) {
|
|
1509
1509
|
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT7)
|
|
@@ -1540,6 +1540,916 @@ function gopayBodyVerdict(body, url) {
|
|
|
1540
1540
|
return refuse11("gopay_signature_mismatch");
|
|
1541
1541
|
return CARD10;
|
|
1542
1542
|
}
|
|
1543
|
+
// src/payrexx.js
|
|
1544
|
+
var PAYREXX_PSP = "payrexx";
|
|
1545
|
+
var PAYREXX_FRAME_HOST = "checkout.payrexx.com";
|
|
1546
|
+
var PAYREXX_PAY_PSP_ID = "44";
|
|
1547
|
+
var PAYREXX_BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
1548
|
+
"instance",
|
|
1549
|
+
"pspId",
|
|
1550
|
+
"card[number]",
|
|
1551
|
+
"card[cardholder]",
|
|
1552
|
+
"card[exp_month]",
|
|
1553
|
+
"card[exp_year]",
|
|
1554
|
+
"card[cvc]",
|
|
1555
|
+
"card[brand]",
|
|
1556
|
+
"amount",
|
|
1557
|
+
"currency",
|
|
1558
|
+
"isTokenization",
|
|
1559
|
+
"isSubscription",
|
|
1560
|
+
"isPreAuthorization",
|
|
1561
|
+
"isMoto",
|
|
1562
|
+
"email"
|
|
1563
|
+
]);
|
|
1564
|
+
var BODY_LIMIT8 = 16384;
|
|
1565
|
+
var URL_LIMIT3 = 128;
|
|
1566
|
+
var FRAME_QUERY = /^\?pspId=([1-9][0-9]{0,3})&lang=([a-z]{2})$/;
|
|
1567
|
+
var GROUPED = /^[0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4}$/;
|
|
1568
|
+
var VISA2 = /^4[0-9]{15}$/;
|
|
1569
|
+
var MASTERCARD2 = /^(?: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})$/;
|
|
1570
|
+
var SECURITY_CODE7 = /^[0-9]{3}$/;
|
|
1571
|
+
var MONTH3 = /^(?:0[1-9]|1[0-2])$/;
|
|
1572
|
+
var YEAR3 = /^20[0-9]{2}$/;
|
|
1573
|
+
var HOLDER2 = /^[\p{L}\p{M}][\p{L}\p{M} '.-]{0,44}$/u;
|
|
1574
|
+
var INSTANCE = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
|
|
1575
|
+
var AMOUNT2 = /^[1-9][0-9]{0,8}$/;
|
|
1576
|
+
var CURRENCY = /^[A-Z]{3}$/;
|
|
1577
|
+
var EMAIL = /^[^\s@]{1,64}@[^\s@]{1,189}$/;
|
|
1578
|
+
var FLAGS = /* @__PURE__ */ Object.freeze(["isTokenization", "isSubscription", "isPreAuthorization", "isMoto"]);
|
|
1579
|
+
var CARD_DIGITS = /[0-9](?:[ -]?[0-9]){11}/;
|
|
1580
|
+
var THREE_DS_KEY = /^(?:threeDSServerTransID|threeDSVersion|postAuth|authData\[[A-Za-z]{1,32}\])$/;
|
|
1581
|
+
var refuse12 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1582
|
+
var CARD11 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1583
|
+
var CONTINUE5 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
1584
|
+
function payrexxFrameTarget(url) {
|
|
1585
|
+
if (typeof url !== "string" || url.length > URL_LIMIT3 || url.includes("#"))
|
|
1586
|
+
return null;
|
|
1587
|
+
let parsed;
|
|
1588
|
+
try {
|
|
1589
|
+
parsed = new URL(url);
|
|
1590
|
+
}
|
|
1591
|
+
catch {
|
|
1592
|
+
return null;
|
|
1593
|
+
}
|
|
1594
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.hostname !== PAYREXX_FRAME_HOST || parsed.pathname !== "/")
|
|
1595
|
+
return null;
|
|
1596
|
+
const query = FRAME_QUERY.exec(parsed.search);
|
|
1597
|
+
return query ? Object.freeze({ pspId: query[1], lang: query[2] }) : null;
|
|
1598
|
+
}
|
|
1599
|
+
function readForm2(body) {
|
|
1600
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT8)
|
|
1601
|
+
return null;
|
|
1602
|
+
try {
|
|
1603
|
+
const pairs = body.split("&").map((chunk) => {
|
|
1604
|
+
const eq = chunk.indexOf("=");
|
|
1605
|
+
if (eq <= 0)
|
|
1606
|
+
throw new URIError("not a form pair");
|
|
1607
|
+
return [decodeURIComponent(chunk.slice(0, eq)), decodeURIComponent(chunk.slice(eq + 1))];
|
|
1608
|
+
});
|
|
1609
|
+
return pairs.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join("&") === body ? pairs : null;
|
|
1610
|
+
}
|
|
1611
|
+
catch {
|
|
1612
|
+
return null;
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
function cardNetwork2(digits) {
|
|
1616
|
+
if (VISA2.test(digits))
|
|
1617
|
+
return "visa";
|
|
1618
|
+
return MASTERCARD2.test(digits) ? "mastercard" : null;
|
|
1619
|
+
}
|
|
1620
|
+
function judgeBody2(body) {
|
|
1621
|
+
const pairs = readForm2(body);
|
|
1622
|
+
if (pairs === null)
|
|
1623
|
+
return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
|
|
1624
|
+
const keys = pairs.map(([key]) => key);
|
|
1625
|
+
const value = Object.fromEntries(pairs);
|
|
1626
|
+
if (!pairs.some(([key, entry]) => key.startsWith("card[") && key !== "card[brand]" && entry !== "")) {
|
|
1627
|
+
return pairs.some(([key, entry]) => key !== "encryptedCard" && CARD_DIGITS.test(entry)) ? { verdict: refuse12("payrexx_body_unsupported"), pairs: null } : { verdict: CONTINUE5, pairs: null };
|
|
1628
|
+
}
|
|
1629
|
+
if (new Set(keys).size !== keys.length)
|
|
1630
|
+
return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
|
|
1631
|
+
if (keys.includes("encryptedCard"))
|
|
1632
|
+
return { verdict: refuse12("payrexx_wallet_card"), pairs: null };
|
|
1633
|
+
if (keys.some((key) => THREE_DS_KEY.test(key)))
|
|
1634
|
+
return { verdict: refuse12("payrexx_three_ds_resend"), pairs: null };
|
|
1635
|
+
if (value.pspId !== PAYREXX_PAY_PSP_ID)
|
|
1636
|
+
return { verdict: refuse12("payrexx_other_provider"), pairs: null };
|
|
1637
|
+
if (keys.length !== PAYREXX_BODY_KEYS.length || !keys.every((key, at) => key === PAYREXX_BODY_KEYS[at])) {
|
|
1638
|
+
return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
|
|
1639
|
+
}
|
|
1640
|
+
const number = value["card[number]"];
|
|
1641
|
+
const network = GROUPED.test(number) ? cardNetwork2(number.replace(/ /g, "")) : null;
|
|
1642
|
+
if (network === null || value["card[brand]"] !== network || !SECURITY_CODE7.test(value["card[cvc]"]) || !MONTH3.test(value["card[exp_month]"]) || !YEAR3.test(value["card[exp_year]"]) || !HOLDER2.test(value["card[cardholder]"]) || !INSTANCE.test(value.instance) || !AMOUNT2.test(value.amount) || !CURRENCY.test(value.currency) || !(value.email === "" || value.email.length <= 254 && EMAIL.test(value.email)) || !FLAGS.every((flag) => value[flag] === "true" || value[flag] === "false")) {
|
|
1643
|
+
return { verdict: refuse12("payrexx_body_unsupported"), pairs: null };
|
|
1644
|
+
}
|
|
1645
|
+
if (value.isTokenization === "true" || value.isSubscription === "true")
|
|
1646
|
+
return { verdict: refuse12("payrexx_keep_on_file"), pairs: null };
|
|
1647
|
+
if (value.isPreAuthorization === "true" || value.isMoto === "true")
|
|
1648
|
+
return { verdict: refuse12("payrexx_not_a_sale"), pairs: null };
|
|
1649
|
+
return { verdict: CARD11, pairs };
|
|
1650
|
+
}
|
|
1651
|
+
function payrexxBodyVerdict(body) {
|
|
1652
|
+
return judgeBody2(body).verdict;
|
|
1653
|
+
}
|
|
1654
|
+
function payrexxGateVerdict(url, body) {
|
|
1655
|
+
const target = payrexxFrameTarget(url);
|
|
1656
|
+
if (target === null)
|
|
1657
|
+
return refuse12("payrexx_url_refused");
|
|
1658
|
+
const verdict = payrexxBodyVerdict(body);
|
|
1659
|
+
return verdict.verdict === "card" && target.pspId !== PAYREXX_PAY_PSP_ID ? refuse12("payrexx_other_provider") : verdict;
|
|
1660
|
+
}
|
|
1661
|
+
// src/komoju.js
|
|
1662
|
+
var KOMOJU_PSP = "komoju";
|
|
1663
|
+
var KOMOJU_HOST = "komoju.com";
|
|
1664
|
+
var KOMOJU_SECURE_TOKEN_URL = "https://komoju.com/api/v1/secure_tokens";
|
|
1665
|
+
var KOMOJU_TOKEN_URL = "https://komoju.com/api/v1/tokens";
|
|
1666
|
+
var KOMOJU_RETURN_URL_PREFIX = "https://multipay.komoju.com/secure-token-return.html?session_id=";
|
|
1667
|
+
var BODY_LIMIT9 = 4096;
|
|
1668
|
+
var URL_LIMIT4 = 128;
|
|
1669
|
+
var SESSION_ID = /^[a-z0-9]{25}$/;
|
|
1670
|
+
var SESSION_PAY_PATH = /^\/api\/v1\/sessions\/([a-z0-9]{25})\/pay$/;
|
|
1671
|
+
var TOKEN_ID = /^tok_[a-z0-9]{20,32}$/;
|
|
1672
|
+
var TOP_KEYS = /* @__PURE__ */ Object.freeze(["amount", "currency", "payment_details", "return_url"]);
|
|
1673
|
+
var KOMOJU_CARD_KEYS = /* @__PURE__ */ Object.freeze(["type", "name", "number", "month", "year", "verification_value", "email"]);
|
|
1674
|
+
var PAY_KEYS = /* @__PURE__ */ Object.freeze(["payment_details", "api_locale"]);
|
|
1675
|
+
var AMOUNT_MAX = 99999999;
|
|
1676
|
+
var CURRENCY2 = /^[A-Z]{3}$/;
|
|
1677
|
+
var NUMBER2 = /^[0-9]{12,19}$/;
|
|
1678
|
+
var MONTH4 = /^(?:0[1-9]|1[0-2])$/;
|
|
1679
|
+
var YEAR4 = /^[0-9]{2}$/;
|
|
1680
|
+
var SECURITY_CODE8 = /^[0-9]{3,4}$/;
|
|
1681
|
+
var PAGE_NAME = /^[\x20-\x7e]{1,64}$/;
|
|
1682
|
+
var NAME_DIGITS_MAX = 11;
|
|
1683
|
+
var EMAIL2 = /^[\x21-\x7e]{1,64}@[\x21-\x7e]{1,189}$/;
|
|
1684
|
+
var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
|
|
1685
|
+
var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
|
|
1686
|
+
var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
1687
|
+
var sameKeys5 = (value, keys) => {
|
|
1688
|
+
const own3 = Object.keys(value);
|
|
1689
|
+
return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
|
|
1690
|
+
};
|
|
1691
|
+
var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1692
|
+
var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1693
|
+
var CONTINUE6 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
1694
|
+
function komojuTarget(url) {
|
|
1695
|
+
if (typeof url !== "string" || url.length > URL_LIMIT4 || url.includes("?") || url.includes("#"))
|
|
1696
|
+
return null;
|
|
1697
|
+
let parsed;
|
|
1698
|
+
try {
|
|
1699
|
+
parsed = new URL(url);
|
|
1700
|
+
}
|
|
1701
|
+
catch {
|
|
1702
|
+
return null;
|
|
1703
|
+
}
|
|
1704
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.hostname !== KOMOJU_HOST)
|
|
1705
|
+
return null;
|
|
1706
|
+
if (url === KOMOJU_SECURE_TOKEN_URL)
|
|
1707
|
+
return Object.freeze({ kind: "secure_token" });
|
|
1708
|
+
if (url === KOMOJU_TOKEN_URL)
|
|
1709
|
+
return Object.freeze({ kind: "token" });
|
|
1710
|
+
const pay = SESSION_PAY_PATH.exec(parsed.pathname);
|
|
1711
|
+
return pay ? Object.freeze({ kind: "session_pay", session: pay[1] }) : null;
|
|
1712
|
+
}
|
|
1713
|
+
function readJson3(body) {
|
|
1714
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT9)
|
|
1715
|
+
return null;
|
|
1716
|
+
try {
|
|
1717
|
+
const value = JSON.parse(body);
|
|
1718
|
+
return record9(value) && JSON.stringify(value) === body ? value : null;
|
|
1719
|
+
}
|
|
1720
|
+
catch {
|
|
1721
|
+
return null;
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
function carriesCard(details) {
|
|
1725
|
+
return record9(details) && Object.keys(details).some((key) => /^(?:number|card_?number|pan)$/i.test(key));
|
|
1726
|
+
}
|
|
1727
|
+
function judgeSecureToken(value) {
|
|
1728
|
+
if (!sameKeys5(value, TOP_KEYS))
|
|
1729
|
+
return "komoju_body_unsupported";
|
|
1730
|
+
const details = value.payment_details;
|
|
1731
|
+
if (!Number.isSafeInteger(value.amount) || value.amount < 0 || value.amount > AMOUNT_MAX || typeof value.currency !== "string" || !CURRENCY2.test(value.currency) || typeof value.return_url !== "string" || !value.return_url.startsWith(KOMOJU_RETURN_URL_PREFIX) || !SESSION_ID.test(value.return_url.slice(KOMOJU_RETURN_URL_PREFIX.length)) || !record9(details) || !sameKeys5(details, KOMOJU_CARD_KEYS) || details.type !== "credit_card" || typeof details.name !== "string" || !PAGE_NAME.test(details.name) || details.name.trim() === "" || details.name.replace(/[^0-9]/g, "").length > NAME_DIGITS_MAX || typeof details.number !== "string" || !NUMBER2.test(details.number) || typeof details.month !== "string" || !MONTH4.test(details.month) || typeof details.year !== "string" || !YEAR4.test(details.year) || typeof details.verification_value !== "string" || !SECURITY_CODE8.test(details.verification_value) || typeof details.email !== "string" || !EMAIL2.test(details.email) || PAN_LIKE3.test(details.email)) {
|
|
1732
|
+
return "komoju_body_unsupported";
|
|
1733
|
+
}
|
|
1734
|
+
return value.amount === 0 ? "komoju_keeps_card" : null;
|
|
1735
|
+
}
|
|
1736
|
+
function tokenPay(value) {
|
|
1737
|
+
const keys = Object.keys(value);
|
|
1738
|
+
return (sameKeys5(value, PAY_KEYS) || keys.length === 1 && keys[0] === "payment_details") && typeof value.payment_details === "string" && TOKEN_ID.test(value.payment_details) && (value.api_locale === void 0 || typeof value.api_locale === "string" && LOCALE.test(value.api_locale));
|
|
1739
|
+
}
|
|
1740
|
+
function komojuBodyVerdict(body, url) {
|
|
1741
|
+
let target = null;
|
|
1742
|
+
if (url !== void 0) {
|
|
1743
|
+
target = komojuTarget(url);
|
|
1744
|
+
if (target === null)
|
|
1745
|
+
return refuse13("komoju_url_refused");
|
|
1746
|
+
}
|
|
1747
|
+
const value = readJson3(body);
|
|
1748
|
+
if (target !== null && target.kind !== "secure_token") {
|
|
1749
|
+
if (value !== null && target.kind === "session_pay" && tokenPay(value))
|
|
1750
|
+
return CONTINUE6;
|
|
1751
|
+
return refuse13(value !== null && carriesCard(value.payment_details) ? "komoju_fallback_refused" : "komoju_body_unsupported");
|
|
1752
|
+
}
|
|
1753
|
+
if (value === null)
|
|
1754
|
+
return refuse13("komoju_body_unsupported");
|
|
1755
|
+
if (target === null && tokenPay(value))
|
|
1756
|
+
return CONTINUE6;
|
|
1757
|
+
if (target === null && !Object.prototype.hasOwnProperty.call(value, "return_url") && carriesCard(value.payment_details)) {
|
|
1758
|
+
return refuse13("komoju_fallback_refused");
|
|
1759
|
+
}
|
|
1760
|
+
const code = judgeSecureToken(value);
|
|
1761
|
+
return code === null ? CARD12 : refuse13(code);
|
|
1762
|
+
}
|
|
1763
|
+
// src/paygent.js
|
|
1764
|
+
var PAYGENT_PSP = "paygent";
|
|
1765
|
+
var PAYGENT_TOKEN_HOSTS = /* @__PURE__ */ Object.freeze({
|
|
1766
|
+
production: Object.freeze(["token.paygent.co.jp"]),
|
|
1767
|
+
sandbox: Object.freeze(["sandbox.paygent.co.jp"])
|
|
1768
|
+
});
|
|
1769
|
+
var PAYGENT_TOKEN_PATH = "/n/token/request";
|
|
1770
|
+
var PAYGENT_BODY_KEYS = /* @__PURE__ */ Object.freeze([
|
|
1771
|
+
"merchant_id",
|
|
1772
|
+
"token_generate_key",
|
|
1773
|
+
"card_number",
|
|
1774
|
+
"card_expire_year",
|
|
1775
|
+
"card_expire_month",
|
|
1776
|
+
"card_cvc",
|
|
1777
|
+
"card_name"
|
|
1778
|
+
]);
|
|
1779
|
+
var BODY_LIMIT10 = 2048;
|
|
1780
|
+
var URL_LIMIT5 = 128;
|
|
1781
|
+
var MERCHANT_ID = /^[0-9]{5,6}$/;
|
|
1782
|
+
var LIVE_KEY = /^live_[A-Za-z0-9]{24}$/;
|
|
1783
|
+
var SANDBOX_KEY = /^(?!live_)[a-z]{1,8}_[A-Za-z0-9]{24}$/;
|
|
1784
|
+
var NUMBER3 = /^[0-9]{12,19}$/;
|
|
1785
|
+
var YEAR5 = /^[0-9]{2}$/;
|
|
1786
|
+
var MONTH5 = /^(?:0?[1-9]|1[0-2])$/;
|
|
1787
|
+
var SECURITY_CODE9 = /^[0-9]{3,4}$/;
|
|
1788
|
+
var PAGE_HOLDER = /^(?:[A-Za-z][A-Za-z .'-]{0,44})?$/;
|
|
1789
|
+
var refuse14 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1790
|
+
var CARD13 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1791
|
+
function paygentEnvironment(url) {
|
|
1792
|
+
if (typeof url !== "string" || url.length > URL_LIMIT5 || url.includes("?") || url.includes("#"))
|
|
1793
|
+
return null;
|
|
1794
|
+
let parsed;
|
|
1795
|
+
try {
|
|
1796
|
+
parsed = new URL(url);
|
|
1797
|
+
}
|
|
1798
|
+
catch {
|
|
1799
|
+
return null;
|
|
1800
|
+
}
|
|
1801
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || parsed.pathname !== PAYGENT_TOKEN_PATH)
|
|
1802
|
+
return null;
|
|
1803
|
+
if (PAYGENT_TOKEN_HOSTS.production.includes(parsed.hostname))
|
|
1804
|
+
return "production";
|
|
1805
|
+
if (PAYGENT_TOKEN_HOSTS.sandbox.includes(parsed.hostname))
|
|
1806
|
+
return "sandbox";
|
|
1807
|
+
return null;
|
|
1808
|
+
}
|
|
1809
|
+
function readBody5(body) {
|
|
1810
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT10)
|
|
1811
|
+
return null;
|
|
1812
|
+
try {
|
|
1813
|
+
const pairs = body.split("&").map((chunk) => {
|
|
1814
|
+
const eq = chunk.indexOf("=");
|
|
1815
|
+
if (eq <= 0)
|
|
1816
|
+
throw new URIError("not a pair");
|
|
1817
|
+
return [chunk.slice(0, eq), decodeURIComponent(chunk.slice(eq + 1))];
|
|
1818
|
+
});
|
|
1819
|
+
return pairs.map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&") === body ? pairs : null;
|
|
1820
|
+
}
|
|
1821
|
+
catch {
|
|
1822
|
+
return null;
|
|
1823
|
+
}
|
|
1824
|
+
}
|
|
1825
|
+
var CVC_ONLY_KEYS = /* @__PURE__ */ Object.freeze(["merchant_id", "token_generate_key", "card_cvc", "cvc_only_flg"]);
|
|
1826
|
+
var sameKeys6 = (pairs, keys) => pairs.length === keys.length && pairs.every(([key], at) => key === keys[at]);
|
|
1827
|
+
function judgeBody3(body) {
|
|
1828
|
+
const pairs = readBody5(body);
|
|
1829
|
+
if (pairs === null)
|
|
1830
|
+
return { code: "paygent_body_unsupported", pairs: null };
|
|
1831
|
+
if (sameKeys6(pairs, CVC_ONLY_KEYS))
|
|
1832
|
+
return { code: "paygent_cvc_only", pairs: null };
|
|
1833
|
+
if (!sameKeys6(pairs, PAYGENT_BODY_KEYS))
|
|
1834
|
+
return { code: "paygent_body_unsupported", pairs: null };
|
|
1835
|
+
const value = Object.fromEntries(pairs);
|
|
1836
|
+
if (!MERCHANT_ID.test(value.merchant_id) || !(LIVE_KEY.test(value.token_generate_key) || SANDBOX_KEY.test(value.token_generate_key)) || !NUMBER3.test(value.card_number) || !YEAR5.test(value.card_expire_year) || !MONTH5.test(value.card_expire_month) || !SECURITY_CODE9.test(value.card_cvc) || !PAGE_HOLDER.test(value.card_name)) {
|
|
1837
|
+
return { code: "paygent_body_unsupported", pairs: null };
|
|
1838
|
+
}
|
|
1839
|
+
return { code: null, pairs };
|
|
1840
|
+
}
|
|
1841
|
+
function paygentBodyVerdict(body) {
|
|
1842
|
+
const { code } = judgeBody3(body);
|
|
1843
|
+
return code === null ? CARD13 : refuse14(code);
|
|
1844
|
+
}
|
|
1845
|
+
function paygentRequestVerdict(url, body) {
|
|
1846
|
+
const environment2 = paygentEnvironment(url);
|
|
1847
|
+
if (environment2 === null)
|
|
1848
|
+
return refuse14("paygent_url_refused");
|
|
1849
|
+
const { code, pairs } = judgeBody3(body);
|
|
1850
|
+
if (code !== null)
|
|
1851
|
+
return refuse14(code);
|
|
1852
|
+
const key = pairs[1][1];
|
|
1853
|
+
return (environment2 === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
|
|
1854
|
+
}
|
|
1855
|
+
// src/multipart-form.js
|
|
1856
|
+
var BODY_LIMIT11 = 65536;
|
|
1857
|
+
var CRLF = "\r\n";
|
|
1858
|
+
var BOUNDARY_CHARACTERS = "[A-Za-z0-9'+_.-]{1,70}";
|
|
1859
|
+
var BOUNDARY = new RegExp(`^${BOUNDARY_CHARACTERS}$`);
|
|
1860
|
+
var CONTENT_TYPE = new RegExp(`^multipart/form-data; ?boundary=(${BOUNDARY_CHARACTERS})$`, "i");
|
|
1861
|
+
var DISPOSITION = /^content-disposition: ?form-data; name="([^"\\\r\n]*)"$/i;
|
|
1862
|
+
var FILE_HINT = /^content-disposition:.*;\s*filename\*?=|^content-type:/i;
|
|
1863
|
+
var refusal = (code) => Object.freeze({ refusal: code });
|
|
1864
|
+
var listed = (list, name) => Array.isArray(list) && list.includes(name);
|
|
1865
|
+
function multipartBoundary(contentType) {
|
|
1866
|
+
const match = typeof contentType === "string" ? CONTENT_TYPE.exec(contentType) : null;
|
|
1867
|
+
return match ? match[1] : null;
|
|
1868
|
+
}
|
|
1869
|
+
function boundaryOf(body, contentType) {
|
|
1870
|
+
const lineEnd = body.indexOf(CRLF);
|
|
1871
|
+
const firstLine = body.startsWith("--") && lineEnd !== -1 ? body.slice(2, lineEnd) : null;
|
|
1872
|
+
if (firstLine === null || !BOUNDARY.test(firstLine))
|
|
1873
|
+
return null;
|
|
1874
|
+
if (contentType === void 0 || contentType === null)
|
|
1875
|
+
return firstLine;
|
|
1876
|
+
return multipartBoundary(contentType) === firstLine ? firstLine : null;
|
|
1877
|
+
}
|
|
1878
|
+
function readMultipartForm(body, contentType) {
|
|
1879
|
+
if (typeof body !== "string" || body.length > BODY_LIMIT11)
|
|
1880
|
+
return refusal("multipart_not_form");
|
|
1881
|
+
const boundary = boundaryOf(body, contentType);
|
|
1882
|
+
if (boundary === null)
|
|
1883
|
+
return refusal("multipart_not_form");
|
|
1884
|
+
const dash = `--${boundary}`;
|
|
1885
|
+
const delimiter = `${CRLF}${dash}`;
|
|
1886
|
+
const parts = [];
|
|
1887
|
+
let position = dash.length + CRLF.length;
|
|
1888
|
+
for (;;) {
|
|
1889
|
+
const headerEnd = body.indexOf(`${CRLF}${CRLF}`, position);
|
|
1890
|
+
if (headerEnd === -1)
|
|
1891
|
+
return refusal("multipart_not_form");
|
|
1892
|
+
const headers = body.slice(position, headerEnd).split(CRLF);
|
|
1893
|
+
if (headers.some((line) => FILE_HINT.test(line)))
|
|
1894
|
+
return refusal("multipart_file_part");
|
|
1895
|
+
const disposition = headers.length === 1 ? DISPOSITION.exec(headers[0]) : null;
|
|
1896
|
+
if (!disposition)
|
|
1897
|
+
return refusal("multipart_not_form");
|
|
1898
|
+
const start = headerEnd + 2 * CRLF.length;
|
|
1899
|
+
const end = body.indexOf(delimiter, start);
|
|
1900
|
+
if (end === -1)
|
|
1901
|
+
return refusal("multipart_not_form");
|
|
1902
|
+
parts.push(Object.freeze({ name: disposition[1], value: body.slice(start, end), start, end }));
|
|
1903
|
+
position = end + delimiter.length;
|
|
1904
|
+
if (body.startsWith("--", position)) {
|
|
1905
|
+
const rest = body.slice(position + 2);
|
|
1906
|
+
return rest === "" || rest === CRLF ? Object.freeze({ boundary, parts: Object.freeze(parts) }) : refusal("multipart_not_form");
|
|
1907
|
+
}
|
|
1908
|
+
if (!body.startsWith(CRLF, position))
|
|
1909
|
+
return refusal("multipart_not_form");
|
|
1910
|
+
position += CRLF.length;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
function soundRule(rule) {
|
|
1914
|
+
if (!rule || typeof rule !== "object" || !Array.isArray(rule.parts) || !Array.isArray(rule.card) || rule.card.length === 0)
|
|
1915
|
+
return false;
|
|
1916
|
+
const names = [...rule.parts, ...rule.card];
|
|
1917
|
+
if (!names.every((name) => typeof name === "string" && name !== ""))
|
|
1918
|
+
return false;
|
|
1919
|
+
return new Set(rule.card).size === rule.card.length && rule.card.every((name) => rule.parts.includes(name));
|
|
1920
|
+
}
|
|
1921
|
+
function judge(body, contentType, rule) {
|
|
1922
|
+
if (!soundRule(rule))
|
|
1923
|
+
throw new TypeError("A multipart rule lists its part names and, among them, its card parts.");
|
|
1924
|
+
const read = readMultipartForm(body, contentType);
|
|
1925
|
+
if (read.refusal)
|
|
1926
|
+
return read;
|
|
1927
|
+
if (read.parts.some((part) => !listed(rule.parts, part.name)))
|
|
1928
|
+
return refusal("multipart_unknown_part");
|
|
1929
|
+
for (const name of rule.card) {
|
|
1930
|
+
const count = read.parts.filter((part) => part.name === name).length;
|
|
1931
|
+
if (count === 0)
|
|
1932
|
+
return refusal("multipart_missing_card_part");
|
|
1933
|
+
if (count > 1)
|
|
1934
|
+
return refusal("multipart_duplicate_card_part");
|
|
1935
|
+
}
|
|
1936
|
+
return read;
|
|
1937
|
+
}
|
|
1938
|
+
function multipartFormRefusal(body, contentType, rule) {
|
|
1939
|
+
const read = judge(body, contentType, rule);
|
|
1940
|
+
return read.refusal ?? null;
|
|
1941
|
+
}
|
|
1942
|
+
// src/pay-nl.js
|
|
1943
|
+
var PAY_NL_PSP = "pay_nl";
|
|
1944
|
+
var PAY_NL_TOKEN_URL = "https://payment.pay.nl/v1/Payment/getCardToken/json";
|
|
1945
|
+
var PAY_NL_PARTS = /* @__PURE__ */ Object.freeze([
|
|
1946
|
+
"serviceId",
|
|
1947
|
+
"requestToken",
|
|
1948
|
+
"payment[method]",
|
|
1949
|
+
"payment[card][number]",
|
|
1950
|
+
"payment[card][name]",
|
|
1951
|
+
"payment[card][cvc]",
|
|
1952
|
+
"payment[card][expire_month]",
|
|
1953
|
+
"payment[card][expire_year]"
|
|
1954
|
+
]);
|
|
1955
|
+
var PAY_NL_CARD_PARTS = /* @__PURE__ */ Object.freeze([
|
|
1956
|
+
"payment[card][number]",
|
|
1957
|
+
"payment[card][name]",
|
|
1958
|
+
"payment[card][cvc]",
|
|
1959
|
+
"payment[card][expire_month]",
|
|
1960
|
+
"payment[card][expire_year]"
|
|
1961
|
+
]);
|
|
1962
|
+
var pin4 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fields.origins]), serviceIds: Object.freeze([...fields.serviceIds]) });
|
|
1963
|
+
var PAY_NL_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
|
|
1964
|
+
pin4({ id: "weeztix", merchant: "Weeztix", origins: ["https://shop.weeztix.com"], serviceIds: ["SL-6399-2740"] })
|
|
1965
|
+
]);
|
|
1966
|
+
var RULE = /* @__PURE__ */ Object.freeze({ parts: PAY_NL_PARTS, card: PAY_NL_CARD_PARTS });
|
|
1967
|
+
var SERVICE_ID = /^SL-\d{4}-\d{4}$/;
|
|
1968
|
+
var REQUEST_TOKEN = /^[0-9a-f]{40}$/i;
|
|
1969
|
+
var NUMBER4 = /^[0-9]{8,19}$/;
|
|
1970
|
+
var HOLDER3 = /^\p{L}+(?: \p{L}+)*$/u;
|
|
1971
|
+
var HOLDER_LIMIT2 = 256;
|
|
1972
|
+
var SECURITY_CODE10 = /^[0-9]{3,4}$/;
|
|
1973
|
+
var MONTH6 = /^(?:0[1-9]|1[0-2])$/;
|
|
1974
|
+
var YEAR6 = /^[0-9]{2}$/;
|
|
1975
|
+
var refuse15 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
1976
|
+
var CARD14 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
1977
|
+
function isPayNlTokenUrl(url) {
|
|
1978
|
+
return url === PAY_NL_TOKEN_URL;
|
|
1979
|
+
}
|
|
1980
|
+
function readBody6(body, contentType) {
|
|
1981
|
+
if (multipartFormRefusal(body, contentType, RULE) !== null)
|
|
1982
|
+
return null;
|
|
1983
|
+
const { parts } = readMultipartForm(body, contentType);
|
|
1984
|
+
if (parts.length !== PAY_NL_PARTS.length || !parts.every((part, at) => part.name === PAY_NL_PARTS[at]))
|
|
1985
|
+
return null;
|
|
1986
|
+
const value = Object.fromEntries(parts.map((part) => [part.name, part.value]));
|
|
1987
|
+
const name = value["payment[card][name]"];
|
|
1988
|
+
if (!SERVICE_ID.test(value.serviceId) || !REQUEST_TOKEN.test(value.requestToken) || value["payment[method]"] !== "card" || !NUMBER4.test(value["payment[card][number]"]) || name.length > HOLDER_LIMIT2 || !HOLDER3.test(name) || !SECURITY_CODE10.test(value["payment[card][cvc]"]) || !MONTH6.test(value["payment[card][expire_month]"]) || !YEAR6.test(value["payment[card][expire_year]"]))
|
|
1989
|
+
return null;
|
|
1990
|
+
return value;
|
|
1991
|
+
}
|
|
1992
|
+
function payNlBodyVerdict(body, contentType) {
|
|
1993
|
+
return readBody6(body, contentType) === null ? refuse15("pay_nl_body_unsupported") : CARD14;
|
|
1994
|
+
}
|
|
1995
|
+
var ERROR_KEYS = /* @__PURE__ */ Object.freeze(["errorId", "errorTag", "errorMessage", "errorFieldName"]);
|
|
1996
|
+
var REQUEST_KEYS = /* @__PURE__ */ Object.freeze(["result", ...ERROR_KEYS]);
|
|
1997
|
+
// src/revolut.js
|
|
1998
|
+
var REVOLUT_PSP = "revolut";
|
|
1999
|
+
var REVOLUT_HOSTS = /* @__PURE__ */ Object.freeze(["merchant.revolut.com", "sandbox-merchant.revolut.com"]);
|
|
2000
|
+
var REVOLUT_BODY_KEYS = /* @__PURE__ */ Object.freeze(["payment_method", "customer", "amount", "channel"]);
|
|
2001
|
+
var REVOLUT_CARD_FIELD_KEYS = /* @__PURE__ */ Object.freeze([
|
|
2002
|
+
"type",
|
|
2003
|
+
"number",
|
|
2004
|
+
"expiry_month",
|
|
2005
|
+
"expiry_year",
|
|
2006
|
+
"cvv",
|
|
2007
|
+
"kount_session_id",
|
|
2008
|
+
"billing_address",
|
|
2009
|
+
"cardholder_name",
|
|
2010
|
+
"shipping_address",
|
|
2011
|
+
"save_for",
|
|
2012
|
+
"environment"
|
|
2013
|
+
]);
|
|
2014
|
+
var REVOLUT_CARD_POPUP_KEYS = /* @__PURE__ */ Object.freeze([
|
|
2015
|
+
"type",
|
|
2016
|
+
"number",
|
|
2017
|
+
"expiry_month",
|
|
2018
|
+
"expiry_year",
|
|
2019
|
+
"cvv",
|
|
2020
|
+
"kount_session_id",
|
|
2021
|
+
"cardholder_name",
|
|
2022
|
+
"billing_address",
|
|
2023
|
+
"shipping_address",
|
|
2024
|
+
"save_for",
|
|
2025
|
+
"environment"
|
|
2026
|
+
]);
|
|
2027
|
+
var REVOLUT_CHANNELS = /* @__PURE__ */ Object.freeze(["WEB_SDK", "REV_CHECKOUT", "HOSTED_PAYMENT_PAGE"]);
|
|
2028
|
+
var BODY_LIMIT12 = 16384;
|
|
2029
|
+
var URL_LIMIT6 = 128;
|
|
2030
|
+
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
2031
|
+
var PAYMENTS_PATH = /^\/api\/public\/orders\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/payments$/;
|
|
2032
|
+
var CARD_NUMBER8 = /^[0-9]{12,19}$/;
|
|
2033
|
+
var SECURITY_CODE11 = /^[0-9]{3,4}$/;
|
|
2034
|
+
var KOUNT_SESSION = /^[0-9a-f]{32}$/;
|
|
2035
|
+
var AMOUNT_LIMIT = 1e11;
|
|
2036
|
+
var ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["country", "region", "city", "postcode", "street_line_1", "street_line_2"]);
|
|
2037
|
+
var ENVIRONMENT_KEYS = /* @__PURE__ */ Object.freeze([
|
|
2038
|
+
"type",
|
|
2039
|
+
"color_depth",
|
|
2040
|
+
"screen_width",
|
|
2041
|
+
"screen_height",
|
|
2042
|
+
"java_enabled",
|
|
2043
|
+
"time_zone_utc_offset",
|
|
2044
|
+
"challenge_window_width",
|
|
2045
|
+
"browser_url",
|
|
2046
|
+
"referrer_url"
|
|
2047
|
+
]);
|
|
2048
|
+
var NEW_CUSTOMER_KEYS = /* @__PURE__ */ Object.freeze(["type", "email", "name", "phone"]);
|
|
2049
|
+
var COUNTRY = /^[A-Z]{2}$/;
|
|
2050
|
+
var PHONE = /^\+?[0-9 \u00a0\/().-]{6,32}$/;
|
|
2051
|
+
var EMAIL3 = /^[^\s@]{1,64}@[^\s@]{1,255}$/;
|
|
2052
|
+
var TEXT_LIMIT2 = 256;
|
|
2053
|
+
var CONTROL5 = /[\u0000-\u001f\u007f]/;
|
|
2054
|
+
var CARD_MEMBER2 = /^(?:number|card_?number|cardnumber|cardnum|card_num|pan|cvv|cvc|cvv2)$/i;
|
|
2055
|
+
var record10 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2056
|
+
var own2 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
|
|
2057
|
+
var inOrder = (value, keys) => {
|
|
2058
|
+
let at = 0;
|
|
2059
|
+
for (const name of Object.keys(value)) {
|
|
2060
|
+
while (at < keys.length && keys[at] !== name)
|
|
2061
|
+
at += 1;
|
|
2062
|
+
if (at === keys.length)
|
|
2063
|
+
return false;
|
|
2064
|
+
at += 1;
|
|
2065
|
+
}
|
|
2066
|
+
return true;
|
|
2067
|
+
};
|
|
2068
|
+
var wellFormed = (value) => {
|
|
2069
|
+
try {
|
|
2070
|
+
encodeURIComponent(value);
|
|
2071
|
+
return true;
|
|
2072
|
+
}
|
|
2073
|
+
catch {
|
|
2074
|
+
return false;
|
|
2075
|
+
}
|
|
2076
|
+
};
|
|
2077
|
+
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);
|
|
2078
|
+
var between = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
|
|
2079
|
+
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})$/;
|
|
2080
|
+
var luhn2 = (digits) => {
|
|
2081
|
+
let sum = 0;
|
|
2082
|
+
for (let at = 0; at < digits.length; at += 1) {
|
|
2083
|
+
let d = digits.charCodeAt(digits.length - 1 - at) - 48;
|
|
2084
|
+
if (at % 2 === 1) {
|
|
2085
|
+
d *= 2;
|
|
2086
|
+
if (d > 9)
|
|
2087
|
+
d -= 9;
|
|
2088
|
+
}
|
|
2089
|
+
sum += d;
|
|
2090
|
+
}
|
|
2091
|
+
return sum % 10 === 0;
|
|
2092
|
+
};
|
|
2093
|
+
var ANY_NETWORK = /^[2-6][0-9]{12,18}$/;
|
|
2094
|
+
var holdsCardShape = (text2, shape = NETWORK) => (text2.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
|
|
2095
|
+
var phone = (value) => typeof value === "string" && PHONE.test(value) && (value.match(/[0-9]/g) ?? []).length >= 6 && (value.match(/[0-9]/g) ?? []).length <= 15;
|
|
2096
|
+
var refuse16 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2097
|
+
var CARD15 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
2098
|
+
var CONTINUE7 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
|
|
2099
|
+
function revolutPaymentsTarget(url) {
|
|
2100
|
+
if (typeof url !== "string" || url.length > URL_LIMIT6 || url.includes("?") || url.includes("#"))
|
|
2101
|
+
return null;
|
|
2102
|
+
let parsed;
|
|
2103
|
+
try {
|
|
2104
|
+
parsed = new URL(url);
|
|
2105
|
+
}
|
|
2106
|
+
catch {
|
|
2107
|
+
return null;
|
|
2108
|
+
}
|
|
2109
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !REVOLUT_HOSTS.includes(parsed.hostname))
|
|
2110
|
+
return null;
|
|
2111
|
+
const match = PAYMENTS_PATH.exec(parsed.pathname);
|
|
2112
|
+
return match ? Object.freeze({ host: parsed.hostname, order: match[1] }) : null;
|
|
2113
|
+
}
|
|
2114
|
+
function isRevolutPaymentsUrl(url) {
|
|
2115
|
+
return revolutPaymentsTarget(url) !== null;
|
|
2116
|
+
}
|
|
2117
|
+
function readBody7(body) {
|
|
2118
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT12)
|
|
2119
|
+
return null;
|
|
2120
|
+
let value;
|
|
2121
|
+
try {
|
|
2122
|
+
value = JSON.parse(body);
|
|
2123
|
+
if (!record10(value) || JSON.stringify(value) !== body)
|
|
2124
|
+
return null;
|
|
2125
|
+
}
|
|
2126
|
+
catch {
|
|
2127
|
+
return null;
|
|
2128
|
+
}
|
|
2129
|
+
return value;
|
|
2130
|
+
}
|
|
2131
|
+
function address(value) {
|
|
2132
|
+
if (!record10(value) || !inOrder(value, ADDRESS_KEYS))
|
|
2133
|
+
return false;
|
|
2134
|
+
const names = Object.keys(value);
|
|
2135
|
+
if (!names.some((key) => typeof value[key] === "string" && value[key].trim() !== ""))
|
|
2136
|
+
return false;
|
|
2137
|
+
return names.every((key) => value[key] === "" || (key === "country" ? typeof value[key] === "string" && COUNTRY.test(value[key]) : plainText2(value[key])));
|
|
2138
|
+
}
|
|
2139
|
+
function pageUrl(value) {
|
|
2140
|
+
if (typeof value !== "string" || value.length > 2048 || CONTROL5.test(value) || holdsCardShape(value, ANY_NETWORK) || !wellFormed(value))
|
|
2141
|
+
return false;
|
|
2142
|
+
let parsed;
|
|
2143
|
+
try {
|
|
2144
|
+
parsed = new URL(value);
|
|
2145
|
+
}
|
|
2146
|
+
catch {
|
|
2147
|
+
return false;
|
|
2148
|
+
}
|
|
2149
|
+
return parsed.protocol === "https:" || parsed.protocol === "http:";
|
|
2150
|
+
}
|
|
2151
|
+
function referrerOrigin(value) {
|
|
2152
|
+
if (value === "" || value === "null")
|
|
2153
|
+
return true;
|
|
2154
|
+
if (typeof value !== "string" || value.length > 512 || holdsCardShape(value, ANY_NETWORK))
|
|
2155
|
+
return false;
|
|
2156
|
+
let parsed;
|
|
2157
|
+
try {
|
|
2158
|
+
parsed = new URL(value);
|
|
2159
|
+
}
|
|
2160
|
+
catch {
|
|
2161
|
+
return false;
|
|
2162
|
+
}
|
|
2163
|
+
return (parsed.protocol === "https:" || parsed.protocol === "http:") && parsed.origin === value;
|
|
2164
|
+
}
|
|
2165
|
+
function environment(value) {
|
|
2166
|
+
if (!record10(value) || !inOrder(value, ENVIRONMENT_KEYS))
|
|
2167
|
+
return false;
|
|
2168
|
+
return value.type === "browser" && between(value.color_depth, 0, 256) && between(value.screen_width, 0, 1e5) && between(value.screen_height, 0, 1e5) && typeof value.java_enabled === "boolean" && between(value.time_zone_utc_offset, -1440, 1440) && between(value.challenge_window_width, 1, 1e4) && (!own2(value, "browser_url") || pageUrl(value.browser_url)) && (!own2(value, "referrer_url") || referrerOrigin(value.referrer_url));
|
|
2169
|
+
}
|
|
2170
|
+
function customer(value) {
|
|
2171
|
+
if (!record10(value))
|
|
2172
|
+
return false;
|
|
2173
|
+
if (value.type === "existing") {
|
|
2174
|
+
const names = Object.keys(value);
|
|
2175
|
+
return names.length === 2 && names[0] === "type" && names[1] === "id" && typeof value.id === "string" && UUID.test(value.id);
|
|
2176
|
+
}
|
|
2177
|
+
if (value.type !== "new" || !inOrder(value, NEW_CUSTOMER_KEYS) || !own2(value, "email"))
|
|
2178
|
+
return false;
|
|
2179
|
+
if (typeof value.email !== "string" || !EMAIL3.test(value.email) || !plainText2(value.email))
|
|
2180
|
+
return false;
|
|
2181
|
+
if (own2(value, "name") && !plainText2(value.name))
|
|
2182
|
+
return false;
|
|
2183
|
+
return !own2(value, "phone") || phone(value.phone);
|
|
2184
|
+
}
|
|
2185
|
+
function cardMethod(value) {
|
|
2186
|
+
if (!record10(value) || value.type !== "card")
|
|
2187
|
+
return "revolut_body_unsupported";
|
|
2188
|
+
if (!inOrder(value, REVOLUT_CARD_FIELD_KEYS) && !inOrder(value, REVOLUT_CARD_POPUP_KEYS))
|
|
2189
|
+
return "revolut_body_unsupported";
|
|
2190
|
+
if (typeof value.number !== "string" || !CARD_NUMBER8.test(value.number) || !between(value.expiry_month, 1, 12) || !between(value.expiry_year, 2e3, 2099) || typeof value.cvv !== "string" || !SECURITY_CODE11.test(value.cvv))
|
|
2191
|
+
return "revolut_body_unsupported";
|
|
2192
|
+
if (!own2(value, "environment") || !environment(value.environment))
|
|
2193
|
+
return "revolut_body_unsupported";
|
|
2194
|
+
if (own2(value, "kount_session_id") && (typeof value.kount_session_id !== "string" || !KOUNT_SESSION.test(value.kount_session_id))) {
|
|
2195
|
+
return "revolut_body_unsupported";
|
|
2196
|
+
}
|
|
2197
|
+
for (const key of ["billing_address", "shipping_address"]) {
|
|
2198
|
+
if (own2(value, key) && !address(value[key]))
|
|
2199
|
+
return "revolut_body_unsupported";
|
|
2200
|
+
}
|
|
2201
|
+
if (own2(value, "cardholder_name") && !plainText2(value.cardholder_name))
|
|
2202
|
+
return "revolut_body_unsupported";
|
|
2203
|
+
if (own2(value, "save_for")) {
|
|
2204
|
+
if (value.save_for === "CUSTOMER" || value.save_for === "MERCHANT")
|
|
2205
|
+
return "revolut_card_on_file";
|
|
2206
|
+
if (value.save_for !== "NONE")
|
|
2207
|
+
return "revolut_body_unsupported";
|
|
2208
|
+
}
|
|
2209
|
+
return null;
|
|
2210
|
+
}
|
|
2211
|
+
function namesCardValue2(parsed) {
|
|
2212
|
+
const pending = record10(parsed) || Array.isArray(parsed) ? [parsed] : [];
|
|
2213
|
+
while (pending.length > 0) {
|
|
2214
|
+
const node = pending.pop();
|
|
2215
|
+
for (const key of Object.keys(node)) {
|
|
2216
|
+
if (!Array.isArray(node) && CARD_MEMBER2.test(key))
|
|
2217
|
+
return true;
|
|
2218
|
+
const value = node[key];
|
|
2219
|
+
if (value !== null && typeof value === "object")
|
|
2220
|
+
pending.push(value);
|
|
2221
|
+
}
|
|
2222
|
+
}
|
|
2223
|
+
return false;
|
|
2224
|
+
}
|
|
2225
|
+
function revolutBodyVerdict(body) {
|
|
2226
|
+
const value = readBody7(body);
|
|
2227
|
+
if (value === null) {
|
|
2228
|
+
return body === void 0 || body === null || body === "" ? CONTINUE7 : refuse16("revolut_body_unsupported");
|
|
2229
|
+
}
|
|
2230
|
+
const method = record10(value.payment_method) ? value.payment_method.type : void 0;
|
|
2231
|
+
if (method !== "card")
|
|
2232
|
+
return namesCardValue2(value) ? refuse16("revolut_body_unsupported") : CONTINUE7;
|
|
2233
|
+
if (!inOrder(value, REVOLUT_BODY_KEYS) || Object.keys(value).length !== REVOLUT_BODY_KEYS.length)
|
|
2234
|
+
return refuse16("revolut_body_unsupported");
|
|
2235
|
+
const code = cardMethod(value.payment_method);
|
|
2236
|
+
if (code !== null)
|
|
2237
|
+
return refuse16(code);
|
|
2238
|
+
if (!customer(value.customer) || !between(value.amount, 1, AMOUNT_LIMIT) || !REVOLUT_CHANNELS.includes(value.channel)) {
|
|
2239
|
+
return refuse16("revolut_body_unsupported");
|
|
2240
|
+
}
|
|
2241
|
+
return CARD15;
|
|
2242
|
+
}
|
|
2243
|
+
// src/sumup.js
|
|
2244
|
+
var SUMUP_PSP = "sumup";
|
|
2245
|
+
var SUMUP_API_HOST = "api.sumup.com";
|
|
2246
|
+
var SUMUP_CHECKOUT_PATH = "/v0.2/checkouts/";
|
|
2247
|
+
var BODY_LIMIT13 = 16384;
|
|
2248
|
+
var CHECKOUT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
2249
|
+
var ROOT_KEYS5 = /* @__PURE__ */ Object.freeze([
|
|
2250
|
+
"payment_type",
|
|
2251
|
+
"device_information",
|
|
2252
|
+
"method_details",
|
|
2253
|
+
"personal_details",
|
|
2254
|
+
"card",
|
|
2255
|
+
"installments",
|
|
2256
|
+
"mandate",
|
|
2257
|
+
"lxn_session_token",
|
|
2258
|
+
"customer_details",
|
|
2259
|
+
"sca_experience"
|
|
2260
|
+
]);
|
|
2261
|
+
var CARD_KEYS7 = /* @__PURE__ */ Object.freeze(["zip_code", "name", "number", "expiry_month", "expiry_year", "cvv"]);
|
|
2262
|
+
var PERSONAL_KEYS = /* @__PURE__ */ Object.freeze(["first_name", "last_name", "email", "address", "birth_date", "phone"]);
|
|
2263
|
+
var ADDRESS_KEYS2 = /* @__PURE__ */ Object.freeze(["country", "city", "line1", "line2", "postal_code", "state"]);
|
|
2264
|
+
var CUSTOMER_KEYS = /* @__PURE__ */ Object.freeze(["first_name", "last_name", "email", "note_for_merchant"]);
|
|
2265
|
+
var CARD_NUMBER9 = /^[0-9]{12,19}$/;
|
|
2266
|
+
var MONTH7 = /^(?:0[1-9]|1[0-2])$/;
|
|
2267
|
+
var YEAR7 = /^(?:[0-9]{2}|[0-9]{4})$/;
|
|
2268
|
+
var CODE2 = /^[0-9]{3,4}$/;
|
|
2269
|
+
var BASE643 = /^[A-Za-z0-9+/]{4,4096}={0,2}$/;
|
|
2270
|
+
var BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
2271
|
+
var DEVICE_KEYS2 = /* @__PURE__ */ Object.freeze([
|
|
2272
|
+
"user_agent",
|
|
2273
|
+
"language",
|
|
2274
|
+
"timezone_offset",
|
|
2275
|
+
"screen_width",
|
|
2276
|
+
"screen_height",
|
|
2277
|
+
"color_depth",
|
|
2278
|
+
"modal_width",
|
|
2279
|
+
"modal_height",
|
|
2280
|
+
"adblock",
|
|
2281
|
+
"realIp",
|
|
2282
|
+
"route"
|
|
2283
|
+
]);
|
|
2284
|
+
var RISK_TOKEN = /^[A-Za-z0-9_+/=-]+\.[A-Za-z0-9_+/=-]+\.[A-Za-z0-9_+/=-]*$/;
|
|
2285
|
+
var RISK_TOKEN_LIMIT = 4096;
|
|
2286
|
+
var PAN_LIKE4 = /(?:[0-9][ _.:-]*){12,}/;
|
|
2287
|
+
var DATE = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
|
|
2288
|
+
var COUNTRY2 = /^[A-Z]{2}$/;
|
|
2289
|
+
var PHONE2 = /^[ #0-9_+\/().-]{1,32}$/;
|
|
2290
|
+
var CARD_PAYMENT2 = "card";
|
|
2291
|
+
var SCA_EXPERIENCE = "iframe";
|
|
2292
|
+
var record11 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
2293
|
+
var refuse17 = (code) => Object.freeze({ verdict: "refuse", code });
|
|
2294
|
+
var CARD16 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
|
|
2295
|
+
function orderedSubset(value, keys) {
|
|
2296
|
+
let at = -1;
|
|
2297
|
+
for (const key of Object.keys(value)) {
|
|
2298
|
+
const next = keys.indexOf(key);
|
|
2299
|
+
if (next <= at)
|
|
2300
|
+
return false;
|
|
2301
|
+
at = next;
|
|
2302
|
+
}
|
|
2303
|
+
return true;
|
|
2304
|
+
}
|
|
2305
|
+
function luhn3(digits) {
|
|
2306
|
+
let sum = 0;
|
|
2307
|
+
for (let at = 0; at < digits.length; at += 1) {
|
|
2308
|
+
let digit = Number(digits[digits.length - 1 - at]);
|
|
2309
|
+
if (at % 2 === 1) {
|
|
2310
|
+
digit *= 2;
|
|
2311
|
+
if (digit > 9)
|
|
2312
|
+
digit -= 9;
|
|
2313
|
+
}
|
|
2314
|
+
sum += digit;
|
|
2315
|
+
}
|
|
2316
|
+
return sum % 10 === 0 && sum > 0;
|
|
2317
|
+
}
|
|
2318
|
+
var printable = (value) => [...value].every((ch) => ch.charCodeAt(0) >= 32 && ch.charCodeAt(0) !== 127);
|
|
2319
|
+
function typed(value, limit = 256) {
|
|
2320
|
+
return typeof value === "string" && value.length >= 1 && value.length <= limit && !PAN_LIKE4.test(value) && printable(value);
|
|
2321
|
+
}
|
|
2322
|
+
function decodeBase64(text2) {
|
|
2323
|
+
if (typeof text2 !== "string" || !BASE643.test(text2) || text2.length % 4 !== 0)
|
|
2324
|
+
return null;
|
|
2325
|
+
let bits = 0;
|
|
2326
|
+
let value = 0;
|
|
2327
|
+
let out = "";
|
|
2328
|
+
for (const ch of text2.replace(/=+$/, "")) {
|
|
2329
|
+
value = (value << 6 | BASE64_ALPHABET.indexOf(ch)) & 16777215;
|
|
2330
|
+
bits += 6;
|
|
2331
|
+
if (bits >= 8) {
|
|
2332
|
+
bits -= 8;
|
|
2333
|
+
out += String.fromCharCode(value >> bits & 255);
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
return out;
|
|
2337
|
+
}
|
|
2338
|
+
function soundDevice(text2) {
|
|
2339
|
+
const json = decodeBase64(text2);
|
|
2340
|
+
if (json === null)
|
|
2341
|
+
return false;
|
|
2342
|
+
let value;
|
|
2343
|
+
try {
|
|
2344
|
+
value = JSON.parse(json);
|
|
2345
|
+
if (JSON.stringify(value) !== json)
|
|
2346
|
+
return false;
|
|
2347
|
+
}
|
|
2348
|
+
catch {
|
|
2349
|
+
return false;
|
|
2350
|
+
}
|
|
2351
|
+
if (!record11(value) || Object.keys(value).join() !== "deviceId,components" || typeof value.deviceId !== "string" || value.deviceId.length > 256 || PAN_LIKE4.test(value.deviceId) || !printable(value.deviceId) || !Array.isArray(value.components) || value.components.length !== DEVICE_KEYS2.length) {
|
|
2352
|
+
return false;
|
|
2353
|
+
}
|
|
2354
|
+
return value.components.every((component, at) => record11(component) && Object.keys(component).join() === "key,value" && component.key === DEVICE_KEYS2[at] && typeof component.value === "string" && component.value.length <= 1024 && !PAN_LIKE4.test(component.value) && printable(component.value));
|
|
2355
|
+
}
|
|
2356
|
+
var soundRiskToken = (token) => typeof token === "string" && token.length <= RISK_TOKEN_LIMIT && RISK_TOKEN.test(token) && !PAN_LIKE4.test(token);
|
|
2357
|
+
function sumupCheckoutUrl(url) {
|
|
2358
|
+
if (typeof url !== "string" || url.length > 256 || url.includes("#") || url.includes("?"))
|
|
2359
|
+
return null;
|
|
2360
|
+
let parsed;
|
|
2361
|
+
try {
|
|
2362
|
+
parsed = new URL(url);
|
|
2363
|
+
}
|
|
2364
|
+
catch {
|
|
2365
|
+
return null;
|
|
2366
|
+
}
|
|
2367
|
+
if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
|
|
2368
|
+
return null;
|
|
2369
|
+
if (parsed.hostname !== SUMUP_API_HOST || !parsed.pathname.startsWith(SUMUP_CHECKOUT_PATH))
|
|
2370
|
+
return null;
|
|
2371
|
+
const checkoutId = parsed.pathname.slice(SUMUP_CHECKOUT_PATH.length);
|
|
2372
|
+
return CHECKOUT_ID.test(checkoutId) ? Object.freeze({ checkoutId }) : null;
|
|
2373
|
+
}
|
|
2374
|
+
function readBody8(body) {
|
|
2375
|
+
if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT13)
|
|
2376
|
+
return null;
|
|
2377
|
+
let value;
|
|
2378
|
+
try {
|
|
2379
|
+
value = JSON.parse(body);
|
|
2380
|
+
if (!record11(value) || JSON.stringify(value) !== body)
|
|
2381
|
+
return null;
|
|
2382
|
+
}
|
|
2383
|
+
catch {
|
|
2384
|
+
return null;
|
|
2385
|
+
}
|
|
2386
|
+
return value;
|
|
2387
|
+
}
|
|
2388
|
+
function soundCard(card) {
|
|
2389
|
+
if (!record11(card) || !orderedSubset(card, CARD_KEYS7))
|
|
2390
|
+
return false;
|
|
2391
|
+
if (typeof card.number !== "string" || !CARD_NUMBER9.test(card.number) || !luhn3(card.number))
|
|
2392
|
+
return false;
|
|
2393
|
+
if (typeof card.expiry_month !== "string" || !MONTH7.test(card.expiry_month))
|
|
2394
|
+
return false;
|
|
2395
|
+
if (typeof card.expiry_year !== "string" || !YEAR7.test(card.expiry_year))
|
|
2396
|
+
return false;
|
|
2397
|
+
if (typeof card.cvv !== "string" || !CODE2.test(card.cvv))
|
|
2398
|
+
return false;
|
|
2399
|
+
if (card.name !== void 0 && (!typed(card.name, 129) || /[0-9]/.test(card.name)))
|
|
2400
|
+
return false;
|
|
2401
|
+
if (card.zip_code !== void 0 && !typed(card.zip_code, 10))
|
|
2402
|
+
return false;
|
|
2403
|
+
return true;
|
|
2404
|
+
}
|
|
2405
|
+
function soundPersonal(details) {
|
|
2406
|
+
if (!record11(details) || !orderedSubset(details, PERSONAL_KEYS) || Object.keys(details).length === 0)
|
|
2407
|
+
return false;
|
|
2408
|
+
for (const key of ["first_name", "last_name", "email"]) {
|
|
2409
|
+
if (details[key] !== void 0 && !typed(details[key]))
|
|
2410
|
+
return false;
|
|
2411
|
+
}
|
|
2412
|
+
if (details.birth_date !== void 0 && (typeof details.birth_date !== "string" || !DATE.test(details.birth_date)))
|
|
2413
|
+
return false;
|
|
2414
|
+
if (details.phone !== void 0 && (typeof details.phone !== "string" || !PHONE2.test(details.phone) || (details.phone.match(/[0-9]/g) ?? []).length > 15))
|
|
2415
|
+
return false;
|
|
2416
|
+
if (details.address === void 0)
|
|
2417
|
+
return true;
|
|
2418
|
+
const address2 = details.address;
|
|
2419
|
+
if (!record11(address2) || !orderedSubset(address2, ADDRESS_KEYS2) || Object.keys(address2).length === 0)
|
|
2420
|
+
return false;
|
|
2421
|
+
if (address2.country !== void 0 && (typeof address2.country !== "string" || !COUNTRY2.test(address2.country)))
|
|
2422
|
+
return false;
|
|
2423
|
+
return ["city", "line1", "line2", "postal_code", "state"].every((key) => address2[key] === void 0 || typed(address2[key]));
|
|
2424
|
+
}
|
|
2425
|
+
function soundCustomer(details) {
|
|
2426
|
+
if (!record11(details) || !orderedSubset(details, CUSTOMER_KEYS) || Object.keys(details).length === 0)
|
|
2427
|
+
return false;
|
|
2428
|
+
return CUSTOMER_KEYS.every((key) => details[key] === void 0 || typed(details[key], key === "note_for_merchant" ? 1024 : 256));
|
|
2429
|
+
}
|
|
2430
|
+
function sumupBodyVerdict(body, url) {
|
|
2431
|
+
if (url !== void 0 && sumupCheckoutUrl(url) === null)
|
|
2432
|
+
return refuse17("sumup_url_refused");
|
|
2433
|
+
const value = readBody8(body);
|
|
2434
|
+
if (value === null || !orderedSubset(value, ROOT_KEYS5))
|
|
2435
|
+
return refuse17("sumup_body_unsupported");
|
|
2436
|
+
if (value.payment_type !== CARD_PAYMENT2 || !soundDevice(value.device_information) || !soundCard(value.card) || value.installments !== 1) {
|
|
2437
|
+
return refuse17("sumup_body_unsupported");
|
|
2438
|
+
}
|
|
2439
|
+
if (value.method_details !== void 0 && !(record11(value.method_details) && orderedSubset(value.method_details, ["zip_code"]) && typed(value.method_details.zip_code, 10)))
|
|
2440
|
+
return refuse17("sumup_body_unsupported");
|
|
2441
|
+
if (value.personal_details !== void 0 && !soundPersonal(value.personal_details))
|
|
2442
|
+
return refuse17("sumup_body_unsupported");
|
|
2443
|
+
if (value.customer_details !== void 0 && !soundCustomer(value.customer_details))
|
|
2444
|
+
return refuse17("sumup_body_unsupported");
|
|
2445
|
+
if (value.lxn_session_token !== void 0 && !soundRiskToken(value.lxn_session_token))
|
|
2446
|
+
return refuse17("sumup_body_unsupported");
|
|
2447
|
+
if (value.sca_experience !== void 0 && value.sca_experience !== SCA_EXPERIENCE)
|
|
2448
|
+
return refuse17("sumup_body_unsupported");
|
|
2449
|
+
if (value.mandate !== void 0)
|
|
2450
|
+
return refuse17("sumup_card_saving_refused");
|
|
2451
|
+
return CARD16;
|
|
2452
|
+
}
|
|
1543
2453
|
// src/card-fields.js
|
|
1544
2454
|
function processorGate(recognizer, url, body) {
|
|
1545
2455
|
if (recognizer && recognizer.psp === LYRA_PSP)
|
|
@@ -1549,6 +2459,8 @@ function processorGate(recognizer, url, body) {
|
|
|
1549
2459
|
return { verdict: "refuse", code: "wix_payments_url_refused" };
|
|
1550
2460
|
return wixPaymentsBodyVerdict(body);
|
|
1551
2461
|
}
|
|
2462
|
+
if (recognizer && recognizer.psp === KOMOJU_PSP)
|
|
2463
|
+
return komojuBodyVerdict(body, url);
|
|
1552
2464
|
if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
|
|
1553
2465
|
if (url !== void 0 && !isPaddleVgsCardsUrl(url))
|
|
1554
2466
|
return { verdict: "refuse", code: "paddle_vgs_url_refused" };
|
|
@@ -1559,6 +2471,17 @@ function processorGate(recognizer, url, body) {
|
|
|
1559
2471
|
return { verdict: "refuse", code: "payfast_url_refused" };
|
|
1560
2472
|
return payfastBodyVerdict(body);
|
|
1561
2473
|
}
|
|
2474
|
+
if (recognizer && recognizer.psp === PAYREXX_PSP) {
|
|
2475
|
+
return url !== void 0 ? payrexxGateVerdict(url, body) : payrexxBodyVerdict(body);
|
|
2476
|
+
}
|
|
2477
|
+
if (recognizer && recognizer.psp === PAYGENT_PSP) {
|
|
2478
|
+
return url !== void 0 ? paygentRequestVerdict(url, body) : paygentBodyVerdict(body);
|
|
2479
|
+
}
|
|
2480
|
+
if (recognizer && recognizer.psp === PAY_NL_PSP) {
|
|
2481
|
+
if (url !== void 0 && !isPayNlTokenUrl(url))
|
|
2482
|
+
return { verdict: "refuse", code: "pay_nl_url_refused" };
|
|
2483
|
+
return payNlBodyVerdict(body);
|
|
2484
|
+
}
|
|
1562
2485
|
if (recognizer && recognizer.psp === PADDLE_TOKENEX_PSP) {
|
|
1563
2486
|
const target = url !== void 0 ? paddleTokenexPayTarget(url) : null;
|
|
1564
2487
|
if (url !== void 0 && target === null)
|
|
@@ -1573,6 +2496,13 @@ function processorGate(recognizer, url, body) {
|
|
|
1573
2496
|
}
|
|
1574
2497
|
if (recognizer && recognizer.psp === GOPAY_PSP)
|
|
1575
2498
|
return gopayBodyVerdict(body, url);
|
|
2499
|
+
if (recognizer && recognizer.psp === REVOLUT_PSP) {
|
|
2500
|
+
if (url !== void 0 && !isRevolutPaymentsUrl(url))
|
|
2501
|
+
return { verdict: "refuse", code: "revolut_url_refused" };
|
|
2502
|
+
return revolutBodyVerdict(body);
|
|
2503
|
+
}
|
|
2504
|
+
if (recognizer && recognizer.psp === SUMUP_PSP)
|
|
2505
|
+
return sumupBodyVerdict(body, url);
|
|
1576
2506
|
if (recognizer && recognizer.psp === GRAVY_PSP)
|
|
1577
2507
|
return gravyBodyVerdict(body);
|
|
1578
2508
|
if (recognizer && recognizer.psp === MONERIS_PSP) {
|
|
@@ -1690,7 +2620,7 @@ function splitCardLeg(recognizer, body) {
|
|
|
1690
2620
|
const absorb = list(split.absorb);
|
|
1691
2621
|
const pass = list(split.pass);
|
|
1692
2622
|
const sibling = list(split.siblingKeys);
|
|
1693
|
-
const
|
|
2623
|
+
const own3 = [];
|
|
1694
2624
|
const seen = /* @__PURE__ */ new Set();
|
|
1695
2625
|
for (const chunk of body.split("&")) {
|
|
1696
2626
|
const eq = chunk.indexOf("=");
|
|
@@ -1707,13 +2637,13 @@ function splitCardLeg(recognizer, body) {
|
|
|
1707
2637
|
return null;
|
|
1708
2638
|
seen.add(key);
|
|
1709
2639
|
if (!sibling.includes(key))
|
|
1710
|
-
|
|
2640
|
+
own3.push(key);
|
|
1711
2641
|
}
|
|
1712
|
-
if (
|
|
2642
|
+
if (own3.length === 0)
|
|
1713
2643
|
return null;
|
|
1714
|
-
if (
|
|
2644
|
+
if (own3.every((key) => absorb.includes(key)))
|
|
1715
2645
|
return "absorb";
|
|
1716
|
-
if (
|
|
2646
|
+
if (own3.every((key) => pass.includes(key)))
|
|
1717
2647
|
return "pass";
|
|
1718
2648
|
return null;
|
|
1719
2649
|
}
|