cards402 0.2.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +133 -0
  3. package/dist/__tests__/client.test.d.ts +2 -0
  4. package/dist/__tests__/client.test.d.ts.map +1 -0
  5. package/dist/__tests__/client.test.js +251 -0
  6. package/dist/__tests__/client.test.js.map +1 -0
  7. package/dist/__tests__/errors.test.d.ts +2 -0
  8. package/dist/__tests__/errors.test.d.ts.map +1 -0
  9. package/dist/__tests__/errors.test.js +177 -0
  10. package/dist/__tests__/errors.test.js.map +1 -0
  11. package/dist/__tests__/integration.test.d.ts +13 -0
  12. package/dist/__tests__/integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration.test.js +223 -0
  14. package/dist/__tests__/integration.test.js.map +1 -0
  15. package/dist/client.d.ts +116 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +261 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/errors.d.ts +66 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +148 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/index.d.ts +8 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +35 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mcp.d.ts +3 -0
  28. package/dist/mcp.d.ts.map +1 -0
  29. package/dist/mcp.js +521 -0
  30. package/dist/mcp.js.map +1 -0
  31. package/dist/ows.d.ts +121 -0
  32. package/dist/ows.d.ts.map +1 -0
  33. package/dist/ows.js +300 -0
  34. package/dist/ows.js.map +1 -0
  35. package/dist/soroban.d.ts +48 -0
  36. package/dist/soroban.d.ts.map +1 -0
  37. package/dist/soroban.js +132 -0
  38. package/dist/soroban.js.map +1 -0
  39. package/dist/stellar.d.ts +53 -0
  40. package/dist/stellar.d.ts.map +1 -0
  41. package/dist/stellar.js +156 -0
  42. package/dist/stellar.js.map +1 -0
  43. package/package.json +73 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CTX.com
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # cards402
2
+
3
+ Virtual Visa cards for AI agents — pay with USDC or XLM on Stellar, get a card number, CVV, and expiry in ~60 seconds.
4
+
5
+ [cards402.com](https://cards402.com) issues prepaid Visa virtual cards on demand. This SDK lets AI agents create an order, pay the cards402 Soroban receiver contract on Stellar, and receive card details programmatically — all in one call.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install cards402
11
+ ```
12
+
13
+ Requires Node.js 18 or newer (the SDK uses native `fetch`, `ReadableStream`, and `WebCrypto`). Supported platforms via the bundled `@ctx.com/stellar-ows-core` native wallet bindings: macOS (arm64 + x64), Linux (arm64 + x64). Windows is not currently supported.
14
+
15
+ ## Quick start
16
+
17
+ ```typescript
18
+ import { createOWSWallet, getOWSBalance, purchaseCardOWS } from 'cards402';
19
+
20
+ // 1. Create (or fetch existing) encrypted wallet. Idempotent.
21
+ const { publicKey } = createOWSWallet('my-agent');
22
+ console.log('Fund this Stellar address:', publicKey);
23
+
24
+ // 2. Pause here until the address has funds. Re-run to check:
25
+ const bal = await getOWSBalance('my-agent');
26
+ console.log(`XLM: ${bal.xlm} USDC: ${bal.usdc}`);
27
+
28
+ // 3. Purchase a card — only do this when the user explicitly asks.
29
+ const card = await purchaseCardOWS({
30
+ apiKey: process.env.CARDS402_API_KEY!,
31
+ walletName: 'my-agent',
32
+ amountUsdc: '10.00',
33
+ paymentAsset: 'xlm', // or 'usdc' (trustline added automatically)
34
+ });
35
+
36
+ console.log(card.number, card.cvv, card.expiry);
37
+ ```
38
+
39
+ `purchaseCardOWS` handles the whole flow:
40
+
41
+ 1. `POST /v1/orders` with the amount
42
+ 2. Sign + submit the Soroban payment from your OWS wallet
43
+ 3. Subscribe to the SSE stream at `/v1/orders/:id/stream`
44
+ 4. Return the card details as soon as the `ready` event arrives
45
+
46
+ No polling loops, no webhook endpoint required.
47
+
48
+ ## Funding your wallet
49
+
50
+ Stellar accounts need a minimum balance to be activated on-chain:
51
+
52
+ - **Pay with XLM:** send ≥ 1 XLM to cover the base reserve, plus whatever XLM the card costs at the current spot rate (shown in `payment.xlm.amount` when you create an order).
53
+ - **Pay with USDC:** send ≥ 2 XLM (1 base reserve + 1 for the USDC trustline entry), plus the USDC card amount. The SDK will add the trustline automatically the first time you purchase with USDC, so you just need the ≥ 2 XLM on-chain before calling `purchaseCardOWS`.
54
+
55
+ ## Step-by-step API (for more control)
56
+
57
+ ```typescript
58
+ import { Cards402Client } from 'cards402';
59
+
60
+ const client = new Cards402Client({
61
+ apiKey: process.env.CARDS402_API_KEY!,
62
+ // baseUrl defaults to https://api.cards402.com/v1
63
+ });
64
+
65
+ // Create the order
66
+ const order = await client.createOrder({ amount_usdc: '10.00' });
67
+ console.log(`Pay ${order.payment.xlm.amount} XLM to contract ${order.payment.contract_id}`);
68
+
69
+ // ... submit the Soroban transaction yourself, or use the payViaContract helpers ...
70
+
71
+ // Wait for delivery (uses SSE under the hood, with polling fallback)
72
+ const card = await client.waitForCard(order.order_id, { timeoutMs: 120000 });
73
+ console.log(card.number, card.cvv, card.expiry);
74
+ ```
75
+
76
+ ## MCP server — for Claude Desktop, Cursor, and other MCP clients
77
+
78
+ Add to your client's `mcpServers` config:
79
+
80
+ ```json
81
+ {
82
+ "mcpServers": {
83
+ "cards402": {
84
+ "command": "npx",
85
+ "args": ["-y", "cards402"],
86
+ "env": { "CARDS402_API_KEY": "cards402_<your key>" }
87
+ }
88
+ }
89
+ }
90
+ ```
91
+
92
+ The MCP server exposes four tools: `setup_wallet`, `check_budget`, `check_order`, and `purchase_vcc`.
93
+
94
+ ## Error handling
95
+
96
+ All SDK errors inherit from `Cards402Error`. Typed subclasses let you react to specific failure modes:
97
+
98
+ ```typescript
99
+ import {
100
+ Cards402Error,
101
+ AuthError,
102
+ SpendLimitError,
103
+ RateLimitError,
104
+ ServiceUnavailableError,
105
+ InvalidAmountError,
106
+ OrderFailedError,
107
+ WaitTimeoutError,
108
+ } from 'cards402';
109
+
110
+ try {
111
+ const card = await purchaseCardOWS({ ... });
112
+ } catch (err) {
113
+ if (err instanceof SpendLimitError) { /* cap reached — ask owner to raise */ }
114
+ else if (err instanceof OrderFailedError) { /* check err.refund for refund tx */ }
115
+ else if (err instanceof WaitTimeoutError) { /* network flake or stalled fulfillment */ }
116
+ else if (err instanceof AuthError) { /* bad key */ }
117
+ }
118
+ ```
119
+
120
+ ## Keeping card details safe
121
+
122
+ `purchaseCardOWS` returns the card PAN, CVV, and expiry as plain strings. **Treat them as secrets.** Don't log them, don't write them to disk, don't send them to observability pipelines unless those pipelines are explicitly PCI-compliant.
123
+
124
+ ## Links
125
+
126
+ - [cards402.com](https://cards402.com) — dashboard and docs
127
+ - [cards402.com/docs](https://cards402.com/docs) — full API reference
128
+ - [cards402.com/agents.txt](https://cards402.com/agents.txt) — machine-readable agent integration guide
129
+ - [github.com/CTX-com/Cards402](https://github.com/CTX-com/Cards402) — source
130
+
131
+ ## License
132
+
133
+ MIT — see [LICENSE](./LICENSE).
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const client_1 = require("../client");
5
+ const errors_1 = require("../errors");
6
+ // ── Helpers ──────────────────────────────────────────────────────────────────
7
+ function mockFetch(status, body) {
8
+ global.fetch = vitest_1.vi.fn().mockResolvedValue({
9
+ ok: status >= 200 && status < 300,
10
+ status,
11
+ json: async () => body,
12
+ });
13
+ }
14
+ function client() {
15
+ return new client_1.Cards402Client({ baseUrl: 'http://localhost:3000/v1', apiKey: 'cards402_test_key' });
16
+ }
17
+ const ORDER_RESPONSE = {
18
+ order_id: 'ord_abc',
19
+ status: 'pending_payment',
20
+ payment: {
21
+ type: 'soroban_contract',
22
+ contract_id: 'CARDS402CONTRACTIDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
23
+ order_id: 'ord_abc',
24
+ usdc: { amount: '10.00', asset: 'USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN' },
25
+ xlm: { amount: '72.00' },
26
+ },
27
+ poll_url: '/v1/orders/ord_abc',
28
+ budget: { spent_usdc: '0.00', limit_usdc: null, remaining_usdc: null },
29
+ };
30
+ const ORDER_STATUS_PENDING = {
31
+ order_id: 'ord_abc',
32
+ status: 'pending_payment',
33
+ phase: 'awaiting_payment',
34
+ amount_usdc: '10.00',
35
+ payment_asset: 'usdc',
36
+ created_at: '2025-01-01T00:00:00Z',
37
+ updated_at: '2025-01-01T00:00:00Z',
38
+ };
39
+ const ORDER_STATUS_READY = {
40
+ ...ORDER_STATUS_PENDING,
41
+ status: 'delivered',
42
+ phase: 'ready',
43
+ card: { number: '4111111111111111', cvv: '123', expiry: '12/27', brand: 'Visa' },
44
+ };
45
+ // ── createOrder ───────────────────────────────────────────────────────────────
46
+ (0, vitest_1.describe)('Cards402Client.createOrder', () => {
47
+ (0, vitest_1.beforeEach)(() => { vitest_1.vi.restoreAllMocks(); });
48
+ (0, vitest_1.it)('creates a USDC order and returns response', async () => {
49
+ mockFetch(201, ORDER_RESPONSE);
50
+ const res = await client().createOrder({ amount_usdc: '10.00' });
51
+ (0, vitest_1.expect)(res.order_id).toBe('ord_abc');
52
+ (0, vitest_1.expect)(res.payment.type).toBe('soroban_contract');
53
+ (0, vitest_1.expect)(res.payment.contract_id).toBe('CARDS402CONTRACTIDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
54
+ (0, vitest_1.expect)(res.payment.order_id).toBe('ord_abc');
55
+ (0, vitest_1.expect)(res.budget.spent_usdc).toBe('0.00');
56
+ });
57
+ (0, vitest_1.it)('sends correct headers and body', async () => {
58
+ const fetchMock = vitest_1.vi.fn().mockResolvedValue({ ok: true, status: 201, json: async () => ORDER_RESPONSE });
59
+ global.fetch = fetchMock;
60
+ await client().createOrder({ amount_usdc: '10.00' });
61
+ (0, vitest_1.expect)(fetchMock).toHaveBeenCalledOnce();
62
+ const [url, opts] = fetchMock.mock.calls[0];
63
+ (0, vitest_1.expect)(url).toBe('http://localhost:3000/v1/orders');
64
+ (0, vitest_1.expect)(opts.headers['X-Api-Key']).toBe('cards402_test_key');
65
+ (0, vitest_1.expect)(opts.headers['Content-Type']).toBe('application/json');
66
+ const parsed = JSON.parse(opts.body);
67
+ (0, vitest_1.expect)(parsed.amount_usdc).toBe('10.00');
68
+ });
69
+ (0, vitest_1.it)('throws AuthError on 401', async () => {
70
+ mockFetch(401, { error: 'invalid_api_key' });
71
+ await (0, vitest_1.expect)(client().createOrder({ amount_usdc: '10.00' })).rejects.toThrow(errors_1.AuthError);
72
+ });
73
+ (0, vitest_1.it)('throws SpendLimitError on 403 spend_limit_exceeded', async () => {
74
+ mockFetch(403, { error: 'spend_limit_exceeded', limit: '50.00', spent: '50.00' });
75
+ const err = await client().createOrder({ amount_usdc: '10.00' }).catch(e => e);
76
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.SpendLimitError);
77
+ (0, vitest_1.expect)(err.limit).toBe('50.00');
78
+ });
79
+ (0, vitest_1.it)('throws RateLimitError on 429', async () => {
80
+ mockFetch(429, { error: 'rate_limit_exceeded' });
81
+ await (0, vitest_1.expect)(client().createOrder({ amount_usdc: '10.00' })).rejects.toThrow(errors_1.RateLimitError);
82
+ });
83
+ (0, vitest_1.it)('throws ServiceUnavailableError on 503', async () => {
84
+ mockFetch(503, { error: 'service_temporarily_unavailable' });
85
+ await (0, vitest_1.expect)(client().createOrder({ amount_usdc: '10.00' })).rejects.toThrow(errors_1.ServiceUnavailableError);
86
+ });
87
+ (0, vitest_1.it)('throws InvalidAmountError on 400 invalid_amount', async () => {
88
+ mockFetch(400, { error: 'invalid_amount' });
89
+ await (0, vitest_1.expect)(client().createOrder({ amount_usdc: '0' })).rejects.toThrow(errors_1.InvalidAmountError);
90
+ });
91
+ (0, vitest_1.it)('strips trailing slash from baseUrl', async () => {
92
+ const fetchMock = vitest_1.vi.fn().mockResolvedValue({ ok: true, status: 201, json: async () => ORDER_RESPONSE });
93
+ global.fetch = fetchMock;
94
+ const c = new client_1.Cards402Client({ baseUrl: 'http://localhost:3000/v1/', apiKey: 'k' });
95
+ await c.createOrder({ amount_usdc: '10.00' });
96
+ const [url] = fetchMock.mock.calls[0];
97
+ (0, vitest_1.expect)(url).toBe('http://localhost:3000/v1/orders');
98
+ });
99
+ });
100
+ // ── getOrder ──────────────────────────────────────────────────────────────────
101
+ (0, vitest_1.describe)('Cards402Client.getOrder', () => {
102
+ (0, vitest_1.beforeEach)(() => { vitest_1.vi.restoreAllMocks(); });
103
+ (0, vitest_1.it)('returns order status with phase', async () => {
104
+ mockFetch(200, ORDER_STATUS_PENDING);
105
+ const order = await client().getOrder('ord_abc');
106
+ (0, vitest_1.expect)(order.order_id).toBe('ord_abc');
107
+ (0, vitest_1.expect)(order.phase).toBe('awaiting_payment');
108
+ (0, vitest_1.expect)(order.status).toBe('pending_payment');
109
+ });
110
+ (0, vitest_1.it)('returns card details for delivered order', async () => {
111
+ mockFetch(200, ORDER_STATUS_READY);
112
+ const order = await client().getOrder('ord_abc');
113
+ (0, vitest_1.expect)(order.phase).toBe('ready');
114
+ (0, vitest_1.expect)(order.card?.number).toBe('4111111111111111');
115
+ });
116
+ (0, vitest_1.it)('throws AuthError on 401', async () => {
117
+ mockFetch(401, { error: 'invalid_api_key' });
118
+ await (0, vitest_1.expect)(client().getOrder('ord_abc')).rejects.toThrow(errors_1.AuthError);
119
+ });
120
+ });
121
+ // ── waitForCard ───────────────────────────────────────────────────────────────
122
+ (0, vitest_1.describe)('Cards402Client.waitForCard', () => {
123
+ (0, vitest_1.beforeEach)(() => { vitest_1.vi.restoreAllMocks(); vitest_1.vi.useFakeTimers(); });
124
+ (0, vitest_1.afterEach)(() => { vitest_1.vi.useRealTimers(); });
125
+ (0, vitest_1.it)('returns card immediately when order is already ready', async () => {
126
+ mockFetch(200, ORDER_STATUS_READY);
127
+ const card = await client().waitForCard('ord_abc', { timeoutMs: 5000, intervalMs: 100 });
128
+ (0, vitest_1.expect)(card.number).toBe('4111111111111111');
129
+ });
130
+ (0, vitest_1.it)('polls until ready', async () => {
131
+ const fetchMock = vitest_1.vi.fn()
132
+ .mockResolvedValueOnce({ ok: true, status: 200, json: async () => ORDER_STATUS_PENDING })
133
+ .mockResolvedValueOnce({ ok: true, status: 200, json: async () => ORDER_STATUS_READY });
134
+ global.fetch = fetchMock;
135
+ const promise = client().waitForCard('ord_abc', { timeoutMs: 10000, intervalMs: 50 });
136
+ // Advance timers to allow polling
137
+ await vitest_1.vi.runAllTimersAsync();
138
+ const card = await promise;
139
+ (0, vitest_1.expect)(card.number).toBe('4111111111111111');
140
+ (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(2);
141
+ });
142
+ (0, vitest_1.it)('throws OrderFailedError when phase=failed', async () => {
143
+ mockFetch(200, {
144
+ ...ORDER_STATUS_PENDING,
145
+ phase: 'failed',
146
+ status: 'failed',
147
+ error: 'supplier unavailable',
148
+ });
149
+ await (0, vitest_1.expect)(client().waitForCard('ord_abc', { timeoutMs: 5000, intervalMs: 100 })).rejects.toThrow(errors_1.OrderFailedError);
150
+ });
151
+ (0, vitest_1.it)('throws OrderFailedError with refund info when phase=refunded', async () => {
152
+ mockFetch(200, {
153
+ ...ORDER_STATUS_PENDING,
154
+ phase: 'refunded',
155
+ status: 'refunded',
156
+ refund: { stellar_txid: 'txid_xyz' },
157
+ });
158
+ const err = await client().waitForCard('ord_abc', { timeoutMs: 5000, intervalMs: 100 }).catch(e => e);
159
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.OrderFailedError);
160
+ (0, vitest_1.expect)(err.refund).toEqual({ stellar_txid: 'txid_xyz' });
161
+ });
162
+ (0, vitest_1.it)('throws OrderFailedError when phase=expired', async () => {
163
+ mockFetch(200, {
164
+ ...ORDER_STATUS_PENDING,
165
+ phase: 'expired',
166
+ status: 'expired',
167
+ });
168
+ const err = await client().waitForCard('ord_abc', { timeoutMs: 5000, intervalMs: 100 }).catch(e => e);
169
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.OrderFailedError);
170
+ (0, vitest_1.expect)(err.message).toContain('expired');
171
+ });
172
+ (0, vitest_1.it)('throws WaitTimeoutError after deadline', async () => {
173
+ mockFetch(200, ORDER_STATUS_PENDING);
174
+ // Attach .catch BEFORE advancing timers so the rejection is handled synchronously
175
+ const errPromise = client().waitForCard('ord_abc', { timeoutMs: 100, intervalMs: 50 })
176
+ .catch(e => e);
177
+ await vitest_1.vi.runAllTimersAsync();
178
+ const err = await errPromise;
179
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.WaitTimeoutError);
180
+ (0, vitest_1.expect)(err.orderId).toBe('ord_abc');
181
+ });
182
+ });
183
+ // ── listOrders ────────────────────────────────────────────────────────────────
184
+ (0, vitest_1.describe)('Cards402Client.listOrders', () => {
185
+ (0, vitest_1.beforeEach)(() => { vitest_1.vi.restoreAllMocks(); });
186
+ (0, vitest_1.it)('returns list of orders', async () => {
187
+ // List endpoint returns { id, status, amount_usdc, payment_asset, created_at, updated_at }
188
+ const listItems = [
189
+ { id: 'ord_abc', status: 'pending_payment', amount_usdc: '10.00', payment_asset: 'usdc', created_at: '2025-01-01T00:00:00Z', updated_at: '2025-01-01T00:00:00Z' },
190
+ { id: 'ord_def', status: 'delivered', amount_usdc: '10.00', payment_asset: 'usdc', created_at: '2025-01-01T00:00:00Z', updated_at: '2025-01-01T00:00:00Z' },
191
+ ];
192
+ mockFetch(200, listItems);
193
+ const orders = await client().listOrders();
194
+ (0, vitest_1.expect)(orders).toHaveLength(2);
195
+ (0, vitest_1.expect)(orders[0]?.id).toBe('ord_abc');
196
+ });
197
+ (0, vitest_1.it)('sends status filter as query param', async () => {
198
+ const fetchMock = vitest_1.vi.fn().mockResolvedValue({ ok: true, status: 200, json: async () => [] });
199
+ global.fetch = fetchMock;
200
+ await client().listOrders({ status: 'delivered' });
201
+ const [url] = fetchMock.mock.calls[0];
202
+ (0, vitest_1.expect)(url).toContain('status=delivered');
203
+ });
204
+ (0, vitest_1.it)('sends limit as query param', async () => {
205
+ const fetchMock = vitest_1.vi.fn().mockResolvedValue({ ok: true, status: 200, json: async () => [] });
206
+ global.fetch = fetchMock;
207
+ await client().listOrders({ limit: 5 });
208
+ const [url] = fetchMock.mock.calls[0];
209
+ (0, vitest_1.expect)(url).toContain('limit=5');
210
+ });
211
+ (0, vitest_1.it)('returns empty array when no orders', async () => {
212
+ mockFetch(200, []);
213
+ const orders = await client().listOrders();
214
+ (0, vitest_1.expect)(orders).toEqual([]);
215
+ });
216
+ (0, vitest_1.it)('throws on error status', async () => {
217
+ mockFetch(401, { error: 'invalid_api_key' });
218
+ await (0, vitest_1.expect)(client().listOrders()).rejects.toThrow();
219
+ });
220
+ });
221
+ // ── getUsage ──────────────────────────────────────────────────────────────────
222
+ (0, vitest_1.describe)('Cards402Client.getUsage', () => {
223
+ (0, vitest_1.beforeEach)(() => { vitest_1.vi.restoreAllMocks(); });
224
+ const USAGE = {
225
+ api_key_id: 'key_1',
226
+ label: 'my-agent',
227
+ budget: { spent_usdc: '10.00', limit_usdc: '100.00', remaining_usdc: '90.00' },
228
+ orders: { total: 3, delivered: 2, failed: 1, refunded: 0, in_progress: 0 },
229
+ };
230
+ (0, vitest_1.it)('returns usage summary', async () => {
231
+ mockFetch(200, USAGE);
232
+ const usage = await client().getUsage();
233
+ (0, vitest_1.expect)(usage.budget.spent_usdc).toBe('10.00');
234
+ (0, vitest_1.expect)(usage.orders.total).toBe(3);
235
+ (0, vitest_1.expect)(usage.orders.delivered).toBe(2);
236
+ });
237
+ (0, vitest_1.it)('handles unlimited budget (null fields)', async () => {
238
+ mockFetch(200, {
239
+ ...USAGE,
240
+ budget: { spent_usdc: '0.00', limit_usdc: null, remaining_usdc: null },
241
+ });
242
+ const usage = await client().getUsage();
243
+ (0, vitest_1.expect)(usage.budget.limit_usdc).toBeNull();
244
+ (0, vitest_1.expect)(usage.budget.remaining_usdc).toBeNull();
245
+ });
246
+ (0, vitest_1.it)('throws on error status', async () => {
247
+ mockFetch(401, {});
248
+ await (0, vitest_1.expect)(client().getUsage()).rejects.toThrow();
249
+ });
250
+ });
251
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/__tests__/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const errors_1 = require("../errors");
5
+ (0, vitest_1.describe)('Cards402Error', () => {
6
+ (0, vitest_1.it)('is an instance of Error', () => {
7
+ const err = new errors_1.Cards402Error('msg', 'code', 400);
8
+ (0, vitest_1.expect)(err).toBeInstanceOf(Error);
9
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.Cards402Error);
10
+ });
11
+ (0, vitest_1.it)('sets message, code, status', () => {
12
+ const err = new errors_1.Cards402Error('something broke', 'test_code', 422);
13
+ (0, vitest_1.expect)(err.message).toBe('something broke');
14
+ (0, vitest_1.expect)(err.code).toBe('test_code');
15
+ (0, vitest_1.expect)(err.status).toBe(422);
16
+ (0, vitest_1.expect)(err.name).toBe('Cards402Error');
17
+ });
18
+ (0, vitest_1.it)('stores raw payload', () => {
19
+ const raw = { detail: 'extra' };
20
+ const err = new errors_1.Cards402Error('msg', 'code', 400, raw);
21
+ (0, vitest_1.expect)(err.raw).toBe(raw);
22
+ });
23
+ });
24
+ (0, vitest_1.describe)('SpendLimitError', () => {
25
+ (0, vitest_1.it)('is instanceof Cards402Error and SpendLimitError', () => {
26
+ const err = new errors_1.SpendLimitError('100.00', '85.00');
27
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.Cards402Error);
28
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.SpendLimitError);
29
+ });
30
+ (0, vitest_1.it)('sets limit and spent fields', () => {
31
+ const err = new errors_1.SpendLimitError('50.00', '50.00');
32
+ (0, vitest_1.expect)(err.limit).toBe('50.00');
33
+ (0, vitest_1.expect)(err.spent).toBe('50.00');
34
+ (0, vitest_1.expect)(err.code).toBe('spend_limit_exceeded');
35
+ (0, vitest_1.expect)(err.status).toBe(403);
36
+ (0, vitest_1.expect)(err.name).toBe('SpendLimitError');
37
+ });
38
+ (0, vitest_1.it)('includes amounts in message', () => {
39
+ const err = new errors_1.SpendLimitError('100.00', '99.99');
40
+ (0, vitest_1.expect)(err.message).toContain('99.99');
41
+ (0, vitest_1.expect)(err.message).toContain('100.00');
42
+ });
43
+ });
44
+ (0, vitest_1.describe)('RateLimitError', () => {
45
+ (0, vitest_1.it)('has correct code and status', () => {
46
+ const err = new errors_1.RateLimitError();
47
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.Cards402Error);
48
+ (0, vitest_1.expect)(err.code).toBe('rate_limit_exceeded');
49
+ (0, vitest_1.expect)(err.status).toBe(429);
50
+ (0, vitest_1.expect)(err.name).toBe('RateLimitError');
51
+ });
52
+ });
53
+ (0, vitest_1.describe)('ServiceUnavailableError', () => {
54
+ (0, vitest_1.it)('has correct code and status', () => {
55
+ const err = new errors_1.ServiceUnavailableError();
56
+ (0, vitest_1.expect)(err.code).toBe('service_temporarily_unavailable');
57
+ (0, vitest_1.expect)(err.status).toBe(503);
58
+ (0, vitest_1.expect)(err.name).toBe('ServiceUnavailableError');
59
+ });
60
+ (0, vitest_1.it)('accepts custom message', () => {
61
+ const err = new errors_1.ServiceUnavailableError('custom msg');
62
+ (0, vitest_1.expect)(err.message).toBe('custom msg');
63
+ });
64
+ });
65
+ (0, vitest_1.describe)('PriceUnavailableError', () => {
66
+ (0, vitest_1.it)('has correct code and status', () => {
67
+ const err = new errors_1.PriceUnavailableError();
68
+ (0, vitest_1.expect)(err.code).toBe('price_unavailable');
69
+ (0, vitest_1.expect)(err.status).toBe(503);
70
+ });
71
+ (0, vitest_1.it)('accepts custom message', () => {
72
+ const err = new errors_1.PriceUnavailableError('price is down');
73
+ (0, vitest_1.expect)(err.message).toBe('price is down');
74
+ });
75
+ });
76
+ (0, vitest_1.describe)('InvalidAmountError', () => {
77
+ (0, vitest_1.it)('has correct code and status', () => {
78
+ const err = new errors_1.InvalidAmountError();
79
+ (0, vitest_1.expect)(err.code).toBe('invalid_amount');
80
+ (0, vitest_1.expect)(err.status).toBe(400);
81
+ (0, vitest_1.expect)(err.name).toBe('InvalidAmountError');
82
+ });
83
+ });
84
+ (0, vitest_1.describe)('AuthError', () => {
85
+ (0, vitest_1.it)('has correct code and status', () => {
86
+ const err = new errors_1.AuthError();
87
+ (0, vitest_1.expect)(err.code).toBe('invalid_api_key');
88
+ (0, vitest_1.expect)(err.status).toBe(401);
89
+ (0, vitest_1.expect)(err.name).toBe('AuthError');
90
+ });
91
+ });
92
+ (0, vitest_1.describe)('OrderFailedError', () => {
93
+ (0, vitest_1.it)('sets orderId and reason', () => {
94
+ const err = new errors_1.OrderFailedError('ord_123', 'supplier error');
95
+ (0, vitest_1.expect)(err.orderId).toBe('ord_123');
96
+ (0, vitest_1.expect)(err.code).toBe('order_failed');
97
+ (0, vitest_1.expect)(err.name).toBe('OrderFailedError');
98
+ });
99
+ (0, vitest_1.it)('includes refund txid in message when provided', () => {
100
+ const err = new errors_1.OrderFailedError('ord_456', 'failed', { stellar_txid: 'abc123' });
101
+ (0, vitest_1.expect)(err.refund).toEqual({ stellar_txid: 'abc123' });
102
+ (0, vitest_1.expect)(err.message).toContain('abc123');
103
+ });
104
+ (0, vitest_1.it)('says refund will be processed when no refund', () => {
105
+ const err = new errors_1.OrderFailedError('ord_789', 'failed');
106
+ (0, vitest_1.expect)(err.refund).toBeUndefined();
107
+ (0, vitest_1.expect)(err.message).toContain('refund');
108
+ });
109
+ (0, vitest_1.it)('is instanceof Cards402Error', () => {
110
+ (0, vitest_1.expect)(new errors_1.OrderFailedError('x', 'y')).toBeInstanceOf(errors_1.Cards402Error);
111
+ });
112
+ });
113
+ (0, vitest_1.describe)('WaitTimeoutError', () => {
114
+ (0, vitest_1.it)('includes orderId and timeout in message', () => {
115
+ const err = new errors_1.WaitTimeoutError('ord_abc', 300000);
116
+ (0, vitest_1.expect)(err.orderId).toBe('ord_abc');
117
+ (0, vitest_1.expect)(err.message).toContain('300s');
118
+ (0, vitest_1.expect)(err.message).toContain('ord_abc');
119
+ (0, vitest_1.expect)(err.code).toBe('wait_timeout');
120
+ (0, vitest_1.expect)(err.status).toBe(408);
121
+ });
122
+ (0, vitest_1.it)('is instanceof Cards402Error', () => {
123
+ (0, vitest_1.expect)(new errors_1.WaitTimeoutError('x', 1000)).toBeInstanceOf(errors_1.Cards402Error);
124
+ });
125
+ });
126
+ (0, vitest_1.describe)('parseApiError', () => {
127
+ (0, vitest_1.it)('returns SpendLimitError for spend_limit_exceeded', () => {
128
+ const err = (0, errors_1.parseApiError)(403, { error: 'spend_limit_exceeded', limit: '100.00', spent: '100.00' });
129
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.SpendLimitError);
130
+ const sle = err;
131
+ (0, vitest_1.expect)(sle.limit).toBe('100.00');
132
+ (0, vitest_1.expect)(sle.spent).toBe('100.00');
133
+ });
134
+ (0, vitest_1.it)('returns RateLimitError for rate_limit_exceeded', () => {
135
+ const err = (0, errors_1.parseApiError)(429, { error: 'rate_limit_exceeded' });
136
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.RateLimitError);
137
+ });
138
+ (0, vitest_1.it)('returns ServiceUnavailableError for service_temporarily_unavailable', () => {
139
+ const err = (0, errors_1.parseApiError)(503, { error: 'service_temporarily_unavailable', message: 'frozen' });
140
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.ServiceUnavailableError);
141
+ (0, vitest_1.expect)(err.message).toBe('frozen');
142
+ });
143
+ (0, vitest_1.it)('returns PriceUnavailableError for price_unavailable', () => {
144
+ const err = (0, errors_1.parseApiError)(503, { error: 'price_unavailable' });
145
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.PriceUnavailableError);
146
+ });
147
+ (0, vitest_1.it)('returns InvalidAmountError for invalid_amount', () => {
148
+ const err = (0, errors_1.parseApiError)(400, { error: 'invalid_amount' });
149
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.InvalidAmountError);
150
+ });
151
+ (0, vitest_1.it)('returns AuthError for missing_api_key', () => {
152
+ const err = (0, errors_1.parseApiError)(401, { error: 'missing_api_key' });
153
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.AuthError);
154
+ });
155
+ (0, vitest_1.it)('returns AuthError for invalid_api_key', () => {
156
+ const err = (0, errors_1.parseApiError)(401, { error: 'invalid_api_key' });
157
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.AuthError);
158
+ });
159
+ (0, vitest_1.it)('returns generic Cards402Error for unknown codes', () => {
160
+ const err = (0, errors_1.parseApiError)(500, { error: 'internal_error', message: 'oops' });
161
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.Cards402Error);
162
+ (0, vitest_1.expect)(err).not.toBeInstanceOf(errors_1.SpendLimitError);
163
+ (0, vitest_1.expect)(err.code).toBe('internal_error');
164
+ (0, vitest_1.expect)(err.message).toBe('oops');
165
+ (0, vitest_1.expect)(err.status).toBe(500);
166
+ });
167
+ (0, vitest_1.it)('falls back to error field as message when message is absent', () => {
168
+ const err = (0, errors_1.parseApiError)(400, { error: 'some_code' });
169
+ (0, vitest_1.expect)(err.message).toBe('some_code');
170
+ });
171
+ (0, vitest_1.it)('handles missing body fields gracefully', () => {
172
+ const err = (0, errors_1.parseApiError)(500, {});
173
+ (0, vitest_1.expect)(err).toBeInstanceOf(errors_1.Cards402Error);
174
+ (0, vitest_1.expect)(err.code).toBe('unknown');
175
+ });
176
+ });
177
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}