@agent-cards/sdk 0.23.18 → 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.
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: f9b8cc9ac7688a49667fd7cec9f9452aa50c4531fbe82ec999872c2f0d9444c5
3
+ // artifact-sha256: 16332ca203bb18be112c4fb3f5605a1e7520cdef85c954bed2f14292c8284212
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
@@ -310,11 +310,11 @@ var MONERIS_TOKENIZE_PATH = "/HPPtoken/request.php";
310
310
  function monerisTokenizeEnvironment(url) {
311
311
  if (typeof url !== "string")
312
312
  return null;
313
- for (const environment of
313
+ for (const environment2 of
314
314
  /** @type {const} */
315
315
  ["production", "sandbox"]) {
316
- if (MONERIS_TOKENIZE_HOSTS[environment].some((host) => url === `https://${host}${MONERIS_TOKENIZE_PATH}`))
317
- return environment;
316
+ if (MONERIS_TOKENIZE_HOSTS[environment2].some((host) => url === `https://${host}${MONERIS_TOKENIZE_PATH}`))
317
+ return environment2;
318
318
  }
319
319
  return null;
320
320
  }
@@ -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 own2 = Object.keys(value);
369
- return own2.length === keys.length && own2.every((key, at) => key === keys[at]);
368
+ const own3 = Object.keys(value);
369
+ return own3.length === keys.length && own3.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" });
@@ -754,13 +754,13 @@ var PADDLE_TOKENEX_KEYS = /* @__PURE__ */ Object.freeze({
754
754
  sha256: "92529bd289bb24d52a1bdcc42edc9ac0bb1dacbb58f7568573d44771e1287762"
755
755
  })
756
756
  });
757
- function paddleTokenexKey(environment) {
758
- if (environment !== "sandbox" && environment !== "production")
757
+ function paddleTokenexKey(environment2) {
758
+ if (environment2 !== "sandbox" && environment2 !== "production")
759
759
  return null;
760
- return PADDLE_TOKENEX_KEYS[environment] ?? null;
760
+ return PADDLE_TOKENEX_KEYS[environment2] ?? null;
761
761
  }
762
- function paddleTokenexKeyBytes(environment) {
763
- const key = paddleTokenexKey(environment);
762
+ function paddleTokenexKeyBytes(environment2) {
763
+ const key = paddleTokenexKey(environment2);
764
764
  if (!key)
765
765
  return null;
766
766
  try {
@@ -775,8 +775,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
775
775
  var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
776
776
  var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
777
777
  var sameKeys2 = (value, keys) => {
778
- const own2 = Object.keys(value);
779
- return own2.length === keys.length && own2.every((key, at) => key === keys[at]);
778
+ const own3 = Object.keys(value);
779
+ return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
780
780
  };
781
781
  var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
782
782
  var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -821,11 +821,11 @@ function isBase64OfBytes(value, bytes) {
821
821
  const pad = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
822
822
  return value.length / 4 * 3 - pad === bytes && btoa(atob(value)) === value;
823
823
  }
824
- function isPaddleTokenexCiphertext(value, environment) {
825
- const bytes = paddleTokenexKeyBytes(environment);
824
+ function isPaddleTokenexCiphertext(value, environment2) {
825
+ const bytes = paddleTokenexKeyBytes(environment2);
826
826
  return bytes !== null && isBase64OfBytes(value, bytes);
827
827
  }
828
- function readPay(body, line, environment) {
828
+ function readPay(body, line, environment2) {
829
829
  if (typeof body !== "string" || body === "" || body.length > PAY_BODY_LIMIT)
830
830
  return null;
831
831
  let value;
@@ -857,11 +857,11 @@ function readPay(body, line, environment) {
857
857
  return null;
858
858
  for (const name of CARD_KEYS3) {
859
859
  const blob = tokenex[name];
860
- if (environment === void 0) {
860
+ if (environment2 === void 0) {
861
861
  if (typeof blob !== "string" || !BASE642.test(blob) || blob.length < 4 || blob.length > 4096)
862
862
  return null;
863
863
  }
864
- else if (!isPaddleTokenexCiphertext(blob, environment))
864
+ else if (!isPaddleTokenexCiphertext(blob, environment2))
865
865
  return null;
866
866
  }
867
867
  if (tokenex.encrypted_card_number === tokenex.encrypted_cvv)
@@ -1265,8 +1265,8 @@ var TEXT_LIMIT = 256;
1265
1265
  var CONTROL4 = /[\u0000-\u001f\u007f]/;
1266
1266
  var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1267
1267
  var sameKeys3 = (value, keys) => {
1268
- const own2 = Object.keys(value);
1269
- return own2.length === keys.length && own2.every((key, at) => key === keys[at]);
1268
+ const own3 = Object.keys(value);
1269
+ return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
1270
1270
  };
1271
1271
  var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
1272
1272
  var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
@@ -1468,8 +1468,8 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
1468
1468
  var CARD_PAYMENT = "PAYMENT_CARD";
1469
1469
  var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1470
1470
  var sameKeys4 = (value, keys) => {
1471
- const own2 = Object.keys(value);
1472
- return own2.length === keys.length && own2.every((key, at) => key === keys[at]);
1471
+ const own3 = Object.keys(value);
1472
+ return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
1473
1473
  };
1474
1474
  var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
1475
1475
  var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -1498,8 +1498,8 @@ function gopayCardFormUrl(url) {
1498
1498
  }
1499
1499
  if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
1500
1500
  return null;
1501
- const environment = Object.prototype.hasOwnProperty.call(GOPAY_CARD_FORM_HOSTS, parsed.hostname) ? GOPAY_CARD_FORM_HOSTS[parsed.hostname] : null;
1502
- if (environment === null || !parsed.pathname.startsWith(GOPAY_CARD_FORM_PATH))
1501
+ const environment2 = Object.prototype.hasOwnProperty.call(GOPAY_CARD_FORM_HOSTS, parsed.hostname) ? GOPAY_CARD_FORM_HOSTS[parsed.hostname] : null;
1502
+ if (environment2 === null || !parsed.pathname.startsWith(GOPAY_CARD_FORM_PATH))
1503
1503
  return null;
1504
1504
  if (!TOKEN2.test(parsed.pathname.slice(GOPAY_CARD_FORM_PATH.length)))
1505
1505
  return null;
@@ -1511,7 +1511,7 @@ function gopayCardFormUrl(url) {
1511
1511
  const version = parsed.searchParams.get("ver");
1512
1512
  if (signature === null || !SIGNATURE.test(signature) || language !== null && !LANGUAGE.test(language) || version !== null && !VERSION.test(version))
1513
1513
  return null;
1514
- return Object.freeze({ host: parsed.hostname, environment, signature });
1514
+ return Object.freeze({ host: parsed.hostname, environment: environment2, signature });
1515
1515
  }
1516
1516
  function readBody4(body) {
1517
1517
  if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT7)
@@ -1693,8 +1693,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
1693
1693
  var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
1694
1694
  var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1695
1695
  var sameKeys5 = (value, keys) => {
1696
- const own2 = Object.keys(value);
1697
- return own2.length === keys.length && own2.every((key, at) => key === keys[at]);
1696
+ const own3 = Object.keys(value);
1697
+ return own3.length === keys.length && own3.every((key, at) => key === keys[at]);
1698
1698
  };
1699
1699
  var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
1700
1700
  var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -1851,14 +1851,14 @@ function paygentBodyVerdict(body) {
1851
1851
  return code === null ? CARD13 : refuse14(code);
1852
1852
  }
1853
1853
  function paygentRequestVerdict(url, body) {
1854
- const environment = paygentEnvironment(url);
1855
- if (environment === null)
1854
+ const environment2 = paygentEnvironment(url);
1855
+ if (environment2 === null)
1856
1856
  return refuse14("paygent_url_refused");
1857
1857
  const { code, pairs } = judgeBody3(body);
1858
1858
  if (code !== null)
1859
1859
  return refuse14(code);
1860
1860
  const key = pairs[1][1];
1861
- return (environment === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
1861
+ return (environment2 === "production" ? LIVE_KEY : SANDBOX_KEY).test(key) ? CARD13 : refuse14("paygent_key_environment");
1862
1862
  }
1863
1863
  // src/multipart-form.js
1864
1864
  var BODY_LIMIT11 = 65536;
@@ -2002,6 +2002,462 @@ function payNlBodyVerdict(body, contentType) {
2002
2002
  }
2003
2003
  var ERROR_KEYS = /* @__PURE__ */ Object.freeze(["errorId", "errorTag", "errorMessage", "errorFieldName"]);
2004
2004
  var REQUEST_KEYS = /* @__PURE__ */ Object.freeze(["result", ...ERROR_KEYS]);
2005
+ // src/revolut.js
2006
+ var REVOLUT_PSP = "revolut";
2007
+ var REVOLUT_HOSTS = /* @__PURE__ */ Object.freeze(["merchant.revolut.com", "sandbox-merchant.revolut.com"]);
2008
+ var REVOLUT_BODY_KEYS = /* @__PURE__ */ Object.freeze(["payment_method", "customer", "amount", "channel"]);
2009
+ var REVOLUT_CARD_FIELD_KEYS = /* @__PURE__ */ Object.freeze([
2010
+ "type",
2011
+ "number",
2012
+ "expiry_month",
2013
+ "expiry_year",
2014
+ "cvv",
2015
+ "kount_session_id",
2016
+ "billing_address",
2017
+ "cardholder_name",
2018
+ "shipping_address",
2019
+ "save_for",
2020
+ "environment"
2021
+ ]);
2022
+ var REVOLUT_CARD_POPUP_KEYS = /* @__PURE__ */ Object.freeze([
2023
+ "type",
2024
+ "number",
2025
+ "expiry_month",
2026
+ "expiry_year",
2027
+ "cvv",
2028
+ "kount_session_id",
2029
+ "cardholder_name",
2030
+ "billing_address",
2031
+ "shipping_address",
2032
+ "save_for",
2033
+ "environment"
2034
+ ]);
2035
+ var REVOLUT_CHANNELS = /* @__PURE__ */ Object.freeze(["WEB_SDK", "REV_CHECKOUT", "HOSTED_PAYMENT_PAGE"]);
2036
+ var BODY_LIMIT12 = 16384;
2037
+ var URL_LIMIT6 = 128;
2038
+ var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
2039
+ 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$/;
2040
+ var CARD_NUMBER8 = /^[0-9]{12,19}$/;
2041
+ var SECURITY_CODE11 = /^[0-9]{3,4}$/;
2042
+ var KOUNT_SESSION = /^[0-9a-f]{32}$/;
2043
+ var AMOUNT_LIMIT = 1e11;
2044
+ var ADDRESS_KEYS = /* @__PURE__ */ Object.freeze(["country", "region", "city", "postcode", "street_line_1", "street_line_2"]);
2045
+ var ENVIRONMENT_KEYS = /* @__PURE__ */ Object.freeze([
2046
+ "type",
2047
+ "color_depth",
2048
+ "screen_width",
2049
+ "screen_height",
2050
+ "java_enabled",
2051
+ "time_zone_utc_offset",
2052
+ "challenge_window_width",
2053
+ "browser_url",
2054
+ "referrer_url"
2055
+ ]);
2056
+ var NEW_CUSTOMER_KEYS = /* @__PURE__ */ Object.freeze(["type", "email", "name", "phone"]);
2057
+ var COUNTRY = /^[A-Z]{2}$/;
2058
+ var PHONE = /^\+?[0-9 \u00a0\/().-]{6,32}$/;
2059
+ var EMAIL3 = /^[^\s@]{1,64}@[^\s@]{1,255}$/;
2060
+ var TEXT_LIMIT2 = 256;
2061
+ var CONTROL5 = /[\u0000-\u001f\u007f]/;
2062
+ var CARD_MEMBER2 = /^(?:number|card_?number|cardnumber|cardnum|card_num|pan|cvv|cvc|cvv2)$/i;
2063
+ var record10 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2064
+ var own2 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
2065
+ var inOrder = (value, keys) => {
2066
+ let at = 0;
2067
+ for (const name of Object.keys(value)) {
2068
+ while (at < keys.length && keys[at] !== name)
2069
+ at += 1;
2070
+ if (at === keys.length)
2071
+ return false;
2072
+ at += 1;
2073
+ }
2074
+ return true;
2075
+ };
2076
+ var wellFormed = (value) => {
2077
+ try {
2078
+ encodeURIComponent(value);
2079
+ return true;
2080
+ }
2081
+ catch {
2082
+ return false;
2083
+ }
2084
+ };
2085
+ 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);
2086
+ var between = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
2087
+ 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})$/;
2088
+ var luhn2 = (digits2) => {
2089
+ let sum = 0;
2090
+ for (let at = 0; at < digits2.length; at += 1) {
2091
+ let d = digits2.charCodeAt(digits2.length - 1 - at) - 48;
2092
+ if (at % 2 === 1) {
2093
+ d *= 2;
2094
+ if (d > 9)
2095
+ d -= 9;
2096
+ }
2097
+ sum += d;
2098
+ }
2099
+ return sum % 10 === 0;
2100
+ };
2101
+ var ANY_NETWORK = /^[2-6][0-9]{12,18}$/;
2102
+ var holdsCardShape = (text3, shape = NETWORK) => (text3.match(/[0-9]{13,}/g) ?? []).some((run) => run.length > 19 || shape.test(run) && luhn2(run));
2103
+ var phone = (value) => typeof value === "string" && PHONE.test(value) && (value.match(/[0-9]/g) ?? []).length >= 6 && (value.match(/[0-9]/g) ?? []).length <= 15;
2104
+ var refuse16 = (code) => Object.freeze({ verdict: "refuse", code });
2105
+ var CARD15 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
2106
+ var CONTINUE7 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
2107
+ function revolutPaymentsTarget(url) {
2108
+ if (typeof url !== "string" || url.length > URL_LIMIT6 || url.includes("?") || url.includes("#"))
2109
+ return null;
2110
+ let parsed;
2111
+ try {
2112
+ parsed = new URL(url);
2113
+ }
2114
+ catch {
2115
+ return null;
2116
+ }
2117
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !REVOLUT_HOSTS.includes(parsed.hostname))
2118
+ return null;
2119
+ const match = PAYMENTS_PATH.exec(parsed.pathname);
2120
+ return match ? Object.freeze({ host: parsed.hostname, order: match[1] }) : null;
2121
+ }
2122
+ function isRevolutPaymentsUrl(url) {
2123
+ return revolutPaymentsTarget(url) !== null;
2124
+ }
2125
+ function readBody7(body) {
2126
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT12)
2127
+ return null;
2128
+ let value;
2129
+ try {
2130
+ value = JSON.parse(body);
2131
+ if (!record10(value) || JSON.stringify(value) !== body)
2132
+ return null;
2133
+ }
2134
+ catch {
2135
+ return null;
2136
+ }
2137
+ return value;
2138
+ }
2139
+ function address(value) {
2140
+ if (!record10(value) || !inOrder(value, ADDRESS_KEYS))
2141
+ return false;
2142
+ const names = Object.keys(value);
2143
+ if (!names.some((key) => typeof value[key] === "string" && value[key].trim() !== ""))
2144
+ return false;
2145
+ return names.every((key) => value[key] === "" || (key === "country" ? typeof value[key] === "string" && COUNTRY.test(value[key]) : plainText2(value[key])));
2146
+ }
2147
+ function pageUrl(value) {
2148
+ if (typeof value !== "string" || value.length > 2048 || CONTROL5.test(value) || holdsCardShape(value, ANY_NETWORK) || !wellFormed(value))
2149
+ return false;
2150
+ let parsed;
2151
+ try {
2152
+ parsed = new URL(value);
2153
+ }
2154
+ catch {
2155
+ return false;
2156
+ }
2157
+ return parsed.protocol === "https:" || parsed.protocol === "http:";
2158
+ }
2159
+ function referrerOrigin(value) {
2160
+ if (value === "" || value === "null")
2161
+ return true;
2162
+ if (typeof value !== "string" || value.length > 512 || holdsCardShape(value, ANY_NETWORK))
2163
+ return false;
2164
+ let parsed;
2165
+ try {
2166
+ parsed = new URL(value);
2167
+ }
2168
+ catch {
2169
+ return false;
2170
+ }
2171
+ return (parsed.protocol === "https:" || parsed.protocol === "http:") && parsed.origin === value;
2172
+ }
2173
+ function environment(value) {
2174
+ if (!record10(value) || !inOrder(value, ENVIRONMENT_KEYS))
2175
+ return false;
2176
+ 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));
2177
+ }
2178
+ function customer(value) {
2179
+ if (!record10(value))
2180
+ return false;
2181
+ if (value.type === "existing") {
2182
+ const names = Object.keys(value);
2183
+ return names.length === 2 && names[0] === "type" && names[1] === "id" && typeof value.id === "string" && UUID.test(value.id);
2184
+ }
2185
+ if (value.type !== "new" || !inOrder(value, NEW_CUSTOMER_KEYS) || !own2(value, "email"))
2186
+ return false;
2187
+ if (typeof value.email !== "string" || !EMAIL3.test(value.email) || !plainText2(value.email))
2188
+ return false;
2189
+ if (own2(value, "name") && !plainText2(value.name))
2190
+ return false;
2191
+ return !own2(value, "phone") || phone(value.phone);
2192
+ }
2193
+ function cardMethod(value) {
2194
+ if (!record10(value) || value.type !== "card")
2195
+ return "revolut_body_unsupported";
2196
+ if (!inOrder(value, REVOLUT_CARD_FIELD_KEYS) && !inOrder(value, REVOLUT_CARD_POPUP_KEYS))
2197
+ return "revolut_body_unsupported";
2198
+ 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))
2199
+ return "revolut_body_unsupported";
2200
+ if (!own2(value, "environment") || !environment(value.environment))
2201
+ return "revolut_body_unsupported";
2202
+ if (own2(value, "kount_session_id") && (typeof value.kount_session_id !== "string" || !KOUNT_SESSION.test(value.kount_session_id))) {
2203
+ return "revolut_body_unsupported";
2204
+ }
2205
+ for (const key of ["billing_address", "shipping_address"]) {
2206
+ if (own2(value, key) && !address(value[key]))
2207
+ return "revolut_body_unsupported";
2208
+ }
2209
+ if (own2(value, "cardholder_name") && !plainText2(value.cardholder_name))
2210
+ return "revolut_body_unsupported";
2211
+ if (own2(value, "save_for")) {
2212
+ if (value.save_for === "CUSTOMER" || value.save_for === "MERCHANT")
2213
+ return "revolut_card_on_file";
2214
+ if (value.save_for !== "NONE")
2215
+ return "revolut_body_unsupported";
2216
+ }
2217
+ return null;
2218
+ }
2219
+ function namesCardValue2(parsed) {
2220
+ const pending = record10(parsed) || Array.isArray(parsed) ? [parsed] : [];
2221
+ while (pending.length > 0) {
2222
+ const node = pending.pop();
2223
+ for (const key of Object.keys(node)) {
2224
+ if (!Array.isArray(node) && CARD_MEMBER2.test(key))
2225
+ return true;
2226
+ const value = node[key];
2227
+ if (value !== null && typeof value === "object")
2228
+ pending.push(value);
2229
+ }
2230
+ }
2231
+ return false;
2232
+ }
2233
+ function revolutBodyVerdict(body) {
2234
+ const value = readBody7(body);
2235
+ if (value === null) {
2236
+ return body === void 0 || body === null || body === "" ? CONTINUE7 : refuse16("revolut_body_unsupported");
2237
+ }
2238
+ const method = record10(value.payment_method) ? value.payment_method.type : void 0;
2239
+ if (method !== "card")
2240
+ return namesCardValue2(value) ? refuse16("revolut_body_unsupported") : CONTINUE7;
2241
+ if (!inOrder(value, REVOLUT_BODY_KEYS) || Object.keys(value).length !== REVOLUT_BODY_KEYS.length)
2242
+ return refuse16("revolut_body_unsupported");
2243
+ const code = cardMethod(value.payment_method);
2244
+ if (code !== null)
2245
+ return refuse16(code);
2246
+ if (!customer(value.customer) || !between(value.amount, 1, AMOUNT_LIMIT) || !REVOLUT_CHANNELS.includes(value.channel)) {
2247
+ return refuse16("revolut_body_unsupported");
2248
+ }
2249
+ return CARD15;
2250
+ }
2251
+ // src/sumup.js
2252
+ var SUMUP_PSP = "sumup";
2253
+ var SUMUP_API_HOST = "api.sumup.com";
2254
+ var SUMUP_CHECKOUT_PATH = "/v0.2/checkouts/";
2255
+ var BODY_LIMIT13 = 16384;
2256
+ 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;
2257
+ var ROOT_KEYS5 = /* @__PURE__ */ Object.freeze([
2258
+ "payment_type",
2259
+ "device_information",
2260
+ "method_details",
2261
+ "personal_details",
2262
+ "card",
2263
+ "installments",
2264
+ "mandate",
2265
+ "lxn_session_token",
2266
+ "customer_details",
2267
+ "sca_experience"
2268
+ ]);
2269
+ var CARD_KEYS7 = /* @__PURE__ */ Object.freeze(["zip_code", "name", "number", "expiry_month", "expiry_year", "cvv"]);
2270
+ var PERSONAL_KEYS = /* @__PURE__ */ Object.freeze(["first_name", "last_name", "email", "address", "birth_date", "phone"]);
2271
+ var ADDRESS_KEYS2 = /* @__PURE__ */ Object.freeze(["country", "city", "line1", "line2", "postal_code", "state"]);
2272
+ var CUSTOMER_KEYS = /* @__PURE__ */ Object.freeze(["first_name", "last_name", "email", "note_for_merchant"]);
2273
+ var CARD_NUMBER9 = /^[0-9]{12,19}$/;
2274
+ var MONTH7 = /^(?:0[1-9]|1[0-2])$/;
2275
+ var YEAR7 = /^(?:[0-9]{2}|[0-9]{4})$/;
2276
+ var CODE2 = /^[0-9]{3,4}$/;
2277
+ var BASE643 = /^[A-Za-z0-9+/]{4,4096}={0,2}$/;
2278
+ var BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2279
+ var DEVICE_KEYS2 = /* @__PURE__ */ Object.freeze([
2280
+ "user_agent",
2281
+ "language",
2282
+ "timezone_offset",
2283
+ "screen_width",
2284
+ "screen_height",
2285
+ "color_depth",
2286
+ "modal_width",
2287
+ "modal_height",
2288
+ "adblock",
2289
+ "realIp",
2290
+ "route"
2291
+ ]);
2292
+ var RISK_TOKEN = /^[A-Za-z0-9_+/=-]+\.[A-Za-z0-9_+/=-]+\.[A-Za-z0-9_+/=-]*$/;
2293
+ var RISK_TOKEN_LIMIT = 4096;
2294
+ var PAN_LIKE4 = /(?:[0-9][ _.:-]*){12,}/;
2295
+ var DATE = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/;
2296
+ var COUNTRY2 = /^[A-Z]{2}$/;
2297
+ var PHONE2 = /^[ #0-9_+\/().-]{1,32}$/;
2298
+ var CARD_PAYMENT2 = "card";
2299
+ var SCA_EXPERIENCE = "iframe";
2300
+ var record11 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2301
+ var refuse17 = (code) => Object.freeze({ verdict: "refuse", code });
2302
+ var CARD16 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
2303
+ function orderedSubset(value, keys) {
2304
+ let at = -1;
2305
+ for (const key of Object.keys(value)) {
2306
+ const next = keys.indexOf(key);
2307
+ if (next <= at)
2308
+ return false;
2309
+ at = next;
2310
+ }
2311
+ return true;
2312
+ }
2313
+ function luhn3(digits2) {
2314
+ let sum = 0;
2315
+ for (let at = 0; at < digits2.length; at += 1) {
2316
+ let digit = Number(digits2[digits2.length - 1 - at]);
2317
+ if (at % 2 === 1) {
2318
+ digit *= 2;
2319
+ if (digit > 9)
2320
+ digit -= 9;
2321
+ }
2322
+ sum += digit;
2323
+ }
2324
+ return sum % 10 === 0 && sum > 0;
2325
+ }
2326
+ var printable = (value) => [...value].every((ch) => ch.charCodeAt(0) >= 32 && ch.charCodeAt(0) !== 127);
2327
+ function typed(value, limit = 256) {
2328
+ return typeof value === "string" && value.length >= 1 && value.length <= limit && !PAN_LIKE4.test(value) && printable(value);
2329
+ }
2330
+ function decodeBase64(text3) {
2331
+ if (typeof text3 !== "string" || !BASE643.test(text3) || text3.length % 4 !== 0)
2332
+ return null;
2333
+ let bits = 0;
2334
+ let value = 0;
2335
+ let out = "";
2336
+ for (const ch of text3.replace(/=+$/, "")) {
2337
+ value = (value << 6 | BASE64_ALPHABET.indexOf(ch)) & 16777215;
2338
+ bits += 6;
2339
+ if (bits >= 8) {
2340
+ bits -= 8;
2341
+ out += String.fromCharCode(value >> bits & 255);
2342
+ }
2343
+ }
2344
+ return out;
2345
+ }
2346
+ function soundDevice(text3) {
2347
+ const json = decodeBase64(text3);
2348
+ if (json === null)
2349
+ return false;
2350
+ let value;
2351
+ try {
2352
+ value = JSON.parse(json);
2353
+ if (JSON.stringify(value) !== json)
2354
+ return false;
2355
+ }
2356
+ catch {
2357
+ return false;
2358
+ }
2359
+ 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) {
2360
+ return false;
2361
+ }
2362
+ 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));
2363
+ }
2364
+ var soundRiskToken = (token) => typeof token === "string" && token.length <= RISK_TOKEN_LIMIT && RISK_TOKEN.test(token) && !PAN_LIKE4.test(token);
2365
+ function sumupCheckoutUrl(url) {
2366
+ if (typeof url !== "string" || url.length > 256 || url.includes("#") || url.includes("?"))
2367
+ return null;
2368
+ let parsed;
2369
+ try {
2370
+ parsed = new URL(url);
2371
+ }
2372
+ catch {
2373
+ return null;
2374
+ }
2375
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
2376
+ return null;
2377
+ if (parsed.hostname !== SUMUP_API_HOST || !parsed.pathname.startsWith(SUMUP_CHECKOUT_PATH))
2378
+ return null;
2379
+ const checkoutId = parsed.pathname.slice(SUMUP_CHECKOUT_PATH.length);
2380
+ return CHECKOUT_ID.test(checkoutId) ? Object.freeze({ checkoutId }) : null;
2381
+ }
2382
+ function readBody8(body) {
2383
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT13)
2384
+ return null;
2385
+ let value;
2386
+ try {
2387
+ value = JSON.parse(body);
2388
+ if (!record11(value) || JSON.stringify(value) !== body)
2389
+ return null;
2390
+ }
2391
+ catch {
2392
+ return null;
2393
+ }
2394
+ return value;
2395
+ }
2396
+ function soundCard(card) {
2397
+ if (!record11(card) || !orderedSubset(card, CARD_KEYS7))
2398
+ return false;
2399
+ if (typeof card.number !== "string" || !CARD_NUMBER9.test(card.number) || !luhn3(card.number))
2400
+ return false;
2401
+ if (typeof card.expiry_month !== "string" || !MONTH7.test(card.expiry_month))
2402
+ return false;
2403
+ if (typeof card.expiry_year !== "string" || !YEAR7.test(card.expiry_year))
2404
+ return false;
2405
+ if (typeof card.cvv !== "string" || !CODE2.test(card.cvv))
2406
+ return false;
2407
+ if (card.name !== void 0 && (!typed(card.name, 129) || /[0-9]/.test(card.name)))
2408
+ return false;
2409
+ if (card.zip_code !== void 0 && !typed(card.zip_code, 10))
2410
+ return false;
2411
+ return true;
2412
+ }
2413
+ function soundPersonal(details) {
2414
+ if (!record11(details) || !orderedSubset(details, PERSONAL_KEYS) || Object.keys(details).length === 0)
2415
+ return false;
2416
+ for (const key of ["first_name", "last_name", "email"]) {
2417
+ if (details[key] !== void 0 && !typed(details[key]))
2418
+ return false;
2419
+ }
2420
+ if (details.birth_date !== void 0 && (typeof details.birth_date !== "string" || !DATE.test(details.birth_date)))
2421
+ return false;
2422
+ if (details.phone !== void 0 && (typeof details.phone !== "string" || !PHONE2.test(details.phone) || (details.phone.match(/[0-9]/g) ?? []).length > 15))
2423
+ return false;
2424
+ if (details.address === void 0)
2425
+ return true;
2426
+ const address2 = details.address;
2427
+ if (!record11(address2) || !orderedSubset(address2, ADDRESS_KEYS2) || Object.keys(address2).length === 0)
2428
+ return false;
2429
+ if (address2.country !== void 0 && (typeof address2.country !== "string" || !COUNTRY2.test(address2.country)))
2430
+ return false;
2431
+ return ["city", "line1", "line2", "postal_code", "state"].every((key) => address2[key] === void 0 || typed(address2[key]));
2432
+ }
2433
+ function soundCustomer(details) {
2434
+ if (!record11(details) || !orderedSubset(details, CUSTOMER_KEYS) || Object.keys(details).length === 0)
2435
+ return false;
2436
+ return CUSTOMER_KEYS.every((key) => details[key] === void 0 || typed(details[key], key === "note_for_merchant" ? 1024 : 256));
2437
+ }
2438
+ function sumupBodyVerdict(body, url) {
2439
+ if (url !== void 0 && sumupCheckoutUrl(url) === null)
2440
+ return refuse17("sumup_url_refused");
2441
+ const value = readBody8(body);
2442
+ if (value === null || !orderedSubset(value, ROOT_KEYS5))
2443
+ return refuse17("sumup_body_unsupported");
2444
+ if (value.payment_type !== CARD_PAYMENT2 || !soundDevice(value.device_information) || !soundCard(value.card) || value.installments !== 1) {
2445
+ return refuse17("sumup_body_unsupported");
2446
+ }
2447
+ if (value.method_details !== void 0 && !(record11(value.method_details) && orderedSubset(value.method_details, ["zip_code"]) && typed(value.method_details.zip_code, 10)))
2448
+ return refuse17("sumup_body_unsupported");
2449
+ if (value.personal_details !== void 0 && !soundPersonal(value.personal_details))
2450
+ return refuse17("sumup_body_unsupported");
2451
+ if (value.customer_details !== void 0 && !soundCustomer(value.customer_details))
2452
+ return refuse17("sumup_body_unsupported");
2453
+ if (value.lxn_session_token !== void 0 && !soundRiskToken(value.lxn_session_token))
2454
+ return refuse17("sumup_body_unsupported");
2455
+ if (value.sca_experience !== void 0 && value.sca_experience !== SCA_EXPERIENCE)
2456
+ return refuse17("sumup_body_unsupported");
2457
+ if (value.mandate !== void 0)
2458
+ return refuse17("sumup_card_saving_refused");
2459
+ return CARD16;
2460
+ }
2005
2461
  // src/card-fields.js
2006
2462
  function processorGate(recognizer, url, body) {
2007
2463
  if (recognizer && recognizer.psp === LYRA_PSP)
@@ -2048,6 +2504,13 @@ function processorGate(recognizer, url, body) {
2048
2504
  }
2049
2505
  if (recognizer && recognizer.psp === GOPAY_PSP)
2050
2506
  return gopayBodyVerdict(body, url);
2507
+ if (recognizer && recognizer.psp === REVOLUT_PSP) {
2508
+ if (url !== void 0 && !isRevolutPaymentsUrl(url))
2509
+ return { verdict: "refuse", code: "revolut_url_refused" };
2510
+ return revolutBodyVerdict(body);
2511
+ }
2512
+ if (recognizer && recognizer.psp === SUMUP_PSP)
2513
+ return sumupBodyVerdict(body, url);
2051
2514
  if (recognizer && recognizer.psp === GRAVY_PSP)
2052
2515
  return gravyBodyVerdict(body);
2053
2516
  if (recognizer && recognizer.psp === MONERIS_PSP) {
@@ -2168,21 +2631,21 @@ var KEEP_ON_FILE_REFUSAL = "Refusing to pay: this Primer payment would keep the
2168
2631
  var UNSUPPORTED_SDK_REFUSAL = "Refusing to pay: this checkout uses a Primer SDK Agentcard does not support yet. Nothing was sent.";
2169
2632
  var NETWORK_MISMATCH_REFUSAL = "Refusing to pay: this Primer payment names a card network that is not your card's. Nothing was sent.";
2170
2633
  var FILL_REFUSAL = "Could not fill the card fields for Primer. Nothing was sent.";
2171
- var BODY_LIMIT12 = 16384;
2634
+ var BODY_LIMIT14 = 16384;
2172
2635
  var RESPONSE_LIMIT = 32768;
2173
- var ROOT_KEYS5 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
2636
+ var ROOT_KEYS6 = ["paymentInstrument", "userDescription", "tokenType", "paymentFlow"];
2174
2637
  var INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear", "cardholderName", "preferredNetwork"];
2175
2638
  var REQUIRED_INSTRUMENT_KEYS = ["number", "cvv", "expirationMonth", "expirationYear"];
2176
- var record10 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2639
+ var record12 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2177
2640
  var owns5 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
2178
2641
  var exact = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
2179
2642
  var text2 = (value, max) => typeof value === "string" && value.length <= max && !/[\u0000-\u001f\u007f]/.test(value);
2180
2643
  var digits = (value, min, max) => typeof value === "string" && value.length >= min && value.length <= max && !/[^0-9]/.test(value);
2181
2644
  var panLike = (value) => /(?:[0-9][ _.:-]*){12,}/.test(value);
2182
2645
  var plain = (value, max) => text2(value, max) && !panLike(value);
2183
- var MONTH7 = /^(?:0[1-9]|1[0-2])$/;
2184
- var YEAR7 = /^20[0-9]{2}$/;
2185
- var NETWORK = /^[A-Z][A-Z_]{1,31}$/;
2646
+ var MONTH8 = /^(?:0[1-9]|1[0-2])$/;
2647
+ var YEAR8 = /^20[0-9]{2}$/;
2648
+ var NETWORK2 = /^[A-Z][A-Z_]{1,31}$/;
2186
2649
  function isPrimerTokenizeUrl(url, method = "POST") {
2187
2650
  if (method !== "POST" || typeof url !== "string" || url.length > 256 || url.includes("?") || url.includes("#"))
2188
2651
  return false;
@@ -2196,7 +2659,7 @@ function isPrimerTokenizeUrl(url, method = "POST") {
2196
2659
  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;
2197
2660
  }
2198
2661
  function judgeBody4(body) {
2199
- if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT12)
2662
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT14)
2200
2663
  return null;
2201
2664
  let value;
2202
2665
  try {
@@ -2205,16 +2668,16 @@ function judgeBody4(body) {
2205
2668
  catch {
2206
2669
  return null;
2207
2670
  }
2208
- if (!record10(value) || !roundTrips(value, body))
2671
+ if (!record12(value) || !roundTrips(value, body))
2209
2672
  return null;
2210
- if (!Object.keys(value).every((key) => ROOT_KEYS5.includes(key)) || !owns5(value, "paymentInstrument"))
2673
+ if (!Object.keys(value).every((key) => ROOT_KEYS6.includes(key)) || !owns5(value, "paymentInstrument"))
2211
2674
  return null;
2212
2675
  const instrument = value.paymentInstrument;
2213
- if (!record10(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns5(instrument, key)))
2676
+ if (!record12(instrument) || !Object.keys(instrument).every((key) => INSTRUMENT_KEYS.includes(key)) || !REQUIRED_INSTRUMENT_KEYS.every((key) => owns5(instrument, key)))
2214
2677
  return null;
2215
- if (!digits(instrument.number, 12, 19) || !digits(instrument.cvv, 3, 4) || !exact(MONTH7, instrument.expirationMonth) || !exact(YEAR7, instrument.expirationYear))
2678
+ if (!digits(instrument.number, 12, 19) || !digits(instrument.cvv, 3, 4) || !exact(MONTH8, instrument.expirationMonth) || !exact(YEAR8, instrument.expirationYear))
2216
2679
  return null;
2217
- if (owns5(instrument, "cardholderName") && instrument.cardholderName !== null && !plain(instrument.cardholderName, 256) || owns5(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact(NETWORK, instrument.preferredNetwork) || owns5(value, "userDescription") && value.userDescription !== null && !plain(value.userDescription, 256) || owns5(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns5(value, "paymentFlow") && value.paymentFlow !== "VAULT")
2680
+ if (owns5(instrument, "cardholderName") && instrument.cardholderName !== null && !plain(instrument.cardholderName, 256) || owns5(instrument, "preferredNetwork") && instrument.preferredNetwork !== null && !exact(NETWORK2, instrument.preferredNetwork) || owns5(value, "userDescription") && value.userDescription !== null && !plain(value.userDescription, 256) || owns5(value, "tokenType") && value.tokenType !== "MULTI_USE" || owns5(value, "paymentFlow") && value.paymentFlow !== "VAULT")
2218
2681
  return null;
2219
2682
  return { value, keepOnFile: owns5(value, "tokenType") || owns5(value, "paymentFlow") };
2220
2683
  }
@@ -2238,7 +2701,7 @@ var CLIENT_TOKEN = /^[A-Za-z0-9._~+/=-]{16,4096}$/;
2238
2701
  var REQUEST_ID = /^[A-Za-z0-9-]{1,64}$/;
2239
2702
  var API_VERSION = /^2\.[0-9]{1,2}$/;
2240
2703
  function readHeaders(headers) {
2241
- if (!record10(headers))
2704
+ if (!record12(headers))
2242
2705
  return null;
2243
2706
  const folded = /* @__PURE__ */ new Map();
2244
2707
  for (const [name, value] of Object.entries(headers)) {
@@ -2285,7 +2748,7 @@ function onTokenizePath(url) {
2285
2748
  }
2286
2749
  }
2287
2750
  function primerTokenizeRefusal(request) {
2288
- if (!record10(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
2751
+ if (!record12(request) || request.method !== "POST" || !isPrimerTokenizeUrl(request.url))
2289
2752
  return "unsupported";
2290
2753
  return headersRefusal(request.headers) ?? primerBodyRefusal(request.body);
2291
2754
  }
@@ -2300,7 +2763,7 @@ function primerCardOnFileRefusal(url, options, policy = PRIMER_SESSION_CARD_ON_F
2300
2763
  return "unsupported";
2301
2764
  if (new URL(url).hostname !== LIVE_PCI_HOST)
2302
2765
  return null;
2303
- return primerCardOnFileDisclosure(url, policy) && record10(options) && options.keepOnFile === true ? null : "keep_on_file";
2766
+ return primerCardOnFileDisclosure(url, policy) && record12(options) && options.keepOnFile === true ? null : "keep_on_file";
2304
2767
  }
2305
2768
  function primerRefusalMessage(reason) {
2306
2769
  if (reason === "keep_on_file")
@@ -2361,7 +2824,7 @@ function injectPrimerCard(body, card) {
2361
2824
  }
2362
2825
  var TOKEN3 = /^[A-Za-z0-9_-]{8,256}$/;
2363
2826
  var ERROR_ID = /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/;
2364
- var CODE2 = /^[A-Z][A-Z0-9_]{0,63}$/;
2827
+ var CODE3 = /^[A-Z][A-Z0-9_]{0,63}$/;
2365
2828
  var NETWORK_NAME = /^[A-Za-z][A-Za-z0-9 _-]{0,31}$/;
2366
2829
  var RESPONSE_MONTH = /^(?:0?[1-9]|1[0-2])$/;
2367
2830
  var RESPONSE_YEAR = /^(?:[0-9]{2}|20[0-9]{2})$/;
@@ -2384,7 +2847,7 @@ function readAnswer(body) {
2384
2847
  return null;
2385
2848
  try {
2386
2849
  const value = JSON.parse(body);
2387
- return record10(value) ? value : null;
2850
+ return record12(value) ? value : null;
2388
2851
  }
2389
2852
  catch {
2390
2853
  return null;
@@ -2393,16 +2856,16 @@ function readAnswer(body) {
2393
2856
  var tokenValue = (value) => exact(TOKEN3, value) && !panLike(value);
2394
2857
  var optional = (value, key, check) => !owns5(value, key) || value[key] === null || check(value[key]);
2395
2858
  function cardDetails(data) {
2396
- if (!record10(data) || !exact(/^[0-9]{4}$/, data.last4Digits))
2859
+ if (!record12(data) || !exact(/^[0-9]{4}$/, data.last4Digits))
2397
2860
  return null;
2398
- if (!optional(data, "first6Digits", (v) => exact(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain(v, 256)) || !optional(data, "network", (v) => exact(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record10))
2861
+ if (!optional(data, "first6Digits", (v) => exact(/^[0-9]{6}$/, v)) || !optional(data, "expirationMonth", (v) => exact(RESPONSE_MONTH, v)) || !optional(data, "expirationYear", (v) => exact(RESPONSE_YEAR, v)) || !optional(data, "cardholderName", (v) => plain(v, 256)) || !optional(data, "network", (v) => exact(NETWORK_NAME, v)) || !optional(data, "isNetworkTokenized", (v) => typeof v === "boolean") || !optional(data, "binData", record12))
2399
2862
  return null;
2400
2863
  const safe = { last4Digits: data.last4Digits };
2401
2864
  for (const key of ["first6Digits", "expirationMonth", "expirationYear", "cardholderName", "network", "isNetworkTokenized"]) {
2402
2865
  if (owns5(data, key) && data[key] !== null)
2403
2866
  safe[key] = data[key];
2404
2867
  }
2405
- if (record10(data.binData)) {
2868
+ if (record12(data.binData)) {
2406
2869
  const bin = {};
2407
2870
  for (const key of BIN_KEYS) {
2408
2871
  if (!owns5(data.binData, key) || data.binData[key] === null)
@@ -2418,7 +2881,7 @@ function cardDetails(data) {
2418
2881
  function threeDsSummary(value) {
2419
2882
  if (value === void 0 || value === null)
2420
2883
  return null;
2421
- if (!record10(value) || !exact(CODE2, value.responseCode) || !optional(value, "reasonCode", (v) => exact(CODE2, v)) || !optional(value, "reasonText", (v) => plain(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact(PROTOCOL, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
2884
+ if (!record12(value) || !exact(CODE3, value.responseCode) || !optional(value, "reasonCode", (v) => exact(CODE3, v)) || !optional(value, "reasonText", (v) => plain(v, 256)) || !optional(value, "protocolVersion", (v) => v === "" || exact(PROTOCOL, v)) || !optional(value, "challengeIssued", (v) => typeof v === "boolean"))
2422
2885
  return void 0;
2423
2886
  const safe = { responseCode: value.responseCode };
2424
2887
  for (const key of ["reasonCode", "reasonText", "protocolVersion", "challengeIssued"]) {
@@ -2446,7 +2909,7 @@ function rebuildToken(value) {
2446
2909
  }
2447
2910
  function primerErrorId(body) {
2448
2911
  const value = readAnswer(body);
2449
- const id = value && record10(value.error) ? value.error.errorId : null;
2912
+ const id = value && record12(value.error) ? value.error.errorId : null;
2450
2913
  return exact(ERROR_ID, id) && !panLike(id) ? id : null;
2451
2914
  }
2452
2915
  function matchesCard(details, card) {