stablevoy 1.1.0 → 1.3.0
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 +18 -0
- package/README.md +35 -2
- package/dist/ConnectionOptions.d.ts +16 -0
- package/dist/ConnectionOptions.d.ts.map +1 -0
- package/dist/ConnectionOptions.js +2 -0
- package/dist/ConnectionOptions.js.map +1 -0
- package/dist/Stablevoy.d.ts +2 -13
- package/dist/Stablevoy.d.ts.map +1 -1
- package/dist/Stablevoy.js +2 -21
- package/dist/Stablevoy.js.map +1 -1
- package/dist/StablevoyConnect.d.ts +25 -0
- package/dist/StablevoyConnect.d.ts.map +1 -0
- package/dist/StablevoyConnect.js +25 -0
- package/dist/StablevoyConnect.js.map +1 -0
- package/dist/errors/ApiError.d.ts +5 -0
- package/dist/errors/ApiError.d.ts.map +1 -1
- package/dist/errors/ApiError.js +5 -0
- package/dist/errors/ApiError.js.map +1 -1
- package/dist/http/ErrorFactory.d.ts.map +1 -1
- package/dist/http/ErrorFactory.js +1 -0
- package/dist/http/ErrorFactory.js.map +1 -1
- package/dist/http/FetchTransport.d.ts +9 -2
- package/dist/http/FetchTransport.d.ts.map +1 -1
- package/dist/http/FetchTransport.js +19 -12
- package/dist/http/FetchTransport.js.map +1 -1
- package/dist/http/RetryPolicy.d.ts +3 -3
- package/dist/http/RetryPolicy.js +3 -3
- package/dist/http/Transport.d.ts +2 -0
- package/dist/http/Transport.d.ts.map +1 -1
- package/dist/http/createFetchTransport.d.ts +5 -0
- package/dist/http/createFetchTransport.d.ts.map +1 -0
- package/dist/http/createFetchTransport.js +25 -0
- package/dist/http/createFetchTransport.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model/ConnectedStore.d.ts +10 -0
- package/dist/model/ConnectedStore.d.ts.map +1 -0
- package/dist/model/ConnectedStore.js +12 -0
- package/dist/model/ConnectedStore.js.map +1 -0
- package/dist/model/Fields.d.ts +2 -0
- package/dist/model/Fields.d.ts.map +1 -1
- package/dist/model/Fields.js +4 -0
- package/dist/model/Fields.js.map +1 -1
- package/dist/model/Invoice.d.ts +1 -1
- package/dist/model/Invoice.d.ts.map +1 -1
- package/dist/model/Platform.d.ts +15 -0
- package/dist/model/Platform.d.ts.map +1 -1
- package/dist/model/Platform.js +12 -0
- package/dist/model/Platform.js.map +1 -1
- package/dist/resources/Invoices.d.ts.map +1 -1
- package/dist/resources/Invoices.js +5 -0
- package/dist/resources/Invoices.js.map +1 -1
- package/dist/resources/Stores.d.ts +5 -0
- package/dist/resources/Stores.d.ts.map +1 -1
- package/dist/resources/Stores.js +7 -0
- package/dist/resources/Stores.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/webhook/WebhookEvent.d.ts +3 -1
- package/dist/webhook/WebhookEvent.d.ts.map +1 -1
- package/dist/webhook/WebhookEvent.js.map +1 -1
- package/dist/webhook/WebhookVerifier.d.ts +2 -0
- package/dist/webhook/WebhookVerifier.d.ts.map +1 -1
- package/dist/webhook/WebhookVerifier.js +10 -1
- package/dist/webhook/WebhookVerifier.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.3.0
|
|
4
|
+
|
|
5
|
+
- New webhook type `invoice.payment_flagged`: a payment of an invoice that is already paid, overpaid or paid late was flagged by sanctions screening. The invoice keeps its status; the flagged payment is in the event data under `payment`.
|
|
6
|
+
- `Store.connectedPlatform`: the plugin connected to the store in one click, or null. `Network` carries `forwarderImplementation`, `explorerAddressUrl` and `rpcUrl`. `ApiError.limitUsdCents` gives the limit an amount was refused for. All three were sent by the API and dropped.
|
|
7
|
+
- `WebhookVerifier.verify()` refuses a body of bytes that is not UTF-8 with `SignatureError`, like every other bad webhook. Before, it threw a plain `TypeError`, which a `catch (SignatureError)` did not cover. A leading byte order mark is kept, so the checked text is exactly what arrived.
|
|
8
|
+
- `invoices.create()` checks the idempotency key before sending: 1 to 255 printable ASCII characters without spaces, as the API requires. Before, a key with a non-Latin-1 letter made fetch throw, and the call was retried and reported as "Cannot reach the Stablevoy API".
|
|
9
|
+
- Webhook events now carry `source` on their invoice, as the API answers do. Events recorded before 3 November 2026 have none, and still verify.
|
|
10
|
+
- One-click connect: `StablevoyConnect.create().exchange({ code, codeVerifier, site })` redeems a connect code for the shop's API key and webhook secret (`ConnectedStore`). It needs no API key and is never retried, since the code works once.
|
|
11
|
+
- `stores.revokeCurrentKey()` revokes the key of the client, for a shop that disconnects. It is retried like a read.
|
|
12
|
+
- `Transport` has `delete()`. Your own implementation of `Transport` needs it too. The connection options shared by both clients are exported as `ConnectionOptions`.
|
|
13
|
+
- Reads, and creates that carry an idempotency key, are also retried on the gateway errors 502, 504 and 520 to 524. nginx and Cloudflare answer with them for the few seconds the API restarts, so a call made then no longer fails at once. A 500 is still not retried.
|
|
14
|
+
|
|
15
|
+
## 1.2.0
|
|
16
|
+
|
|
17
|
+
- `Store` carries `networksWithoutPayout`: the enabled networks with no payout wallet for their family (EVM or Tron) on the account. Buyers are not offered them.
|
|
18
|
+
- `canAcceptPayments(store)` is false when no enabled network has a payout wallet, so every invoice would be refused. Check it before offering the payment method.
|
|
19
|
+
- `ApiError.PAYOUT_ADDRESS_NOT_SET` names the error code an invoice gets in that case.
|
|
20
|
+
|
|
3
21
|
## 1.1.0
|
|
4
22
|
|
|
5
23
|
- `invoices.list()` and `all()` take more filters: `source` (payment link, WooCommerce, Easy Digital Downloads, WHMCS, an API key made by hand, or not recorded; see `InvoiceSourceFilter`), `createdFrom` and `createdTo` (UTC days as YYYY-MM-DD, both ends included) and `search` (an invoice id or the start of the external reference).
|
package/README.md
CHANGED
|
@@ -52,9 +52,42 @@ for await (const invoice of stablevoy.invoices.all({ source: InvoiceSourceFilter
|
|
|
52
52
|
}
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
## Check the store before going live
|
|
56
|
+
|
|
57
|
+
Invoices need a payout wallet for at least one network the store accepts; without one every invoice is refused with `payout_address_not_set`. Read the store of the key to find out in advance, and tell the merchant about networks buyers will not be offered:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { canAcceptPayments } from 'stablevoy';
|
|
61
|
+
|
|
62
|
+
const store = await stablevoy.stores.current();
|
|
63
|
+
if (!canAcceptPayments(store)) {
|
|
64
|
+
// Hide the payment method: set the payout address in the Stablevoy dashboard first.
|
|
65
|
+
}
|
|
66
|
+
if (store.networksWithoutPayout.length > 0) {
|
|
67
|
+
// These enabled networks have no payout wallet, so buyers do not see them.
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Connect a shop in one click
|
|
72
|
+
|
|
73
|
+
A shop integration can get its API key and webhook secret without the merchant copying them: it sends the merchant to the Stablevoy dashboard with a PKCE challenge, gets a code back on its callback URL and redeems it. This call needs no API key, since the shop has none yet. The code works once, so the call is never retried.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { StablevoyConnect } from 'stablevoy';
|
|
77
|
+
|
|
78
|
+
const connected = await StablevoyConnect.create().exchange({ code, codeVerifier, site: 'https://shop.example.com' });
|
|
79
|
+
// Store connected.apiKey and connected.webhookSecret; connected.storeName is the store the merchant chose.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
When the merchant disconnects the shop, give the key up so it stops working at once. A key that is already revoked answers with `AuthenticationError`, which for a disconnect means the same:
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
await stablevoy.stores.revokeCurrentKey();
|
|
86
|
+
```
|
|
87
|
+
|
|
55
88
|
## Verify webhooks
|
|
56
89
|
|
|
57
|
-
Stablevoy posts an event to your webhook URL when an invoice is paid, overpaid, underpaid, expired, paid late or put on hold. Check the signature before you trust it, using the signing secret shown when you set the webhook in the dashboard. Pass the raw body, exactly as received: a body parsed to JSON and serialised again no longer matches the signature.
|
|
90
|
+
Stablevoy posts an event to your webhook URL when an invoice is paid, overpaid, underpaid, expired, paid late or put on hold. One more, `invoice.payment_flagged`, comes when a later transfer to an invoice that is already paid is flagged by sanctions screening: the invoice keeps its paid status, so this event is not a new payment; the flagged transfer is in `event.data.payment`. Check the signature before you trust it, using the signing secret shown when you set the webhook in the dashboard. Pass the raw body, exactly as received: a body parsed to JSON and serialised again no longer matches the signature.
|
|
58
91
|
|
|
59
92
|
Express:
|
|
60
93
|
|
|
@@ -97,7 +130,7 @@ export async function POST(request: Request) {
|
|
|
97
130
|
|
|
98
131
|
Every error extends `StablevoyError`. API errors are `ApiError` with the HTTP `status`, a stable `code`, a readable `detail` and a link to the [error catalog](https://stablevoy.com/docs/api/errors/); the ones you may want to handle on their own are `AuthenticationError`, `ValidationError` (with `issues`), `NotFoundError`, `RateLimitedError` and `MaintenanceError`. `TransportError` means no answer at all.
|
|
99
132
|
|
|
100
|
-
Reads, and creates that carry an idempotency key, are retried on rate limits, maintenance and failed connections, at most twice and only for waits of up to 10 seconds. Anything longer reaches you with `retryAfterSeconds`, so a request never hangs.
|
|
133
|
+
Reads, and creates that carry an idempotency key, are retried on rate limits, maintenance, gateway errors while the API restarts (502, 504, 520 to 524) and failed connections, at most twice and only for waits of up to 10 seconds. Anything longer reaches you with `retryAfterSeconds`, so a request never hangs.
|
|
101
134
|
|
|
102
135
|
```ts
|
|
103
136
|
import { RetryPolicy, Stablevoy } from 'stablevoy';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { RetryPolicy } from './http/RetryPolicy.js';
|
|
2
|
+
import type { Sleep } from './http/Sleep.js';
|
|
3
|
+
/** How a client talks to the API. The defaults are what production needs. */
|
|
4
|
+
export interface ConnectionOptions {
|
|
5
|
+
/** https://api.stablevoy.com by default. */
|
|
6
|
+
readonly baseUrl?: string;
|
|
7
|
+
readonly retries?: RetryPolicy;
|
|
8
|
+
/** The global fetch by default. */
|
|
9
|
+
readonly fetch?: typeof fetch;
|
|
10
|
+
readonly sleep?: Sleep;
|
|
11
|
+
/** Added to the User-Agent, e.g. "my-shop/2.1". */
|
|
12
|
+
readonly userAgentSuffix?: string;
|
|
13
|
+
/** Seconds before an attempt is given up, at most 600; 30 by default. */
|
|
14
|
+
readonly timeoutSeconds?: number;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ConnectionOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionOptions.d.ts","sourceRoot":"","sources":["../src/ConnectionOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B,mCAAmC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionOptions.js","sourceRoot":"","sources":["../src/ConnectionOptions.ts"],"names":[],"mappings":""}
|
package/dist/Stablevoy.d.ts
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type Sleep } from './http/Sleep.js';
|
|
1
|
+
import type { ConnectionOptions } from './ConnectionOptions.js';
|
|
3
2
|
import type { Transport } from './http/Transport.js';
|
|
4
3
|
import { Invoices } from './resources/Invoices.js';
|
|
5
4
|
import { Platform } from './resources/Platform.js';
|
|
6
5
|
import { Stores } from './resources/Stores.js';
|
|
7
|
-
export interface StablevoyOptions {
|
|
6
|
+
export interface StablevoyOptions extends ConnectionOptions {
|
|
8
7
|
/** The store's API key (sk_live_... or sk_test_...). */
|
|
9
8
|
readonly apiKey: string;
|
|
10
|
-
/** https://api.stablevoy.com by default. */
|
|
11
|
-
readonly baseUrl?: string;
|
|
12
|
-
readonly retries?: RetryPolicy;
|
|
13
|
-
/** The global fetch by default. */
|
|
14
|
-
readonly fetch?: typeof fetch;
|
|
15
|
-
readonly sleep?: Sleep;
|
|
16
|
-
/** Added to the User-Agent, e.g. "my-shop/2.1". */
|
|
17
|
-
readonly userAgentSuffix?: string;
|
|
18
|
-
/** Seconds before an attempt is given up, at most 600; 30 by default. */
|
|
19
|
-
readonly timeoutSeconds?: number;
|
|
20
9
|
}
|
|
21
10
|
/** The Stablevoy API: `const stablevoy = Stablevoy.create({ apiKey: process.env.STABLEVOY_API_KEY })`. */
|
|
22
11
|
export declare class Stablevoy {
|
package/dist/Stablevoy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stablevoy.d.ts","sourceRoot":"","sources":["../src/Stablevoy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Stablevoy.d.ts","sourceRoot":"","sources":["../src/Stablevoy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0GAA0G;AAC1G,qBAAa,SAAS;IAElB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;gBAFlB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ;IAG7B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS;IAInD,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS;CAGtD"}
|
package/dist/Stablevoy.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FetchTransport } from './http/FetchTransport.js';
|
|
3
|
-
import { RetryPolicy } from './http/RetryPolicy.js';
|
|
4
|
-
import { realSleep } from './http/Sleep.js';
|
|
5
|
-
import { ConfigurationError } from './errors/ConfigurationError.js';
|
|
1
|
+
import { createFetchTransport } from './http/createFetchTransport.js';
|
|
6
2
|
import { Invoices } from './resources/Invoices.js';
|
|
7
3
|
import { Platform } from './resources/Platform.js';
|
|
8
4
|
import { Stores } from './resources/Stores.js';
|
|
9
|
-
import { VERSION } from './version.js';
|
|
10
5
|
/** The Stablevoy API: `const stablevoy = Stablevoy.create({ apiKey: process.env.STABLEVOY_API_KEY })`. */
|
|
11
6
|
export class Stablevoy {
|
|
12
7
|
invoices;
|
|
@@ -18,21 +13,7 @@ export class Stablevoy {
|
|
|
18
13
|
this.platform = platform;
|
|
19
14
|
}
|
|
20
15
|
static create(options) {
|
|
21
|
-
|
|
22
|
-
if (typeof fetchFn !== 'function')
|
|
23
|
-
throw new ConfigurationError('No fetch is available. Use Node 22 or newer, or pass one as options.fetch.');
|
|
24
|
-
// Node 21+, Bun, Deno and edge runtimes all name themselves here, e.g. "Node.js/26".
|
|
25
|
-
const runtime = typeof navigator === 'undefined' ? 'unknown-runtime' : navigator.userAgent;
|
|
26
|
-
return Stablevoy.fromTransport(new FetchTransport({
|
|
27
|
-
apiKey: options.apiKey,
|
|
28
|
-
baseUrl: options.baseUrl ?? 'https://api.stablevoy.com',
|
|
29
|
-
userAgent: `stablevoy-node/${VERSION} ${runtime}${options.userAgentSuffix === undefined ? '' : ` ${options.userAgentSuffix}`}`,
|
|
30
|
-
retries: options.retries ?? new RetryPolicy(),
|
|
31
|
-
fetch: fetchFn,
|
|
32
|
-
sleep: options.sleep ?? realSleep,
|
|
33
|
-
errors: new ErrorFactory(),
|
|
34
|
-
timeoutSeconds: options.timeoutSeconds ?? 30,
|
|
35
|
-
}));
|
|
16
|
+
return Stablevoy.fromTransport(createFetchTransport(options.apiKey, options));
|
|
36
17
|
}
|
|
37
18
|
static fromTransport(transport) {
|
|
38
19
|
return new Stablevoy(new Invoices(transport), new Stores(transport), new Platform(transport));
|
package/dist/Stablevoy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stablevoy.js","sourceRoot":"","sources":["../src/Stablevoy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Stablevoy.js","sourceRoot":"","sources":["../src/Stablevoy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,0GAA0G;AAC1G,MAAM,OAAO,SAAS;IAET;IACA;IACA;IAHX,YACW,QAAkB,EAClB,MAAc,EACd,QAAkB;QAFlB,aAAQ,GAAR,QAAQ,CAAU;QAClB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAU;IAC1B,CAAC;IAEJ,MAAM,CAAC,MAAM,CAAC,OAAyB;QACrC,OAAO,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,SAAoB;QACvC,OAAO,IAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAChG,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ConnectionOptions } from './ConnectionOptions.js';
|
|
2
|
+
import type { Transport } from './http/Transport.js';
|
|
3
|
+
import { type ConnectedStore } from './model/ConnectedStore.js';
|
|
4
|
+
/** A connect code to redeem: the code from the callback, the PKCE verifier kept for it, and the shop's own URL. */
|
|
5
|
+
export interface ExchangeInput {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly codeVerifier: string;
|
|
8
|
+
/** The same URL the shop sent when the connection was started. */
|
|
9
|
+
readonly site: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* One-click connect: the shop sends the merchant to the Stablevoy dashboard with a PKCE challenge, gets a code back on its
|
|
13
|
+
* callback and redeems it here for its API key and webhook secret. Needs no API key, since the shop has none yet.
|
|
14
|
+
*/
|
|
15
|
+
export declare class StablevoyConnect {
|
|
16
|
+
private readonly transport;
|
|
17
|
+
constructor(transport: Transport);
|
|
18
|
+
static create(options?: ConnectionOptions): StablevoyConnect;
|
|
19
|
+
/**
|
|
20
|
+
* Redeems the code. It works once, so this call is never retried: after a lost answer the merchant clicks Connect again.
|
|
21
|
+
* A refusal (invalid_connect_code, store_linked_to_other_site, store_connected_other_platform) is an ApiError with that code.
|
|
22
|
+
*/
|
|
23
|
+
exchange(input: ExchangeInput): Promise<ConnectedStore>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=StablevoyConnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StablevoyConnect.d.ts","sourceRoot":"","sources":["../src/StablevoyConnect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGrF,mHAAmH;AACnH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAEjD,MAAM,CAAC,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB;IAIhE;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAI9D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createFetchTransport } from './http/createFetchTransport.js';
|
|
2
|
+
import { parseConnectedStore } from './model/ConnectedStore.js';
|
|
3
|
+
import { Fields } from './model/Fields.js';
|
|
4
|
+
/**
|
|
5
|
+
* One-click connect: the shop sends the merchant to the Stablevoy dashboard with a PKCE challenge, gets a code back on its
|
|
6
|
+
* callback and redeems it here for its API key and webhook secret. Needs no API key, since the shop has none yet.
|
|
7
|
+
*/
|
|
8
|
+
export class StablevoyConnect {
|
|
9
|
+
transport;
|
|
10
|
+
constructor(transport) {
|
|
11
|
+
this.transport = transport;
|
|
12
|
+
}
|
|
13
|
+
static create(options = {}) {
|
|
14
|
+
return new StablevoyConnect(createFetchTransport(null, options));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Redeems the code. It works once, so this call is never retried: after a lost answer the merchant clicks Connect again.
|
|
18
|
+
* A refusal (invalid_connect_code, store_linked_to_other_site, store_connected_other_platform) is an ApiError with that code.
|
|
19
|
+
*/
|
|
20
|
+
async exchange(input) {
|
|
21
|
+
const body = { code: input.code, codeVerifier: input.codeVerifier, site: input.site };
|
|
22
|
+
return parseConnectedStore(Fields.of(await this.transport.post('/v1/connect/exchange', body), 'connected'));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=StablevoyConnect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StablevoyConnect.js","sourceRoot":"","sources":["../src/StablevoyConnect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAuB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAU3C;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,MAAM,CAAC,MAAM,CAAC,UAA6B,EAAE;QAC3C,OAAO,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAoB;QACjC,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QACtF,OAAO,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9G,CAAC;CACF"}
|
|
@@ -10,12 +10,15 @@ export interface ApiErrorDetails {
|
|
|
10
10
|
readonly type: string | null;
|
|
11
11
|
readonly issues: readonly ProblemIssue[];
|
|
12
12
|
readonly retryAfterSeconds: number | null;
|
|
13
|
+
readonly limitUsdCents: number | null;
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
16
|
* The API answered with an error: an RFC 7807 problem document with a stable code, a readable detail and a link to the
|
|
16
17
|
* code's entry in the error catalog (https://stablevoy.com/docs/api/errors/).
|
|
17
18
|
*/
|
|
18
19
|
export declare class ApiError extends StablevoyError {
|
|
20
|
+
/** No enabled network of the store has a payout wallet; canAcceptPayments(store) tells it in advance. */
|
|
21
|
+
static readonly PAYOUT_ADDRESS_NOT_SET = "payout_address_not_set";
|
|
19
22
|
readonly status: number;
|
|
20
23
|
readonly code: string;
|
|
21
24
|
readonly detail: string;
|
|
@@ -24,6 +27,8 @@ export declare class ApiError extends StablevoyError {
|
|
|
24
27
|
readonly issues: readonly ProblemIssue[];
|
|
25
28
|
/** From the Retry-After header of a 429 or 503, else null. */
|
|
26
29
|
readonly retryAfterSeconds: number | null;
|
|
30
|
+
/** For an amount refused by a limit (amount_below_minimum, amount_above_store_limit, ...): that limit in US cents. */
|
|
31
|
+
readonly limitUsdCents: number | null;
|
|
27
32
|
constructor(details: ApiErrorDetails);
|
|
28
33
|
}
|
|
29
34
|
//# sourceMappingURL=ApiError.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiError.d.ts","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiError.d.ts","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,qBAAa,QAAS,SAAQ,cAAc;IAC1C,yGAAyG;IACzG,MAAM,CAAC,QAAQ,CAAC,sBAAsB,4BAA4B;IAElE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,sHAAsH;IACtH,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;gBAE1B,OAAO,EAAE,eAAe;CAUrC"}
|
package/dist/errors/ApiError.js
CHANGED
|
@@ -4,6 +4,8 @@ import { StablevoyError } from './StablevoyError.js';
|
|
|
4
4
|
* code's entry in the error catalog (https://stablevoy.com/docs/api/errors/).
|
|
5
5
|
*/
|
|
6
6
|
export class ApiError extends StablevoyError {
|
|
7
|
+
/** No enabled network of the store has a payout wallet; canAcceptPayments(store) tells it in advance. */
|
|
8
|
+
static PAYOUT_ADDRESS_NOT_SET = 'payout_address_not_set';
|
|
7
9
|
status;
|
|
8
10
|
code;
|
|
9
11
|
detail;
|
|
@@ -12,6 +14,8 @@ export class ApiError extends StablevoyError {
|
|
|
12
14
|
issues;
|
|
13
15
|
/** From the Retry-After header of a 429 or 503, else null. */
|
|
14
16
|
retryAfterSeconds;
|
|
17
|
+
/** For an amount refused by a limit (amount_below_minimum, amount_above_store_limit, ...): that limit in US cents. */
|
|
18
|
+
limitUsdCents;
|
|
15
19
|
constructor(details) {
|
|
16
20
|
super(`${details.detail} (HTTP ${details.status}, ${details.code})`);
|
|
17
21
|
this.status = details.status;
|
|
@@ -20,6 +24,7 @@ export class ApiError extends StablevoyError {
|
|
|
20
24
|
this.type = details.type;
|
|
21
25
|
this.issues = details.issues;
|
|
22
26
|
this.retryAfterSeconds = details.retryAfterSeconds;
|
|
27
|
+
this.limitUsdCents = details.limitUsdCents;
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
30
|
//# sourceMappingURL=ApiError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiError.js","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiError.js","sourceRoot":"","sources":["../../src/errors/ApiError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAiBrD;;;GAGG;AACH,MAAM,OAAO,QAAS,SAAQ,cAAc;IAC1C,yGAAyG;IACzG,MAAM,CAAU,sBAAsB,GAAG,wBAAwB,CAAC;IAEzD,MAAM,CAAS;IACf,IAAI,CAAS;IACb,MAAM,CAAS;IACf,IAAI,CAAgB;IAC7B,2CAA2C;IAClC,MAAM,CAA0B;IACzC,8DAA8D;IACrD,iBAAiB,CAAgB;IAC1C,sHAAsH;IAC7G,aAAa,CAAgB;IAEtC,YAAY,OAAwB;QAClC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorFactory.d.ts","sourceRoot":"","sources":["../../src/http/ErrorFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2C,MAAM,uBAAuB,CAAC;AAS1F,+FAA+F;AAC/F,qBAAa,YAAY;IACvB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ;
|
|
1
|
+
{"version":3,"file":"ErrorFactory.d.ts","sourceRoot":"","sources":["../../src/http/ErrorFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2C,MAAM,uBAAuB,CAAC;AAS1F,+FAA+F;AAC/F,qBAAa,YAAY;IACvB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ;IAoBrF,OAAO,CAAC,MAAM,CAAC,KAAK;IASpB,OAAO,CAAC,MAAM,CAAC,MAAM;CAQtB"}
|
|
@@ -17,6 +17,7 @@ export class ErrorFactory {
|
|
|
17
17
|
type: stringOr(problem['type'], null),
|
|
18
18
|
issues: ErrorFactory.issues(problem['issues']),
|
|
19
19
|
retryAfterSeconds,
|
|
20
|
+
limitUsdCents: Number.isSafeInteger(problem['limitUsdCents']) ? problem['limitUsdCents'] : null,
|
|
20
21
|
};
|
|
21
22
|
if (status === 401)
|
|
22
23
|
return new AuthenticationError(details);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorFactory.js","sourceRoot":"","sources":["../../src/http/ErrorFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2C,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,QAAuB,EAAiB,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE5H,+FAA+F;AAC/F,MAAM,OAAO,YAAY;IACvB,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,iBAAgC;QACxE,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,QAAQ,MAAM,EAAE,CAAC;QACjE,MAAM,OAAO,GAAoB;YAC/B,MAAM;YACN,IAAI;YACJ,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,yBAAyB,MAAM,EAAE;YAC9E,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;YACrC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9C,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ErrorFactory.js","sourceRoot":"","sources":["../../src/http/ErrorFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@ import type { RetryPolicy } from './RetryPolicy.js';
|
|
|
3
3
|
import type { Sleep } from './Sleep.js';
|
|
4
4
|
import type { Query, Transport } from './Transport.js';
|
|
5
5
|
export interface FetchTransportOptions {
|
|
6
|
-
|
|
6
|
+
/** null only for the one call made before a shop has a key, the connect exchange: then no Authorization is sent. */
|
|
7
|
+
readonly apiKey: string | null;
|
|
7
8
|
readonly baseUrl: string;
|
|
8
9
|
readonly userAgent: string;
|
|
9
10
|
readonly retries: RetryPolicy;
|
|
@@ -15,20 +16,26 @@ export interface FetchTransportOptions {
|
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* The API over fetch: Bearer API key, JSON in and out, errors as exceptions, and retries only where a repeat cannot do
|
|
18
|
-
* harm (reads, and creates that carry an Idempotency-Key).
|
|
19
|
+
* harm (reads, deletes, and creates that carry an Idempotency-Key).
|
|
19
20
|
*/
|
|
20
21
|
export declare class FetchTransport implements Transport {
|
|
21
22
|
private readonly options;
|
|
22
23
|
private readonly baseUrl;
|
|
23
24
|
constructor(options: FetchTransportOptions);
|
|
24
25
|
get(path: string, query?: Query): Promise<unknown>;
|
|
26
|
+
delete(path: string): Promise<void>;
|
|
25
27
|
post(path: string, body: unknown, idempotencyKey?: string): Promise<unknown>;
|
|
28
|
+
/** The body of the first successful answer, or the error of the last failed attempt. */
|
|
26
29
|
private send;
|
|
27
30
|
/**
|
|
28
31
|
* Only a scheme, a host and an optional port. The API key travels in every request, so plain http is refused except
|
|
29
32
|
* for a local development server, and so are credentials, paths, queries and fragments in the URL.
|
|
30
33
|
*/
|
|
31
34
|
private static checkedBaseUrl;
|
|
35
|
+
/**
|
|
36
|
+
* 429 and 503, and the gateway errors nginx and Cloudflare answer while the API restarts (502, 504, 520 to 524). A 500 is
|
|
37
|
+
* a fault of the API, not a moment: repeating it would not help.
|
|
38
|
+
*/
|
|
32
39
|
private static isRetryable;
|
|
33
40
|
private static decode;
|
|
34
41
|
private static retryAfter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchTransport.d.ts","sourceRoot":"","sources":["../../src/http/FetchTransport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"FetchTransport.d.ts","sourceRoot":"","sources":["../../src/http/FetchTransport.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,oHAAoH;IACpH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,8GAA8G;IAC9G,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,qBAAqB;IAO1C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,KAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5E,wFAAwF;YAC1E,IAAI;IA0BlB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAa7B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B,OAAO,CAAC,MAAM,CAAC,MAAM;IAWrB,OAAO,CAAC,MAAM,CAAC,UAAU;CAI1B"}
|
|
@@ -3,13 +3,13 @@ import { TransportError } from '../errors/TransportError.js';
|
|
|
3
3
|
import { UnexpectedResponseError } from '../errors/UnexpectedResponseError.js';
|
|
4
4
|
/**
|
|
5
5
|
* The API over fetch: Bearer API key, JSON in and out, errors as exceptions, and retries only where a repeat cannot do
|
|
6
|
-
* harm (reads, and creates that carry an Idempotency-Key).
|
|
6
|
+
* harm (reads, deletes, and creates that carry an Idempotency-Key).
|
|
7
7
|
*/
|
|
8
8
|
export class FetchTransport {
|
|
9
9
|
options;
|
|
10
10
|
baseUrl;
|
|
11
11
|
constructor(options) {
|
|
12
|
-
if (options.apiKey.trim() === '')
|
|
12
|
+
if (options.apiKey !== null && options.apiKey.trim() === '')
|
|
13
13
|
throw new ConfigurationError('The API key is empty. Create one in the Stablevoy dashboard.');
|
|
14
14
|
if (!(options.timeoutSeconds > 0 && options.timeoutSeconds <= 600))
|
|
15
15
|
throw new ConfigurationError(`timeoutSeconds must be more than 0 and at most 600; got ${String(options.timeoutSeconds)}`);
|
|
@@ -18,21 +18,24 @@ export class FetchTransport {
|
|
|
18
18
|
}
|
|
19
19
|
get(path, query = {}) {
|
|
20
20
|
const search = new URLSearchParams(Object.entries(query).map(([k, v]) => [k, String(v)])).toString();
|
|
21
|
-
return this.send(`${this.baseUrl}${path}${search === '' ? '' : `?${search}`}`, { method: 'GET' }, true);
|
|
21
|
+
return this.send(`${this.baseUrl}${path}${search === '' ? '' : `?${search}`}`, { method: 'GET' }, true).then((text) => FetchTransport.decode(text));
|
|
22
|
+
}
|
|
23
|
+
async delete(path) {
|
|
24
|
+
await this.send(`${this.baseUrl}${path}`, { method: 'DELETE' }, true);
|
|
22
25
|
}
|
|
23
26
|
post(path, body, idempotencyKey) {
|
|
24
27
|
const headers = { 'Content-Type': 'application/json' };
|
|
25
28
|
if (idempotencyKey !== undefined)
|
|
26
29
|
headers['Idempotency-Key'] = idempotencyKey;
|
|
27
|
-
return this.send(`${this.baseUrl}${path}`, { method: 'POST', headers, body: JSON.stringify(body) }, idempotencyKey !== undefined);
|
|
30
|
+
return this.send(`${this.baseUrl}${path}`, { method: 'POST', headers, body: JSON.stringify(body) }, idempotencyKey !== undefined).then((text) => FetchTransport.decode(text));
|
|
28
31
|
}
|
|
32
|
+
/** The body of the first successful answer, or the error of the last failed attempt. */
|
|
29
33
|
async send(url, init, retryable) {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
34
|
+
const headers = { ...init.headers, Accept: 'application/json', 'User-Agent': this.options.userAgent };
|
|
35
|
+
if (this.options.apiKey !== null)
|
|
36
|
+
headers['Authorization'] = `Bearer ${this.options.apiKey}`;
|
|
37
|
+
// The API never redirects; following one would carry the key wherever it points.
|
|
38
|
+
const request = { ...init, redirect: 'error', headers };
|
|
36
39
|
for (let attempt = 1;; attempt++) {
|
|
37
40
|
let response;
|
|
38
41
|
let text;
|
|
@@ -49,7 +52,7 @@ export class FetchTransport {
|
|
|
49
52
|
continue;
|
|
50
53
|
}
|
|
51
54
|
if (response.ok)
|
|
52
|
-
return
|
|
55
|
+
return text;
|
|
53
56
|
const apiError = this.options.errors.fromProblem(response.status, text, FetchTransport.retryAfter(response));
|
|
54
57
|
const wait = retryable && FetchTransport.isRetryable(apiError) ? this.options.retries.waitBefore(attempt, apiError.retryAfterSeconds) : null;
|
|
55
58
|
if (wait === null)
|
|
@@ -75,8 +78,12 @@ export class FetchTransport {
|
|
|
75
78
|
return refuse();
|
|
76
79
|
return url.origin;
|
|
77
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* 429 and 503, and the gateway errors nginx and Cloudflare answer while the API restarts (502, 504, 520 to 524). A 500 is
|
|
83
|
+
* a fault of the API, not a moment: repeating it would not help.
|
|
84
|
+
*/
|
|
78
85
|
static isRetryable(error) {
|
|
79
|
-
return
|
|
86
|
+
return [429, 502, 503, 504, 520, 521, 522, 523, 524].includes(error.status);
|
|
80
87
|
}
|
|
81
88
|
static decode(text) {
|
|
82
89
|
let value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchTransport.js","sourceRoot":"","sources":["../../src/http/FetchTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"FetchTransport.js","sourceRoot":"","sources":["../../src/http/FetchTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* When to retry: on 429, 503
|
|
3
|
-
* 4 seconds without it). A wait longer than maxWaitSeconds is not slept
|
|
4
|
-
* retryAfterSeconds, so a request never hangs for minutes during maintenance.
|
|
2
|
+
* When to retry: on 429, 503, the gateway errors 502, 504 and 520 to 524, and a failed connection, at most maxRetries
|
|
3
|
+
* times, waiting what Retry-After asks (or 1, 2, 4 seconds without it). A wait longer than maxWaitSeconds is not slept
|
|
4
|
+
* through: the error goes to the caller with retryAfterSeconds, so a request never hangs for minutes during maintenance.
|
|
5
5
|
*/
|
|
6
6
|
export declare class RetryPolicy {
|
|
7
7
|
readonly maxRetries: number;
|
package/dist/http/RetryPolicy.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* When to retry: on 429, 503
|
|
3
|
-
* 4 seconds without it). A wait longer than maxWaitSeconds is not slept
|
|
4
|
-
* retryAfterSeconds, so a request never hangs for minutes during maintenance.
|
|
2
|
+
* When to retry: on 429, 503, the gateway errors 502, 504 and 520 to 524, and a failed connection, at most maxRetries
|
|
3
|
+
* times, waiting what Retry-After asks (or 1, 2, 4 seconds without it). A wait longer than maxWaitSeconds is not slept
|
|
4
|
+
* through: the error goes to the caller with retryAfterSeconds, so a request never hangs for minutes during maintenance.
|
|
5
5
|
*/
|
|
6
6
|
export class RetryPolicy {
|
|
7
7
|
maxRetries;
|
package/dist/http/Transport.d.ts
CHANGED
|
@@ -3,5 +3,7 @@ export type Query = Readonly<Record<string, string | number>>;
|
|
|
3
3
|
export interface Transport {
|
|
4
4
|
get(path: string, query?: Query): Promise<unknown>;
|
|
5
5
|
post(path: string, body: unknown, idempotencyKey?: string): Promise<unknown>;
|
|
6
|
+
/** A call that answers 204 without a body. Deleting twice does no harm, so it is retried like a read. */
|
|
7
|
+
delete(path: string): Promise<void>;
|
|
6
8
|
}
|
|
7
9
|
//# sourceMappingURL=Transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../../src/http/Transport.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AAE9D,yIAAyI;AACzI,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../../src/http/Transport.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AAE9D,yIAAyI;AACzI,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,yGAAyG;IACzG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ConnectionOptions } from '../ConnectionOptions.js';
|
|
2
|
+
import { FetchTransport } from './FetchTransport.js';
|
|
3
|
+
/** The transport Stablevoy and StablevoyConnect talk through, built the same way for both. */
|
|
4
|
+
export declare function createFetchTransport(apiKey: string | null, options: ConnectionOptions): FetchTransport;
|
|
5
|
+
//# sourceMappingURL=createFetchTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createFetchTransport.d.ts","sourceRoot":"","sources":["../../src/http/createFetchTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAIjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAetG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ConfigurationError } from '../errors/ConfigurationError.js';
|
|
2
|
+
import { VERSION } from '../version.js';
|
|
3
|
+
import { ErrorFactory } from './ErrorFactory.js';
|
|
4
|
+
import { FetchTransport } from './FetchTransport.js';
|
|
5
|
+
import { RetryPolicy } from './RetryPolicy.js';
|
|
6
|
+
import { realSleep } from './Sleep.js';
|
|
7
|
+
/** The transport Stablevoy and StablevoyConnect talk through, built the same way for both. */
|
|
8
|
+
export function createFetchTransport(apiKey, options) {
|
|
9
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
10
|
+
if (typeof fetchFn !== 'function')
|
|
11
|
+
throw new ConfigurationError('No fetch is available. Use Node 22 or newer, or pass one as options.fetch.');
|
|
12
|
+
// Node 21+, Bun, Deno and edge runtimes all name themselves here, e.g. "Node.js/26".
|
|
13
|
+
const runtime = typeof navigator === 'undefined' ? 'unknown-runtime' : navigator.userAgent;
|
|
14
|
+
return new FetchTransport({
|
|
15
|
+
apiKey,
|
|
16
|
+
baseUrl: options.baseUrl ?? 'https://api.stablevoy.com',
|
|
17
|
+
userAgent: `stablevoy-node/${VERSION} ${runtime}${options.userAgentSuffix === undefined ? '' : ` ${options.userAgentSuffix}`}`,
|
|
18
|
+
retries: options.retries ?? new RetryPolicy(),
|
|
19
|
+
fetch: fetchFn,
|
|
20
|
+
sleep: options.sleep ?? realSleep,
|
|
21
|
+
errors: new ErrorFactory(),
|
|
22
|
+
timeoutSeconds: options.timeoutSeconds ?? 30,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=createFetchTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createFetchTransport.js","sourceRoot":"","sources":["../../src/http/createFetchTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,8FAA8F;AAC9F,MAAM,UAAU,oBAAoB,CAAC,MAAqB,EAAE,OAA0B;IACpF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,IAAI,OAAO,OAAO,KAAK,UAAU;QAAE,MAAM,IAAI,kBAAkB,CAAC,4EAA4E,CAAC,CAAC;IAC9I,qFAAqF;IACrF,MAAM,OAAO,GAAG,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;IAC3F,OAAO,IAAI,cAAc,CAAC;QACxB,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,2BAA2B;QACvD,SAAS,EAAE,kBAAkB,OAAO,IAAI,OAAO,GAAG,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,EAAE;QAC9H,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,WAAW,EAAE;QAC7C,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;QACjC,MAAM,EAAE,IAAI,YAAY,EAAE;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;KAC7C,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export { Stablevoy, type StablevoyOptions } from './Stablevoy.js';
|
|
2
|
+
export { StablevoyConnect, type ExchangeInput } from './StablevoyConnect.js';
|
|
3
|
+
export type { ConnectionOptions } from './ConnectionOptions.js';
|
|
4
|
+
export type { ConnectedStore } from './model/ConnectedStore.js';
|
|
2
5
|
export { VERSION } from './version.js';
|
|
3
6
|
export { RetryPolicy } from './http/RetryPolicy.js';
|
|
4
7
|
export type { Sleep } from './http/Sleep.js';
|
|
@@ -10,6 +13,7 @@ export { InvoiceStatus, isPaidStatus } from './model/InvoiceStatus.js';
|
|
|
10
13
|
export { InvoiceSourceFilter, InvoiceSourceKind, type InvoiceSource } from './model/InvoiceSource.js';
|
|
11
14
|
export type { CreateInvoiceInput, CreatedInvoice, DepositAddress, Invoice, InvoicePage, Payment } from './model/Invoice.js';
|
|
12
15
|
export type { Limits, Network, Pricing, Store, Token } from './model/Platform.js';
|
|
16
|
+
export { canAcceptPayments } from './model/Platform.js';
|
|
13
17
|
export { WebhookVerifier, type WebhookVerifierOptions } from './webhook/WebhookVerifier.js';
|
|
14
18
|
export type { WebhookEvent } from './webhook/WebhookEvent.js';
|
|
15
19
|
export type { Clock } from './time/Clock.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACtG,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC5H,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACtG,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC5H,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { Stablevoy } from './Stablevoy.js';
|
|
2
|
+
export { StablevoyConnect } from './StablevoyConnect.js';
|
|
2
3
|
export { VERSION } from './version.js';
|
|
3
4
|
export { RetryPolicy } from './http/RetryPolicy.js';
|
|
4
5
|
export { Invoices } from './resources/Invoices.js';
|
|
@@ -6,6 +7,7 @@ export { Stores } from './resources/Stores.js';
|
|
|
6
7
|
export { Platform } from './resources/Platform.js';
|
|
7
8
|
export { InvoiceStatus, isPaidStatus } from './model/InvoiceStatus.js';
|
|
8
9
|
export { InvoiceSourceFilter, InvoiceSourceKind } from './model/InvoiceSource.js';
|
|
10
|
+
export { canAcceptPayments } from './model/Platform.js';
|
|
9
11
|
export { WebhookVerifier } from './webhook/WebhookVerifier.js';
|
|
10
12
|
export { StablevoyError } from './errors/StablevoyError.js';
|
|
11
13
|
export { ApiError } from './errors/ApiError.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAoD,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAsB,MAAM,0BAA0B,CAAC;AAGtG,OAAO,EAAE,eAAe,EAA+B,MAAM,8BAA8B,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAA2C,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAsB,MAAM,uBAAuB,CAAC;AAG7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAoD,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAsB,MAAM,0BAA0B,CAAC;AAGtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAA+B,MAAM,8BAA8B,CAAC;AAG5F,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAA2C,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Fields } from './Fields.js';
|
|
2
|
+
/** What a redeemed connect code gives the shop: its API key, its webhook signing secret and the store they belong to. */
|
|
3
|
+
export interface ConnectedStore {
|
|
4
|
+
readonly apiKey: string;
|
|
5
|
+
readonly webhookSecret: string;
|
|
6
|
+
readonly storeId: string;
|
|
7
|
+
readonly storeName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseConnectedStore(f: Fields): ConnectedStore;
|
|
10
|
+
//# sourceMappingURL=ConnectedStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectedStore.d.ts","sourceRoot":"","sources":["../../src/model/ConnectedStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,yHAAyH;AACzH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc,CAO7D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { UnexpectedResponseError } from '../errors/UnexpectedResponseError.js';
|
|
2
|
+
export function parseConnectedStore(f) {
|
|
3
|
+
const apiKey = f.string('apiKey');
|
|
4
|
+
if (!/^sk_(live|test)_/.test(apiKey))
|
|
5
|
+
throw new UnexpectedResponseError(`${f.pathOf('apiKey')} is not an API key (sk_live_ or sk_test_)`);
|
|
6
|
+
const webhookSecret = f.string('webhookSecret');
|
|
7
|
+
if (!webhookSecret.startsWith('whsec_'))
|
|
8
|
+
throw new UnexpectedResponseError(`${f.pathOf('webhookSecret')} is not a webhook secret (whsec_)`);
|
|
9
|
+
const store = f.object('store');
|
|
10
|
+
return { apiKey, webhookSecret, storeId: store.string('id'), storeName: store.string('name') };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ConnectedStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectedStore.js","sourceRoot":"","sources":["../../src/model/ConnectedStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAW/E,MAAM,UAAU,mBAAmB,CAAC,CAAS;IAC3C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,2CAA2C,CAAC,CAAC;IAC1I,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAChD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,mCAAmC,CAAC,CAAC;IAC5I,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACjG,CAAC"}
|
package/dist/model/Fields.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export declare class Fields {
|
|
|
19
19
|
/** Each item of a list of objects, parsed with `parse`. */
|
|
20
20
|
objects<T>(key: string, parse: (item: Fields) => T): T[];
|
|
21
21
|
object(key: string): Fields;
|
|
22
|
+
/** Where a field of this object is, for error messages. */
|
|
23
|
+
pathOf(key: string): string;
|
|
22
24
|
/** The object as decoded, for data this library does not model. */
|
|
23
25
|
raw(): Readonly<Record<string, unknown>>;
|
|
24
26
|
private value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../../src/model/Fields.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,OAAO;IAKP,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAK/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAM3B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMxB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMvC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKtC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAO9B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE;IAM5B,2DAA2D;IAC3D,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;IAIxD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3B,mEAAmE;IACnE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIxC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,KAAK;CAGd"}
|
|
1
|
+
{"version":3,"file":"Fields.d.ts","sourceRoot":"","sources":["../../src/model/Fields.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFvB,OAAO;IAKP,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAK/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAM3B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMxB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMvC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM1B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKtC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAO9B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE;IAM5B,2DAA2D;IAC3D,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;IAIxD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI3B,2DAA2D;IAC3D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAG3B,mEAAmE;IACnE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIxC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,KAAK;CAGd"}
|
package/dist/model/Fields.js
CHANGED
|
@@ -72,6 +72,10 @@ export class Fields {
|
|
|
72
72
|
object(key) {
|
|
73
73
|
return Fields.of(this.value(key), `${this.path}.${key}`);
|
|
74
74
|
}
|
|
75
|
+
/** Where a field of this object is, for error messages. */
|
|
76
|
+
pathOf(key) {
|
|
77
|
+
return `${this.path}.${key}`;
|
|
78
|
+
}
|
|
75
79
|
/** The object as decoded, for data this library does not model. */
|
|
76
80
|
raw() {
|
|
77
81
|
return this.data;
|
package/dist/model/Fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fields.js","sourceRoot":"","sources":["../../src/model/Fields.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Fields.js","sourceRoot":"","sources":["../../src/model/Fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E;;;GAGG;AACH,MAAM,OAAO,MAAM;IAEE;IACA;IAFnB,YACmB,IAAuC,EACvC,IAAY;QADZ,SAAI,GAAJ,IAAI,CAAmC;QACvC,SAAI,GAAJ,IAAI,CAAQ;IAC5B,CAAC;IAEJ,MAAM,CAAC,EAAE,CAAC,KAAc,EAAE,IAAY;QACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,uBAAuB,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC;QAC3I,OAAO,IAAI,MAAM,CAAC,KAAgC,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc,CAAC,GAAW;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC3F,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACtE,OAAO,KAAe,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAChG,OAAO,KAAsB,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,GAAW;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,GAAW;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2DAA2D;IAC3D,OAAO,CAAI,GAAW,EAAE,KAA0B;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,OAAO,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,2DAA2D;IAC3D,MAAM,CAAC,GAAW;QAChB,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IAC/B,CAAC;IACD,mEAAmE;IACnE,GAAG;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,MAAM,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,aAAa,CAAC,CAAC;QACxG,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAEO,SAAS,CAAC,GAAW,EAAE,KAAa;QAC1C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,QAAgB;QACzC,OAAO,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,WAAW,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;CACF"}
|
package/dist/model/Invoice.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export interface Invoice {
|
|
|
37
37
|
readonly createdAt: Date;
|
|
38
38
|
readonly depositAddresses: readonly DepositAddress[];
|
|
39
39
|
readonly payments: readonly Payment[];
|
|
40
|
-
/** Where the invoice came from; absent only from an API older than 31 October 2026, which did not
|
|
40
|
+
/** Where the invoice came from; absent only on invoices from an API older than 31 October 2026 and on webhook events recorded before 3 November 2026, which did not carry it. */
|
|
41
41
|
readonly source?: InvoiceSource;
|
|
42
42
|
}
|
|
43
43
|
export declare function parseInvoice(f: Fields): Invoice;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invoice.d.ts","sourceRoot":"","sources":["../../src/model/Invoice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5E,6GAA6G;AAC7G,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,qHAAqH;AACrH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,cAAc,EAAE,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,
|
|
1
|
+
{"version":3,"file":"Invoice.d.ts","sourceRoot":"","sources":["../../src/model/Invoice.ts"],"names":[],"mappings":"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"}
|
package/dist/model/Platform.d.ts
CHANGED
|
@@ -6,14 +6,23 @@ export interface Store {
|
|
|
6
6
|
readonly status: string;
|
|
7
7
|
/** Network keys, e.g. "base", "tron". */
|
|
8
8
|
readonly enabledNetworks: readonly string[];
|
|
9
|
+
/** Enabled networks with no payout wallet for their family (EVM or Tron) on the account: buyers are not offered them. */
|
|
10
|
+
readonly networksWithoutPayout: readonly string[];
|
|
9
11
|
readonly minInvoiceUsdCents: number | null;
|
|
10
12
|
readonly maxInvoiceUsdCents: number | null;
|
|
11
13
|
readonly webhookUrl: string | null;
|
|
12
14
|
readonly websiteUrl: string | null;
|
|
13
15
|
readonly defaultReturnUrl: string | null;
|
|
14
16
|
readonly createdAt: Date;
|
|
17
|
+
/** The plugin connected to the store in one click ('woocommerce', 'edd', 'whmcs'), or null. */
|
|
18
|
+
readonly connectedPlatform: string | null;
|
|
15
19
|
}
|
|
16
20
|
export declare function parseStore(f: Fields): Store;
|
|
21
|
+
/**
|
|
22
|
+
* False when no enabled network has a payout wallet: every invoice would be refused with payout_address_not_set. Check it
|
|
23
|
+
* before offering the payment method, and show the merchant networksWithoutPayout when it is not empty.
|
|
24
|
+
*/
|
|
25
|
+
export declare function canAcceptPayments(store: Store): boolean;
|
|
17
26
|
/** The smallest and largest invoice the platform accepts, in US cents. */
|
|
18
27
|
export interface Limits {
|
|
19
28
|
readonly minInvoiceUsdCents: number;
|
|
@@ -43,6 +52,12 @@ export interface Network {
|
|
|
43
52
|
readonly factoryAddress: string | null;
|
|
44
53
|
readonly explorerUrl: string | null;
|
|
45
54
|
readonly tokens: readonly Token[];
|
|
55
|
+
/** The forwarder contract the deposit addresses clone; with factoryAddress it is what a manual recovery needs. */
|
|
56
|
+
readonly forwarderImplementation: string | null;
|
|
57
|
+
/** The explorer page of an address is this followed by the address. */
|
|
58
|
+
readonly explorerAddressUrl: string | null;
|
|
59
|
+
/** A public RPC endpoint of the network. */
|
|
60
|
+
readonly rpcUrl: string | null;
|
|
46
61
|
}
|
|
47
62
|
export declare function parseNetwork(f: Fields): Network;
|
|
48
63
|
//# sourceMappingURL=Platform.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.d.ts","sourceRoot":"","sources":["../../src/model/Platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,wCAAwC;AACxC,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Platform.d.ts","sourceRoot":"","sources":["../../src/model/Platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,wCAAwC;AACxC,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,yHAAyH;IACzH,QAAQ,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC;IAClD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,+FAA+F;IAC/F,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAe3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEvD;AAED,0EAA0E;AAC1E,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,+HAA+H;AAC/H,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,+IAA+I;AAC/I,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,kHAAkH;IAClH,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,uEAAuE;IACvE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAe/C"}
|
package/dist/model/Platform.js
CHANGED
|
@@ -4,14 +4,23 @@ export function parseStore(f) {
|
|
|
4
4
|
name: f.string('name'),
|
|
5
5
|
status: f.string('status'),
|
|
6
6
|
enabledNetworks: f.strings('enabledNetworks'),
|
|
7
|
+
networksWithoutPayout: f.strings('networksWithoutPayout'),
|
|
7
8
|
minInvoiceUsdCents: f.nullableInt('minInvoiceUsdCents'),
|
|
8
9
|
maxInvoiceUsdCents: f.nullableInt('maxInvoiceUsdCents'),
|
|
9
10
|
webhookUrl: f.nullableString('webhookUrl'),
|
|
10
11
|
websiteUrl: f.nullableString('websiteUrl'),
|
|
11
12
|
defaultReturnUrl: f.nullableString('defaultReturnUrl'),
|
|
12
13
|
createdAt: f.date('createdAt'),
|
|
14
|
+
connectedPlatform: f.nullableString('connectedPlatform'),
|
|
13
15
|
};
|
|
14
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* False when no enabled network has a payout wallet: every invoice would be refused with payout_address_not_set. Check it
|
|
19
|
+
* before offering the payment method, and show the merchant networksWithoutPayout when it is not empty.
|
|
20
|
+
*/
|
|
21
|
+
export function canAcceptPayments(store) {
|
|
22
|
+
return store.enabledNetworks.some((key) => !store.networksWithoutPayout.includes(key));
|
|
23
|
+
}
|
|
15
24
|
export function parseLimits(f) {
|
|
16
25
|
return { minInvoiceUsdCents: f.int('minInvoiceUsdCents'), maxInvoiceUsdCents: f.int('maxInvoiceUsdCents') };
|
|
17
26
|
}
|
|
@@ -29,6 +38,9 @@ export function parseNetwork(f) {
|
|
|
29
38
|
factoryAddress: f.nullableString('factoryAddress'),
|
|
30
39
|
explorerUrl: f.nullableString('explorerUrl'),
|
|
31
40
|
tokens: f.objects('tokens', (t) => ({ symbol: t.string('symbol'), address: t.string('address'), decimals: t.int('decimals') })),
|
|
41
|
+
forwarderImplementation: f.nullableString('forwarderImplementation'),
|
|
42
|
+
explorerAddressUrl: f.nullableString('explorerAddressUrl'),
|
|
43
|
+
rpcUrl: f.nullableString('rpcUrl'),
|
|
32
44
|
};
|
|
33
45
|
}
|
|
34
46
|
//# sourceMappingURL=Platform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.js","sourceRoot":"","sources":["../../src/model/Platform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Platform.js","sourceRoot":"","sources":["../../src/model/Platform.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAClB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1B,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC7C,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;QACzD,kBAAkB,EAAE,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC;QACvD,kBAAkB,EAAE,CAAC,CAAC,WAAW,CAAC,oBAAoB,CAAC;QACvD,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC;QAC1C,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC;QACtD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QAC9B,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC;KACzD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,CAAC;AAQD,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;AAC9G,CAAC;AASD,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;AACrH,CAAC;AA2BD,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;QACzB,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC;QACrC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAClC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC;QAClD,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC;QAC5C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/H,uBAAuB,EAAE,CAAC,CAAC,cAAc,CAAC,yBAAyB,CAAC;QACpE,kBAAkB,EAAE,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC;QAC1D,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invoices.d.ts","sourceRoot":"","sources":["../../src/resources/Invoices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAuD,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Invoices.d.ts","sourceRoot":"","sources":["../../src/resources/Invoices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAuD,KAAK,cAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMxK,sHAAsH;AACtH,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB;IAClB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB;IAClB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,oDAAoD;AACpD,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAEjD;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAc9G,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM9C,0CAA0C;IACpC,IAAI,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBnE,qHAAqH;IAC9G,GAAG,CAAC,OAAO,GAAE,iBAAiB,GAAG;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,cAAc,CAAC,OAAO,CAAC;CAStG"}
|
|
@@ -2,6 +2,7 @@ import { Fields } from '../model/Fields.js';
|
|
|
2
2
|
import { parseCreatedInvoice, parseInvoice, parseInvoicePage } from '../model/Invoice.js';
|
|
3
3
|
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
4
4
|
const DAY = /^\d{4}-\d{2}-\d{2}$/;
|
|
5
|
+
const IDEMPOTENCY_KEY = /^[\x21-\x7e]{1,255}$/;
|
|
5
6
|
/** Invoices of the store the API key belongs to. */
|
|
6
7
|
export class Invoices {
|
|
7
8
|
transport;
|
|
@@ -16,6 +17,10 @@ export class Invoices {
|
|
|
16
17
|
if (!Number.isSafeInteger(input.amountUsdCents) || input.amountUsdCents < 1) {
|
|
17
18
|
throw new RangeError('amountUsdCents must be a positive whole number of US cents, for example 1999 for $19.99');
|
|
18
19
|
}
|
|
20
|
+
// What the API accepts; anything else would be refused there, or make fetch throw on the header.
|
|
21
|
+
if (options.idempotencyKey !== undefined && !IDEMPOTENCY_KEY.test(options.idempotencyKey)) {
|
|
22
|
+
throw new RangeError('The idempotency key must be 1 to 255 printable ASCII characters without spaces, such as your order id');
|
|
23
|
+
}
|
|
19
24
|
const body = { amountUsdCents: input.amountUsdCents };
|
|
20
25
|
if (input.externalReference !== undefined)
|
|
21
26
|
body['externalReference'] = input.externalReference;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invoices.js","sourceRoot":"","sources":["../../src/resources/Invoices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,EAAgF,MAAM,qBAAqB,CAAC;AAExK,MAAM,IAAI,GAAG,iEAAiE,CAAC;AAC/E,MAAM,GAAG,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Invoices.js","sourceRoot":"","sources":["../../src/resources/Invoices.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,10 @@ export declare class Stores {
|
|
|
5
5
|
constructor(transport: Transport);
|
|
6
6
|
/** The store the API key belongs to: a cheap way to check that the key works. */
|
|
7
7
|
current(): Promise<Store>;
|
|
8
|
+
/**
|
|
9
|
+
* Revokes the API key of this client; it stops working at once (use it when the shop disconnects). A key that is already
|
|
10
|
+
* revoked answers with AuthenticationError, which for a disconnect means the same.
|
|
11
|
+
*/
|
|
12
|
+
revokeCurrentKey(): Promise<void>;
|
|
8
13
|
}
|
|
9
14
|
//# sourceMappingURL=Stores.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stores.d.ts","sourceRoot":"","sources":["../../src/resources/Stores.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE9D,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAEjD,iFAAiF;IAC3E,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"Stores.d.ts","sourceRoot":"","sources":["../../src/resources/Stores.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE9D,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAEjD,iFAAiF;IAC3E,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IAI/B;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGxC"}
|
package/dist/resources/Stores.js
CHANGED
|
@@ -9,5 +9,12 @@ export class Stores {
|
|
|
9
9
|
async current() {
|
|
10
10
|
return parseStore(Fields.of(await this.transport.get('/v1/store'), 'store'));
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Revokes the API key of this client; it stops working at once (use it when the shop disconnects). A key that is already
|
|
14
|
+
* revoked answers with AuthenticationError, which for a disconnect means the same.
|
|
15
|
+
*/
|
|
16
|
+
async revokeCurrentKey() {
|
|
17
|
+
await this.transport.delete('/v1/store/api-keys/current');
|
|
18
|
+
}
|
|
12
19
|
}
|
|
13
20
|
//# sourceMappingURL=Stores.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stores.js","sourceRoot":"","sources":["../../src/resources/Stores.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAc,MAAM,sBAAsB,CAAC;AAE9D,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,iFAAiF;IACjF,KAAK,CAAC,OAAO;QACX,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/E,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"Stores.js","sourceRoot":"","sources":["../../src/resources/Stores.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAc,MAAM,sBAAsB,CAAC;AAE9D,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,iFAAiF;IACjF,KAAK,CAAC,OAAO;QACX,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAC5D,CAAC;CACF"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.
|
|
1
|
+
export declare const VERSION = "1.3.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = '1.
|
|
1
|
+
export const VERSION = '1.3.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -2,7 +2,9 @@ import type { Fields } from '../model/Fields.js';
|
|
|
2
2
|
import { type Invoice } from '../model/Invoice.js';
|
|
3
3
|
/**
|
|
4
4
|
* A verified webhook. Types: invoice.paid, invoice.overpaid, invoice.underpaid, invoice.expired, invoice.paid_late,
|
|
5
|
-
* invoice.on_hold and webhook.test.
|
|
5
|
+
* invoice.on_hold, invoice.payment_flagged and webhook.test. invoice.payment_flagged: a payment of a settled invoice was
|
|
6
|
+
* flagged by screening; the invoice keeps its status and `data.payment` holds the payment. Deliveries can repeat: use `id`
|
|
7
|
+
* to process each event once.
|
|
6
8
|
*/
|
|
7
9
|
export interface WebhookEvent {
|
|
8
10
|
readonly id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookEvent.d.ts","sourceRoot":"","sources":["../../src/webhook/WebhookEvent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEjE
|
|
1
|
+
{"version":3,"file":"WebhookEvent.d.ts","sourceRoot":"","sources":["../../src/webhook/WebhookEvent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAIzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookEvent.js","sourceRoot":"","sources":["../../src/webhook/WebhookEvent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"WebhookEvent.js","sourceRoot":"","sources":["../../src/webhook/WebhookEvent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AAkBjE,MAAM,UAAU,iBAAiB,CAAC,CAAS;IACzC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC5K,CAAC"}
|
|
@@ -17,6 +17,8 @@ export declare class WebhookVerifier {
|
|
|
17
17
|
/** `secret` is the webhook signing secret of the store (whsec_...). */
|
|
18
18
|
constructor(secret: string, options?: WebhookVerifierOptions);
|
|
19
19
|
verify(rawBody: string | Uint8Array, signatureHeader: string | null | undefined): Promise<WebhookEvent>;
|
|
20
|
+
/** The bytes as sent: a leading byte order mark is kept, so the signed text is exactly what arrived. */
|
|
21
|
+
private static text;
|
|
20
22
|
private static parse;
|
|
21
23
|
}
|
|
22
24
|
//# sourceMappingURL=WebhookVerifier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookVerifier.d.ts","sourceRoot":"","sources":["../../src/webhook/WebhookVerifier.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC,2EAA2E;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAYD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B,uEAAuE;gBAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAQ1D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB7G,OAAO,CAAC,MAAM,CAAC,KAAK;CAYrB"}
|
|
1
|
+
{"version":3,"file":"WebhookVerifier.d.ts","sourceRoot":"","sources":["../../src/webhook/WebhookVerifier.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC,2EAA2E;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAYD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAE9B,uEAAuE;gBAC3D,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B;IAQ1D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB7G,wGAAwG;IACxG,OAAO,CAAC,MAAM,CAAC,IAAI;IAOnB,OAAO,CAAC,MAAM,CAAC,KAAK;CAYrB"}
|
|
@@ -33,7 +33,7 @@ export class WebhookVerifier {
|
|
|
33
33
|
this.key = crypto.subtle.importKey('raw', encoder.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
34
34
|
}
|
|
35
35
|
async verify(rawBody, signatureHeader) {
|
|
36
|
-
const body = typeof rawBody === 'string' ? rawBody :
|
|
36
|
+
const body = typeof rawBody === 'string' ? rawBody : WebhookVerifier.text(rawBody);
|
|
37
37
|
const { timestamp, signatures } = WebhookVerifier.parse(signatureHeader ?? '');
|
|
38
38
|
if (Math.abs(this.clock.now() - timestamp) > this.toleranceSeconds)
|
|
39
39
|
throw new SignatureError('The webhook signature is too old or from the future; check the server clock');
|
|
@@ -55,6 +55,15 @@ export class WebhookVerifier {
|
|
|
55
55
|
throw new SignatureError(`The webhook is signed but its body is not a Stablevoy event: ${error.message}`, { cause: error });
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
+
/** The bytes as sent: a leading byte order mark is kept, so the signed text is exactly what arrived. */
|
|
59
|
+
static text(bytes) {
|
|
60
|
+
try {
|
|
61
|
+
return new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new SignatureError('The webhook body is not UTF-8 text', { cause: error });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
58
67
|
static parse(header) {
|
|
59
68
|
if (header.trim() === '')
|
|
60
69
|
throw new SignatureError('The X-Stablevoy-Signature header is missing');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookVerifier.js","sourceRoot":"","sources":["../../src/webhook/WebhookVerifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAqB,MAAM,mBAAmB,CAAC;AAQzE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,6EAA6E;AAC7E,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACT,GAAG,CAAqB;IACxB,gBAAgB,CAAS;IACzB,KAAK,CAAQ;IAE9B,uEAAuE;IACvE,YAAY,MAAc,EAAE,UAAkC,EAAE;QAC9D,IAAI,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,UAAU,CAAC,sGAAsG,CAAC,CAAC;QAChJ,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,uDAAuD,CAAC,CAAC;QACzJ,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;QAC1C,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACxH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA4B,EAAE,eAA0C;QACnF,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"WebhookVerifier.js","sourceRoot":"","sources":["../../src/webhook/WebhookVerifier.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stablevoy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Node.js and TypeScript client for the Stablevoy API: non-custodial USDT and USDC payments, invoices and signed webhooks.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"stablevoy",
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@eslint/js": "10.0.1",
|
|
54
|
-
"@types/node": "26.6.
|
|
54
|
+
"@types/node": "26.6.6",
|
|
55
55
|
"@vitest/coverage-v8": "5.0.5",
|
|
56
|
-
"eslint": "10.
|
|
56
|
+
"eslint": "10.14.0",
|
|
57
57
|
"typescript": "6.0.3",
|
|
58
|
-
"typescript-eslint": "8.72.
|
|
58
|
+
"typescript-eslint": "8.72.1",
|
|
59
59
|
"vitest": "5.0.5"
|
|
60
60
|
}
|
|
61
61
|
}
|