@crossmint/wallets-sdk 0.18.14 → 0.18.15
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/dist/api/__tests__/constants.cjs +31 -0
- package/dist/api/__tests__/constants.d.cts +96 -0
- package/dist/api/__tests__/constants.d.ts +96 -0
- package/dist/api/__tests__/constants.js +31 -0
- package/dist/api/__tests__/test-utils.cjs +372 -0
- package/dist/api/__tests__/test-utils.d.cts +99 -0
- package/dist/api/__tests__/test-utils.d.ts +99 -0
- package/dist/api/__tests__/test-utils.js +372 -0
- package/dist/api/client.cjs +4 -4
- package/dist/api/client.js +3 -3
- package/dist/api/index.cjs +4 -4
- package/dist/api/index.js +3 -3
- package/dist/chains/chains.cjs +4 -4
- package/dist/chains/chains.js +3 -3
- package/dist/{chunk-ZJZO6LQ3.js → chunk-4ZFP3ST7.js} +1 -1
- package/dist/{chunk-AAESOWQL.js → chunk-5YX2BE4I.js} +3 -3
- package/dist/{chunk-G7TC2YMQ.cjs → chunk-77HEKAFB.cjs} +3 -3
- package/dist/{chunk-5TYDRD6D.cjs → chunk-AKAJ7UHQ.cjs} +3 -3
- package/dist/{chunk-FUMQWMQR.cjs → chunk-AKJOFUXU.cjs} +9 -9
- package/dist/{chunk-BEJB6ZUK.cjs → chunk-AUNZEGWS.cjs} +7 -7
- package/dist/{chunk-SGKMU5NX.cjs → chunk-BMXG52BZ.cjs} +8 -8
- package/dist/{chunk-SEGDDAL2.js → chunk-CJWHHO4B.js} +1 -1
- package/dist/chunk-G6QJHFSY.cjs +74 -0
- package/dist/{chunk-5CTWIW7X.js → chunk-GSDBCRGH.js} +3 -3
- package/dist/{chunk-5WJE5X7V.cjs → chunk-JDAWNKQ7.cjs} +23 -23
- package/dist/{chunk-B24CPC6Y.js → chunk-LFUXRLJR.js} +1 -1
- package/dist/{chunk-PUXRHELK.cjs → chunk-NFQT5TFO.cjs} +12 -12
- package/dist/{chunk-ZQACPBUW.js → chunk-OOVNMAQF.js} +3 -3
- package/dist/{chunk-SB5FTFPM.cjs → chunk-OTI3LX45.cjs} +9 -9
- package/dist/{chunk-PST7R25G.cjs → chunk-PADJ2CIV.cjs} +40 -40
- package/dist/{chunk-KIS2P5DM.js → chunk-PHIXNAMT.js} +1 -1
- package/dist/chunk-PJOJIRTY.js +74 -0
- package/dist/{chunk-ADCODBBF.cjs → chunk-PJTTM5QQ.cjs} +1 -1
- package/dist/{chunk-2RVPHSR5.cjs → chunk-PRQOFWLH.cjs} +3 -3
- package/dist/{chunk-OPKBL6A2.cjs → chunk-QCTTQ4XE.cjs} +19 -19
- package/dist/{chunk-UWKMOJ4D.js → chunk-SCU5YLUT.js} +1 -1
- package/dist/{chunk-PCZDMOJH.js → chunk-TOTOITTM.js} +2 -2
- package/dist/{chunk-VJ2ZKU3R.js → chunk-V65OBC5I.js} +5 -5
- package/dist/{chunk-LKAE7D7W.js → chunk-VM6OLXBS.js} +1 -1
- package/dist/{chunk-SWPJZ5JX.cjs → chunk-WMUNQJYD.cjs} +3 -3
- package/dist/{chunk-3PI54IUS.js → chunk-WQDGFD34.js} +2 -2
- package/dist/{chunk-FV4PV7HU.cjs → chunk-YT64AZL6.cjs} +6 -6
- package/dist/{chunk-CEFMURL3.js → chunk-YZOPFNY3.js} +2 -2
- package/dist/{chunk-THLRRDVV.js → chunk-ZM437XPQ.js} +3 -3
- package/dist/index.cjs +18 -18
- package/dist/index.js +17 -17
- package/dist/logger/index.cjs +3 -3
- package/dist/logger/index.js +2 -2
- package/dist/logger/init.cjs +3 -3
- package/dist/logger/init.js +2 -2
- package/dist/sdk.cjs +12 -12
- package/dist/sdk.js +11 -11
- package/dist/signers/index.cjs +8 -8
- package/dist/signers/index.js +7 -7
- package/dist/signers/non-custodial/index.cjs +7 -7
- package/dist/signers/non-custodial/index.js +8 -8
- package/dist/signers/non-custodial/ncs-evm-signer.cjs +5 -5
- package/dist/signers/non-custodial/ncs-evm-signer.js +4 -4
- package/dist/signers/non-custodial/ncs-signer.cjs +4 -4
- package/dist/signers/non-custodial/ncs-signer.js +3 -3
- package/dist/signers/non-custodial/ncs-solana-signer.cjs +5 -5
- package/dist/signers/non-custodial/ncs-solana-signer.js +4 -4
- package/dist/signers/non-custodial/ncs-stellar-signer.cjs +5 -5
- package/dist/signers/non-custodial/ncs-stellar-signer.js +4 -4
- package/dist/utils/constants.cjs +2 -2
- package/dist/utils/constants.js +1 -1
- package/dist/wallets/__tests__/test-helpers.cjs +8 -8
- package/dist/wallets/__tests__/test-helpers.js +7 -7
- package/dist/wallets/evm.cjs +12 -12
- package/dist/wallets/evm.js +11 -11
- package/dist/wallets/solana.cjs +9 -9
- package/dist/wallets/solana.js +8 -8
- package/dist/wallets/stellar.cjs +9 -9
- package/dist/wallets/stellar.js +8 -8
- package/dist/wallets/wallet-factory.cjs +10 -10
- package/dist/wallets/wallet-factory.js +9 -9
- package/dist/wallets/wallet.cjs +8 -8
- package/dist/wallets/wallet.js +7 -7
- package/package.json +3 -3
- package/dist/{chunk-GROJZ247.cjs → chunk-OWRKZD7H.cjs} +4 -4
- package/dist/{chunk-NJTKHWXR.js → chunk-XVFUAZJY.js} +6 -6
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
var _chunkG6QJHFSYcjs = require('../../chunk-G6QJHFSY.cjs');
|
|
16
|
+
require('../../chunk-UO2J2ZB2.cjs');
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
exports.DELAY_LONG = _chunkG6QJHFSYcjs.DELAY_LONG; exports.DELAY_MEDIUM = _chunkG6QJHFSYcjs.DELAY_MEDIUM; exports.DELAY_RATE_LIMIT_WINDOW = _chunkG6QJHFSYcjs.DELAY_RATE_LIMIT_WINDOW; exports.DELAY_SHORT = _chunkG6QJHFSYcjs.DELAY_SHORT; exports.HTTP_ERROR_STATUSES = _chunkG6QJHFSYcjs.HTTP_ERROR_STATUSES; exports.MOCK_API_KEY = _chunkG6QJHFSYcjs.MOCK_API_KEY; exports.TEST_ADDRESSES = _chunkG6QJHFSYcjs.TEST_ADDRESSES; exports.TEST_VALUES = _chunkG6QJHFSYcjs.TEST_VALUES; exports.TIMEOUT_LONG = _chunkG6QJHFSYcjs.TIMEOUT_LONG; exports.TIMEOUT_MEDIUM = _chunkG6QJHFSYcjs.TIMEOUT_MEDIUM; exports.TIMEOUT_SHORT = _chunkG6QJHFSYcjs.TIMEOUT_SHORT; exports.TOKEN_LOCATORS = _chunkG6QJHFSYcjs.TOKEN_LOCATORS; exports.WALLET_LOCATORS = _chunkG6QJHFSYcjs.WALLET_LOCATORS;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { WalletLocator } from '../types.cjs';
|
|
2
|
+
import 'viem';
|
|
3
|
+
import '../gen/types.gen.cjs';
|
|
4
|
+
|
|
5
|
+
declare const HTTP_ERROR_STATUSES: readonly [{
|
|
6
|
+
readonly status: 400;
|
|
7
|
+
readonly message: "Bad Request";
|
|
8
|
+
}, {
|
|
9
|
+
readonly status: 401;
|
|
10
|
+
readonly message: "Unauthorized";
|
|
11
|
+
}, {
|
|
12
|
+
readonly status: 403;
|
|
13
|
+
readonly message: "Forbidden";
|
|
14
|
+
}, {
|
|
15
|
+
readonly status: 404;
|
|
16
|
+
readonly message: "Not Found";
|
|
17
|
+
}, {
|
|
18
|
+
readonly status: 429;
|
|
19
|
+
readonly message: "Rate limit exceeded";
|
|
20
|
+
}, {
|
|
21
|
+
readonly status: 500;
|
|
22
|
+
readonly message: "Internal server error";
|
|
23
|
+
}, {
|
|
24
|
+
readonly status: 502;
|
|
25
|
+
readonly message: "Bad Gateway";
|
|
26
|
+
}, {
|
|
27
|
+
readonly status: 503;
|
|
28
|
+
readonly message: "Service Unavailable";
|
|
29
|
+
}];
|
|
30
|
+
/**
|
|
31
|
+
* General-purpose wallet locators for unit and integration tests.
|
|
32
|
+
* Includes both locator format strings (me:chain:type) and actual addresses.
|
|
33
|
+
* Used for testing wallet operations that accept WalletLocator type.
|
|
34
|
+
*/
|
|
35
|
+
declare const WALLET_LOCATORS: {
|
|
36
|
+
readonly evmSmart: WalletLocator;
|
|
37
|
+
readonly evmMpc: WalletLocator;
|
|
38
|
+
readonly solanaSmart: WalletLocator;
|
|
39
|
+
readonly solanaAddress: WalletLocator;
|
|
40
|
+
readonly evmAddress: WalletLocator;
|
|
41
|
+
readonly evmAddressWithSpecialChars: WalletLocator;
|
|
42
|
+
};
|
|
43
|
+
declare const TOKEN_LOCATORS: {
|
|
44
|
+
readonly eth: "base-sepolia:eth";
|
|
45
|
+
readonly usdc: "base-sepolia:usdc";
|
|
46
|
+
readonly sol: "solana:sol";
|
|
47
|
+
readonly customContract: "base-sepolia:0x1234567890123456789012345678901234567890";
|
|
48
|
+
readonly tokenWithSpecialChars: "base-sepolia:0xABCDEFabcdef0123456789ABCDEFabcdef012345";
|
|
49
|
+
};
|
|
50
|
+
declare const TIMEOUT_SHORT = 30000;
|
|
51
|
+
declare const TIMEOUT_MEDIUM = 60000;
|
|
52
|
+
declare const TIMEOUT_LONG = 120000;
|
|
53
|
+
declare const DELAY_SHORT = 200;
|
|
54
|
+
declare const DELAY_MEDIUM = 500;
|
|
55
|
+
declare const DELAY_LONG = 1000;
|
|
56
|
+
declare const DELAY_RATE_LIMIT_WINDOW = 2000;
|
|
57
|
+
/**
|
|
58
|
+
* Real blockchain addresses for integration tests with specific purposes.
|
|
59
|
+
* These are actual addresses used in integration tests for:
|
|
60
|
+
* - Admin signers (external wallet addresses for wallet creation)
|
|
61
|
+
* - Recipients (addresses to send tokens to)
|
|
62
|
+
* - Error testing (non-existent addresses)
|
|
63
|
+
* - General test operations
|
|
64
|
+
* Note: These are actual addresses, not locator format strings.
|
|
65
|
+
*/
|
|
66
|
+
declare const TEST_ADDRESSES: {
|
|
67
|
+
readonly EVM_ADMIN_SIGNER: "0xe5E91D9b21C3563011cc332B050150fb9211bBEB";
|
|
68
|
+
readonly SOLANA_ADMIN_SIGNER: "CsHuaddA9J8j9vSTdL9wpvBsyjYe4F7iQQLuPg3EUqsU";
|
|
69
|
+
readonly EVM_RECIPIENT: "0xDF8b5F9c19E187f1Ea00730a1e46180152244315";
|
|
70
|
+
readonly EVM_NON_EXISTENT: "0x0000000000000000000000000000000000000000";
|
|
71
|
+
readonly EVM_TEST: "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";
|
|
72
|
+
};
|
|
73
|
+
declare const TEST_VALUES: {
|
|
74
|
+
readonly FUNDING_AMOUNT_SMALL: 1;
|
|
75
|
+
readonly FUNDING_AMOUNT_LARGE: 10;
|
|
76
|
+
readonly SEND_AMOUNT_SMALL: "0.0001";
|
|
77
|
+
readonly SEND_AMOUNT_VERY_SMALL: "0.000000000000000001";
|
|
78
|
+
readonly SEND_AMOUNT_ZERO: "0";
|
|
79
|
+
readonly SEND_AMOUNT_INVALID: "999999999999999999.0";
|
|
80
|
+
readonly SEND_AMOUNT_EXTREME: "999999999999999999999999999999.999999999999999999";
|
|
81
|
+
readonly LONG_STRING_LENGTH: 10000;
|
|
82
|
+
readonly CONCURRENT_REQUESTS: 3;
|
|
83
|
+
readonly RAPID_SEQUENTIAL_COUNT: 3;
|
|
84
|
+
readonly RATE_LIMIT_BATCH_SIZE: 5;
|
|
85
|
+
readonly RATE_LIMIT_BATCHES: 3;
|
|
86
|
+
readonly RATE_LIMIT_RAPID_COUNT: 20;
|
|
87
|
+
readonly RATE_LIMIT_STRESS_COUNT: 50;
|
|
88
|
+
readonly APPROVE_TRANSACTION_MAX_RETRIES: 10;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Mock API key for unit tests.
|
|
92
|
+
* This is a valid development API key format used for testing purposes only.
|
|
93
|
+
*/
|
|
94
|
+
declare const MOCK_API_KEY = "ck_development_A61UZQnvjSQcM5qVBaBactgqebxafWAVsNdD2xLkgBxoYuH5q2guM8r9DUmZQzE1WYyoByGVYpEG2o9gVSzAZFsrLbfKGERUJ6D5CW6S9AsJGAc3ctgrsD4n2ioekzGj7KPbLwT3SysDjMamYXLxEroUbQSdwf6aLF4zeEpECq2crkTUQeLFzxzmjWNxFDHFYefDrfrFPCURvBXJLf5pCxCQ";
|
|
95
|
+
|
|
96
|
+
export { DELAY_LONG, DELAY_MEDIUM, DELAY_RATE_LIMIT_WINDOW, DELAY_SHORT, HTTP_ERROR_STATUSES, MOCK_API_KEY, TEST_ADDRESSES, TEST_VALUES, TIMEOUT_LONG, TIMEOUT_MEDIUM, TIMEOUT_SHORT, TOKEN_LOCATORS, WALLET_LOCATORS };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { WalletLocator } from '../types.js';
|
|
2
|
+
import 'viem';
|
|
3
|
+
import '../gen/types.gen.js';
|
|
4
|
+
|
|
5
|
+
declare const HTTP_ERROR_STATUSES: readonly [{
|
|
6
|
+
readonly status: 400;
|
|
7
|
+
readonly message: "Bad Request";
|
|
8
|
+
}, {
|
|
9
|
+
readonly status: 401;
|
|
10
|
+
readonly message: "Unauthorized";
|
|
11
|
+
}, {
|
|
12
|
+
readonly status: 403;
|
|
13
|
+
readonly message: "Forbidden";
|
|
14
|
+
}, {
|
|
15
|
+
readonly status: 404;
|
|
16
|
+
readonly message: "Not Found";
|
|
17
|
+
}, {
|
|
18
|
+
readonly status: 429;
|
|
19
|
+
readonly message: "Rate limit exceeded";
|
|
20
|
+
}, {
|
|
21
|
+
readonly status: 500;
|
|
22
|
+
readonly message: "Internal server error";
|
|
23
|
+
}, {
|
|
24
|
+
readonly status: 502;
|
|
25
|
+
readonly message: "Bad Gateway";
|
|
26
|
+
}, {
|
|
27
|
+
readonly status: 503;
|
|
28
|
+
readonly message: "Service Unavailable";
|
|
29
|
+
}];
|
|
30
|
+
/**
|
|
31
|
+
* General-purpose wallet locators for unit and integration tests.
|
|
32
|
+
* Includes both locator format strings (me:chain:type) and actual addresses.
|
|
33
|
+
* Used for testing wallet operations that accept WalletLocator type.
|
|
34
|
+
*/
|
|
35
|
+
declare const WALLET_LOCATORS: {
|
|
36
|
+
readonly evmSmart: WalletLocator;
|
|
37
|
+
readonly evmMpc: WalletLocator;
|
|
38
|
+
readonly solanaSmart: WalletLocator;
|
|
39
|
+
readonly solanaAddress: WalletLocator;
|
|
40
|
+
readonly evmAddress: WalletLocator;
|
|
41
|
+
readonly evmAddressWithSpecialChars: WalletLocator;
|
|
42
|
+
};
|
|
43
|
+
declare const TOKEN_LOCATORS: {
|
|
44
|
+
readonly eth: "base-sepolia:eth";
|
|
45
|
+
readonly usdc: "base-sepolia:usdc";
|
|
46
|
+
readonly sol: "solana:sol";
|
|
47
|
+
readonly customContract: "base-sepolia:0x1234567890123456789012345678901234567890";
|
|
48
|
+
readonly tokenWithSpecialChars: "base-sepolia:0xABCDEFabcdef0123456789ABCDEFabcdef012345";
|
|
49
|
+
};
|
|
50
|
+
declare const TIMEOUT_SHORT = 30000;
|
|
51
|
+
declare const TIMEOUT_MEDIUM = 60000;
|
|
52
|
+
declare const TIMEOUT_LONG = 120000;
|
|
53
|
+
declare const DELAY_SHORT = 200;
|
|
54
|
+
declare const DELAY_MEDIUM = 500;
|
|
55
|
+
declare const DELAY_LONG = 1000;
|
|
56
|
+
declare const DELAY_RATE_LIMIT_WINDOW = 2000;
|
|
57
|
+
/**
|
|
58
|
+
* Real blockchain addresses for integration tests with specific purposes.
|
|
59
|
+
* These are actual addresses used in integration tests for:
|
|
60
|
+
* - Admin signers (external wallet addresses for wallet creation)
|
|
61
|
+
* - Recipients (addresses to send tokens to)
|
|
62
|
+
* - Error testing (non-existent addresses)
|
|
63
|
+
* - General test operations
|
|
64
|
+
* Note: These are actual addresses, not locator format strings.
|
|
65
|
+
*/
|
|
66
|
+
declare const TEST_ADDRESSES: {
|
|
67
|
+
readonly EVM_ADMIN_SIGNER: "0xe5E91D9b21C3563011cc332B050150fb9211bBEB";
|
|
68
|
+
readonly SOLANA_ADMIN_SIGNER: "CsHuaddA9J8j9vSTdL9wpvBsyjYe4F7iQQLuPg3EUqsU";
|
|
69
|
+
readonly EVM_RECIPIENT: "0xDF8b5F9c19E187f1Ea00730a1e46180152244315";
|
|
70
|
+
readonly EVM_NON_EXISTENT: "0x0000000000000000000000000000000000000000";
|
|
71
|
+
readonly EVM_TEST: "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";
|
|
72
|
+
};
|
|
73
|
+
declare const TEST_VALUES: {
|
|
74
|
+
readonly FUNDING_AMOUNT_SMALL: 1;
|
|
75
|
+
readonly FUNDING_AMOUNT_LARGE: 10;
|
|
76
|
+
readonly SEND_AMOUNT_SMALL: "0.0001";
|
|
77
|
+
readonly SEND_AMOUNT_VERY_SMALL: "0.000000000000000001";
|
|
78
|
+
readonly SEND_AMOUNT_ZERO: "0";
|
|
79
|
+
readonly SEND_AMOUNT_INVALID: "999999999999999999.0";
|
|
80
|
+
readonly SEND_AMOUNT_EXTREME: "999999999999999999999999999999.999999999999999999";
|
|
81
|
+
readonly LONG_STRING_LENGTH: 10000;
|
|
82
|
+
readonly CONCURRENT_REQUESTS: 3;
|
|
83
|
+
readonly RAPID_SEQUENTIAL_COUNT: 3;
|
|
84
|
+
readonly RATE_LIMIT_BATCH_SIZE: 5;
|
|
85
|
+
readonly RATE_LIMIT_BATCHES: 3;
|
|
86
|
+
readonly RATE_LIMIT_RAPID_COUNT: 20;
|
|
87
|
+
readonly RATE_LIMIT_STRESS_COUNT: 50;
|
|
88
|
+
readonly APPROVE_TRANSACTION_MAX_RETRIES: 10;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Mock API key for unit tests.
|
|
92
|
+
* This is a valid development API key format used for testing purposes only.
|
|
93
|
+
*/
|
|
94
|
+
declare const MOCK_API_KEY = "ck_development_A61UZQnvjSQcM5qVBaBactgqebxafWAVsNdD2xLkgBxoYuH5q2guM8r9DUmZQzE1WYyoByGVYpEG2o9gVSzAZFsrLbfKGERUJ6D5CW6S9AsJGAc3ctgrsD4n2ioekzGj7KPbLwT3SysDjMamYXLxEroUbQSdwf6aLF4zeEpECq2crkTUQeLFzxzmjWNxFDHFYefDrfrFPCURvBXJLf5pCxCQ";
|
|
95
|
+
|
|
96
|
+
export { DELAY_LONG, DELAY_MEDIUM, DELAY_RATE_LIMIT_WINDOW, DELAY_SHORT, HTTP_ERROR_STATUSES, MOCK_API_KEY, TEST_ADDRESSES, TEST_VALUES, TIMEOUT_LONG, TIMEOUT_MEDIUM, TIMEOUT_SHORT, TOKEN_LOCATORS, WALLET_LOCATORS };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DELAY_LONG,
|
|
3
|
+
DELAY_MEDIUM,
|
|
4
|
+
DELAY_RATE_LIMIT_WINDOW,
|
|
5
|
+
DELAY_SHORT,
|
|
6
|
+
HTTP_ERROR_STATUSES,
|
|
7
|
+
MOCK_API_KEY,
|
|
8
|
+
TEST_ADDRESSES,
|
|
9
|
+
TEST_VALUES,
|
|
10
|
+
TIMEOUT_LONG,
|
|
11
|
+
TIMEOUT_MEDIUM,
|
|
12
|
+
TIMEOUT_SHORT,
|
|
13
|
+
TOKEN_LOCATORS,
|
|
14
|
+
WALLET_LOCATORS
|
|
15
|
+
} from "../../chunk-PJOJIRTY.js";
|
|
16
|
+
import "../../chunk-ASE2FXWP.js";
|
|
17
|
+
export {
|
|
18
|
+
DELAY_LONG,
|
|
19
|
+
DELAY_MEDIUM,
|
|
20
|
+
DELAY_RATE_LIMIT_WINDOW,
|
|
21
|
+
DELAY_SHORT,
|
|
22
|
+
HTTP_ERROR_STATUSES,
|
|
23
|
+
MOCK_API_KEY,
|
|
24
|
+
TEST_ADDRESSES,
|
|
25
|
+
TEST_VALUES,
|
|
26
|
+
TIMEOUT_LONG,
|
|
27
|
+
TIMEOUT_MEDIUM,
|
|
28
|
+
TIMEOUT_SHORT,
|
|
29
|
+
TOKEN_LOCATORS,
|
|
30
|
+
WALLET_LOCATORS
|
|
31
|
+
};
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkG6QJHFSYcjs = require('../../chunk-G6QJHFSY.cjs');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _chunkNFQT5TFOcjs = require('../../chunk-NFQT5TFO.cjs');
|
|
13
|
+
require('../../chunk-XC2V34TS.cjs');
|
|
14
|
+
require('../../chunk-WMUNQJYD.cjs');
|
|
15
|
+
require('../../chunk-PJTTM5QQ.cjs');
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
var _chunkUO2J2ZB2cjs = require('../../chunk-UO2J2ZB2.cjs');
|
|
21
|
+
|
|
22
|
+
// src/api/__tests__/test-utils.ts
|
|
23
|
+
var _vitest = require('vitest');
|
|
24
|
+
var createMockResponse = ({
|
|
25
|
+
data,
|
|
26
|
+
status = 200,
|
|
27
|
+
ok = true,
|
|
28
|
+
statusText = "OK"
|
|
29
|
+
}) => {
|
|
30
|
+
return {
|
|
31
|
+
json: _vitest.vi.fn().mockResolvedValue(data),
|
|
32
|
+
ok,
|
|
33
|
+
status,
|
|
34
|
+
statusText
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
var createMockSuccessResponse = (data) => createMockResponse({ data });
|
|
38
|
+
var createMockErrorResponse = (data, status = 400, statusText = "Bad Request") => createMockResponse({ data, status, ok: false, statusText });
|
|
39
|
+
var createMockCrossmint = (overrides = {}) => {
|
|
40
|
+
const base = _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {
|
|
41
|
+
apiKey: _chunkG6QJHFSYcjs.MOCK_API_KEY
|
|
42
|
+
}, overrides);
|
|
43
|
+
return _chunkUO2J2ZB2cjs.__spreadProps.call(void 0, _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {}, base), {
|
|
44
|
+
setJwt: _vitest.vi.fn().mockReturnThis(),
|
|
45
|
+
experimental_setCustomAuth: _vitest.vi.fn().mockReturnThis()
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
var createTestApiClient = (crossmint) => {
|
|
49
|
+
return new (0, _chunkNFQT5TFOcjs.ApiClient)(crossmint || createMockCrossmint());
|
|
50
|
+
};
|
|
51
|
+
var createServerSideApiClient = () => {
|
|
52
|
+
const apiClient = createTestApiClient();
|
|
53
|
+
Object.defineProperty(apiClient, "isServerSide", {
|
|
54
|
+
get: () => true,
|
|
55
|
+
configurable: true
|
|
56
|
+
});
|
|
57
|
+
return apiClient;
|
|
58
|
+
};
|
|
59
|
+
var extractFetchCall = (mockFn) => {
|
|
60
|
+
const calls = mockFn.mock.calls;
|
|
61
|
+
if (calls.length === 0) {
|
|
62
|
+
return void 0;
|
|
63
|
+
}
|
|
64
|
+
const lastCall = calls[calls.length - 1];
|
|
65
|
+
return {
|
|
66
|
+
path: lastCall[0],
|
|
67
|
+
options: lastCall[1]
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
var expectRequestPath = (call, expectedPath) => {
|
|
71
|
+
_vitest.expect.call(void 0, call == null ? void 0 : call.path).toBe(expectedPath);
|
|
72
|
+
};
|
|
73
|
+
var expectCommonHeaders = (headers) => {
|
|
74
|
+
const headerObj = headers;
|
|
75
|
+
_vitest.expect.call(void 0, headerObj["Content-Type"]).toBe("application/json");
|
|
76
|
+
};
|
|
77
|
+
var expectRequestBody = (options, expectedBody) => {
|
|
78
|
+
_vitest.expect.call(void 0, options.body).toBe(JSON.stringify(expectedBody));
|
|
79
|
+
};
|
|
80
|
+
var validateRequest = (call, expectedPath, expectedBody) => {
|
|
81
|
+
_vitest.expect.call(void 0, call).toBeDefined();
|
|
82
|
+
if (!call) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
expectRequestPath(call, expectedPath);
|
|
86
|
+
if (call.options.headers) {
|
|
87
|
+
expectCommonHeaders(call.options.headers);
|
|
88
|
+
}
|
|
89
|
+
if (expectedBody !== void 0 && call.options) {
|
|
90
|
+
expectRequestBody(call.options, expectedBody);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
var testHttpErrorResponse = (apiCall, mockFn, errorData, statusCode) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
94
|
+
mockFn.mockResolvedValue(createMockErrorResponse(errorData, statusCode));
|
|
95
|
+
const result = yield apiCall();
|
|
96
|
+
_vitest.expect.call(void 0, isErrorResponse(result)).toBe(true);
|
|
97
|
+
if (isErrorResponse(result)) {
|
|
98
|
+
_vitest.expect.call(void 0, result.error).toBe(true);
|
|
99
|
+
if (errorData.message) {
|
|
100
|
+
_vitest.expect.call(void 0, result.message).toBe(errorData.message);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
var testCommonHttpErrors = (_0, _1, ..._2) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, [_0, _1, ..._2], function* (apiCall, mockFn, skipStatuses = []) {
|
|
105
|
+
for (const { status, message } of _chunkG6QJHFSYcjs.HTTP_ERROR_STATUSES) {
|
|
106
|
+
if (skipStatuses.includes(status)) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const errorResponse = { error: true, message };
|
|
110
|
+
mockFn.mockResolvedValueOnce(createMockErrorResponse(errorResponse, status));
|
|
111
|
+
const result = yield apiCall();
|
|
112
|
+
_vitest.expect.call(void 0, isErrorResponse(result)).toBe(true);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
var testNetworkError = (apiCall, mockFn) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
116
|
+
mockFn.mockRejectedValue(new Error("Network error"));
|
|
117
|
+
yield _vitest.expect.call(void 0, apiCall()).rejects.toThrow("Network error");
|
|
118
|
+
});
|
|
119
|
+
var testInvalidJsonResponse = (apiCall, mockFn) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
120
|
+
const mockResponse = {
|
|
121
|
+
json: _vitest.vi.fn().mockRejectedValue(new Error("Invalid JSON")),
|
|
122
|
+
ok: true,
|
|
123
|
+
status: 200
|
|
124
|
+
};
|
|
125
|
+
mockFn.mockResolvedValue(mockResponse);
|
|
126
|
+
yield _vitest.expect.call(void 0, apiCall()).rejects.toThrow();
|
|
127
|
+
});
|
|
128
|
+
var testTimeoutError = (apiCall, mockFn) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
129
|
+
mockFn.mockImplementation(
|
|
130
|
+
() => new Promise((_, reject) => setTimeout(() => reject(new Error("Request timeout")), 0))
|
|
131
|
+
);
|
|
132
|
+
yield _vitest.expect.call(void 0, apiCall()).rejects.toThrow("Request timeout");
|
|
133
|
+
});
|
|
134
|
+
var testMalformedResponse = (apiCall, mockFn, malformedData) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
135
|
+
mockFn.mockResolvedValue(createMockSuccessResponse(malformedData));
|
|
136
|
+
const result = yield apiCall();
|
|
137
|
+
_vitest.expect.call(void 0, result).toEqual(malformedData);
|
|
138
|
+
});
|
|
139
|
+
var createMockWalletResponse = (overrides = {}) => _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {
|
|
140
|
+
address: _chunkG6QJHFSYcjs.WALLET_LOCATORS.evmAddress,
|
|
141
|
+
chainType: "evm",
|
|
142
|
+
type: "smart",
|
|
143
|
+
config: {
|
|
144
|
+
adminSigner: {
|
|
145
|
+
type: "external-wallet",
|
|
146
|
+
address: _chunkG6QJHFSYcjs.TEST_ADDRESSES.EVM_TEST
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}, overrides);
|
|
150
|
+
var createMockSendResponse = (overrides = {}) => _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {
|
|
151
|
+
id: "txn-123",
|
|
152
|
+
status: "pending",
|
|
153
|
+
chainType: "evm",
|
|
154
|
+
walletType: "evm-smart-wallet",
|
|
155
|
+
params: {
|
|
156
|
+
transaction: "0x1234567890abcdef",
|
|
157
|
+
signer: "api-key:test"
|
|
158
|
+
},
|
|
159
|
+
onChain: {
|
|
160
|
+
txId: "0xabcdef1234567890abcdef1234567890abcdef12",
|
|
161
|
+
explorerLink: "https://explorer.example.com/tx/0xabcdef1234567890abcdef1234567890abcdef12"
|
|
162
|
+
},
|
|
163
|
+
createdAt: Date.now()
|
|
164
|
+
}, overrides);
|
|
165
|
+
function isErrorResponse(response) {
|
|
166
|
+
return typeof response === "object" && response !== null && "error" in response && response.error === true;
|
|
167
|
+
}
|
|
168
|
+
function isSuccessWalletResponse(response) {
|
|
169
|
+
return typeof response === "object" && response !== null && "address" in response && "chainType" in response && "type" in response;
|
|
170
|
+
}
|
|
171
|
+
function isSuccessTransactionResponse(response) {
|
|
172
|
+
return typeof response === "object" && response !== null && "id" in response && "status" in response && "chainType" in response;
|
|
173
|
+
}
|
|
174
|
+
var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
175
|
+
var isValidEthereumAddress = (address) => {
|
|
176
|
+
return /^0x[a-fA-F0-9]{40}$/.test(address);
|
|
177
|
+
};
|
|
178
|
+
var isValidSolanaAddress = (address) => {
|
|
179
|
+
return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(address);
|
|
180
|
+
};
|
|
181
|
+
var createIntegrationApiClient = (apiKey, baseUrl, overrides = {}) => {
|
|
182
|
+
const base = _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {
|
|
183
|
+
apiKey
|
|
184
|
+
}, baseUrl && { overrideBaseUrl: baseUrl }), overrides);
|
|
185
|
+
const crossmint = _chunkUO2J2ZB2cjs.__spreadProps.call(void 0, _chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {}, base), {
|
|
186
|
+
setJwt: () => crossmint,
|
|
187
|
+
experimental_setCustomAuth: () => crossmint
|
|
188
|
+
});
|
|
189
|
+
return new (0, _chunkNFQT5TFOcjs.ApiClient)(crossmint);
|
|
190
|
+
};
|
|
191
|
+
var TestDataFactory = class {
|
|
192
|
+
constructor() {
|
|
193
|
+
this.wallets = [];
|
|
194
|
+
this.transactions = [];
|
|
195
|
+
}
|
|
196
|
+
addWallet(address) {
|
|
197
|
+
if (address && !this.wallets.includes(address)) {
|
|
198
|
+
this.wallets.push(address);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
addTransaction(id) {
|
|
202
|
+
if (id && !this.transactions.includes(id)) {
|
|
203
|
+
this.transactions.push(id);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
getWallet(index = 0) {
|
|
207
|
+
return this.wallets[index];
|
|
208
|
+
}
|
|
209
|
+
getTransaction(index = 0) {
|
|
210
|
+
return this.transactions[index];
|
|
211
|
+
}
|
|
212
|
+
hasWallets() {
|
|
213
|
+
return this.wallets.length > 0;
|
|
214
|
+
}
|
|
215
|
+
clear() {
|
|
216
|
+
this.wallets = [];
|
|
217
|
+
this.transactions = [];
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
function ensureWalletExists(_0, _1) {
|
|
221
|
+
return _chunkUO2J2ZB2cjs.__async.call(void 0, this, arguments, function* (apiClient, testData, options = {}) {
|
|
222
|
+
if (testData.hasWallets()) {
|
|
223
|
+
return testData.getWallet();
|
|
224
|
+
}
|
|
225
|
+
const { chainType = "evm", type = "mpc", owner, testName = "default" } = options;
|
|
226
|
+
const ownerId = owner || `userId:integration-${testName}-${Date.now()}`;
|
|
227
|
+
const createResult = yield apiClient.createWallet(_chunkUO2J2ZB2cjs.__spreadValues.call(void 0, {
|
|
228
|
+
chainType,
|
|
229
|
+
type
|
|
230
|
+
}, owner && { owner: ownerId }));
|
|
231
|
+
if (isSuccessWalletResponse(createResult)) {
|
|
232
|
+
testData.addWallet(createResult.address);
|
|
233
|
+
return createResult.address;
|
|
234
|
+
}
|
|
235
|
+
return void 0;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
function createTestWallet(apiClient, testData, params) {
|
|
239
|
+
return _chunkUO2J2ZB2cjs.__async.call(void 0, this, null, function* () {
|
|
240
|
+
const result = yield apiClient.createWallet(params);
|
|
241
|
+
if (isSuccessWalletResponse(result)) {
|
|
242
|
+
testData.addWallet(result.address);
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
function expectErrorResponse(response, message) {
|
|
248
|
+
_vitest.expect.call(void 0, isErrorResponse(response)).toBe(true);
|
|
249
|
+
if (message) {
|
|
250
|
+
_vitest.expect.call(void 0, response.message).toBeDefined();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function expectSuccessWalletResponse(response) {
|
|
254
|
+
_vitest.expect.call(void 0, isSuccessWalletResponse(response)).toBe(true);
|
|
255
|
+
}
|
|
256
|
+
function expectSuccessTransactionResponse(response) {
|
|
257
|
+
_vitest.expect.call(void 0, isSuccessTransactionResponse(response)).toBe(true);
|
|
258
|
+
}
|
|
259
|
+
var fundWallet = (apiClient, walletLocator, amount, token = "usdxm", chain = "base-sepolia") => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
260
|
+
const params = {
|
|
261
|
+
amount,
|
|
262
|
+
token,
|
|
263
|
+
chain
|
|
264
|
+
};
|
|
265
|
+
const result = yield apiClient.fundWallet(walletLocator, params);
|
|
266
|
+
if (isErrorResponse(result)) {
|
|
267
|
+
throw new Error(`Failed to fund wallet: ${result.message || "Unknown error"}`);
|
|
268
|
+
}
|
|
269
|
+
yield delay(_chunkG6QJHFSYcjs.DELAY_LONG);
|
|
270
|
+
return result;
|
|
271
|
+
});
|
|
272
|
+
var approveTransaction = (_0, _1, _2, ..._3) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, [_0, _1, _2, ..._3], function* (apiClient, walletLocator, transactionId, maxRetries = _chunkG6QJHFSYcjs.TEST_VALUES.APPROVE_TRANSACTION_MAX_RETRIES) {
|
|
273
|
+
var _a;
|
|
274
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
275
|
+
const transaction = yield apiClient.getTransaction(walletLocator, transactionId);
|
|
276
|
+
if (isErrorResponse(transaction)) {
|
|
277
|
+
throw new Error(`Transaction not found: ${transaction.message || "Unknown error"}`);
|
|
278
|
+
}
|
|
279
|
+
if ("status" in transaction && (transaction.status === "success" || transaction.status === "failed")) {
|
|
280
|
+
return transaction;
|
|
281
|
+
}
|
|
282
|
+
const pendingApprovals = "approvals" in transaction ? (_a = transaction.approvals) == null ? void 0 : _a.pending : void 0;
|
|
283
|
+
if (pendingApprovals && pendingApprovals.length > 0) {
|
|
284
|
+
const approvals = {
|
|
285
|
+
approvals: pendingApprovals.map((approval) => ({
|
|
286
|
+
signer: approval.signer.locator,
|
|
287
|
+
signature: ""
|
|
288
|
+
}))
|
|
289
|
+
};
|
|
290
|
+
const approvedTransaction = yield apiClient.approveTransaction(walletLocator, transactionId, approvals);
|
|
291
|
+
if (isErrorResponse(approvedTransaction)) {
|
|
292
|
+
throw new Error(`Failed to approve transaction: ${approvedTransaction.message || "Unknown error"}`);
|
|
293
|
+
}
|
|
294
|
+
yield delay(_chunkG6QJHFSYcjs.DELAY_RATE_LIMIT_WINDOW);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
yield delay(_chunkG6QJHFSYcjs.DELAY_LONG);
|
|
298
|
+
}
|
|
299
|
+
const finalTransaction = yield apiClient.getTransaction(walletLocator, transactionId);
|
|
300
|
+
if (isErrorResponse(finalTransaction)) {
|
|
301
|
+
throw new Error(`Transaction not found after retries: ${finalTransaction.message || "Unknown error"}`);
|
|
302
|
+
}
|
|
303
|
+
if (!("status" in finalTransaction)) {
|
|
304
|
+
throw new Error("Transaction response missing status property");
|
|
305
|
+
}
|
|
306
|
+
return finalTransaction;
|
|
307
|
+
});
|
|
308
|
+
var fundWalletAndWait = (apiClient, walletLocator, amount = 1, token = "usdxm", chain = "base-sepolia") => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
309
|
+
return fundWallet(apiClient, walletLocator, amount, token, chain);
|
|
310
|
+
});
|
|
311
|
+
var sendTokenAndApprove = (apiClient, walletLocator, tokenLocator, recipient, amount) => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
312
|
+
const sendResult = yield apiClient.send(walletLocator, tokenLocator, {
|
|
313
|
+
recipient,
|
|
314
|
+
amount
|
|
315
|
+
});
|
|
316
|
+
if (isErrorResponse(sendResult)) {
|
|
317
|
+
throw new Error(`Failed to send token: ${sendResult.message || "Unknown error"}`);
|
|
318
|
+
}
|
|
319
|
+
if (typeof sendResult === "object" && sendResult !== null && "id" in sendResult && typeof sendResult.id === "string") {
|
|
320
|
+
return approveTransaction(apiClient, walletLocator, sendResult.id);
|
|
321
|
+
}
|
|
322
|
+
throw new Error("Transaction ID not found in send response");
|
|
323
|
+
});
|
|
324
|
+
var ensureWalletFunded = (apiClient, walletLocator, amount = 1, token = "usdxm", chain = "base-sepolia") => _chunkUO2J2ZB2cjs.__async.call(void 0, void 0, null, function* () {
|
|
325
|
+
try {
|
|
326
|
+
yield fundWallet(apiClient, walletLocator, amount, token, chain);
|
|
327
|
+
} catch (error) {
|
|
328
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
329
|
+
if (!errorMessage.includes("already funded") && !errorMessage.includes("insufficient")) {
|
|
330
|
+
throw error;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
exports.TestDataFactory = TestDataFactory; exports.approveTransaction = approveTransaction; exports.createIntegrationApiClient = createIntegrationApiClient; exports.createMockCrossmint = createMockCrossmint; exports.createMockErrorResponse = createMockErrorResponse; exports.createMockResponse = createMockResponse; exports.createMockSendResponse = createMockSendResponse; exports.createMockSuccessResponse = createMockSuccessResponse; exports.createMockWalletResponse = createMockWalletResponse; exports.createServerSideApiClient = createServerSideApiClient; exports.createTestApiClient = createTestApiClient; exports.createTestWallet = createTestWallet; exports.delay = delay; exports.ensureWalletExists = ensureWalletExists; exports.ensureWalletFunded = ensureWalletFunded; exports.expectCommonHeaders = expectCommonHeaders; exports.expectErrorResponse = expectErrorResponse; exports.expectRequestBody = expectRequestBody; exports.expectRequestPath = expectRequestPath; exports.expectSuccessTransactionResponse = expectSuccessTransactionResponse; exports.expectSuccessWalletResponse = expectSuccessWalletResponse; exports.extractFetchCall = extractFetchCall; exports.fundWallet = fundWallet; exports.fundWalletAndWait = fundWalletAndWait; exports.isErrorResponse = isErrorResponse; exports.isSuccessTransactionResponse = isSuccessTransactionResponse; exports.isSuccessWalletResponse = isSuccessWalletResponse; exports.isValidEthereumAddress = isValidEthereumAddress; exports.isValidSolanaAddress = isValidSolanaAddress; exports.sendTokenAndApprove = sendTokenAndApprove; exports.testCommonHttpErrors = testCommonHttpErrors; exports.testHttpErrorResponse = testHttpErrorResponse; exports.testInvalidJsonResponse = testInvalidJsonResponse; exports.testMalformedResponse = testMalformedResponse; exports.testNetworkError = testNetworkError; exports.testTimeoutError = testTimeoutError; exports.validateRequest = validateRequest;
|