@agent-cards/sdk 0.23.28 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +84 -0
- package/PREFLIGHT.md +7 -1
- package/README.md +197 -102
- package/dist/aci.d.ts +52 -22
- package/dist/aci.js +79 -15
- package/dist/adyen-merchant-hosted.generated.d.ts +2 -2
- package/dist/adyen-merchant-hosted.generated.js +586 -55
- package/dist/agent-amount.generated.js +1 -1
- package/dist/agentcard.d.ts +4 -5
- package/dist/agentcard.js +4 -5
- package/dist/amadeus.d.ts +9 -3
- package/dist/amadeus.js +33 -4
- package/dist/api-module.d.ts +1 -7
- package/dist/api-module.js +3 -5
- package/dist/{voice-retry.js → api-retry.js} +1 -1
- package/dist/api-types.d.ts +53 -0
- package/dist/{voice-types.js → api-types.js} +7 -2
- package/dist/approvals.d.ts +166 -0
- package/dist/approvals.js +213 -0
- package/dist/aurus.d.ts +33 -0
- package/dist/aurus.js +75 -0
- package/dist/builtin-registry.generated.js +1 -1
- package/dist/buy.d.ts +20 -101
- package/dist/buy.js +19 -74
- package/dist/capabilities.generated.js +1 -1
- package/dist/card-fields.generated.js +2864 -249
- package/dist/cardlink-vpos.d.ts +43 -0
- package/dist/cardlink-vpos.js +90 -0
- package/dist/cdp.d.ts +3 -13
- package/dist/cdp.js +244 -175
- package/dist/checkout-com.generated.js +5 -1
- package/dist/client.d.ts +170 -22
- package/dist/client.js +281 -40
- package/dist/creditguard.generated.d.ts +4 -4
- package/dist/cybersource-flex.generated.d.ts +39 -1
- package/dist/cybersource-flex.generated.js +100 -11
- package/dist/datatrans.generated.js +22 -1
- package/dist/eghl.d.ts +40 -0
- package/dist/eghl.js +72 -0
- package/dist/elavon-converge.generated.js +5 -3
- package/dist/gmo.generated.js +7 -2
- package/dist/hold.d.ts +8 -0
- package/dist/hold.js +43 -2
- package/dist/hosted-entry.js +4 -0
- package/dist/index.d.ts +9 -15
- package/dist/index.js +6 -10
- package/dist/lifecycle.d.ts +9 -61
- package/dist/lifecycle.js +24 -10
- package/dist/merchant-card-endpoints.generated.d.ts +6 -1
- package/dist/merchant-card-endpoints.generated.js +344 -19
- package/dist/merchant-hosted.d.ts +8 -1
- package/dist/nike-order.d.ts +51 -0
- package/dist/nike-order.js +81 -0
- package/dist/oceanpayment.d.ts +38 -0
- package/dist/oceanpayment.js +70 -0
- package/dist/paddle-tokenex.generated.js +111 -11
- package/dist/payplug.d.ts +41 -0
- package/dist/payplug.js +71 -0
- package/dist/payrails.generated.js +33 -8
- package/dist/pre-claim.d.ts +11 -0
- package/dist/pre-claim.js +130 -7
- package/dist/preflight-capabilities.generated.d.ts +0 -4
- package/dist/preflight-capabilities.generated.js +0 -5
- package/dist/preflight-catalog.json +200 -6
- package/dist/preflight-playwright.d.ts +2 -2
- package/dist/preflight-playwright.js +63 -14
- package/dist/preflight-schemas.json +18 -0
- package/dist/preflight.generated.d.ts +5 -4
- package/dist/preflight.generated.js +63 -3
- package/dist/preparation.d.ts +7 -0
- package/dist/preparation.js +21 -0
- package/dist/prepared-processor.d.ts +18 -5
- package/dist/prepared-processor.js +48 -8
- package/dist/primer.generated.js +2889 -268
- package/dist/processout.generated.d.ts +61 -0
- package/dist/processout.generated.js +577 -0
- package/dist/requests.js +1 -1
- package/dist/shiji-sts.generated.js +111 -11
- package/dist/stripe-checkout.generated.js +2761 -319
- package/dist/substitutions.generated.js +553 -26
- package/dist/tap-payments.generated.js +111 -11
- package/dist/twoc2p.generated.js +111 -11
- package/dist/url-masks/bluesnap.d.ts +2 -0
- package/dist/url-masks/bluesnap.js +15 -0
- package/dist/url-masks/oceanpayment.d.ts +2 -0
- package/dist/url-masks/oceanpayment.js +13 -0
- package/dist/url-masks/payplug.d.ts +2 -0
- package/dist/url-masks/payplug.js +13 -0
- package/dist/url-masks/vtex_payments.d.ts +2 -0
- package/dist/url-masks/vtex_payments.js +12 -0
- package/dist/url-masks.generated.d.ts +1 -1
- package/dist/url-masks.generated.js +6 -2
- package/dist/verifone.generated.js +42 -2
- package/dist/vtex-payments.generated.d.ts +127 -0
- package/dist/vtex-payments.generated.js +544 -0
- package/dist/webhooks.d.ts +2 -2
- package/dist/webhooks.js +2 -2
- package/examples/preflight/kernel-native/inventory.json +1 -1
- package/package.json +6 -8
- package/dist/languages.d.ts +0 -23
- package/dist/languages.js +0 -76
- package/dist/voice-pkce.d.ts +0 -49
- package/dist/voice-pkce.js +0 -147
- package/dist/voice-stream.generated.d.ts +0 -118
- package/dist/voice-stream.generated.js +0 -170
- package/dist/voice-types.d.ts +0 -735
- package/dist/voice.d.ts +0 -373
- package/dist/voice.js +0 -815
- package/readme.test.mjs +0 -53
- /package/dist/{voice-retry.d.ts → api-retry.d.ts} +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oceanpayment's hosted payment page (secure.oceanpayment.com, and test-secure.oceanpayment.com, its sandbox), as this SDK
|
|
3
|
+
* reads it.
|
|
4
|
+
*
|
|
5
|
+
* The page, where Oceanpayment's Shopify redirect app sends the buyer after Shopify's Pay now, submits its card form as one
|
|
6
|
+
* form post to /gateway/sendPay;jsessionid=<the payment's session>, the card in clear. That post is the one request this
|
|
7
|
+
* SDK pauses: the cardholder's device writes the real card into it and sends it through the checkout relay (payment-core
|
|
8
|
+
* processors/oceanpayment.js). The page's other posts to these hosts lead to or carry the card the agent typed: Cardinal's
|
|
9
|
+
* device-data call (/gateway/CreateJWTInterface) posts the whole number when the merchant's terminal turns it on, and a card
|
|
10
|
+
* post written another way would carry it to Oceanpayment as a payment. This SDK aborts every one of them in a page it
|
|
11
|
+
* watches, so the agent's placeholder never reaches Oceanpayment. A GET (the page, its scripts, its log) continues.
|
|
12
|
+
*
|
|
13
|
+
* OCEANPAYMENT_HOSTS is payment-core's OCEANPAYMENT_HOSTS, and isOceanpaymentSendPay takes the URLs payment-core's
|
|
14
|
+
* isOceanpaymentSendPayUrl takes; oceanpayment.test.mjs pins both to payment-core.
|
|
15
|
+
*/
|
|
16
|
+
export declare const OCEANPAYMENT_PSP = "oceanpayment";
|
|
17
|
+
/** The dark-launch capability the API serves Oceanpayment's recognizer behind (payment-core processors/oceanpayment.js). */
|
|
18
|
+
export declare const OCEANPAYMENT_CAPABILITY = "oceanpayment_hosted_payment_page";
|
|
19
|
+
/** The live host and Oceanpayment's sandbox, which serves the same page for a test terminal. */
|
|
20
|
+
export declare const OCEANPAYMENT_HOSTS: readonly string[];
|
|
21
|
+
/** Whether this URL is on one of Oceanpayment's two hosts. */
|
|
22
|
+
export declare function isOceanpaymentHost(url: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The only request on Oceanpayment's hosts that is the page's card post: a POST to exactly
|
|
25
|
+
* https://<host>/gateway/sendPay;jsessionid=<session>, as the page's form action writes it, with no port, query, fragment
|
|
26
|
+
* or other spelling (payment-core isOceanpaymentSendPayUrl takes the same strings). The post the SDK pauses.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isOceanpaymentSendPay(url: string, method: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Whether an adapter must hand this request to the pre-claim gates: it is on an Oceanpayment host and this build's
|
|
31
|
+
* registry serves Oceanpayment's card post there. Cardinal's call and a card post of another spelling are not the card
|
|
32
|
+
* post, so the registry's card-request test does not name them; the CDP adapter still pauses them through the
|
|
33
|
+
* recognizer's host pattern, and attachToPlaywright's route predicate asks this, so both adapters show the gates every
|
|
34
|
+
* request to Oceanpayment once Oceanpayment is armed.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isArmedOceanpaymentUrl(vault: {
|
|
37
|
+
isCardRequest(url: string, method?: string): boolean;
|
|
38
|
+
}, url: string): boolean;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oceanpayment's hosted payment page (secure.oceanpayment.com, and test-secure.oceanpayment.com, its sandbox), as this SDK
|
|
3
|
+
* reads it.
|
|
4
|
+
*
|
|
5
|
+
* The page, where Oceanpayment's Shopify redirect app sends the buyer after Shopify's Pay now, submits its card form as one
|
|
6
|
+
* form post to /gateway/sendPay;jsessionid=<the payment's session>, the card in clear. That post is the one request this
|
|
7
|
+
* SDK pauses: the cardholder's device writes the real card into it and sends it through the checkout relay (payment-core
|
|
8
|
+
* processors/oceanpayment.js). The page's other posts to these hosts lead to or carry the card the agent typed: Cardinal's
|
|
9
|
+
* device-data call (/gateway/CreateJWTInterface) posts the whole number when the merchant's terminal turns it on, and a card
|
|
10
|
+
* post written another way would carry it to Oceanpayment as a payment. This SDK aborts every one of them in a page it
|
|
11
|
+
* watches, so the agent's placeholder never reaches Oceanpayment. A GET (the page, its scripts, its log) continues.
|
|
12
|
+
*
|
|
13
|
+
* OCEANPAYMENT_HOSTS is payment-core's OCEANPAYMENT_HOSTS, and isOceanpaymentSendPay takes the URLs payment-core's
|
|
14
|
+
* isOceanpaymentSendPayUrl takes; oceanpayment.test.mjs pins both to payment-core.
|
|
15
|
+
*/
|
|
16
|
+
export const OCEANPAYMENT_PSP = 'oceanpayment';
|
|
17
|
+
/** The dark-launch capability the API serves Oceanpayment's recognizer behind (payment-core processors/oceanpayment.js). */
|
|
18
|
+
export const OCEANPAYMENT_CAPABILITY = 'oceanpayment_hosted_payment_page';
|
|
19
|
+
/** The live host and Oceanpayment's sandbox, which serves the same page for a test terminal. */
|
|
20
|
+
export const OCEANPAYMENT_HOSTS = Object.freeze(['secure.oceanpayment.com', 'test-secure.oceanpayment.com']);
|
|
21
|
+
const SEND_PAY = /^\/gateway\/sendPay;jsessionid=[A-Za-z0-9._!-]{16,128}$/;
|
|
22
|
+
// A session in the shape the recognizer takes, to ask whether this build's registry serves the card post on a host.
|
|
23
|
+
const PROBE_SESSION = 'ARMEDPROBESESSION0';
|
|
24
|
+
/** The Oceanpayment host a URL is on (https, no credentials, any port, any letter case, a trailing dot or not), or null. */
|
|
25
|
+
function oceanpaymentHost(raw) {
|
|
26
|
+
let url;
|
|
27
|
+
try {
|
|
28
|
+
url = new URL(raw);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
if (url.protocol !== 'https:' || url.username || url.password)
|
|
34
|
+
return null;
|
|
35
|
+
const host = url.hostname.toLowerCase().replace(/\.$/, '');
|
|
36
|
+
return OCEANPAYMENT_HOSTS.includes(host) ? host : null;
|
|
37
|
+
}
|
|
38
|
+
/** Whether this URL is on one of Oceanpayment's two hosts. */
|
|
39
|
+
export function isOceanpaymentHost(url) {
|
|
40
|
+
return oceanpaymentHost(url) !== null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The only request on Oceanpayment's hosts that is the page's card post: a POST to exactly
|
|
44
|
+
* https://<host>/gateway/sendPay;jsessionid=<session>, as the page's form action writes it, with no port, query, fragment
|
|
45
|
+
* or other spelling (payment-core isOceanpaymentSendPayUrl takes the same strings). The post the SDK pauses.
|
|
46
|
+
*/
|
|
47
|
+
export function isOceanpaymentSendPay(url, method) {
|
|
48
|
+
if (String(method).toUpperCase() !== 'POST' || typeof url !== 'string' || url.includes('?') || url.includes('#'))
|
|
49
|
+
return false;
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = new URL(url);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return parsed.href === url && parsed.protocol === 'https:' && !parsed.port && !parsed.username && !parsed.password
|
|
58
|
+
&& OCEANPAYMENT_HOSTS.includes(parsed.hostname) && SEND_PAY.test(parsed.pathname);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Whether an adapter must hand this request to the pre-claim gates: it is on an Oceanpayment host and this build's
|
|
62
|
+
* registry serves Oceanpayment's card post there. Cardinal's call and a card post of another spelling are not the card
|
|
63
|
+
* post, so the registry's card-request test does not name them; the CDP adapter still pauses them through the
|
|
64
|
+
* recognizer's host pattern, and attachToPlaywright's route predicate asks this, so both adapters show the gates every
|
|
65
|
+
* request to Oceanpayment once Oceanpayment is armed.
|
|
66
|
+
*/
|
|
67
|
+
export function isArmedOceanpaymentUrl(vault, url) {
|
|
68
|
+
const host = oceanpaymentHost(url);
|
|
69
|
+
return host !== null && vault.isCardRequest(`https://${host}/gateway/sendPay;jsessionid=${PROBE_SESSION}`, 'POST');
|
|
70
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Generated from @agent-cards/payment-core. Do not edit.
|
|
3
|
-
// artifact-sha256:
|
|
3
|
+
// artifact-sha256: 0bd60e76821ed0f63235a99cc37dece9f0db8afef89492a0a7930fb49f80eb18
|
|
4
4
|
// src/sha256.js
|
|
5
5
|
var K = /* @__PURE__ */ new Uint32Array([
|
|
6
6
|
1116352408,
|
|
@@ -146,6 +146,7 @@ var BASE64 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
|
146
146
|
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
147
147
|
var RSA_ALGORITHM = [48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0];
|
|
148
148
|
var MODULUS_BYTES = [128, 256, 384, 512];
|
|
149
|
+
var SMALL_MODULUS_BYTES = 64;
|
|
149
150
|
var MIN_PADDING = 8;
|
|
150
151
|
var MAX_DRAWS = 16;
|
|
151
152
|
var TYPED_ARRAY = Object.getPrototypeOf(Uint8Array.prototype);
|
|
@@ -156,6 +157,9 @@ function parseRsaPublicKey(key) {
|
|
|
156
157
|
const named = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "exponent") ? key.exponent : void 0;
|
|
157
158
|
if (named !== void 0 && named !== 17)
|
|
158
159
|
throw refuse("key");
|
|
160
|
+
const sized = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "bits") ? key.bits : void 0;
|
|
161
|
+
if (sized !== void 0 && sized !== 512)
|
|
162
|
+
throw refuse("key");
|
|
159
163
|
if (typeof spki !== "string" || spki.length > 1024 || spki.length % 4 !== 0 || !BASE64.test(spki))
|
|
160
164
|
throw refuse("key");
|
|
161
165
|
if (typeof pin2 !== "string" || !SHA256_HEX.test(pin2))
|
|
@@ -188,7 +192,8 @@ function parseRsaPublicKey(key) {
|
|
|
188
192
|
if (exponent.end !== rsa.end)
|
|
189
193
|
throw refuse("key");
|
|
190
194
|
const n = modulus.bytes;
|
|
191
|
-
|
|
195
|
+
const sizes = sized === 512 ? [SMALL_MODULUS_BYTES] : MODULUS_BYTES;
|
|
196
|
+
if (!sizes.includes(n.length) || !(n[0] & 128) || !(n[n.length - 1] & 1))
|
|
192
197
|
throw refuse("key");
|
|
193
198
|
const e = exponent.bytes;
|
|
194
199
|
const expected = named === 17 ? [17] : [1, 0, 1];
|
|
@@ -429,9 +434,64 @@ function isPlainObject(v) {
|
|
|
429
434
|
return !!v && typeof v === "object" && !Array.isArray(v);
|
|
430
435
|
}
|
|
431
436
|
var MAX_PATH_STEPS = 16;
|
|
437
|
+
var MAX_TEXT_STEPS = 2;
|
|
438
|
+
function isTextStep(step) {
|
|
439
|
+
return isPlainObject(step) && Object.keys(step).length === 1 && step.text === "json";
|
|
440
|
+
}
|
|
441
|
+
function sameStep(a, b) {
|
|
442
|
+
return a === b || isTextStep(a) && isTextStep(b);
|
|
443
|
+
}
|
|
444
|
+
function spellJson(parsed, form) {
|
|
445
|
+
const text = JSON.stringify(parsed);
|
|
446
|
+
if (form !== "php")
|
|
447
|
+
return text;
|
|
448
|
+
return text.replace(/\//g, "\\/").replace(/[\u0080-\uffff]/g, (unit) => `\\u${unit.charCodeAt(0).toString(16).padStart(4, "0")}`);
|
|
449
|
+
}
|
|
450
|
+
function jsonTextForm(value) {
|
|
451
|
+
if (typeof value !== "string" || !/^[[{]/.test(value))
|
|
452
|
+
return void 0;
|
|
453
|
+
let parsed;
|
|
454
|
+
try {
|
|
455
|
+
parsed = JSON.parse(value);
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
return void 0;
|
|
459
|
+
}
|
|
460
|
+
if (parsed === null || typeof parsed !== "object")
|
|
461
|
+
return void 0;
|
|
462
|
+
for (const form of ["js", "php"]) {
|
|
463
|
+
try {
|
|
464
|
+
if (spellJson(parsed, form) === value)
|
|
465
|
+
return { parsed, form };
|
|
466
|
+
}
|
|
467
|
+
catch {
|
|
468
|
+
return void 0;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return void 0;
|
|
472
|
+
}
|
|
473
|
+
function jsonText(value) {
|
|
474
|
+
return jsonTextForm(value)?.parsed;
|
|
475
|
+
}
|
|
432
476
|
function isJsonPath(path) {
|
|
433
477
|
return Array.isArray(path) && path.length <= MAX_PATH_STEPS && path.every((step) => typeof step === "string" ? step.length > 0 && !FORBIDDEN_KEYS.has(step) : Number.isSafeInteger(step) && step >= 0);
|
|
434
478
|
}
|
|
479
|
+
function isProfilePath(path) {
|
|
480
|
+
if (!Array.isArray(path) || path.length > MAX_PATH_STEPS)
|
|
481
|
+
return false;
|
|
482
|
+
let texts = 0;
|
|
483
|
+
for (const [i, step] of path.entries()) {
|
|
484
|
+
if (isTextStep(step)) {
|
|
485
|
+
texts += 1;
|
|
486
|
+
if (i === 0 || i === path.length - 1 || isTextStep(path[i - 1]) || texts > MAX_TEXT_STEPS)
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
else if (!isJsonPath([step])) {
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
435
495
|
function jsonAt(root, path) {
|
|
436
496
|
let node = root;
|
|
437
497
|
for (const step of path) {
|
|
@@ -446,6 +506,42 @@ function jsonAt(root, path) {
|
|
|
446
506
|
}
|
|
447
507
|
return { found: true, value: node };
|
|
448
508
|
}
|
|
509
|
+
function profileAt(root, path) {
|
|
510
|
+
if (!isProfilePath(path))
|
|
511
|
+
return { found: false };
|
|
512
|
+
let node = root;
|
|
513
|
+
for (const step of path) {
|
|
514
|
+
if (isTextStep(step)) {
|
|
515
|
+
const inner = jsonText(node);
|
|
516
|
+
if (inner === void 0)
|
|
517
|
+
return { found: false };
|
|
518
|
+
node = inner;
|
|
519
|
+
continue;
|
|
520
|
+
}
|
|
521
|
+
const at = jsonAt(node, [step]);
|
|
522
|
+
if (!at.found)
|
|
523
|
+
return { found: false };
|
|
524
|
+
node = at.value;
|
|
525
|
+
}
|
|
526
|
+
return { found: true, value: node };
|
|
527
|
+
}
|
|
528
|
+
function editAtProfilePath(root, path, edit) {
|
|
529
|
+
const at = profileAt(root, path);
|
|
530
|
+
if (!at.found || !isPlainObject(at.value))
|
|
531
|
+
return false;
|
|
532
|
+
const k = path.findIndex(isTextStep);
|
|
533
|
+
if (k === -1) {
|
|
534
|
+
edit(at.value);
|
|
535
|
+
return true;
|
|
536
|
+
}
|
|
537
|
+
const holder = jsonAt(root, path.slice(0, k - 1)).value;
|
|
538
|
+
const key = path[k - 1];
|
|
539
|
+
const text = jsonTextForm(holder[key]);
|
|
540
|
+
if (!text || !editAtProfilePath(text.parsed, path.slice(k + 1), edit))
|
|
541
|
+
return false;
|
|
542
|
+
holder[key] = spellJson(text.parsed, text.form);
|
|
543
|
+
return true;
|
|
544
|
+
}
|
|
449
545
|
function roundTrips(parsed, body) {
|
|
450
546
|
try {
|
|
451
547
|
return JSON.stringify(parsed) === body;
|
|
@@ -455,17 +551,17 @@ function roundTrips(parsed, body) {
|
|
|
455
551
|
}
|
|
456
552
|
}
|
|
457
553
|
function sameSteps(a, b) {
|
|
458
|
-
return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((step, i) => step
|
|
554
|
+
return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((step, i) => sameStep(step, b[i]));
|
|
459
555
|
}
|
|
460
556
|
function pathsOverlap(a, b) {
|
|
461
557
|
const n = Math.min(a.length, b.length);
|
|
462
558
|
for (let i = 0; i < n; i += 1)
|
|
463
|
-
if (a[i]
|
|
559
|
+
if (!sameStep(a[i], b[i]))
|
|
464
560
|
return false;
|
|
465
561
|
return true;
|
|
466
562
|
}
|
|
467
563
|
function describePath(path) {
|
|
468
|
-
return path.length ? path.map((step) => typeof step === "number" ? `[${step}]` : `.${step}`).join("").replace(/^\./, "") : "(root)";
|
|
564
|
+
return path.length ? path.map((step) => typeof step === "number" ? `[${step}]` : isTextStep(step) ? "<json>" : `.${step}`).join("").replace(/^\./, "") : "(root)";
|
|
469
565
|
}
|
|
470
566
|
// src/substitution-primitives.js
|
|
471
567
|
var SubstitutionError = class extends Error {
|
|
@@ -514,7 +610,7 @@ function swapMerchantHostedFields(body, spec, ciphertext = ADYEN_JWE) {
|
|
|
514
610
|
const path = Array.isArray(spec.path) ? [...spec.path] : spec.path;
|
|
515
611
|
const fields = isPlainObject(spec.fields) ? Object.fromEntries(Object.entries(spec.fields)) : null;
|
|
516
612
|
const remove = Array.isArray(spec.remove) ? [...spec.remove] : spec.remove ?? [];
|
|
517
|
-
if (!
|
|
613
|
+
if (!isProfilePath(path))
|
|
518
614
|
throw new SubstitutionError("refusing substitution path");
|
|
519
615
|
if (!fields || Object.keys(fields).length === 0)
|
|
520
616
|
throw new SubstitutionError("substitutions carry no fields");
|
|
@@ -548,7 +644,7 @@ function swapMerchantHostedFields(body, spec, ciphertext = ADYEN_JWE) {
|
|
|
548
644
|
}
|
|
549
645
|
if (!isPlainObject(parsed))
|
|
550
646
|
throw new SubstitutionError("the paused body is not a JSON object");
|
|
551
|
-
const holder =
|
|
647
|
+
const holder = profileAt(parsed, path);
|
|
552
648
|
if (!holder.found || !isPlainObject(holder.value))
|
|
553
649
|
throw new SubstitutionError(`the paused body has no object at ${describePath(path)}`);
|
|
554
650
|
const swaps = /* @__PURE__ */ new Map();
|
|
@@ -600,15 +696,19 @@ function swapMerchantHostedFields(body, spec, ciphertext = ADYEN_JWE) {
|
|
|
600
696
|
catch {
|
|
601
697
|
throw new SubstitutionError("the substituted body is not JSON");
|
|
602
698
|
}
|
|
603
|
-
const written =
|
|
699
|
+
const written = profileAt(out, path);
|
|
604
700
|
if (!written.found || !isPlainObject(written.value) || names.some((name) => written.value[name] !== fields[name]) || dummies.some((dummy) => swapped.includes(dummy))) {
|
|
605
701
|
throw new SubstitutionError(`the substitution did not land at ${describePath(path)}`);
|
|
606
702
|
}
|
|
607
703
|
if (remove.length === 0 && set.length === 0)
|
|
608
704
|
return swapped;
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
705
|
+
if (remove.length > 0 && !editAtProfilePath(out, path, (object) => {
|
|
706
|
+
for (const key of remove)
|
|
707
|
+
if (Object.prototype.hasOwnProperty.call(object, key))
|
|
708
|
+
delete object[key];
|
|
709
|
+
})) {
|
|
710
|
+
throw new SubstitutionError(`the substitution did not land at ${describePath(path)}`);
|
|
711
|
+
}
|
|
612
712
|
for (const entry of set) {
|
|
613
713
|
const parent = jsonAt(out, entry.path.slice(0, -1));
|
|
614
714
|
if (!parent.found || !isPlainObject(parent.value))
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PayPlug's hosted payment page (secure.payplug.com, where French merchants send a buyer who pays by card), as this SDK
|
|
3
|
+
* reads it.
|
|
4
|
+
*
|
|
5
|
+
* The merchant's server creates the payment with PayPlug and sends the buyer's browser to the page's URL PayPlug answered
|
|
6
|
+
* with, https://secure.payplug.com/pay/<payment id>, or /pay/test/<payment id> for a test payment, by a redirect or by
|
|
7
|
+
* setting the page's location. PayPlug's Shopify app does the same from Shopify's checkout. That GET carries no card, no
|
|
8
|
+
* amount and no merchant, and it is the one request a build that declares PayPlug's capability pauses (hosted-entry.ts):
|
|
9
|
+
* the cardholder's device repeats it over the end-to-end TLS relay and pays on the page PayPlug returns to it (payment-core
|
|
10
|
+
* processors/payplug.js). Every step toward paying on that page is a POST to PayPlug's host, the page's card post among
|
|
11
|
+
* them, with the card encrypted under the page's own key.
|
|
12
|
+
*
|
|
13
|
+
* PAYPLUG_HOST is payment-core's PAYPLUG_HOST, and isPayplugEntryUrl is payment-core's isPayplugEntryUrl; payplug.test.mjs
|
|
14
|
+
* pins both to payment-core on every case payment-core's own tests list.
|
|
15
|
+
*/
|
|
16
|
+
export declare const PAYPLUG_PSP = "payplug";
|
|
17
|
+
/** The dark-launch capability the API serves PayPlug's recognizer behind (payment-core processors/payplug.js). */
|
|
18
|
+
export declare const PAYPLUG_CAPABILITY = "payplug_hosted_payment_page";
|
|
19
|
+
/** PayPlug's page host, which its test and live payments share; the entry's path says which one a payment is. */
|
|
20
|
+
export declare const PAYPLUG_HOST = "secure.payplug.com";
|
|
21
|
+
/**
|
|
22
|
+
* Whether a URL is the payment page's URL exactly as PayPlug writes payment_url: https, secure.payplug.com in lower case,
|
|
23
|
+
* the default port, no credentials, no query and no fragment, not even an empty one, and the path /pay/<id> or
|
|
24
|
+
* /pay/test/<id> with the payment's 22-character id. The lightbox's ?lightbox=1, or any other query, asks PayPlug's page
|
|
25
|
+
* for something else, so it is not the entry, and neither is any other request to PayPlug's host.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isPayplugEntryUrl(raw: unknown): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Whether a request on PayPlug's page host is a step toward paying there: any POST, the page's card post and its
|
|
30
|
+
* 3-D Secure posts among them. The page itself, its scripts, its images and its frames are GETs of no card and are not one.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isPayplugPayStep(url: string, method: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Whether an adapter must hand this request to the pre-claim gates: it is on PayPlug's page host and this build's
|
|
35
|
+
* registry serves PayPlug's entry. The page's posts are not the entry, so the registry's card-request test does not name
|
|
36
|
+
* them; the CDP adapter still pauses them through the recognizer's host pattern, and attachToPlaywright's route predicate
|
|
37
|
+
* asks this, so both adapters show the gates every request to the page's host once PayPlug is armed.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isArmedPayplugUrl(vault: {
|
|
40
|
+
isCardRequest(url: string, method?: string): boolean;
|
|
41
|
+
} | undefined, url: string): boolean;
|
package/dist/payplug.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PayPlug's hosted payment page (secure.payplug.com, where French merchants send a buyer who pays by card), as this SDK
|
|
3
|
+
* reads it.
|
|
4
|
+
*
|
|
5
|
+
* The merchant's server creates the payment with PayPlug and sends the buyer's browser to the page's URL PayPlug answered
|
|
6
|
+
* with, https://secure.payplug.com/pay/<payment id>, or /pay/test/<payment id> for a test payment, by a redirect or by
|
|
7
|
+
* setting the page's location. PayPlug's Shopify app does the same from Shopify's checkout. That GET carries no card, no
|
|
8
|
+
* amount and no merchant, and it is the one request a build that declares PayPlug's capability pauses (hosted-entry.ts):
|
|
9
|
+
* the cardholder's device repeats it over the end-to-end TLS relay and pays on the page PayPlug returns to it (payment-core
|
|
10
|
+
* processors/payplug.js). Every step toward paying on that page is a POST to PayPlug's host, the page's card post among
|
|
11
|
+
* them, with the card encrypted under the page's own key.
|
|
12
|
+
*
|
|
13
|
+
* PAYPLUG_HOST is payment-core's PAYPLUG_HOST, and isPayplugEntryUrl is payment-core's isPayplugEntryUrl; payplug.test.mjs
|
|
14
|
+
* pins both to payment-core on every case payment-core's own tests list.
|
|
15
|
+
*/
|
|
16
|
+
export const PAYPLUG_PSP = 'payplug';
|
|
17
|
+
/** The dark-launch capability the API serves PayPlug's recognizer behind (payment-core processors/payplug.js). */
|
|
18
|
+
export const PAYPLUG_CAPABILITY = 'payplug_hosted_payment_page';
|
|
19
|
+
/** PayPlug's page host, which its test and live payments share; the entry's path says which one a payment is. */
|
|
20
|
+
export const PAYPLUG_HOST = 'secure.payplug.com';
|
|
21
|
+
// The entry's path: /pay/<id> for a live payment, /pay/test/<id> for a test one, the id as PayPlug writes it.
|
|
22
|
+
const ENTRY_PATH = /^\/pay\/(?:test\/)?[A-Za-z0-9]{22}$/;
|
|
23
|
+
// An id of that shape, for asking whether this build's registry serves the entry.
|
|
24
|
+
const PROBE = 'https://secure.payplug.com/pay/0000000000000000000000';
|
|
25
|
+
/**
|
|
26
|
+
* Whether a URL is the payment page's URL exactly as PayPlug writes payment_url: https, secure.payplug.com in lower case,
|
|
27
|
+
* the default port, no credentials, no query and no fragment, not even an empty one, and the path /pay/<id> or
|
|
28
|
+
* /pay/test/<id> with the payment's 22-character id. The lightbox's ?lightbox=1, or any other query, asks PayPlug's page
|
|
29
|
+
* for something else, so it is not the entry, and neither is any other request to PayPlug's host.
|
|
30
|
+
*/
|
|
31
|
+
export function isPayplugEntryUrl(raw) {
|
|
32
|
+
if (typeof raw !== 'string' || raw.length > 256 || raw.includes('?') || raw.includes('#'))
|
|
33
|
+
return false;
|
|
34
|
+
let url;
|
|
35
|
+
try {
|
|
36
|
+
url = new URL(raw);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (url.href !== raw || url.protocol !== 'https:' || url.hostname !== PAYPLUG_HOST || url.port || url.username || url.password)
|
|
42
|
+
return false;
|
|
43
|
+
return ENTRY_PATH.test(url.pathname);
|
|
44
|
+
}
|
|
45
|
+
/** Whether a URL is on PayPlug's page host: https, no credentials, any port, any letter case, a trailing dot or not. */
|
|
46
|
+
function onPayplugHost(raw) {
|
|
47
|
+
let url;
|
|
48
|
+
try {
|
|
49
|
+
url = new URL(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return url.protocol === 'https:' && !url.username && !url.password && url.hostname.toLowerCase().replace(/\.$/, '') === PAYPLUG_HOST;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Whether a request on PayPlug's page host is a step toward paying there: any POST, the page's card post and its
|
|
58
|
+
* 3-D Secure posts among them. The page itself, its scripts, its images and its frames are GETs of no card and are not one.
|
|
59
|
+
*/
|
|
60
|
+
export function isPayplugPayStep(url, method) {
|
|
61
|
+
return onPayplugHost(url) && String(method).toUpperCase() === 'POST';
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Whether an adapter must hand this request to the pre-claim gates: it is on PayPlug's page host and this build's
|
|
65
|
+
* registry serves PayPlug's entry. The page's posts are not the entry, so the registry's card-request test does not name
|
|
66
|
+
* them; the CDP adapter still pauses them through the recognizer's host pattern, and attachToPlaywright's route predicate
|
|
67
|
+
* asks this, so both adapters show the gates every request to the page's host once PayPlug is armed.
|
|
68
|
+
*/
|
|
69
|
+
export function isArmedPayplugUrl(vault, url) {
|
|
70
|
+
return onPayplugHost(url) && typeof vault?.isCardRequest === 'function' && vault.isCardRequest(PROBE, 'GET');
|
|
71
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
// Generated from @agent-cards/payment-core. Do not edit.
|
|
3
|
-
// artifact-sha256:
|
|
3
|
+
// artifact-sha256: d6d50b6577a932c3586fcade6b8cbd03c562bd3394e8addcb954d797ea9999b4
|
|
4
4
|
// src/json-path.js
|
|
5
5
|
function roundTrips(parsed, body) {
|
|
6
6
|
try {
|
|
@@ -10,6 +10,25 @@ function roundTrips(parsed, body) {
|
|
|
10
10
|
return false;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
// src/answer-card-leak.js
|
|
14
|
+
var DECIMAL = /\p{Nd}/u;
|
|
15
|
+
function digitValue(char) {
|
|
16
|
+
const point = char.codePointAt(0);
|
|
17
|
+
let first = point;
|
|
18
|
+
while (DECIMAL.test(String.fromCodePoint(first - 1)))
|
|
19
|
+
first -= 1;
|
|
20
|
+
return String((point - first) % 10);
|
|
21
|
+
}
|
|
22
|
+
var ENCLOSED = /* @__PURE__ */ Object.freeze([[9451, 10, 11], [9461, 10, 1], [9471, 1, 0], [10102, 30, 1], [127243, 2, 0]]);
|
|
23
|
+
var ENCLOSED_CHAR = /[\u24eb-\u24ff\u2776-\u2793\u{1f10b}\u{1f10c}]/gu;
|
|
24
|
+
function enclosedValue(char) {
|
|
25
|
+
const point = char.codePointAt(0);
|
|
26
|
+
const [first, , start] = ENCLOSED.find(([from, size]) => point >= from && point < from + size);
|
|
27
|
+
return String(first === 127243 ? 0 : first === 10102 ? (point - first) % 10 + 1 : start + point - first);
|
|
28
|
+
}
|
|
29
|
+
var asciiDigits = (text) => (typeof text.normalize === "function" ? text.normalize("NFKC") : text).replace(ENCLOSED_CHAR, enclosedValue).replace(/\p{Nd}/gu, (char) => char >= "0" && char <= "9" ? char : digitValue(char));
|
|
30
|
+
var digitCount = (text) => (asciiDigits(String(text)).match(/\p{N}/gu) ?? []).length;
|
|
31
|
+
var NAME_DIGITS = 3;
|
|
13
32
|
// src/sha256.js
|
|
14
33
|
var K = /* @__PURE__ */ new Uint32Array([
|
|
15
34
|
1116352408,
|
|
@@ -139,7 +158,7 @@ function sha256Hex(input) {
|
|
|
139
158
|
H[6] += g;
|
|
140
159
|
H[7] += h;
|
|
141
160
|
}
|
|
142
|
-
return Array.from(H, (
|
|
161
|
+
return Array.from(H, (word2) => word2.toString(16).padStart(8, "0")).join("");
|
|
143
162
|
}
|
|
144
163
|
// src/rsa-pkcs1v15.js
|
|
145
164
|
var RsaPkcs1v15Error = class extends Error {
|
|
@@ -155,6 +174,7 @@ var BASE64 = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
|
155
174
|
var SHA256_HEX = /^[0-9a-f]{64}$/;
|
|
156
175
|
var RSA_ALGORITHM = [48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0];
|
|
157
176
|
var MODULUS_BYTES = [128, 256, 384, 512];
|
|
177
|
+
var SMALL_MODULUS_BYTES = 64;
|
|
158
178
|
var TYPED_ARRAY = Object.getPrototypeOf(Uint8Array.prototype);
|
|
159
179
|
var typedArrayName = Object.getOwnPropertyDescriptor(TYPED_ARRAY, Symbol.toStringTag).get;
|
|
160
180
|
function parseRsaPublicKey(key) {
|
|
@@ -163,6 +183,9 @@ function parseRsaPublicKey(key) {
|
|
|
163
183
|
const named = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "exponent") ? key.exponent : void 0;
|
|
164
184
|
if (named !== void 0 && named !== 17)
|
|
165
185
|
throw refuse("key");
|
|
186
|
+
const sized = key && typeof key === "object" && Object.prototype.hasOwnProperty.call(key, "bits") ? key.bits : void 0;
|
|
187
|
+
if (sized !== void 0 && sized !== 512)
|
|
188
|
+
throw refuse("key");
|
|
166
189
|
if (typeof spki !== "string" || spki.length > 1024 || spki.length % 4 !== 0 || !BASE64.test(spki))
|
|
167
190
|
throw refuse("key");
|
|
168
191
|
if (typeof pin !== "string" || !SHA256_HEX.test(pin))
|
|
@@ -195,7 +218,8 @@ function parseRsaPublicKey(key) {
|
|
|
195
218
|
if (exponent.end !== rsa.end)
|
|
196
219
|
throw refuse("key");
|
|
197
220
|
const n = modulus.bytes;
|
|
198
|
-
|
|
221
|
+
const sizes = sized === 512 ? [SMALL_MODULUS_BYTES] : MODULUS_BYTES;
|
|
222
|
+
if (!sizes.includes(n.length) || !(n[0] & 128) || !(n[n.length - 1] & 1))
|
|
199
223
|
throw refuse("key");
|
|
200
224
|
const e = exponent.bytes;
|
|
201
225
|
const expected = named === 17 ? [17] : [1, 0, 1];
|
|
@@ -652,6 +676,7 @@ var PAYRAILS_SERVED_CARD_FACTS = Object.freeze(["bin", "binLookup", "holderName"
|
|
|
652
676
|
var exact = (pattern, value) => typeof value === "string" && pattern.exec(value)?.[0] === value;
|
|
653
677
|
var bin6 = (value) => exact(/^[0-9]{6,8}$/, value) ? value.slice(0, 6) : void 0;
|
|
654
678
|
var label = (value, max) => plainText(value, max) ? value : void 0;
|
|
679
|
+
var word = (value, max, digits = 0) => plainText(value, max) && digitCount(value) <= digits ? value : void 0;
|
|
655
680
|
var pick = (value, pattern) => exact(pattern, value) ? value : void 0;
|
|
656
681
|
var compact = (object) => Object.fromEntries(Object.entries(object).filter(([, value]) => value !== void 0));
|
|
657
682
|
var nonEmpty = (object) => Object.keys(object).length ? object : void 0;
|
|
@@ -691,13 +716,13 @@ function sanitizePayrailsResponse(text) {
|
|
|
691
716
|
bin: served.has("bin") ? bin6(data.bin) : void 0,
|
|
692
717
|
binLookup: lookup ? nonEmpty(compact({
|
|
693
718
|
bin: bin6(lookup.bin),
|
|
694
|
-
network:
|
|
695
|
-
issuer:
|
|
696
|
-
issuerCountry: country ? nonEmpty(compact({ code: pick(country.code, /^[A-Z]{2}$/), name:
|
|
697
|
-
type:
|
|
719
|
+
network: word(lookup.network, 32),
|
|
720
|
+
issuer: word(lookup.issuer, 128, NAME_DIGITS),
|
|
721
|
+
issuerCountry: country ? nonEmpty(compact({ code: pick(country.code, /^[A-Z]{2}$/), name: word(country.name, 64), iso3: pick(country.iso3, /^[A-Z]{3}$/) })) : void 0,
|
|
722
|
+
type: word(lookup.type, 32)
|
|
698
723
|
})) : void 0,
|
|
699
724
|
holderName: served.has("holderName") ? label(data.holderName, 200) : void 0,
|
|
700
|
-
network: served.has("network") ?
|
|
725
|
+
network: served.has("network") ? word(data.network, 32) : void 0,
|
|
701
726
|
suffix: data.suffix,
|
|
702
727
|
expiryMonth: served.has("expiryMonth") ? pick(data.expiryMonth, /^(?:0[1-9]|1[0-2])$/) : void 0,
|
|
703
728
|
expiryYear: served.has("expiryYear") ? pick(data.expiryYear, /^(?:[0-9]{2}|[0-9]{4})$/) : void 0
|
package/dist/pre-claim.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { type MerchantProfile } from './merchant-hosted.js';
|
|
|
12
12
|
import type { MerchantHandoffWatch } from './merchant-handoff.js';
|
|
13
13
|
import { type CybersourceFlexDecision, type CybersourceFlexPause, type FlexRequest } from './cybersource-flex.js';
|
|
14
14
|
import { type CardEndpointProfile } from './card-endpoint.js';
|
|
15
|
+
import { type NikeOrders } from './nike-order.js';
|
|
15
16
|
import { type PayrailsSessionCapture, type PayrailsSidecar } from './payrails.js';
|
|
16
17
|
import { type VerifoneProfile } from './verifone.js';
|
|
17
18
|
import { type WorldlineMyCheckoutProducts } from './worldline-mycheckout.js';
|
|
@@ -250,6 +251,8 @@ export interface PreClaimContext {
|
|
|
250
251
|
* card frame is refused.
|
|
251
252
|
*/
|
|
252
253
|
payrexx?: PayrexxFollowUps;
|
|
254
|
+
/** The approval Nike's order is held to once a card went through Nike's profile (nike-order.ts). Absent: Nike's order is left alone. */
|
|
255
|
+
nikeOrders?: NikeOrders;
|
|
253
256
|
}
|
|
254
257
|
/**
|
|
255
258
|
* The URL an event may name for a request. For an armed merchant profile's
|
|
@@ -265,6 +268,10 @@ export declare function eventUrl(vault: {
|
|
|
265
268
|
/** A gate returns a decision when it handles the request, undefined to defer to
|
|
266
269
|
* the next gate, or a promise of either when it must do I/O first. */
|
|
267
270
|
export type PreClaimGate = (ctx: PreClaimContext) => PreClaimDecision | undefined | Promise<PreClaimDecision | undefined>;
|
|
271
|
+
/** What the Nike order gate reads of a paused request and its attachment. */
|
|
272
|
+
export type NikeOrderGateContext = Pick<PreClaimContext, 'request' | 'nikeOrders' | 'lifecycle' | 'effects' | 'onEvent' | 'lifecycleAborted' | 'terminal'>;
|
|
273
|
+
/** The Nike order gate's decision, already performed, or undefined when the request is not its to judge. */
|
|
274
|
+
export declare function nikeOrderGate(ctx: NikeOrderGateContext): Promise<PreClaimDecision> | undefined;
|
|
268
275
|
export declare const MERCHANT_BODY_UNREADABLE = "the paused request carries no body the SDK could read, so Agentcard cannot tell whether it carries a card";
|
|
269
276
|
export declare const verifonePreClaim: PreClaimGate;
|
|
270
277
|
export declare const fiservPreClaim: PreClaimGate;
|
|
@@ -280,6 +287,9 @@ export declare function isArmedCreditguardCall(vault: {
|
|
|
280
287
|
} | undefined, url: string): boolean;
|
|
281
288
|
export declare const przelewy24PreClaim: PreClaimGate;
|
|
282
289
|
export declare const barionPreClaim: PreClaimGate;
|
|
290
|
+
export declare const payplugPreClaim: PreClaimGate;
|
|
291
|
+
export declare const eghlPreClaim: PreClaimGate;
|
|
292
|
+
export declare const cardlinkVposPreClaim: PreClaimGate;
|
|
283
293
|
export declare const ekashuPreClaim: PreClaimGate;
|
|
284
294
|
export declare const transbankPreClaim: PreClaimGate;
|
|
285
295
|
export declare const paytrailPreClaim: PreClaimGate;
|
|
@@ -287,6 +297,7 @@ export declare const redsysPreClaim: PreClaimGate;
|
|
|
287
297
|
export declare const quickpayPreClaim: PreClaimGate;
|
|
288
298
|
export declare const comgatePreClaim: PreClaimGate;
|
|
289
299
|
export declare const eximbayPreClaim: PreClaimGate;
|
|
300
|
+
export declare const oceanpaymentPreClaim: PreClaimGate;
|
|
290
301
|
export declare const paypalHostedFieldsPreClaim: PreClaimGate;
|
|
291
302
|
export declare const paypalCardFormsPreClaim: PreClaimGate;
|
|
292
303
|
export declare const cybersourceSecureAcceptancePreClaim: PreClaimGate;
|