@agent-cards/sdk 0.23.22 → 0.23.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  // Generated from @agent-cards/payment-core. Do not edit.
3
- // artifact-sha256: 5079a0d54849efcb72153c66e2e73268acb14d5e1da10c04c10a9497b3ac884d
3
+ // artifact-sha256: d1aac0b870ff4b5f9d63a43d1c2bb0eef03841846206282b5aeca4f540f0e73d
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
@@ -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 own10 = Object.keys(value);
361
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
360
+ const own12 = Object.keys(value);
361
+ return own12.length === keys.length && own12.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" });
@@ -771,8 +771,8 @@ var PADDLE_TOKENEX_PSP = "paddle_tokenex";
771
771
  var PADDLE_TOKENEX_FACT_KEYS = /* @__PURE__ */ Object.freeze(["card_first_six", "card_last_four", "expiry_month", "expiry_year", "card_brand"]);
772
772
  var record4 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
773
773
  var sameKeys2 = (value, keys) => {
774
- const own10 = Object.keys(value);
775
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
774
+ const own12 = Object.keys(value);
775
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
776
776
  };
777
777
  var refuse7 = (code) => Object.freeze({ verdict: "refuse", code });
778
778
  var CARD6 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -1261,8 +1261,8 @@ var TEXT_LIMIT = 256;
1261
1261
  var CONTROL4 = /[\u0000-\u001f\u007f]/;
1262
1262
  var record6 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1263
1263
  var sameKeys3 = (value, keys) => {
1264
- const own10 = Object.keys(value);
1265
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
1264
+ const own12 = Object.keys(value);
1265
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
1266
1266
  };
1267
1267
  var plainText = (value) => typeof value === "string" && value.length <= TEXT_LIMIT && !CONTROL4.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
1268
1268
  var refuse9 = (code) => Object.freeze({ verdict: "refuse", code });
@@ -1464,8 +1464,8 @@ var EXPIRATION = /^[0-9]{2}(?:0[1-9]|1[0-2])$/;
1464
1464
  var CARD_PAYMENT = "PAYMENT_CARD";
1465
1465
  var record8 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1466
1466
  var sameKeys4 = (value, keys) => {
1467
- const own10 = Object.keys(value);
1468
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
1467
+ const own12 = Object.keys(value);
1468
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
1469
1469
  };
1470
1470
  var refuse11 = (code) => Object.freeze({ verdict: "refuse", code });
1471
1471
  var CARD10 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -1695,8 +1695,8 @@ var LOCALE = /^[a-z]{2}(?:-[A-Za-z]{2,4})?$/;
1695
1695
  var PAN_LIKE3 = /(?:[0-9][ _.:-]*){12,}/;
1696
1696
  var record9 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
1697
1697
  var sameKeys5 = (value, keys) => {
1698
- const own10 = Object.keys(value);
1699
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
1698
+ const own12 = Object.keys(value);
1699
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
1700
1700
  };
1701
1701
  var refuse13 = (code) => Object.freeze({ verdict: "refuse", code });
1702
1702
  var CARD12 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -2727,8 +2727,8 @@ var TEXT_LIMIT3 = 256;
2727
2727
  var CONTROL7 = /[\u0000-\u001f\u007f]/;
2728
2728
  var record13 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
2729
2729
  var sameKeys7 = (value, keys) => {
2730
- const own10 = Object.keys(value);
2731
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
2730
+ const own12 = Object.keys(value);
2731
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
2732
2732
  };
2733
2733
  var plainText3 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT3 && !CONTROL7.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
2734
2734
  var refuse19 = (code) => Object.freeze({ verdict: "refuse", code });
@@ -2776,6 +2776,15 @@ var pin6 = (fields) => Object.freeze({ ...fields, origins: Object.freeze([...fie
2776
2776
  var HIPAY_MERCHANT_PINS = /* @__PURE__ */ Object.freeze([
2777
2777
  pin6({ id: "happybulle", merchant: "HappyBulle", origins: ["https://www.happybulle.com"], usernames: ["94683309.secure-gateway.hipay-tpp.com"] })
2778
2778
  ]);
2779
+ // src/deep-freeze.js
2780
+ function deepFreeze(value) {
2781
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
2782
+ for (const child of Object.values(value))
2783
+ deepFreeze(child);
2784
+ Object.freeze(value);
2785
+ }
2786
+ return value;
2787
+ }
2779
2788
  // src/amazon-payment-services.js
2780
2789
  var APS_PSP = "amazon_payment_services";
2781
2790
  var APS_HOSTS = /* @__PURE__ */ Object.freeze({ "checkout.payfort.com": "production", "sbcheckout.payfort.com": "sandbox" });
@@ -3449,8 +3458,8 @@ var HOSTNAME = /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](
3449
3458
  var PUBLISHABLE_KEY = /^[A-Za-z0-9]{16,64}$/;
3450
3459
  var record18 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
3451
3460
  var sameKeys8 = (value, keys) => {
3452
- const own10 = Object.keys(value);
3453
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
3461
+ const own12 = Object.keys(value);
3462
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
3454
3463
  };
3455
3464
  var refuse24 = (code) => Object.freeze({ verdict: "refuse", code });
3456
3465
  var CARD23 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
@@ -4141,8 +4150,8 @@ var LONG_TEXT_LIMIT = BODY_LIMIT25;
4141
4150
  var record22 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4142
4151
  var owns6 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4143
4152
  var sameKeys9 = (value, keys) => {
4144
- const own10 = Object.keys(value);
4145
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
4153
+ const own12 = Object.keys(value);
4154
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
4146
4155
  };
4147
4156
  var exact3 = (pattern, value) => typeof value === "string" && pattern.test(value);
4148
4157
  var printable3 = (text8) => [...text8].every((character) => {
@@ -4541,8 +4550,8 @@ var POSTAL_CODE4 = /^[A-Za-z0-9 -]{0,16}$/;
4541
4550
  var CIPHERTEXT_B64 = /^[A-Za-z0-9+/]{341}[AQgw]==$/;
4542
4551
  var record24 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
4543
4552
  var sameKeys11 = (value, keys) => {
4544
- const own10 = Object.keys(value);
4545
- return own10.length === keys.length && own10.every((key, at) => key === keys[at]);
4553
+ const own12 = Object.keys(value);
4554
+ return own12.length === keys.length && own12.every((key, at) => key === keys[at]);
4546
4555
  };
4547
4556
  var refuse29 = (code) => Object.freeze({ verdict: "refuse", code });
4548
4557
  var failed = (code) => (
@@ -5063,6 +5072,1083 @@ function xenditBodyVerdict(body) {
5063
5072
  return refuse32("xendit_body_unsupported");
5064
5073
  return CARD31;
5065
5074
  }
5075
+ // src/tappay.js
5076
+ var TAPPAY_PSP = "tappay";
5077
+ var TAPPAY_GETPRIME_URL = "https://js.tappaysdk.com/payment/tpdirect/production/getprime";
5078
+ var BODY_LIMIT31 = 8192;
5079
+ var REQUIRED_KEYS3 = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "protocol", "tappay_sdk_version", "cardholder_info"]);
5080
+ var KEY_ORDER = /* @__PURE__ */ Object.freeze(["cardnumber", "cardduedate", "appid", "appkey", "appname", "url", "port", "protocol", "tappay_sdk_version", "cardholder_info", "cardccv", "device_id"]);
5081
+ var OPTIONAL_KEYS2 = /* @__PURE__ */ Object.freeze(["port", "cardccv", "device_id"]);
5082
+ var CARDHOLDER_KEYS = /* @__PURE__ */ Object.freeze(["name_en", "email", "phone_number_country_code", "phone_number"]);
5083
+ var CARD_NUMBER16 = /^[0-9]{12,19}$/;
5084
+ var CARD_DUE_DATE = /^20[0-9]{2}(?:0[1-9]|1[0-2])$/;
5085
+ var SECURITY_CODE19 = /^[0-9]{3,4}$/;
5086
+ var APP_KEY = /^[A-Za-z0-9_-]{16,512}$/;
5087
+ var SDK_VERSION = /^v[0-9]+(?:\.[0-9]+){1,3}$/;
5088
+ var HOSTNAME2 = /^[A-Za-z0-9.:-]{1,255}$/;
5089
+ var ORIGIN_URL = /^https?:\/\/[A-Za-z0-9.:_/-]{1,255}$/;
5090
+ var PROTOCOL = /^https?:$/;
5091
+ var PORT = /^[0-9]{0,5}$/;
5092
+ var CONTROL13 = /[\u0000-\u001f\u007f]/;
5093
+ var TEXT_LIMIT12 = 256;
5094
+ var DEVICE_ID = /^[A-Za-z0-9_-]{1,128}$/;
5095
+ var record28 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
5096
+ var plainText7 = (value) => typeof value === "string" && value.length <= TEXT_LIMIT12 && !CONTROL13.test(value) && (value.match(/[0-9]/g) ?? []).length < 12;
5097
+ var holderField = (value) => value === null || plainText7(value);
5098
+ var refuse33 = (code) => Object.freeze({ verdict: "refuse", code });
5099
+ var CARD32 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5100
+ function isTappayGetPrimeUrl(url) {
5101
+ return url === TAPPAY_GETPRIME_URL;
5102
+ }
5103
+ function readBody19(body) {
5104
+ if (typeof body !== "string" || body.length > BODY_LIMIT31)
5105
+ return null;
5106
+ const eq = body.indexOf("=");
5107
+ if (eq !== "jsonString".length || body.slice(0, eq) !== "jsonString")
5108
+ return null;
5109
+ const json = body.slice(eq + 1);
5110
+ let value;
5111
+ try {
5112
+ value = JSON.parse(json);
5113
+ if (!record28(value) || JSON.stringify(value) !== json)
5114
+ return null;
5115
+ }
5116
+ catch {
5117
+ return null;
5118
+ }
5119
+ return value;
5120
+ }
5121
+ function keysInOrder(value) {
5122
+ const keys = Object.keys(value);
5123
+ for (const key of REQUIRED_KEYS3) {
5124
+ if (!keys.includes(key))
5125
+ return false;
5126
+ }
5127
+ for (const key of keys) {
5128
+ if (!KEY_ORDER.includes(key) || !REQUIRED_KEYS3.includes(key) && !OPTIONAL_KEYS2.includes(key))
5129
+ return false;
5130
+ }
5131
+ const rank = (key) => KEY_ORDER.indexOf(key);
5132
+ for (let at = 1; at < keys.length; at += 1) {
5133
+ if (rank(keys[at]) <= rank(keys[at - 1]))
5134
+ return false;
5135
+ }
5136
+ return true;
5137
+ }
5138
+ function cardholderInfo(value) {
5139
+ if (!record28(value))
5140
+ return false;
5141
+ const keys = Object.keys(value);
5142
+ return keys.length <= CARDHOLDER_KEYS.length && keys.every((key) => CARDHOLDER_KEYS.includes(key) && holderField(value[key]));
5143
+ }
5144
+ function tappayBodyVerdict(body) {
5145
+ const value = readBody19(body);
5146
+ if (value === null || !keysInOrder(value))
5147
+ return refuse33("tappay_body_unsupported");
5148
+ if (typeof value.cardnumber !== "string" || !CARD_NUMBER16.test(value.cardnumber) || typeof value.cardduedate !== "string" || !CARD_DUE_DATE.test(value.cardduedate) || !Number.isInteger(value.appid) || value.appid < 0 || typeof value.appkey !== "string" || !APP_KEY.test(value.appkey) || typeof value.appname !== "string" || !HOSTNAME2.test(value.appname) || typeof value.url !== "string" || !ORIGIN_URL.test(value.url) || typeof value.protocol !== "string" || !PROTOCOL.test(value.protocol) || typeof value.tappay_sdk_version !== "string" || !SDK_VERSION.test(value.tappay_sdk_version) || !cardholderInfo(value.cardholder_info)) {
5149
+ return refuse33("tappay_body_unsupported");
5150
+ }
5151
+ if (Object.prototype.hasOwnProperty.call(value, "port") && (typeof value.port !== "string" || !PORT.test(value.port)))
5152
+ return refuse33("tappay_body_unsupported");
5153
+ if (Object.prototype.hasOwnProperty.call(value, "cardccv") && (typeof value.cardccv !== "string" || !SECURITY_CODE19.test(value.cardccv)))
5154
+ return refuse33("tappay_body_unsupported");
5155
+ if (Object.prototype.hasOwnProperty.call(value, "device_id") && (typeof value.device_id !== "string" || !DEVICE_ID.test(value.device_id)))
5156
+ return refuse33("tappay_body_unsupported");
5157
+ return CARD32;
5158
+ }
5159
+ // src/paymob.js
5160
+ var PAYMOB_PSP = "paymob";
5161
+ var PAYMOB_HOSTS = /* @__PURE__ */ Object.freeze(["accept.paymob.com", "uae.paymob.com", "ksa.paymob.com", "oman.paymob.com", "accept.paymobsolutions.com"]);
5162
+ var PAYMOB_PAY_PATH = "/api/acceptance/payments/pay";
5163
+ var URL_LIMIT12 = 128;
5164
+ var BODY_LIMIT32 = 16384;
5165
+ var KEY_LIMIT = 8192;
5166
+ var NUMBER7 = /^[0-9]{12,19}$/;
5167
+ var MONTH17 = /^(?:0[1-9]|1[0-2])$/;
5168
+ var YEAR18 = /^[0-9]{2}$/;
5169
+ var SECURITY_CODE20 = /^[0-9]{3,4}$/;
5170
+ var TEXT3 = /^[^\x00-\x1f\x7f]{0,256}$/;
5171
+ var HOLDER_TEXT = /^[^\x00-\x1f\x7f]{0,128}$/;
5172
+ var FIELD = /^[a-z][a-z0-9_]{0,39}$/;
5173
+ var FINGERPRINT3 = /^[\x21-\x7e]{1,256}$/;
5174
+ var ORIGIN2 = /^https?:\/\/[A-Za-z0-9.-]{1,253}(?::[0-9]{1,5})?$/;
5175
+ var SWITCH = /* @__PURE__ */ new Set(["True", "False"]);
5176
+ var SOURCE_FOR = /* @__PURE__ */ Object.freeze({ IFRAME: "True", PIXEL: "False" });
5177
+ var CARD_MEMBER4 = /^(?:card_?number|pan|cvv|cvc|cvn|card_pin|card_expiry|expiry_month|expiry_year|security_code)$/i;
5178
+ var SAVED_CARD = "TOKEN";
5179
+ var OTHER_CARD_SUBTYPES = /* @__PURE__ */ new Set(["OMANNET", "PREMIUM", "PREMIUM6_ONLINE", "SYMPL"]);
5180
+ var CARD_SOURCE_KEYS = /* @__PURE__ */ new Set(["identifier", "sourceholder_name", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"]);
5181
+ var TOP_KEYS3 = /* @__PURE__ */ new Set([
5182
+ "source",
5183
+ "billing",
5184
+ "shipping_data",
5185
+ "payment_token",
5186
+ "api_source",
5187
+ "unified_checkout",
5188
+ "save_card",
5189
+ "fingerprint",
5190
+ "merchant-domain",
5191
+ "customer",
5192
+ "converted_currency",
5193
+ "no_of_cards_selected",
5194
+ "split_payment_amount"
5195
+ ]);
5196
+ var REQUIRED_TOP_KEYS = ["source", "payment_token", "api_source", "unified_checkout", "save_card"];
5197
+ var REQUIRED_SOURCE_KEYS = ["identifier", "subtype", "expiry_month", "expiry_year", "cvn", "unified_checkout", "save_card"];
5198
+ var record29 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
5199
+ var own10 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
5200
+ var refuse34 = (code) => Object.freeze({ verdict: "refuse", code });
5201
+ var CARD33 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5202
+ var CONTINUE12 = /* @__PURE__ */ Object.freeze({ verdict: "continue" });
5203
+ function paymobPayHost(url) {
5204
+ if (typeof url !== "string" || url.length > URL_LIMIT12 || url.includes("?") || url.includes("#"))
5205
+ return null;
5206
+ let parsed;
5207
+ try {
5208
+ parsed = new URL(url);
5209
+ }
5210
+ catch {
5211
+ return null;
5212
+ }
5213
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password || !PAYMOB_HOSTS.includes(parsed.hostname) || parsed.pathname !== PAYMOB_PAY_PATH)
5214
+ return null;
5215
+ return parsed.hostname;
5216
+ }
5217
+ function isPaymobPayUrl(url) {
5218
+ return paymobPayHost(url) !== null;
5219
+ }
5220
+ var BASE645 = /^[A-Za-z0-9+/]+={0,2}$/;
5221
+ var BASE64URL = /^[A-Za-z0-9_-]+$/;
5222
+ var ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
5223
+ function decodeBase642(text8, url) {
5224
+ if (typeof text8 !== "string" || text8 === "")
5225
+ return null;
5226
+ let body = text8;
5227
+ if (url) {
5228
+ if (!BASE64URL.test(body) || body.length % 4 === 1)
5229
+ return null;
5230
+ }
5231
+ else {
5232
+ if (!BASE645.test(body) || body.length % 4 !== 0)
5233
+ return null;
5234
+ body = body.replace(/=+$/, "");
5235
+ }
5236
+ const extra = url ? "-_" : "+/";
5237
+ const bytes = new Uint8Array(Math.floor(body.length * 3 / 4));
5238
+ let buffer = 0;
5239
+ let bits = 0;
5240
+ let at = 0;
5241
+ for (const char of body) {
5242
+ const value = (ALPHABET + extra).indexOf(char);
5243
+ if (value < 0)
5244
+ return null;
5245
+ buffer = buffer << 6 | value;
5246
+ bits += 6;
5247
+ if (bits >= 8) {
5248
+ bits -= 8;
5249
+ bytes[at++] = buffer >> bits & 255;
5250
+ }
5251
+ }
5252
+ if (buffer & (1 << bits) - 1)
5253
+ return null;
5254
+ return bytes.subarray(0, at);
5255
+ }
5256
+ function jsonOf(bytes) {
5257
+ if (!bytes)
5258
+ return null;
5259
+ let text8;
5260
+ try {
5261
+ text8 = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
5262
+ }
5263
+ catch {
5264
+ return null;
5265
+ }
5266
+ try {
5267
+ const value = JSON.parse(text8);
5268
+ return record29(value) ? value : null;
5269
+ }
5270
+ catch {
5271
+ return null;
5272
+ }
5273
+ }
5274
+ var positive = (value) => Number.isSafeInteger(value) && value > 0;
5275
+ var CURRENCY5 = /^[A-Z]{3}$/;
5276
+ var KEY_CLAIMS = /* @__PURE__ */ new Set([
5277
+ "user_id",
5278
+ "integration_id",
5279
+ "order_id",
5280
+ "amount_cents",
5281
+ "currency",
5282
+ "exp",
5283
+ "billing_data",
5284
+ "extra",
5285
+ "notification_url",
5286
+ "redirection_url",
5287
+ "redirect_url",
5288
+ "lock_order_when_paid",
5289
+ "single_payment_attempt",
5290
+ "next_payment_intention",
5291
+ "created_by",
5292
+ "is_partner",
5293
+ "split_payment_methods"
5294
+ ]);
5295
+ var SUBSCRIPTION_CLAIMS = /* @__PURE__ */ new Set(["subscription_plan_id", "subscription_start_date"]);
5296
+ var UNREADABLE_KEY = /* @__PURE__ */ Object.freeze({ facts: null, code: "paymob_payment_key_unreadable" });
5297
+ function readPaymentKey(key) {
5298
+ if (typeof key !== "string" || key.length > KEY_LIMIT)
5299
+ return UNREADABLE_KEY;
5300
+ const outer = decodeBase642(key, false);
5301
+ if (!outer)
5302
+ return UNREADABLE_KEY;
5303
+ let jwt;
5304
+ try {
5305
+ jwt = new TextDecoder("utf-8", { fatal: true }).decode(outer);
5306
+ }
5307
+ catch {
5308
+ return UNREADABLE_KEY;
5309
+ }
5310
+ const parts = jwt.split(".");
5311
+ if (parts.length !== 3 || parts.some((part) => part === "" || !BASE64URL.test(part)))
5312
+ return UNREADABLE_KEY;
5313
+ const header = jsonOf(decodeBase642(parts[0], true));
5314
+ if (!header || Object.keys(header).length !== 2 || header.alg !== "HS512" || header.typ !== "JWT")
5315
+ return UNREADABLE_KEY;
5316
+ const signature = decodeBase642(parts[2], true);
5317
+ if (!signature || signature.length !== 64)
5318
+ return UNREADABLE_KEY;
5319
+ const payload = jsonOf(decodeBase642(parts[1], true));
5320
+ if (!payload)
5321
+ return UNREADABLE_KEY;
5322
+ const claims = Object.keys(payload);
5323
+ if (claims.some((claim) => SUBSCRIPTION_CLAIMS.has(claim) && payload[claim] !== null))
5324
+ return Object.freeze({ facts: null, code: "paymob_subscription" });
5325
+ if (claims.some((claim) => !KEY_CLAIMS.has(claim) && !SUBSCRIPTION_CLAIMS.has(claim)))
5326
+ return UNREADABLE_KEY;
5327
+ const { user_id: merchantId, integration_id: integrationId, order_id: orderId, amount_cents: amountCents, currency, exp } = payload;
5328
+ if (!positive(merchantId) || !positive(integrationId) || !positive(orderId) || !Number.isSafeInteger(amountCents) || amountCents < 0 || typeof currency !== "string" || !CURRENCY5.test(currency) || own10(payload, "exp") && !positive(exp))
5329
+ return UNREADABLE_KEY;
5330
+ if (amountCents === 0)
5331
+ return Object.freeze({ facts: null, code: "paymob_no_amount" });
5332
+ return Object.freeze({ facts: Object.freeze({ merchantId, integrationId, orderId, amountCents, currency, expiresAt: own10(payload, "exp") ? exp : null }), code: null });
5333
+ }
5334
+ function readJson8(body) {
5335
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT32)
5336
+ return { parsed: null, exact: false };
5337
+ let parsed;
5338
+ try {
5339
+ parsed = JSON.parse(body);
5340
+ }
5341
+ catch {
5342
+ return { parsed: null, exact: false };
5343
+ }
5344
+ let exact4 = false;
5345
+ try {
5346
+ exact4 = body.length <= BODY_LIMIT32 && JSON.stringify(parsed) === body;
5347
+ }
5348
+ catch {
5349
+ exact4 = false;
5350
+ }
5351
+ return { parsed, exact: exact4 };
5352
+ }
5353
+ function namesCardValue3(parsed) {
5354
+ const pending = parsed !== null && typeof parsed === "object" ? [parsed] : [];
5355
+ while (pending.length > 0) {
5356
+ const node = pending.pop();
5357
+ for (const key of Object.keys(node)) {
5358
+ if (!Array.isArray(node) && CARD_MEMBER4.test(key))
5359
+ return true;
5360
+ const value = node[key];
5361
+ if (value !== null && typeof value === "object")
5362
+ pending.push(value);
5363
+ }
5364
+ }
5365
+ return false;
5366
+ }
5367
+ function addressBlock(value) {
5368
+ return record29(value) && Object.keys(value).length <= 32 && Object.entries(value).every(([key, text8]) => FIELD.test(key) && !CARD_MEMBER4.test(key) && (text8 === null || typeof text8 === "string" && TEXT3.test(text8)));
5369
+ }
5370
+ function judgeCardPayment(parsed) {
5371
+ const source = parsed.source;
5372
+ for (const key of Object.keys(parsed))
5373
+ if (!TOP_KEYS3.has(key))
5374
+ return "paymob_body_unsupported";
5375
+ for (const key of Object.keys(source)) {
5376
+ if (key === "is_card_to_installment" || key === "tenure")
5377
+ return "paymob_installments";
5378
+ if (!CARD_SOURCE_KEYS.has(key))
5379
+ return "paymob_body_unsupported";
5380
+ }
5381
+ if (own10(parsed, "customer"))
5382
+ return "paymob_account";
5383
+ if (own10(parsed, "no_of_cards_selected") || own10(parsed, "split_payment_amount"))
5384
+ return "paymob_split_payment";
5385
+ if (own10(parsed, "converted_currency"))
5386
+ return "paymob_currency_conversion";
5387
+ if (!REQUIRED_TOP_KEYS.every((key) => own10(parsed, key)) || !REQUIRED_SOURCE_KEYS.every((key) => own10(source, key)))
5388
+ return "paymob_body_unsupported";
5389
+ if (source.save_card === true || parsed.save_card === true)
5390
+ return "paymob_keep_on_file";
5391
+ if (source.save_card !== false || parsed.save_card !== false)
5392
+ return "paymob_body_unsupported";
5393
+ if (typeof source.identifier !== "string" || !NUMBER7.test(source.identifier) || typeof source.expiry_month !== "string" || !MONTH17.test(source.expiry_month) || typeof source.expiry_year !== "string" || !YEAR18.test(source.expiry_year) || typeof source.cvn !== "string" || !SECURITY_CODE20.test(source.cvn) || own10(source, "sourceholder_name") && !(typeof source.sourceholder_name === "string" && HOLDER_TEXT.test(source.sourceholder_name))) {
5394
+ return "paymob_body_unsupported";
5395
+ }
5396
+ if (!own10(SOURCE_FOR, parsed.api_source) || !SWITCH.has(parsed.unified_checkout) || parsed.unified_checkout !== SOURCE_FOR[parsed.api_source] || source.unified_checkout !== parsed.unified_checkout)
5397
+ return "paymob_body_unsupported";
5398
+ if (own10(parsed, "billing") && !addressBlock(parsed.billing) || own10(parsed, "shipping_data") && !addressBlock(parsed.shipping_data)) {
5399
+ return "paymob_body_unsupported";
5400
+ }
5401
+ if (own10(parsed, "fingerprint") && parsed.fingerprint !== null && !(typeof parsed.fingerprint === "string" && FINGERPRINT3.test(parsed.fingerprint))) {
5402
+ return "paymob_body_unsupported";
5403
+ }
5404
+ if (own10(parsed, "merchant-domain") && !(typeof parsed["merchant-domain"] === "string" && ORIGIN2.test(parsed["merchant-domain"]))) {
5405
+ return "paymob_body_unsupported";
5406
+ }
5407
+ return readPaymentKey(parsed.payment_token).code;
5408
+ }
5409
+ function paymobBodyVerdict(body) {
5410
+ if (body === void 0 || body === null || body === "")
5411
+ return CONTINUE12;
5412
+ const { parsed, exact: exact4 } = readJson8(body);
5413
+ if (!exact4 || !record29(parsed) || !record29(parsed.source) || typeof parsed.source.subtype !== "string")
5414
+ return refuse34("paymob_body_unsupported");
5415
+ const subtype = parsed.source.subtype;
5416
+ if (subtype === "CARD") {
5417
+ const code = judgeCardPayment(parsed);
5418
+ return code === null ? CARD33 : refuse34(code);
5419
+ }
5420
+ if (subtype === SAVED_CARD)
5421
+ return refuse34("paymob_saved_card");
5422
+ if (OTHER_CARD_SUBTYPES.has(subtype) || namesCardValue3(parsed))
5423
+ return refuse34("paymob_body_unsupported");
5424
+ return CONTINUE12;
5425
+ }
5426
+ // src/payu-latam.js
5427
+ var PAYU_LATAM_PSP = "payu_latam";
5428
+ var PAYU_LATAM_HOSTS = /* @__PURE__ */ Object.freeze({
5429
+ production: Object.freeze(["checkout.payulatam.com"]),
5430
+ sandbox: Object.freeze(["sandbox.checkout.payulatam.com"])
5431
+ });
5432
+ var PAYU_LATAM_COUNTRIES = /* @__PURE__ */ Object.freeze(["cl", "co", "mx", "pa", "pe"]);
5433
+ var UNREVIEWED_COUNTRIES = /* @__PURE__ */ Object.freeze(["ar", "br"]);
5434
+ var PAYU_LATAM_CARD_BRANDS = /* @__PURE__ */ Object.freeze(["VISA", "MASTERCARD", "AMEX", "DINERS"]);
5435
+ var BODY_LIMIT33 = 65536;
5436
+ var URL_LIMIT13 = 256;
5437
+ var SUBMIT_PATH = /^\/ppp-web-gateway-payu\/checkout\/submit\/([a-z]{2})\/credit_card\/([0-9a-f]{32})$/;
5438
+ var KEY = /^[0-9a-f]{32}$/;
5439
+ var CARD_KEYS14 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear", "cardType"]);
5440
+ var CARD_REQUIRED2 = /* @__PURE__ */ Object.freeze(["number", "securityCode", "expirationDateMonth", "expirationDateYear"]);
5441
+ var CARD_TYPES2 = /* @__PURE__ */ Object.freeze(["CREDIT", "DEBIT", "PREPAID"]);
5442
+ var NOT_THE_CARD_FORM = /* @__PURE__ */ Object.freeze([
5443
+ "checkoutPaymentMethod",
5444
+ "response",
5445
+ "checkoutPse",
5446
+ "checkoutKhipu",
5447
+ "smsCode",
5448
+ "checkoutDebitCard"
5449
+ ]);
5450
+ var TRANSACTION_MEMBERS = /* @__PURE__ */ Object.freeze([
5451
+ "id",
5452
+ "key",
5453
+ "isPaymentAttempt",
5454
+ "payer",
5455
+ "state",
5456
+ "merchantId",
5457
+ "orderId",
5458
+ "order",
5459
+ "checkoutPaymentMethod",
5460
+ "paymentNetwork",
5461
+ "paymentMethodType",
5462
+ "paymentMethodMain",
5463
+ "bank",
5464
+ "paymentAgreementId",
5465
+ "paymentCountry",
5466
+ "paymentExchangeRate",
5467
+ "response",
5468
+ "expirationDate",
5469
+ "lastUpdatedDate",
5470
+ "creationDate",
5471
+ "termsAndConditionId",
5472
+ "installments",
5473
+ "installmentValue",
5474
+ "internationalCard",
5475
+ "checkoutVersion",
5476
+ "payerCommissionValue",
5477
+ "payerInterestValue",
5478
+ "payerPricingValue",
5479
+ "promotionId",
5480
+ "shippingValue",
5481
+ "shipmentMerchantValue",
5482
+ "additionalValue",
5483
+ "administrativeFee",
5484
+ "payerTotalAmount",
5485
+ "source",
5486
+ "integrationMethod",
5487
+ "cardType",
5488
+ "creditCardCountry",
5489
+ "shippingInfo",
5490
+ "questionnaire",
5491
+ "merchantSoftDescriptor",
5492
+ "pmNetworkValue",
5493
+ "tea",
5494
+ "cft",
5495
+ "hasPaymentByPoints",
5496
+ "loyaltyProgramRedeemedAmount",
5497
+ "loyaltyProgramRedeemedPoints",
5498
+ "lendingEligible",
5499
+ "registerLendingDevice",
5500
+ "lendingDeviceToken",
5501
+ "abandonedLendingTransaction",
5502
+ "masterpassObfuscateCreditCardNumber",
5503
+ "isMasterpass",
5504
+ "brandName",
5505
+ "transactionType",
5506
+ "nossoNumero",
5507
+ "paymentTaxesDetails",
5508
+ "shopifyGid",
5509
+ "shopifyVersion",
5510
+ "shopifyShopDomain",
5511
+ "shopifyRedirectTime",
5512
+ "paymentCancelUrl",
5513
+ "checkoutCreditCard",
5514
+ "isRegisterPayer",
5515
+ "creditCardTokenId",
5516
+ "checkoutPse",
5517
+ "checkoutKhipu",
5518
+ "smsCode",
5519
+ "checkoutDebitCard"
5520
+ ]);
5521
+ var ADDRESS = ["street1", "street2", "street3", "city", "state", "country", "postalCode", "phone"];
5522
+ var PERSON = [
5523
+ "fullName",
5524
+ "emailAddress",
5525
+ "contactPhone",
5526
+ "phoneCountryCode",
5527
+ "dniNumber",
5528
+ "isDniNumberEncrypt",
5529
+ "dniType",
5530
+ "personType",
5531
+ "businessName",
5532
+ "cnpj",
5533
+ "gender"
5534
+ ];
5535
+ var MONEY = ["value", "symbol", "currency"];
5536
+ var RECORD_MEMBERS = /* @__PURE__ */ Object.freeze({
5537
+ payer: [...PERSON, "merchantBuyerId", "billingAddress", "birthDate", "identificationNumber", "identificationType"],
5538
+ "payer.billingAddress": ADDRESS,
5539
+ order: [
5540
+ "id",
5541
+ "referenceCode",
5542
+ "airlineCode",
5543
+ "description",
5544
+ "isTest",
5545
+ "signature",
5546
+ "language",
5547
+ "buyer",
5548
+ "shipment",
5549
+ "state",
5550
+ "status",
5551
+ "paymentApprovalDate",
5552
+ "creationDate",
5553
+ "accountId",
5554
+ "amount",
5555
+ "tax",
5556
+ "totalPurchase",
5557
+ "currency",
5558
+ "amountConvertedValue",
5559
+ "taxConvertedValue",
5560
+ "taxReturnBase",
5561
+ "taxReturnBaseConvertedValue",
5562
+ "additionalValue",
5563
+ "administrativeFee",
5564
+ "taxAdministrativeFee",
5565
+ "taxAdministrativeFeeReturnBase",
5566
+ "enabledPaymentMethods",
5567
+ "enabledInstallments",
5568
+ "enabledPaymentMethodTypes",
5569
+ "enabledIin",
5570
+ "enabledPseBanks",
5571
+ "enabledKhipuBanks",
5572
+ "paymentMethodsDescription",
5573
+ "urlEncodedId",
5574
+ "shippingValue",
5575
+ "paymentRequestLinkId",
5576
+ "airlineDescription",
5577
+ "displayShipping",
5578
+ "displayBuyerComments",
5579
+ "buyerCommentsLabel",
5580
+ "extraParameters",
5581
+ "dispersion"
5582
+ ],
5583
+ "order.buyer": [...PERSON, "merchantBuyerId", "buyerAddress", "comments"],
5584
+ "order.buyer.buyerAddress": ADDRESS,
5585
+ "order.shipment": [...PERSON, "merchantShipmentId", "shippingAddress", "comments"],
5586
+ "order.shipment.shippingAddress": ADDRESS,
5587
+ "order.amount": MONEY,
5588
+ "order.tax": MONEY,
5589
+ "order.totalPurchase": MONEY,
5590
+ "order.amountConvertedValue": MONEY,
5591
+ "order.taxConvertedValue": MONEY,
5592
+ "order.taxReturnBase": MONEY,
5593
+ "order.taxReturnBaseConvertedValue": MONEY,
5594
+ shippingInfo: [
5595
+ "userLogin",
5596
+ "id",
5597
+ "reference",
5598
+ "description",
5599
+ "currency",
5600
+ "deliveryCity",
5601
+ "deliveryCityName",
5602
+ "deliveryAddress1",
5603
+ "deliveryAddress2",
5604
+ "deliveryAddress3",
5605
+ "postalCode",
5606
+ "fullName",
5607
+ "documentType",
5608
+ "document",
5609
+ "phoneNumber",
5610
+ "observationsReceivingShipment",
5611
+ "destinationState",
5612
+ "destinationStateName",
5613
+ "destinationCountry",
5614
+ "destinationEmail",
5615
+ "originFullName",
5616
+ "originIdentificationType",
5617
+ "originIdentification",
5618
+ "originCity",
5619
+ "originState",
5620
+ "originCountry",
5621
+ "originAddress",
5622
+ "originZipCode",
5623
+ "originPhone",
5624
+ "originEmail",
5625
+ "kilogramWeight",
5626
+ "volumetricWeight",
5627
+ "totalValue",
5628
+ "declaredValue",
5629
+ "shippingValue",
5630
+ "guideNumber",
5631
+ "enlistmentApplies",
5632
+ "deliveryDate",
5633
+ "deliveryDays",
5634
+ "minDeliveryDays",
5635
+ "packageHeight",
5636
+ "packageWidth",
5637
+ "packageLength",
5638
+ "shippingProvider",
5639
+ "shippingState",
5640
+ "creationDate",
5641
+ "lastUpdateDate",
5642
+ "expirationDate",
5643
+ "signature",
5644
+ "strCreationDate",
5645
+ "comment",
5646
+ "warehouseId",
5647
+ "additionalDeliveryDays",
5648
+ "shippingMerchantValue"
5649
+ ],
5650
+ // PayU's own ten, as transaction/create names them, and the merchant's extra1 to extra4 (the payment form's
5651
+ // optional fields), each text or nothing.
5652
+ "order.extraParameters": [
5653
+ "CURRENCY",
5654
+ "LANGUAGE",
5655
+ "ACCOUNT_ID",
5656
+ "ALGORITHM_SIGNATURE",
5657
+ "CHECKOUT_VERSION",
5658
+ "RESPONSE_URL",
5659
+ "IS_TEST",
5660
+ "SIGNATURE",
5661
+ "NOTIFY_URL",
5662
+ "IP_COUNTRY",
5663
+ "EXTRA1",
5664
+ "EXTRA2",
5665
+ "EXTRA3",
5666
+ "EXTRA4"
5667
+ ]
5668
+ });
5669
+ var TEXT_RECORDS = /* @__PURE__ */ Object.freeze(["order.extraParameters"]);
5670
+ var CARD_WORDS = /* @__PURE__ */ Object.freeze([
5671
+ "card",
5672
+ "cards",
5673
+ "pan",
5674
+ "cvv",
5675
+ "cvv2",
5676
+ "cvc",
5677
+ "cvd",
5678
+ "csc",
5679
+ "ccv",
5680
+ "cc",
5681
+ "token",
5682
+ "masterpass",
5683
+ "wallet",
5684
+ "register",
5685
+ "recurring",
5686
+ "recurrent",
5687
+ "recurrence",
5688
+ "keep",
5689
+ "store",
5690
+ "save",
5691
+ "saved",
5692
+ "vault",
5693
+ "exp",
5694
+ "expiry",
5695
+ "expiration",
5696
+ "expiracion",
5697
+ "tarjeta",
5698
+ "tarjetas",
5699
+ "vencimiento"
5700
+ ]);
5701
+ var OWN_CARD_MEMBERS = /* @__PURE__ */ Object.freeze([
5702
+ "checkoutCreditCard",
5703
+ "cardType",
5704
+ "internationalCard",
5705
+ "creditCardCountry",
5706
+ "isMasterpass",
5707
+ "masterpassObfuscateCreditCardNumber",
5708
+ "isRegisterPayer",
5709
+ "registerLendingDevice",
5710
+ "lendingDeviceToken",
5711
+ "creditCardTokenId",
5712
+ "checkoutDebitCard",
5713
+ "expirationDate",
5714
+ "shippingInfo.expirationDate"
5715
+ ]);
5716
+ var SIGNATURE2 = /^[0-9a-f]{32,128}$/i;
5717
+ var OPAQUE_MEMBERS = /* @__PURE__ */ Object.freeze({
5718
+ key: /^[0-9a-f]{32}$/,
5719
+ "order.signature": SIGNATURE2,
5720
+ "order.extraParameters.SIGNATURE": SIGNATURE2,
5721
+ "shippingInfo.signature": SIGNATURE2,
5722
+ "order.urlEncodedId": /^[A-Za-z0-9+/=_-]{1,256}$/,
5723
+ shopifyGid: /^gid:\/\/shopify\/[A-Za-z]+\/[0-9]{1,20}$/
5724
+ });
5725
+ var IS_TEST_TEXT = /* @__PURE__ */ Object.freeze({ true: ["true", "1"], false: ["false", "0"] });
5726
+ var MASKS = /* @__PURE__ */ Object.freeze({ VISA: [4, 4, 4, 4], MASTERCARD: [4, 4, 4, 4], AMEX: [4, 6, 5], DINERS: [4, 6, 4] });
5727
+ var NETWORK2 = /* @__PURE__ */ Object.freeze({
5728
+ VISA: /^4(?:[0-9]{12}|[0-9]{15})$/,
5729
+ MASTERCARD: /^(?:5[1-5][0-9]{14}|2(?:2(?:2[1-9]|[3-9][0-9])|[3-6][0-9]{2}|7(?:[01][0-9]|20))[0-9]{12})$/,
5730
+ AMEX: /^3[47][0-9]{13}$/,
5731
+ DINERS: /^(?:3(?:0[0-5]|[68][0-9])[0-9]{11}|3095[0-9]{10}|3[89][0-9]{12})$/
5732
+ });
5733
+ var SECURITY_CODE21 = /^[0-9]{3,4}$/;
5734
+ var COUNTRY6 = /^[A-Z]{2}$/;
5735
+ var record30 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
5736
+ var owns7 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
5737
+ var refuse35 = (code) => Object.freeze({ verdict: "refuse", code });
5738
+ var CARD34 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
5739
+ var absent = (value, key) => !owns7(value, key) || value[key] === null;
5740
+ function payuLatamSubmitTarget(url) {
5741
+ if (typeof url !== "string" || url.length > URL_LIMIT13 || url.includes("?") || url.includes("#"))
5742
+ return null;
5743
+ let parsed;
5744
+ try {
5745
+ parsed = new URL(url);
5746
+ }
5747
+ catch {
5748
+ return null;
5749
+ }
5750
+ if (parsed.href !== url || parsed.protocol !== "https:" || parsed.port || parsed.username || parsed.password)
5751
+ return null;
5752
+ const environment2 = PAYU_LATAM_HOSTS.production.includes(parsed.hostname) ? "production" : PAYU_LATAM_HOSTS.sandbox.includes(parsed.hostname) ? "sandbox" : null;
5753
+ const match = environment2 === null ? null : SUBMIT_PATH.exec(parsed.pathname);
5754
+ if (match === null || !(PAYU_LATAM_COUNTRIES.includes(match[1]) || UNREVIEWED_COUNTRIES.includes(match[1])))
5755
+ return null;
5756
+ return Object.freeze({ host: parsed.hostname, environment: environment2, country: match[1], key: match[2] });
5757
+ }
5758
+ function readJson9(body) {
5759
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT33)
5760
+ return null;
5761
+ let at = 0;
5762
+ let nodes = 0;
5763
+ const fail = () => {
5764
+ throw new Error("invalid_payu_latam_json");
5765
+ };
5766
+ const space = () => {
5767
+ while (" \r\n".includes(body[at] ?? "\0"))
5768
+ at += 1;
5769
+ };
5770
+ const string = () => {
5771
+ space();
5772
+ const start = at;
5773
+ if (body[at++] !== '"')
5774
+ fail();
5775
+ while (at < body.length) {
5776
+ const character = body[at++];
5777
+ if (character === "\\") {
5778
+ at += 1;
5779
+ continue;
5780
+ }
5781
+ if (character === '"')
5782
+ return JSON.parse(body.slice(start, at));
5783
+ }
5784
+ return fail();
5785
+ };
5786
+ const value = (depth) => {
5787
+ if (depth > 8 || ++nodes > 4096)
5788
+ fail();
5789
+ space();
5790
+ const character = body[at];
5791
+ if (character === '"')
5792
+ return string();
5793
+ if (character === "{") {
5794
+ at += 1;
5795
+ const result = /* @__PURE__ */ Object.create(null);
5796
+ const seen = /* @__PURE__ */ new Set();
5797
+ space();
5798
+ if (body[at] === "}") {
5799
+ at += 1;
5800
+ return result;
5801
+ }
5802
+ for (;;) {
5803
+ const key = string();
5804
+ if (seen.has(key) || ["__proto__", "prototype", "constructor"].includes(key))
5805
+ fail();
5806
+ seen.add(key);
5807
+ space();
5808
+ if (body[at++] !== ":")
5809
+ fail();
5810
+ result[key] = value(depth + 1);
5811
+ space();
5812
+ const next = body[at++];
5813
+ if (next === "}")
5814
+ return result;
5815
+ if (next !== ",")
5816
+ fail();
5817
+ }
5818
+ }
5819
+ if (character === "[") {
5820
+ at += 1;
5821
+ const result = [];
5822
+ space();
5823
+ if (body[at] === "]") {
5824
+ at += 1;
5825
+ return result;
5826
+ }
5827
+ for (;;) {
5828
+ result.push(value(depth + 1));
5829
+ space();
5830
+ const next = body[at++];
5831
+ if (next === "]")
5832
+ return result;
5833
+ if (next !== ",")
5834
+ fail();
5835
+ }
5836
+ }
5837
+ for (const literal of ["true", "false", "null"]) {
5838
+ if (body.startsWith(literal, at)) {
5839
+ at += literal.length;
5840
+ return JSON.parse(literal);
5841
+ }
5842
+ }
5843
+ const number = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/.exec(body.slice(at, at + 32));
5844
+ if (!number || /^-?[0-9]{16,}$/.test(number[0]))
5845
+ fail();
5846
+ at += number[0].length;
5847
+ const parsed = Number(number[0]);
5848
+ if (!Number.isFinite(parsed))
5849
+ fail();
5850
+ return parsed;
5851
+ };
5852
+ try {
5853
+ const parsed = value(0);
5854
+ space();
5855
+ return at === body.length && record30(parsed) ? parsed : null;
5856
+ }
5857
+ catch {
5858
+ return null;
5859
+ }
5860
+ }
5861
+ function cardNamed2(key) {
5862
+ const words = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^A-Za-z0-9]+/).filter(Boolean).map((word) => word.toLowerCase());
5863
+ const phrase = words.join(" ");
5864
+ return words.some((word) => CARD_WORDS.includes(word)) || ["security code", "codigo seguridad", "codigo verificacion"].some((said) => phrase.includes(said));
5865
+ }
5866
+ function carriesCardNumber(text8) {
5867
+ for (const [run] of text8.matchAll(/[0-9]+(?:[ ._/,-][0-9]+)*/g)) {
5868
+ const groups = run.split(/[ ._/,-]/);
5869
+ for (let first = 0; first < groups.length; first += 1) {
5870
+ let digits3 = "";
5871
+ for (let last = first; last < groups.length && digits3.length + groups[last].length <= 19; last += 1) {
5872
+ digits3 += groups[last];
5873
+ if (digits3.length >= 13 && digits3[0] >= "2" && digits3[0] <= "6" && luhn7(digits3))
5874
+ return true;
5875
+ }
5876
+ }
5877
+ }
5878
+ return false;
5879
+ }
5880
+ var wholeCardNumber = (text8) => /^[2-6][0-9]{12,18}$/.test(text8) && luhn7(text8);
5881
+ function membersRefusal(root) {
5882
+ const pending = [[root, ""]];
5883
+ while (pending.length > 0) {
5884
+ const [node, path] = pending.pop();
5885
+ const own12 = path === "" ? TRANSACTION_MEMBERS : owns7(RECORD_MEMBERS, path) ? RECORD_MEMBERS[path] : null;
5886
+ for (const [key, child] of Object.entries(node)) {
5887
+ const at = Array.isArray(node) ? path : path === "" ? key : `${path}.${key}`;
5888
+ if (at === "checkoutCreditCard")
5889
+ continue;
5890
+ if (own12 !== null && !own12.includes(key))
5891
+ return true;
5892
+ if (TEXT_RECORDS.includes(path) && child !== null && typeof child !== "string")
5893
+ return true;
5894
+ if (!Array.isArray(node) && owns7(OPAQUE_MEMBERS, at)) {
5895
+ if (child !== null && (typeof child !== "string" || !OPAQUE_MEMBERS[at].test(child) || wholeCardNumber(child)))
5896
+ return true;
5897
+ continue;
5898
+ }
5899
+ if (!Array.isArray(node) && !OWN_CARD_MEMBERS.includes(at) && cardNamed2(key) && child !== null && child !== false)
5900
+ return true;
5901
+ if (typeof child === "string" && carriesCardNumber(child))
5902
+ return true;
5903
+ if (typeof child === "number" && (!/Date$/.test(key) || String(child).length > 13) && carriesCardNumber(String(child)))
5904
+ return true;
5905
+ if (child !== null && typeof child === "object")
5906
+ pending.push([child, at]);
5907
+ }
5908
+ }
5909
+ return false;
5910
+ }
5911
+ function cardDigits(number, brand) {
5912
+ if (typeof number !== "string")
5913
+ return null;
5914
+ if (/^[0-9]{12,19}$/.test(number))
5915
+ return number;
5916
+ const groups = number.split(" ");
5917
+ const mask = MASKS[brand];
5918
+ if (!mask || groups.length !== mask.length || !groups.every((group, at) => group.length === mask[at] && /^[0-9]+$/.test(group)))
5919
+ return null;
5920
+ return groups.join("");
5921
+ }
5922
+ function luhn7(digits3) {
5923
+ let sum = 0;
5924
+ for (let at = digits3.length - 1, double = false; at >= 0; at -= 1, double = !double) {
5925
+ let digit = digits3.charCodeAt(at) - 48;
5926
+ if (double) {
5927
+ digit *= 2;
5928
+ if (digit > 9)
5929
+ digit -= 9;
5930
+ }
5931
+ sum += digit;
5932
+ }
5933
+ return sum % 10 === 0;
5934
+ }
5935
+ function cardRefusal(card, brand) {
5936
+ if (!record30(card) || !Object.keys(card).every((key) => CARD_KEYS14.includes(key)) || !CARD_REQUIRED2.every((key) => owns7(card, key))) {
5937
+ return "payu_latam_body_unsupported";
5938
+ }
5939
+ const digits3 = cardDigits(card.number, brand);
5940
+ if (digits3 === null || !NETWORK2[brand].test(digits3) || !luhn7(digits3))
5941
+ return "payu_latam_body_unsupported";
5942
+ const code = card.securityCode;
5943
+ if (typeof code !== "string" || !SECURITY_CODE21.test(code) || code.length !== (brand === "AMEX" ? 4 : 3))
5944
+ return "payu_latam_body_unsupported";
5945
+ const { expirationDateMonth: month, expirationDateYear: year } = card;
5946
+ if (!Number.isSafeInteger(month) || month < 1 || month > 12 || !Number.isSafeInteger(year) || year < 0 || year > 99)
5947
+ return "payu_latam_body_unsupported";
5948
+ if (!absent(card, "cardType") && !CARD_TYPES2.includes(card.cardType))
5949
+ return "payu_latam_body_unsupported";
5950
+ return null;
5951
+ }
5952
+ function judgeBody5(body, target) {
5953
+ const value = readJson9(body);
5954
+ if (value === null || value.paymentMethodType !== "CREDIT_CARD" || typeof value.key !== "string" || !KEY.test(value.key) || !record30(value.order) || !record30(value.payer))
5955
+ return { code: "payu_latam_body_unsupported", value: null };
5956
+ if (target !== void 0 && value.key !== target.key)
5957
+ return { code: "payu_latam_session_mismatch", value: null };
5958
+ if (!absent(value, "creditCardTokenId") || value.isMasterpass === true || !absent(value, "masterpassObfuscateCreditCardNumber")) {
5959
+ return { code: "payu_latam_saved_card", value: null };
5960
+ }
5961
+ if (NOT_THE_CARD_FORM.some((key) => !absent(value, key)) || membersRefusal(value) || !absent(value, "lendingDeviceToken") || !absent(value, "questionnaire") || !(absent(value, "registerLendingDevice") || value.registerLendingDevice === false))
5962
+ return { code: "payu_latam_body_unsupported", value: null };
5963
+ const brand = value.paymentMethodMain;
5964
+ if (typeof brand !== "string" || !PAYU_LATAM_CARD_BRANDS.includes(brand))
5965
+ return { code: "payu_latam_card_unsupported", value: null };
5966
+ const card = cardRefusal(value.checkoutCreditCard, brand);
5967
+ if (card !== null)
5968
+ return { code: card, value: null };
5969
+ if (value.installments !== 1 && value.installments !== "1")
5970
+ return { code: "payu_latam_installments_unsupported", value: null };
5971
+ if (!absent(value, "cardType") && !CARD_TYPES2.includes(value.cardType) || !absent(value, "internationalCard") && typeof value.internationalCard !== "boolean" || !absent(value, "creditCardCountry") && (typeof value.creditCardCountry !== "string" || !COUNTRY6.test(value.creditCardCountry)) || !absent(value, "transactionType") && value.transactionType !== "AUTHORIZATION_AND_CAPTURE" || !absent(value, "isMasterpass") && typeof value.isMasterpass !== "boolean" || typeof value.order.isTest !== "boolean")
5972
+ return { code: "payu_latam_body_unsupported", value: null };
5973
+ const extra = value.order.extraParameters;
5974
+ if (!record30(extra) || !IS_TEST_TEXT[value.order.isTest].includes(extra.IS_TEST)) {
5975
+ return { code: "payu_latam_body_unsupported", value: null };
5976
+ }
5977
+ if (value.isRegisterPayer === true)
5978
+ return { code: "payu_latam_keep_on_file", value: null };
5979
+ if (!absent(value, "isRegisterPayer") && value.isRegisterPayer !== false)
5980
+ return { code: "payu_latam_body_unsupported", value: null };
5981
+ if (target !== void 0 && target.environment === "production" && value.order.isTest)
5982
+ return { code: "payu_latam_environment_mismatch", value: null };
5983
+ return { code: null, value };
5984
+ }
5985
+ function payuLatamBodyVerdict(body, url) {
5986
+ let target;
5987
+ if (url !== void 0) {
5988
+ target = payuLatamSubmitTarget(url);
5989
+ if (target === null)
5990
+ return refuse35("payu_latam_url_refused");
5991
+ if (!PAYU_LATAM_COUNTRIES.includes(target.country))
5992
+ return refuse35("payu_latam_country_unreviewed");
5993
+ }
5994
+ const { code } = judgeBody5(body, target);
5995
+ return code === null ? CARD34 : refuse35(code);
5996
+ }
5997
+ // src/registration.js
5998
+ var PARTS = { psp: "id", definitions: "list", refusedOperations: "list", settlementReadback: "any", exactUrl: "rule", bodyGate: "rule", amount: "rule" };
5999
+ var PSP_ID = /^[a-z][a-z0-9_]*$/;
6000
+ var registrationProblems = (spec) => problemsOf(spec, PARTS);
6001
+ function problemsOf(spec, parts) {
6002
+ if (!spec || typeof spec !== "object")
6003
+ return ["a registration is an object"];
6004
+ const psp = spec.psp;
6005
+ if (typeof psp !== "string" || !PSP_ID.test(psp))
6006
+ return [`${JSON.stringify(psp)} is not a processor id`];
6007
+ const problems2 = Object.keys(spec).filter((key) => !(key in parts)).map((key) => `${psp}: ${key} is no registration part`);
6008
+ for (const [key, kind] of Object.entries(parts)) {
6009
+ const value = spec[key];
6010
+ if (value === void 0)
6011
+ continue;
6012
+ if (kind === "rule" && typeof value !== "function")
6013
+ problems2.push(`${psp}: ${key} is not a function`);
6014
+ if (kind === "numbers" && !((Array.isArray(value) || value instanceof Set) && [...value].every((n) => typeof n === "string" && /^\d{12,19}$/.test(n)))) {
6015
+ problems2.push(`${psp}: ${key} is not a list of card numbers`);
6016
+ }
6017
+ }
6018
+ if ("definitions" in parts) {
6019
+ if (!Array.isArray(spec.definitions) || spec.definitions.length === 0)
6020
+ problems2.push(`${psp}: names no definition`);
6021
+ else if (spec.definitions.some((definition) => definition?.psp !== psp))
6022
+ problems2.push(`${psp}: a definition names another processor`);
6023
+ for (const id of spec.refusedOperations ?? []) {
6024
+ if (typeof id !== "string" || !id.startsWith(`${psp}.`))
6025
+ problems2.push(`${psp}: ${JSON.stringify(id)} is not one of its operations`);
6026
+ }
6027
+ }
6028
+ return problems2;
6029
+ }
6030
+ function registered(spec, parts) {
6031
+ const problems2 = problemsOf(spec, parts);
6032
+ if (problems2.length)
6033
+ throw new Error(`payment-core registration refused: ${problems2.join("; ")}`);
6034
+ return deepFreeze({ ...spec });
6035
+ }
6036
+ function registerProcessor(spec) {
6037
+ return registered(spec, PARTS);
6038
+ }
6039
+ // src/processors/midtrans.js
6040
+ var MIDTRANS_PSP = "midtrans";
6041
+ var MIDTRANS_OPERATION = "midtrans.card_request";
6042
+ var MIDTRANS_TOKEN_URL = "https://api.midtrans.com/v2/token";
6043
+ var MIDTRANS_SANDBOX_TOKEN_URL = "https://api.sandbox.midtrans.com/v2/token";
6044
+ var MIDTRANS_TOKEN_KEYS = /* @__PURE__ */ Object.freeze(["card_cvv", "card_number", "card_exp_month", "card_exp_year", "installment_term"]);
6045
+ var BODY_LIMIT34 = 4096;
6046
+ var CARD_NUMBER17 = /^[0-9]{12,19}$/;
6047
+ var SECURITY_CODE22 = /^[0-9]{3,4}$/;
6048
+ var MONTH18 = /^(?:0[1-9]|1[0-2])$/;
6049
+ var YEAR19 = /^20[0-9]{2}$/;
6050
+ var TERM = /^[0-9]{1,3}$/;
6051
+ var record31 = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
6052
+ var own11 = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
6053
+ var inOrder6 = (value, keys) => {
6054
+ let at = 0;
6055
+ for (const name of Object.keys(value)) {
6056
+ while (at < keys.length && keys[at] !== name)
6057
+ at += 1;
6058
+ if (at === keys.length)
6059
+ return false;
6060
+ at += 1;
6061
+ }
6062
+ return true;
6063
+ };
6064
+ var refuse36 = (code) => Object.freeze({ verdict: "refuse", code });
6065
+ var CARD35 = /* @__PURE__ */ Object.freeze({ verdict: "card" });
6066
+ function isMidtransTokenUrl(url) {
6067
+ return url === MIDTRANS_TOKEN_URL || url === MIDTRANS_SANDBOX_TOKEN_URL;
6068
+ }
6069
+ function readBody20(body) {
6070
+ if (typeof body !== "string" || body === "" || body.length > BODY_LIMIT34)
6071
+ return null;
6072
+ let value;
6073
+ try {
6074
+ value = JSON.parse(body);
6075
+ if (!record31(value) || JSON.stringify(value) !== body)
6076
+ return null;
6077
+ }
6078
+ catch {
6079
+ return null;
6080
+ }
6081
+ return value;
6082
+ }
6083
+ function midtransBodyVerdict(body) {
6084
+ const value = readBody20(body);
6085
+ if (value === null || !inOrder6(value, MIDTRANS_TOKEN_KEYS)) {
6086
+ if (record31(value) && (own11(value, "token_id") || own11(value, "two_click")) && !own11(value, "card_number"))
6087
+ return refuse36("midtrans_saved_card");
6088
+ return refuse36("midtrans_body_unsupported");
6089
+ }
6090
+ if (!own11(value, "card_cvv") || !own11(value, "card_number") || !own11(value, "card_exp_month") || !own11(value, "card_exp_year")) {
6091
+ return refuse36("midtrans_body_unsupported");
6092
+ }
6093
+ if (typeof value.card_cvv !== "string" || !SECURITY_CODE22.test(value.card_cvv) || typeof value.card_number !== "string" || !CARD_NUMBER17.test(value.card_number) || typeof value.card_exp_month !== "string" || !MONTH18.test(value.card_exp_month) || typeof value.card_exp_year !== "string" || !YEAR19.test(value.card_exp_year))
6094
+ return refuse36("midtrans_body_unsupported");
6095
+ if (own11(value, "installment_term") && (typeof value.installment_term !== "string" || !TERM.test(value.installment_term)))
6096
+ return refuse36("midtrans_body_unsupported");
6097
+ return CARD35;
6098
+ }
6099
+ var midtrans_default = /* @__PURE__ */ registerProcessor({
6100
+ psp: MIDTRANS_PSP,
6101
+ definitions: [
6102
+ {
6103
+ psp: "midtrans",
6104
+ // Snap's token request, as the header above reads it. Sandbox has its own host, so the device sends a
6105
+ // test-mode request only Midtrans' documented test cards (hostEnvironmentPinned, device-replay.js S7).
6106
+ // Ships dark: served only to a client that declares `midtrans_card_token`, gated off for every org until an
6107
+ // operator lists one (`midtrans:<org>`), and the backend's gate serves only Agentcard's own company until the
6108
+ // token's publishable key is bound to the merchant (backend config.ts MIDTRANS_KEY_BOUND_TO_MERCHANT).
6109
+ capability: "midtrans_card_token",
6110
+ match: "api\\.(?:sandbox\\.)?midtrans\\.com/v2/token",
6111
+ hosts: ["^api\\.midtrans\\.com$", "^api\\.sandbox\\.midtrans\\.com$"],
6112
+ sandboxHosts: ["^api\\.sandbox\\.midtrans\\.com$"],
6113
+ hostEnvironmentPinned: true,
6114
+ encoding: "json",
6115
+ // Snap's own headers: the publishable client key (Authorization Basic) and X-Service. Origin, Referer and
6116
+ // cookies never ride.
6117
+ passthroughHeaders: ["^authorization$", "^x-service$"],
6118
+ jsonCardFields: [["card_number"]]
6119
+ }
6120
+ ],
6121
+ // Only the cardholder's device sends a token, after a person approves; no reviewed list names midtrans.
6122
+ refusedOperations: [MIDTRANS_OPERATION],
6123
+ // Not surveyed: the token moves no money, and the merchant's own charge names its status by the order id alone.
6124
+ settlementReadback: "not_surveyed",
6125
+ exactUrl: isMidtransTokenUrl,
6126
+ bodyGate: (url, body) => url !== void 0 && !isMidtransTokenUrl(url) ? { verdict: "refuse", code: "midtrans_url_refused" } : midtransBodyVerdict(body)
6127
+ });
6128
+ // src/processors/index.generated.js
6129
+ var REGISTERED_MODULES = Object.freeze({
6130
+ midtrans: midtrans_default
6131
+ });
6132
+ // src/registry.js
6133
+ var REGISTERED_PROCESSORS = Object.values(REGISTERED_MODULES);
6134
+ var ids = REGISTERED_PROCESSORS.map((processor) => processor.psp);
6135
+ var problems = REGISTERED_PROCESSORS.flatMap(registrationProblems);
6136
+ for (const [name, processor] of Object.entries(REGISTERED_MODULES)) {
6137
+ if (processor.psp !== name)
6138
+ problems.push(`processors/${name}.js registers ${JSON.stringify(processor.psp)}`);
6139
+ }
6140
+ if (ids.some((id, i) => i > 0 && ids[i - 1] >= id))
6141
+ problems.push(`registered processors out of id order: ${ids.join(", ")}`);
6142
+ if (problems.length)
6143
+ throw new Error(`payment-core registry refused: ${problems.join("; ")}`);
6144
+ var BY_PSP = new Map(REGISTERED_PROCESSORS.map((processor) => [processor.psp, processor]));
6145
+ var REGISTERED_IDS = Object.freeze(ids);
6146
+ var REGISTERED_DEFINITIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.definitions));
6147
+ var REGISTERED_REFUSED_OPERATIONS = Object.freeze(REGISTERED_PROCESSORS.flatMap((processor) => processor.refusedOperations ?? []));
6148
+ var REGISTERED_SETTLEMENT_READBACK = Object.freeze(REGISTERED_PROCESSORS.filter((processor) => processor.settlementReadback !== void 0).map((processor) => [processor.psp, processor.settlementReadback]));
6149
+ function registeredRule(psp, name) {
6150
+ return typeof psp === "string" ? BY_PSP.get(psp)?.[name] : void 0;
6151
+ }
5066
6152
  // src/card-fields.js
5067
6153
  function processorGate(recognizer, url, body) {
5068
6154
  if (recognizer && recognizer.psp === LYRA_PSP)
@@ -5100,6 +6186,8 @@ function processorGate(recognizer, url, body) {
5100
6186
  return { verdict: "refuse", code: "toast_url_refused" };
5101
6187
  return toastBodyVerdict(body);
5102
6188
  }
6189
+ if (recognizer && recognizer.psp === PAYU_LATAM_PSP)
6190
+ return payuLatamBodyVerdict(body, url);
5103
6191
  if (recognizer && recognizer.psp === PADDLE_VGS_PSP) {
5104
6192
  if (url !== void 0 && !isPaddleVgsCardsUrl(url))
5105
6193
  return { verdict: "refuse", code: "paddle_vgs_url_refused" };
@@ -5183,6 +6271,11 @@ function processorGate(recognizer, url, body) {
5183
6271
  return { verdict: "refuse", code: "xendit_url_refused" };
5184
6272
  return xenditBodyVerdict(body);
5185
6273
  }
6274
+ if (recognizer && recognizer.psp === PAYMOB_PSP) {
6275
+ if (url !== void 0 && !isPaymobPayUrl(url))
6276
+ return { verdict: "refuse", code: "paymob_url_refused" };
6277
+ return paymobBodyVerdict(body);
6278
+ }
5186
6279
  if (recognizer && recognizer.psp === GRAVY_PSP)
5187
6280
  return gravyBodyVerdict(body);
5188
6281
  if (recognizer && recognizer.psp === MONERIS_PSP) {
@@ -5190,6 +6283,14 @@ function processorGate(recognizer, url, body) {
5190
6283
  return { verdict: "refuse", code: "moneris_url_refused" };
5191
6284
  return monerisBodyVerdict(body);
5192
6285
  }
6286
+ if (recognizer && recognizer.psp === TAPPAY_PSP) {
6287
+ if (url !== void 0 && !isTappayGetPrimeUrl(url))
6288
+ return { verdict: "refuse", code: "tappay_url_refused" };
6289
+ return tappayBodyVerdict(body);
6290
+ }
6291
+ const ownGate = registeredRule(recognizer?.psp, "bodyGate");
6292
+ if (ownGate)
6293
+ return ownGate(url, body);
5193
6294
  if (!recognizer || recognizer.psp !== "elavon_converge")
5194
6295
  return null;
5195
6296
  if (url !== void 0 && !isConvergeProcessUrl(url))
@@ -5300,7 +6401,7 @@ function splitCardLeg(recognizer, body) {
5300
6401
  const absorb = list(split.absorb);
5301
6402
  const pass = list(split.pass);
5302
6403
  const sibling = list(split.siblingKeys);
5303
- const own10 = [];
6404
+ const own12 = [];
5304
6405
  const seen = /* @__PURE__ */ new Set();
5305
6406
  for (const chunk of body.split("&")) {
5306
6407
  const eq = chunk.indexOf("=");
@@ -5317,13 +6418,13 @@ function splitCardLeg(recognizer, body) {
5317
6418
  return null;
5318
6419
  seen.add(key);
5319
6420
  if (!sibling.includes(key))
5320
- own10.push(key);
6421
+ own12.push(key);
5321
6422
  }
5322
- if (own10.length === 0)
6423
+ if (own12.length === 0)
5323
6424
  return null;
5324
- if (own10.every((key) => absorb.includes(key)))
6425
+ if (own12.every((key) => absorb.includes(key)))
5325
6426
  return "absorb";
5326
- if (own10.every((key) => pass.includes(key)))
6427
+ if (own12.every((key) => pass.includes(key)))
5327
6428
  return "pass";
5328
6429
  return null;
5329
6430
  }