modern-treasury 2.2.0 → 2.4.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 +75 -0
- package/README.md +43 -15
- package/_shims/ReadableStream-node.d.ts +6 -0
- package/_shims/ReadableStream-node.d.ts.map +1 -0
- package/_shims/ReadableStream-node.js +14 -0
- package/_shims/ReadableStream-node.js.map +1 -0
- package/_shims/ReadableStream-node.mjs +3 -0
- package/_shims/ReadableStream-node.mjs.map +1 -0
- package/_shims/ReadableStream.d.ts +38 -0
- package/_shims/ReadableStream.js +5 -0
- package/_shims/ReadableStream.mjs +7 -0
- package/_shims/{agent.node.d.ts → agent-node.d.ts} +1 -1
- package/_shims/agent-node.d.ts.map +1 -0
- package/_shims/{agent.node.js → agent-node.js} +1 -1
- package/_shims/{agent.node.js.map → agent-node.js.map} +1 -1
- package/_shims/{agent.node.mjs → agent-node.mjs} +1 -1
- package/_shims/{agent.node.mjs.map → agent-node.mjs.map} +1 -1
- package/_shims/agent.d.ts +1 -1
- package/_shims/agent.js +1 -1
- package/_shims/agent.mjs +1 -1
- package/_shims/{fetch.node.d.ts → fetch-node.d.ts} +12 -1
- package/_shims/fetch.d.ts +9 -1
- package/_shims/{fileFromPath.node.d.ts → fileFromPath-node.d.ts} +2 -2
- package/_shims/{fileFromPath.node.d.ts.map → fileFromPath-node.d.ts.map} +1 -1
- package/_shims/{fileFromPath.node.js → fileFromPath-node.js} +1 -1
- package/_shims/{fileFromPath.node.js.map → fileFromPath-node.js.map} +1 -1
- package/_shims/{fileFromPath.node.mjs → fileFromPath-node.mjs} +1 -1
- package/_shims/{fileFromPath.node.mjs.map → fileFromPath-node.mjs.map} +1 -1
- package/_shims/fileFromPath.d.ts +2 -2
- package/_shims/fileFromPath.d.ts.map +1 -1
- package/_shims/fileFromPath.js +1 -1
- package/_shims/fileFromPath.mjs +1 -1
- package/_shims/form-data.js +17 -0
- package/_shims/form-data.mjs +20 -0
- package/_shims/{getMultipartRequestOptions.node.d.ts → getMultipartRequestOptions-node.d.ts} +2 -2
- package/_shims/getMultipartRequestOptions-node.d.ts.map +1 -0
- package/_shims/{getMultipartRequestOptions.node.js → getMultipartRequestOptions-node.js} +1 -1
- package/_shims/{getMultipartRequestOptions.node.js.map → getMultipartRequestOptions-node.js.map} +1 -1
- package/_shims/{getMultipartRequestOptions.node.mjs → getMultipartRequestOptions-node.mjs} +1 -1
- package/_shims/{getMultipartRequestOptions.node.mjs.map → getMultipartRequestOptions-node.mjs.map} +1 -1
- package/_shims/getMultipartRequestOptions.d.ts +1 -1
- package/_shims/getMultipartRequestOptions.d.ts.map +1 -1
- package/_shims/{node-readable.node.d.ts → node-readable-node.d.ts} +1 -1
- package/_shims/{node-readable.node.d.ts.map → node-readable-node.d.ts.map} +1 -1
- package/_shims/{node-readable.node.js → node-readable-node.js} +1 -1
- package/_shims/node-readable-node.js.map +1 -0
- package/_shims/{node-readable.node.mjs → node-readable-node.mjs} +1 -1
- package/_shims/node-readable-node.mjs.map +1 -0
- package/core.d.ts +91 -34
- package/core.d.ts.map +1 -1
- package/core.js +201 -70
- package/core.js.map +1 -1
- package/core.mjs +195 -70
- package/core.mjs.map +1 -1
- package/index.d.mts +19 -7
- package/index.d.ts +19 -7
- package/index.d.ts.map +1 -1
- package/index.js +23 -9
- package/index.js.map +1 -1
- package/index.mjs +23 -9
- package/index.mjs.map +1 -1
- package/package.json +32 -9
- package/pagination.d.ts +2 -2
- package/pagination.d.ts.map +1 -1
- package/pagination.js +5 -5
- package/pagination.js.map +1 -1
- package/pagination.mjs +5 -5
- package/pagination.mjs.map +1 -1
- package/resources/account-collection-flows.d.ts +8 -33
- package/resources/account-collection-flows.d.ts.map +1 -1
- package/resources/account-collection-flows.js +22 -17
- package/resources/account-collection-flows.js.map +1 -1
- package/resources/account-collection-flows.mjs +22 -17
- package/resources/account-collection-flows.mjs.map +1 -1
- package/resources/account-details.d.ts +8 -13
- package/resources/account-details.d.ts.map +1 -1
- package/resources/account-details.js +10 -4
- package/resources/account-details.js.map +1 -1
- package/resources/account-details.mjs +10 -4
- package/resources/account-details.mjs.map +1 -1
- package/resources/connections.d.ts +5 -2
- package/resources/connections.d.ts.map +1 -1
- package/resources/connections.js +3 -3
- package/resources/connections.js.map +1 -1
- package/resources/connections.mjs +3 -3
- package/resources/connections.mjs.map +1 -1
- package/resources/counterparties.d.ts +37 -51
- package/resources/counterparties.d.ts.map +1 -1
- package/resources/counterparties.js +17 -5
- package/resources/counterparties.js.map +1 -1
- package/resources/counterparties.mjs +17 -5
- package/resources/counterparties.mjs.map +1 -1
- package/resources/documents.d.ts +6 -17
- package/resources/documents.d.ts.map +1 -1
- package/resources/documents.js +13 -7
- package/resources/documents.js.map +1 -1
- package/resources/documents.mjs +13 -7
- package/resources/documents.mjs.map +1 -1
- package/resources/events.d.ts +3 -3
- package/resources/events.d.ts.map +1 -1
- package/resources/events.js +3 -3
- package/resources/events.mjs +3 -3
- package/resources/expected-payments.d.ts +30 -39
- package/resources/expected-payments.d.ts.map +1 -1
- package/resources/expected-payments.js +10 -4
- package/resources/expected-payments.js.map +1 -1
- package/resources/expected-payments.mjs +10 -4
- package/resources/expected-payments.mjs.map +1 -1
- package/resources/external-accounts.d.ts +27 -61
- package/resources/external-accounts.d.ts.map +1 -1
- package/resources/external-accounts.js +24 -6
- package/resources/external-accounts.js.map +1 -1
- package/resources/external-accounts.mjs +24 -6
- package/resources/external-accounts.mjs.map +1 -1
- package/resources/incoming-payment-details.d.ts +20 -21
- package/resources/incoming-payment-details.d.ts.map +1 -1
- package/resources/incoming-payment-details.js +10 -4
- package/resources/incoming-payment-details.js.map +1 -1
- package/resources/incoming-payment-details.mjs +10 -4
- package/resources/incoming-payment-details.mjs.map +1 -1
- package/resources/index.d.ts +0 -3
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs.map +1 -1
- package/resources/internal-accounts/balance-reports.d.ts +6 -3
- package/resources/internal-accounts/balance-reports.d.ts.map +1 -1
- package/resources/internal-accounts/balance-reports.js +3 -3
- package/resources/internal-accounts/balance-reports.js.map +1 -1
- package/resources/internal-accounts/balance-reports.mjs +3 -3
- package/resources/internal-accounts/balance-reports.mjs.map +1 -1
- package/resources/internal-accounts/internal-accounts.d.ts +16 -21
- package/resources/internal-accounts/internal-accounts.d.ts.map +1 -1
- package/resources/internal-accounts/internal-accounts.js +10 -4
- package/resources/internal-accounts/internal-accounts.js.map +1 -1
- package/resources/internal-accounts/internal-accounts.mjs +10 -4
- package/resources/internal-accounts/internal-accounts.mjs.map +1 -1
- package/resources/invoices/invoices.d.ts +67 -42
- package/resources/invoices/invoices.d.ts.map +1 -1
- package/resources/invoices/invoices.js +10 -4
- package/resources/invoices/invoices.js.map +1 -1
- package/resources/invoices/invoices.mjs +10 -4
- package/resources/invoices/invoices.mjs.map +1 -1
- package/resources/invoices/line-items.d.ts +32 -185
- package/resources/invoices/line-items.d.ts.map +1 -1
- package/resources/invoices/line-items.js +10 -4
- package/resources/invoices/line-items.js.map +1 -1
- package/resources/invoices/line-items.mjs +10 -4
- package/resources/invoices/line-items.mjs.map +1 -1
- package/resources/ledger-account-categories.d.ts +47 -87
- package/resources/ledger-account-categories.d.ts.map +1 -1
- package/resources/ledger-account-categories.js +21 -17
- package/resources/ledger-account-categories.js.map +1 -1
- package/resources/ledger-account-categories.mjs +21 -17
- package/resources/ledger-account-categories.mjs.map +1 -1
- package/resources/ledger-account-payouts.d.ts +33 -22
- package/resources/ledger-account-payouts.d.ts.map +1 -1
- package/resources/ledger-account-payouts.js +10 -4
- package/resources/ledger-account-payouts.js.map +1 -1
- package/resources/ledger-account-payouts.mjs +10 -4
- package/resources/ledger-account-payouts.mjs.map +1 -1
- package/resources/ledger-account-statements.d.ts +11 -16
- package/resources/ledger-account-statements.d.ts.map +1 -1
- package/resources/ledger-account-statements.js +8 -2
- package/resources/ledger-account-statements.js.map +1 -1
- package/resources/ledger-account-statements.mjs +8 -2
- package/resources/ledger-account-statements.mjs.map +1 -1
- package/resources/ledger-accounts.d.ts +30 -30
- package/resources/ledger-accounts.d.ts.map +1 -1
- package/resources/ledger-accounts.js +10 -4
- package/resources/ledger-accounts.js.map +1 -1
- package/resources/ledger-accounts.mjs +10 -4
- package/resources/ledger-accounts.mjs.map +1 -1
- package/resources/ledger-entries.d.ts +20 -6
- package/resources/ledger-entries.d.ts.map +1 -1
- package/resources/ledger-entries.js +3 -3
- package/resources/ledger-entries.js.map +1 -1
- package/resources/ledger-entries.mjs +3 -3
- package/resources/ledger-entries.mjs.map +1 -1
- package/resources/ledger-event-handlers.d.ts +12 -24
- package/resources/ledger-event-handlers.d.ts.map +1 -1
- package/resources/ledger-event-handlers.js +10 -4
- package/resources/ledger-event-handlers.js.map +1 -1
- package/resources/ledger-event-handlers.mjs +10 -4
- package/resources/ledger-event-handlers.mjs.map +1 -1
- package/resources/ledger-transactions/ledger-transactions.d.ts +48 -37
- package/resources/ledger-transactions/ledger-transactions.d.ts.map +1 -1
- package/resources/ledger-transactions/ledger-transactions.js +13 -7
- package/resources/ledger-transactions/ledger-transactions.js.map +1 -1
- package/resources/ledger-transactions/ledger-transactions.mjs +13 -7
- package/resources/ledger-transactions/ledger-transactions.mjs.map +1 -1
- package/resources/ledger-transactions/versions.d.ts +4 -2
- package/resources/ledger-transactions/versions.d.ts.map +1 -1
- package/resources/ledger-transactions/versions.js +3 -3
- package/resources/ledger-transactions/versions.js.map +1 -1
- package/resources/ledger-transactions/versions.mjs +3 -3
- package/resources/ledger-transactions/versions.mjs.map +1 -1
- package/resources/ledgerable-events.d.ts +13 -18
- package/resources/ledgerable-events.d.ts.map +1 -1
- package/resources/ledgerable-events.js +8 -2
- package/resources/ledgerable-events.js.map +1 -1
- package/resources/ledgerable-events.mjs +8 -2
- package/resources/ledgerable-events.mjs.map +1 -1
- package/resources/ledgers.d.ts +16 -20
- package/resources/ledgers.d.ts.map +1 -1
- package/resources/ledgers.js +10 -4
- package/resources/ledgers.js.map +1 -1
- package/resources/ledgers.mjs +10 -4
- package/resources/ledgers.mjs.map +1 -1
- package/resources/line-items.d.ts +5 -5
- package/resources/line-items.d.ts.map +1 -1
- package/resources/line-items.js +3 -3
- package/resources/line-items.mjs +3 -3
- package/resources/paper-items.d.ts +6 -3
- package/resources/paper-items.d.ts.map +1 -1
- package/resources/paper-items.js +3 -3
- package/resources/paper-items.js.map +1 -1
- package/resources/paper-items.mjs +3 -3
- package/resources/paper-items.mjs.map +1 -1
- package/resources/payment-flows.d.ts +18 -42
- package/resources/payment-flows.d.ts.map +1 -1
- package/resources/payment-flows.js +22 -17
- package/resources/payment-flows.js.map +1 -1
- package/resources/payment-flows.mjs +22 -17
- package/resources/payment-flows.mjs.map +1 -1
- package/resources/payment-orders/payment-orders.d.ts +172 -191
- package/resources/payment-orders/payment-orders.d.ts.map +1 -1
- package/resources/payment-orders/payment-orders.js +21 -11
- package/resources/payment-orders/payment-orders.js.map +1 -1
- package/resources/payment-orders/payment-orders.mjs +21 -11
- package/resources/payment-orders/payment-orders.mjs.map +1 -1
- package/resources/payment-orders/reversals.d.ts +21 -22
- package/resources/payment-orders/reversals.d.ts.map +1 -1
- package/resources/payment-orders/reversals.js +10 -4
- package/resources/payment-orders/reversals.js.map +1 -1
- package/resources/payment-orders/reversals.mjs +10 -4
- package/resources/payment-orders/reversals.mjs.map +1 -1
- package/resources/payment-references.d.ts +3 -3
- package/resources/payment-references.d.ts.map +1 -1
- package/resources/payment-references.js +3 -3
- package/resources/payment-references.mjs +3 -3
- package/resources/returns.d.ts +16 -19
- package/resources/returns.d.ts.map +1 -1
- package/resources/returns.js +10 -4
- package/resources/returns.js.map +1 -1
- package/resources/returns.mjs +10 -4
- package/resources/returns.mjs.map +1 -1
- package/resources/routing-details.d.ts +9 -15
- package/resources/routing-details.d.ts.map +1 -1
- package/resources/routing-details.js +10 -4
- package/resources/routing-details.js.map +1 -1
- package/resources/routing-details.mjs +10 -4
- package/resources/routing-details.mjs.map +1 -1
- package/resources/transactions/line-items.d.ts +5 -2
- package/resources/transactions/line-items.d.ts.map +1 -1
- package/resources/transactions/line-items.js +3 -3
- package/resources/transactions/line-items.js.map +1 -1
- package/resources/transactions/line-items.mjs +3 -3
- package/resources/transactions/line-items.mjs.map +1 -1
- package/resources/transactions/transactions.d.ts +8 -5
- package/resources/transactions/transactions.d.ts.map +1 -1
- package/resources/transactions/transactions.js +3 -3
- package/resources/transactions/transactions.js.map +1 -1
- package/resources/transactions/transactions.mjs +3 -3
- package/resources/transactions/transactions.mjs.map +1 -1
- package/resources/validations.d.ts +1 -1
- package/resources/validations.d.ts.map +1 -1
- package/resources/validations.js +1 -1
- package/resources/validations.mjs +1 -1
- package/resources/virtual-accounts.d.ts +19 -28
- package/resources/virtual-accounts.d.ts.map +1 -1
- package/resources/virtual-accounts.js +10 -4
- package/resources/virtual-accounts.js.map +1 -1
- package/resources/virtual-accounts.mjs +10 -4
- package/resources/virtual-accounts.mjs.map +1 -1
- package/resources/webhooks.js +2 -2
- package/resources/webhooks.mjs +2 -2
- package/src/_shims/ReadableStream-node.ts +6 -0
- package/src/_shims/ReadableStream.d.ts +38 -0
- package/src/_shims/ReadableStream.js +5 -0
- package/src/_shims/ReadableStream.mjs +7 -0
- package/src/_shims/agent.ts +1 -1
- package/src/_shims/{fetch.node.d.ts → fetch-node.d.ts} +20 -9
- package/src/_shims/fetch.d.ts +18 -10
- package/src/_shims/{fileFromPath.node.ts → fileFromPath-node.ts} +1 -1
- package/src/_shims/fileFromPath.ts +2 -2
- package/src/_shims/{formdata.node.d.ts → form-data-node.d.ts} +4 -4
- package/src/_shims/{formdata.d.ts → form-data.d.ts} +4 -4
- package/src/_shims/form-data.js +17 -0
- package/src/_shims/form-data.mjs +20 -0
- package/src/_shims/{getMultipartRequestOptions.node.ts → getMultipartRequestOptions-node.ts} +3 -3
- package/src/_shims/getMultipartRequestOptions.ts +3 -3
- package/src/core.ts +275 -97
- package/src/error.ts +1 -1
- package/src/index.ts +31 -18
- package/src/pagination.ts +6 -6
- package/src/resource.ts +1 -1
- package/src/resources/account-collection-flows.ts +29 -57
- package/src/resources/account-details.ts +22 -22
- package/src/resources/connections.ts +11 -8
- package/src/resources/counterparties.ts +61 -65
- package/src/resources/documents.ts +21 -30
- package/src/resources/events.ts +9 -9
- package/src/resources/expected-payments.ts +45 -49
- package/src/resources/external-accounts.ts +59 -78
- package/src/resources/incoming-payment-details.ts +38 -33
- package/src/resources/index.ts +39 -36
- package/src/resources/internal-accounts/balance-reports.ts +13 -10
- package/src/resources/internal-accounts/index.ts +2 -2
- package/src/resources/internal-accounts/internal-accounts.ts +35 -35
- package/src/resources/invoices/index.ts +2 -2
- package/src/resources/invoices/invoices.ts +91 -54
- package/src/resources/invoices/line-items.ts +46 -228
- package/src/resources/ledger-account-categories.ts +67 -111
- package/src/resources/ledger-account-payouts.ts +49 -30
- package/src/resources/ledger-account-statements.ts +21 -21
- package/src/resources/ledger-accounts.ts +46 -40
- package/src/resources/ledger-entries.ts +29 -13
- package/src/resources/ledger-event-handlers.ts +25 -35
- package/src/resources/ledger-transactions/index.ts +2 -2
- package/src/resources/ledger-transactions/ledger-transactions.ts +73 -53
- package/src/resources/ledger-transactions/versions.ts +10 -8
- package/src/resources/ledgerable-events.ts +23 -23
- package/src/resources/ledgers.ts +31 -29
- package/src/resources/line-items.ts +12 -12
- package/src/resources/paper-items.ts +13 -10
- package/src/resources/payment-flows.ts +39 -66
- package/src/resources/payment-orders/index.ts +2 -2
- package/src/resources/payment-orders/payment-orders.ts +204 -216
- package/src/resources/payment-orders/reversals.ts +36 -31
- package/src/resources/payment-references.ts +9 -9
- package/src/resources/returns.ts +30 -28
- package/src/resources/routing-details.ts +23 -24
- package/src/resources/top-level.ts +1 -1
- package/src/resources/transactions/index.ts +7 -2
- package/src/resources/transactions/line-items.ts +11 -8
- package/src/resources/transactions/transactions.ts +17 -14
- package/src/resources/validations.ts +4 -4
- package/src/resources/virtual-accounts.ts +35 -39
- package/src/resources/webhooks.ts +3 -3
- package/src/tsconfig.json +11 -0
- package/src/uploads.ts +6 -6
- package/src/version.ts +1 -1
- package/uploads.d.ts +1 -1
- package/uploads.d.ts.map +1 -1
- package/uploads.js +7 -7
- package/uploads.js.map +1 -1
- package/uploads.mjs +4 -4
- package/uploads.mjs.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
- package/_shims/agent.node.d.ts.map +0 -1
- package/_shims/formdata.js +0 -9
- package/_shims/formdata.mjs +0 -11
- package/_shims/getMultipartRequestOptions.node.d.ts.map +0 -1
- package/_shims/node-readable.node.js.map +0 -1
- package/_shims/node-readable.node.mjs.map +0 -1
- package/src/_shims/fetch.deno.ts +0 -23
- package/src/_shims/formdata.deno.ts +0 -16
- package/src/_shims/formdata.js +0 -9
- package/src/_shims/formdata.mjs +0 -11
- /package/_shims/{fetch.node.js → fetch-node.js} +0 -0
- /package/_shims/{fetch.node.mjs → fetch-node.mjs} +0 -0
- /package/_shims/{formdata.node.d.ts → form-data-node.d.ts} +0 -0
- /package/_shims/{formdata.node.js → form-data-node.js} +0 -0
- /package/_shims/{formdata.node.mjs → form-data-node.mjs} +0 -0
- /package/_shims/{formdata.d.ts → form-data.d.ts} +0 -0
- /package/src/_shims/{agent.node.ts → agent-node.ts} +0 -0
- /package/src/_shims/{fetch.node.js → fetch-node.js} +0 -0
- /package/src/_shims/{fetch.node.mjs → fetch-node.mjs} +0 -0
- /package/src/_shims/{formdata.node.js → form-data-node.js} +0 -0
- /package/src/_shims/{formdata.node.mjs → form-data-node.mjs} +0 -0
- /package/src/_shims/{node-readable.node.ts → node-readable-node.ts} +0 -0
package/src/core.ts
CHANGED
|
@@ -1,26 +1,122 @@
|
|
|
1
|
-
import { VERSION } from './version';
|
|
2
|
-
import { APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError } from './error';
|
|
3
|
-
import type { Readable } from './_shims/node-readable';
|
|
4
|
-
import { getDefaultAgent, type Agent } from './_shims/agent';
|
|
1
|
+
import { VERSION } from './version.js';
|
|
2
|
+
import { APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError } from './error.js';
|
|
3
|
+
import type { Readable } from './_shims/node-readable.js';
|
|
4
|
+
import { getDefaultAgent, type Agent } from './_shims/agent.js';
|
|
5
5
|
import {
|
|
6
6
|
fetch,
|
|
7
7
|
isPolyfilled as fetchIsPolyfilled,
|
|
8
8
|
type RequestInfo,
|
|
9
9
|
type RequestInit,
|
|
10
10
|
type Response,
|
|
11
|
+
type HeadersInit,
|
|
11
12
|
} from './_shims/fetch.js';
|
|
12
|
-
|
|
13
|
+
export { type Response };
|
|
14
|
+
import { isMultipartBody } from './uploads.js';
|
|
13
15
|
export {
|
|
14
16
|
maybeMultipartFormRequestOptions,
|
|
15
17
|
multipartFormRequestOptions,
|
|
16
18
|
createForm,
|
|
17
19
|
type Uploadable,
|
|
18
|
-
} from './uploads';
|
|
20
|
+
} from './uploads.js';
|
|
19
21
|
|
|
20
22
|
const MAX_RETRIES = 2;
|
|
21
23
|
|
|
22
24
|
export type Fetch = (url: RequestInfo, init?: RequestInit) => Promise<Response>;
|
|
23
25
|
|
|
26
|
+
type PromiseOrValue<T> = T | Promise<T>;
|
|
27
|
+
|
|
28
|
+
type APIResponseProps = {
|
|
29
|
+
response: Response;
|
|
30
|
+
options: FinalRequestOptions;
|
|
31
|
+
controller: AbortController;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
async function defaultParseResponse<T>(props: APIResponseProps): Promise<T> {
|
|
35
|
+
const { response } = props;
|
|
36
|
+
const contentType = response.headers.get('content-type');
|
|
37
|
+
if (contentType?.includes('application/json')) {
|
|
38
|
+
const json = await response.json();
|
|
39
|
+
|
|
40
|
+
debug('response', response.status, response.url, response.headers, json);
|
|
41
|
+
|
|
42
|
+
return json as T;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// TODO handle blob, arraybuffer, other content types, etc.
|
|
46
|
+
const text = await response.text();
|
|
47
|
+
debug('response', response.status, response.url, response.headers, text);
|
|
48
|
+
return text as any as T;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A subclass of `Promise` providing additional helper methods
|
|
53
|
+
* for interacting with the SDK.
|
|
54
|
+
*/
|
|
55
|
+
export class APIPromise<T> extends Promise<T> {
|
|
56
|
+
private parsedPromise: Promise<T> | undefined;
|
|
57
|
+
|
|
58
|
+
constructor(
|
|
59
|
+
private responsePromise: Promise<APIResponseProps>,
|
|
60
|
+
private parseResponse: (props: APIResponseProps) => PromiseOrValue<T> = defaultParseResponse,
|
|
61
|
+
) {
|
|
62
|
+
super((resolve) => {
|
|
63
|
+
// this is maybe a bit weird but this has to be a no-op to not implicitly
|
|
64
|
+
// parse the response body; instead .then, .catch, .finally are overridden
|
|
65
|
+
// to parse the response
|
|
66
|
+
resolve(null as any);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
_thenUnwrap<U>(transform: (data: T) => U): APIPromise<U> {
|
|
71
|
+
return new APIPromise(this.responsePromise, async (props) => transform(await this.parseResponse(props)));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Gets the raw `Response` instance instead of parsing the response
|
|
76
|
+
* data.
|
|
77
|
+
*
|
|
78
|
+
* If you want to parse the response body but still get the `Response`
|
|
79
|
+
* instance, you can use {@link withResponse()}.
|
|
80
|
+
*/
|
|
81
|
+
asResponse(): Promise<Response> {
|
|
82
|
+
return this.responsePromise.then((p) => p.response);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Gets the parsed response data and the raw `Response` instance.
|
|
86
|
+
*
|
|
87
|
+
* If you just want to get the raw `Response` instance without parsing it,
|
|
88
|
+
* you can use {@link asResponse()}.
|
|
89
|
+
*/
|
|
90
|
+
async withResponse(): Promise<{ data: T; response: Response }> {
|
|
91
|
+
const [data, response] = await Promise.all([this.parse(), this.asResponse()]);
|
|
92
|
+
return { data, response };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private parse(): Promise<T> {
|
|
96
|
+
if (!this.parsedPromise) {
|
|
97
|
+
this.parsedPromise = this.responsePromise.then(this.parseResponse);
|
|
98
|
+
}
|
|
99
|
+
return this.parsedPromise;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
override then<TResult1 = T, TResult2 = never>(
|
|
103
|
+
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,
|
|
104
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,
|
|
105
|
+
): Promise<TResult1 | TResult2> {
|
|
106
|
+
return this.parse().then(onfulfilled, onrejected);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
override catch<TResult = never>(
|
|
110
|
+
onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null,
|
|
111
|
+
): Promise<T | TResult> {
|
|
112
|
+
return this.parse().catch(onrejected);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
override finally(onfinally?: (() => void) | undefined | null): Promise<T> {
|
|
116
|
+
return this.parse().finally(onfinally);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
24
120
|
export abstract class APIClient {
|
|
25
121
|
baseURL: string;
|
|
26
122
|
maxRetries: number;
|
|
@@ -33,7 +129,7 @@ export abstract class APIClient {
|
|
|
33
129
|
constructor({
|
|
34
130
|
baseURL,
|
|
35
131
|
maxRetries,
|
|
36
|
-
timeout =
|
|
132
|
+
timeout = 60000, // 1 minute
|
|
37
133
|
httpAgent,
|
|
38
134
|
fetch: overridenFetch,
|
|
39
135
|
}: {
|
|
@@ -51,7 +147,7 @@ export abstract class APIClient {
|
|
|
51
147
|
this.fetch = overridenFetch ?? fetch;
|
|
52
148
|
}
|
|
53
149
|
|
|
54
|
-
protected authHeaders(): Headers {
|
|
150
|
+
protected authHeaders(opts: FinalRequestOptions): Headers {
|
|
55
151
|
return {};
|
|
56
152
|
}
|
|
57
153
|
|
|
@@ -63,13 +159,13 @@ export abstract class APIClient {
|
|
|
63
159
|
* Authorization: 'Bearer 123',
|
|
64
160
|
* }
|
|
65
161
|
*/
|
|
66
|
-
protected defaultHeaders(): Headers {
|
|
162
|
+
protected defaultHeaders(opts: FinalRequestOptions): Headers {
|
|
67
163
|
return {
|
|
68
164
|
Accept: 'application/json',
|
|
69
165
|
'Content-Type': 'application/json',
|
|
70
166
|
'User-Agent': this.getUserAgent(),
|
|
71
167
|
...getPlatformHeaders(),
|
|
72
|
-
...this.authHeaders(),
|
|
168
|
+
...this.authHeaders(opts),
|
|
73
169
|
};
|
|
74
170
|
}
|
|
75
171
|
|
|
@@ -84,27 +180,39 @@ export abstract class APIClient {
|
|
|
84
180
|
return `stainless-node-retry-${uuid4()}`;
|
|
85
181
|
}
|
|
86
182
|
|
|
87
|
-
get<Req extends {}, Rsp>(path: string, opts?: RequestOptions<Req
|
|
88
|
-
return this.
|
|
183
|
+
get<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
|
|
184
|
+
return this.methodRequest('get', path, opts);
|
|
89
185
|
}
|
|
90
|
-
|
|
91
|
-
|
|
186
|
+
|
|
187
|
+
post<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
|
|
188
|
+
return this.methodRequest('post', path, opts);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
patch<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
|
|
192
|
+
return this.methodRequest('patch', path, opts);
|
|
92
193
|
}
|
|
93
|
-
|
|
94
|
-
|
|
194
|
+
|
|
195
|
+
put<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
|
|
196
|
+
return this.methodRequest('put', path, opts);
|
|
95
197
|
}
|
|
96
|
-
|
|
97
|
-
|
|
198
|
+
|
|
199
|
+
delete<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
|
|
200
|
+
return this.methodRequest('delete', path, opts);
|
|
98
201
|
}
|
|
99
|
-
|
|
100
|
-
|
|
202
|
+
|
|
203
|
+
private methodRequest<Req extends {}, Rsp>(
|
|
204
|
+
method: HTTPMethod,
|
|
205
|
+
path: string,
|
|
206
|
+
opts?: PromiseOrValue<RequestOptions<Req>>,
|
|
207
|
+
): APIPromise<Rsp> {
|
|
208
|
+
return this.request(Promise.resolve(opts).then((opts) => ({ method, path, ...opts })));
|
|
101
209
|
}
|
|
102
210
|
|
|
103
211
|
getAPIList<Item, PageClass extends AbstractPage<Item> = AbstractPage<Item>>(
|
|
104
212
|
path: string,
|
|
105
213
|
Page: new (...args: any[]) => PageClass,
|
|
106
214
|
opts?: RequestOptions<any>,
|
|
107
|
-
): PagePromise<PageClass> {
|
|
215
|
+
): PagePromise<PageClass, Item> {
|
|
108
216
|
return this.requestAPIList(Page, { method: 'get', path, ...opts });
|
|
109
217
|
}
|
|
110
218
|
|
|
@@ -140,7 +248,10 @@ export abstract class APIClient {
|
|
|
140
248
|
const timeout = options.timeout ?? this.timeout;
|
|
141
249
|
const httpAgent = options.httpAgent ?? this.httpAgent ?? getDefaultAgent(url);
|
|
142
250
|
const minAgentTimeout = timeout + 1000;
|
|
143
|
-
if (
|
|
251
|
+
if (
|
|
252
|
+
typeof (httpAgent as any)?.options?.timeout === 'number' &&
|
|
253
|
+
minAgentTimeout > ((httpAgent as any).options.timeout ?? 0)
|
|
254
|
+
) {
|
|
144
255
|
// Allow any given request to bump our agent active socket timeout.
|
|
145
256
|
// This may seem strange, but leaking active sockets should be rare and not particularly problematic,
|
|
146
257
|
// and without mutating agent we would need to create more of them.
|
|
@@ -155,7 +266,7 @@ export abstract class APIClient {
|
|
|
155
266
|
|
|
156
267
|
const reqHeaders: Record<string, string> = {
|
|
157
268
|
...(contentLength && { 'Content-Length': contentLength }),
|
|
158
|
-
...this.defaultHeaders(),
|
|
269
|
+
...this.defaultHeaders(options),
|
|
159
270
|
...headers,
|
|
160
271
|
};
|
|
161
272
|
// let builtin fetch set the Content-Type for multipart bodies
|
|
@@ -187,7 +298,19 @@ export abstract class APIClient {
|
|
|
187
298
|
* This is useful for cases where you want to add certain headers based off of
|
|
188
299
|
* the request properties, e.g. `method` or `url`.
|
|
189
300
|
*/
|
|
190
|
-
protected async prepareRequest(
|
|
301
|
+
protected async prepareRequest(
|
|
302
|
+
request: RequestInit,
|
|
303
|
+
{ url, options }: { url: string; options: FinalRequestOptions },
|
|
304
|
+
): Promise<void> {}
|
|
305
|
+
|
|
306
|
+
protected parseHeaders(headers: HeadersInit | null | undefined): Record<string, string> {
|
|
307
|
+
return (
|
|
308
|
+
!headers ? {}
|
|
309
|
+
: Symbol.iterator in headers ?
|
|
310
|
+
Object.fromEntries(Array.from(headers as Iterable<string[]>).map((header) => [...header]))
|
|
311
|
+
: { ...headers }
|
|
312
|
+
);
|
|
313
|
+
}
|
|
191
314
|
|
|
192
315
|
protected makeStatusError(
|
|
193
316
|
status: number | undefined,
|
|
@@ -198,14 +321,27 @@ export abstract class APIClient {
|
|
|
198
321
|
return APIError.generate(status, error, message, headers);
|
|
199
322
|
}
|
|
200
323
|
|
|
201
|
-
|
|
202
|
-
options: FinalRequestOptions<Req
|
|
203
|
-
|
|
204
|
-
):
|
|
324
|
+
request<Req extends {}, Rsp>(
|
|
325
|
+
options: PromiseOrValue<FinalRequestOptions<Req>>,
|
|
326
|
+
remainingRetries: number | null = null,
|
|
327
|
+
): APIPromise<Rsp> {
|
|
328
|
+
return new APIPromise(this.makeRequest(options, remainingRetries));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private async makeRequest(
|
|
332
|
+
optionsInput: PromiseOrValue<FinalRequestOptions>,
|
|
333
|
+
retriesRemaining: number | null,
|
|
334
|
+
): Promise<APIResponseProps> {
|
|
335
|
+
const options = await optionsInput;
|
|
336
|
+
if (retriesRemaining == null) {
|
|
337
|
+
retriesRemaining = options.maxRetries ?? this.maxRetries;
|
|
338
|
+
}
|
|
339
|
+
|
|
205
340
|
const { req, url, timeout } = this.buildRequest(options);
|
|
206
|
-
await this.prepareRequest(req, { url });
|
|
207
341
|
|
|
208
|
-
this.
|
|
342
|
+
await this.prepareRequest(req, { url, options });
|
|
343
|
+
|
|
344
|
+
debug('request', url, options, req.headers);
|
|
209
345
|
|
|
210
346
|
if (options.signal?.aborted) {
|
|
211
347
|
throw new APIUserAbortError();
|
|
@@ -238,45 +374,24 @@ export abstract class APIClient {
|
|
|
238
374
|
const errJSON = safeJSON(errText);
|
|
239
375
|
const errMessage = errJSON ? undefined : errText;
|
|
240
376
|
|
|
241
|
-
|
|
377
|
+
debug('response', response.status, url, responseHeaders, errMessage);
|
|
242
378
|
|
|
243
379
|
const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders);
|
|
244
380
|
throw err;
|
|
245
381
|
}
|
|
246
382
|
|
|
247
|
-
|
|
248
|
-
if (contentType?.includes('application/json')) {
|
|
249
|
-
const json = await response.json();
|
|
250
|
-
|
|
251
|
-
if (typeof json === 'object' && json != null) {
|
|
252
|
-
/** @deprecated – we expect to change this interface in the near future. */
|
|
253
|
-
Object.defineProperty(json, 'responseHeaders', {
|
|
254
|
-
enumerable: false,
|
|
255
|
-
writable: false,
|
|
256
|
-
value: responseHeaders,
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
this.debug('response', response.status, url, responseHeaders, json);
|
|
261
|
-
|
|
262
|
-
return json as APIResponse<Rsp>;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// TODO handle blob, arraybuffer, other content types, etc.
|
|
266
|
-
const text = response.text();
|
|
267
|
-
this.debug('response', response.status, url, responseHeaders, text);
|
|
268
|
-
return text as Promise<any>;
|
|
383
|
+
return { response, options, controller };
|
|
269
384
|
}
|
|
270
385
|
|
|
271
386
|
requestAPIList<Item = unknown, PageClass extends AbstractPage<Item> = AbstractPage<Item>>(
|
|
272
387
|
Page: new (...args: ConstructorParameters<typeof AbstractPage>) => PageClass,
|
|
273
388
|
options: FinalRequestOptions,
|
|
274
|
-
): PagePromise<PageClass> {
|
|
275
|
-
const
|
|
276
|
-
return new PagePromise(this,
|
|
389
|
+
): PagePromise<PageClass, Item> {
|
|
390
|
+
const request = this.makeRequest(options, null);
|
|
391
|
+
return new PagePromise<PageClass, Item>(this, request, Page);
|
|
277
392
|
}
|
|
278
393
|
|
|
279
|
-
buildURL<Req
|
|
394
|
+
buildURL<Req extends Record<string, unknown>>(path: string, query: Req | null | undefined): string {
|
|
280
395
|
const url =
|
|
281
396
|
isAbsoluteURL(path) ?
|
|
282
397
|
new URL(path)
|
|
@@ -353,11 +468,11 @@ export abstract class APIClient {
|
|
|
353
468
|
return false;
|
|
354
469
|
}
|
|
355
470
|
|
|
356
|
-
private async retryRequest
|
|
357
|
-
options: FinalRequestOptions
|
|
471
|
+
private async retryRequest(
|
|
472
|
+
options: FinalRequestOptions,
|
|
358
473
|
retriesRemaining: number,
|
|
359
474
|
responseHeaders?: Headers | undefined,
|
|
360
|
-
): Promise<
|
|
475
|
+
): Promise<APIResponseProps> {
|
|
361
476
|
retriesRemaining -= 1;
|
|
362
477
|
|
|
363
478
|
// About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
|
|
@@ -370,7 +485,7 @@ export abstract class APIClient {
|
|
|
370
485
|
const timeout = this.calculateRetryTimeoutSeconds(retriesRemaining, retryAfter, maxRetries) * 1000;
|
|
371
486
|
await sleep(timeout);
|
|
372
487
|
|
|
373
|
-
return this.
|
|
488
|
+
return this.makeRequest(options, retriesRemaining);
|
|
374
489
|
}
|
|
375
490
|
|
|
376
491
|
private calculateRetryTimeoutSeconds(
|
|
@@ -401,12 +516,6 @@ export abstract class APIClient {
|
|
|
401
516
|
private getUserAgent(): string {
|
|
402
517
|
return `${this.constructor.name}/JS ${VERSION}`;
|
|
403
518
|
}
|
|
404
|
-
|
|
405
|
-
private debug(action: string, ...args: any[]) {
|
|
406
|
-
if (typeof process !== 'undefined' && process.env['DEBUG'] === 'true') {
|
|
407
|
-
console.log(`${this.constructor.name}:DEBUG:${action}`, ...args);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
519
|
}
|
|
411
520
|
|
|
412
521
|
export class APIResource {
|
|
@@ -436,9 +545,14 @@ export abstract class AbstractPage<Item> implements AsyncIterable<Item> {
|
|
|
436
545
|
#client: APIClient;
|
|
437
546
|
protected options: FinalRequestOptions;
|
|
438
547
|
|
|
439
|
-
|
|
548
|
+
protected response: Response;
|
|
549
|
+
protected body: unknown;
|
|
550
|
+
|
|
551
|
+
constructor(client: APIClient, response: Response, body: unknown, options: FinalRequestOptions) {
|
|
440
552
|
this.#client = client;
|
|
441
553
|
this.options = options;
|
|
554
|
+
this.response = response;
|
|
555
|
+
this.body = body;
|
|
442
556
|
}
|
|
443
557
|
|
|
444
558
|
/**
|
|
@@ -455,7 +569,7 @@ export abstract class AbstractPage<Item> implements AsyncIterable<Item> {
|
|
|
455
569
|
return this.nextPageInfo() != null;
|
|
456
570
|
}
|
|
457
571
|
|
|
458
|
-
async getNextPage(): Promise<
|
|
572
|
+
async getNextPage(): Promise<this> {
|
|
459
573
|
const nextInfo = this.nextPageInfo();
|
|
460
574
|
if (!nextInfo) {
|
|
461
575
|
throw new Error(
|
|
@@ -495,35 +609,33 @@ export abstract class AbstractPage<Item> implements AsyncIterable<Item> {
|
|
|
495
609
|
}
|
|
496
610
|
}
|
|
497
611
|
|
|
612
|
+
/**
|
|
613
|
+
* This subclass of Promise will resolve to an instantiated Page once the request completes.
|
|
614
|
+
*
|
|
615
|
+
* It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg:
|
|
616
|
+
*
|
|
617
|
+
* for await (const item of client.items.list()) {
|
|
618
|
+
* console.log(item)
|
|
619
|
+
* }
|
|
620
|
+
*/
|
|
498
621
|
export class PagePromise<
|
|
499
622
|
PageClass extends AbstractPage<Item>,
|
|
500
623
|
Item = ReturnType<PageClass['getPaginatedItems']>[number],
|
|
501
624
|
>
|
|
502
|
-
extends
|
|
625
|
+
extends APIPromise<PageClass>
|
|
503
626
|
implements AsyncIterable<Item>
|
|
504
627
|
{
|
|
505
|
-
/**
|
|
506
|
-
* This subclass of Promise will resolve to an instantiated Page once the request completes.
|
|
507
|
-
*/
|
|
508
628
|
constructor(
|
|
509
629
|
client: APIClient,
|
|
510
|
-
|
|
511
|
-
options: FinalRequestOptions,
|
|
630
|
+
request: Promise<APIResponseProps>,
|
|
512
631
|
Page: new (...args: ConstructorParameters<typeof AbstractPage>) => PageClass,
|
|
513
632
|
) {
|
|
514
|
-
super(
|
|
515
|
-
|
|
633
|
+
super(
|
|
634
|
+
request,
|
|
635
|
+
async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options),
|
|
516
636
|
);
|
|
517
637
|
}
|
|
518
638
|
|
|
519
|
-
/**
|
|
520
|
-
* Enable subclassing Promise.
|
|
521
|
-
* Ref: https://stackoverflow.com/a/60328122
|
|
522
|
-
*/
|
|
523
|
-
static get [Symbol.species]() {
|
|
524
|
-
return Promise;
|
|
525
|
-
}
|
|
526
|
-
|
|
527
639
|
/**
|
|
528
640
|
* Allow auto-paginating iteration on an unawaited list call, eg:
|
|
529
641
|
*
|
|
@@ -610,11 +722,6 @@ export type FinalRequestOptions<Req extends {} = Record<string, unknown> | Reada
|
|
|
610
722
|
path: string;
|
|
611
723
|
};
|
|
612
724
|
|
|
613
|
-
export type APIResponse<T> = T & {
|
|
614
|
-
/** @deprecated - we plan to add a different way to access raw response information shortly. */
|
|
615
|
-
responseHeaders: Headers;
|
|
616
|
-
};
|
|
617
|
-
|
|
618
725
|
declare const Deno: any;
|
|
619
726
|
declare const EdgeRuntime: any;
|
|
620
727
|
type Arch = 'x32' | 'x64' | 'arm' | 'arm64' | `other:${string}` | 'unknown';
|
|
@@ -628,12 +735,13 @@ type PlatformName =
|
|
|
628
735
|
| 'Android'
|
|
629
736
|
| `Other:${string}`
|
|
630
737
|
| 'Unknown';
|
|
738
|
+
type Browser = 'ie' | 'edge' | 'chrome' | 'firefox' | 'safari';
|
|
631
739
|
type PlatformProperties = {
|
|
632
740
|
'X-Stainless-Lang': 'js';
|
|
633
741
|
'X-Stainless-Package-Version': string;
|
|
634
742
|
'X-Stainless-OS': PlatformName;
|
|
635
743
|
'X-Stainless-Arch': Arch;
|
|
636
|
-
'X-Stainless-Runtime': 'node' | 'deno' | 'edge' | 'unknown';
|
|
744
|
+
'X-Stainless-Runtime': 'node' | 'deno' | 'edge' | `browser:${Browser}` | 'unknown';
|
|
637
745
|
'X-Stainless-Runtime-Version': string;
|
|
638
746
|
};
|
|
639
747
|
const getPlatformProperties = (): PlatformProperties => {
|
|
@@ -668,7 +776,20 @@ const getPlatformProperties = (): PlatformProperties => {
|
|
|
668
776
|
'X-Stainless-Runtime-Version': process.version,
|
|
669
777
|
};
|
|
670
778
|
}
|
|
671
|
-
|
|
779
|
+
|
|
780
|
+
const browserInfo = getBrowserInfo();
|
|
781
|
+
if (browserInfo) {
|
|
782
|
+
return {
|
|
783
|
+
'X-Stainless-Lang': 'js',
|
|
784
|
+
'X-Stainless-Package-Version': VERSION,
|
|
785
|
+
'X-Stainless-OS': 'Unknown',
|
|
786
|
+
'X-Stainless-Arch': 'unknown',
|
|
787
|
+
'X-Stainless-Runtime': `browser:${browserInfo.browser}`,
|
|
788
|
+
'X-Stainless-Runtime-Version': browserInfo.version,
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// TODO add support for Cloudflare workers, etc.
|
|
672
793
|
return {
|
|
673
794
|
'X-Stainless-Lang': 'js',
|
|
674
795
|
'X-Stainless-Package-Version': VERSION,
|
|
@@ -679,6 +800,44 @@ const getPlatformProperties = (): PlatformProperties => {
|
|
|
679
800
|
};
|
|
680
801
|
};
|
|
681
802
|
|
|
803
|
+
type BrowserInfo = {
|
|
804
|
+
browser: Browser;
|
|
805
|
+
version: string;
|
|
806
|
+
};
|
|
807
|
+
|
|
808
|
+
declare const navigator: { userAgent: string } | undefined;
|
|
809
|
+
|
|
810
|
+
// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts
|
|
811
|
+
function getBrowserInfo(): BrowserInfo | null {
|
|
812
|
+
if (typeof navigator === 'undefined' || !navigator) {
|
|
813
|
+
return null;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
// NOTE: The order matters here!
|
|
817
|
+
const browserPatterns = [
|
|
818
|
+
{ key: 'edge' as const, pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
|
|
819
|
+
{ key: 'ie' as const, pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
|
|
820
|
+
{ key: 'ie' as const, pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ },
|
|
821
|
+
{ key: 'chrome' as const, pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
|
|
822
|
+
{ key: 'firefox' as const, pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
|
|
823
|
+
{ key: 'safari' as const, pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/ },
|
|
824
|
+
];
|
|
825
|
+
|
|
826
|
+
// Find the FIRST matching browser
|
|
827
|
+
for (const { key, pattern } of browserPatterns) {
|
|
828
|
+
const match = pattern.exec(navigator.userAgent);
|
|
829
|
+
if (match) {
|
|
830
|
+
const major = match[1] || 0;
|
|
831
|
+
const minor = match[2] || 0;
|
|
832
|
+
const patch = match[3] || 0;
|
|
833
|
+
|
|
834
|
+
return { browser: key, version: `${major}.${minor}.${patch}` };
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
return null;
|
|
839
|
+
}
|
|
840
|
+
|
|
682
841
|
const normalizeArch = (arch: string): Arch => {
|
|
683
842
|
// Node docs:
|
|
684
843
|
// - https://nodejs.org/api/process.html#processarch
|
|
@@ -760,14 +919,16 @@ export const ensurePresent = <T>(value: T | null | undefined): T => {
|
|
|
760
919
|
/**
|
|
761
920
|
* Read an environment variable.
|
|
762
921
|
*
|
|
763
|
-
* Will return
|
|
922
|
+
* Will return undefined if the environment variable doesn't exist or cannot be accessed.
|
|
764
923
|
*/
|
|
765
924
|
export const readEnv = (env: string): string | undefined => {
|
|
766
|
-
if (typeof process
|
|
767
|
-
return undefined;
|
|
925
|
+
if (typeof process !== 'undefined') {
|
|
926
|
+
return process.env?.[env] ?? undefined;
|
|
768
927
|
}
|
|
769
|
-
|
|
770
|
-
|
|
928
|
+
if (typeof Deno !== 'undefined') {
|
|
929
|
+
return Deno.env?.get?.(env);
|
|
930
|
+
}
|
|
931
|
+
return undefined;
|
|
771
932
|
};
|
|
772
933
|
|
|
773
934
|
export const coerceInteger = (value: unknown): number => {
|
|
@@ -823,6 +984,12 @@ export function hasOwn(obj: Object, key: string): boolean {
|
|
|
823
984
|
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
824
985
|
}
|
|
825
986
|
|
|
987
|
+
export function debug(action: string, ...args: any[]) {
|
|
988
|
+
if (typeof process !== 'undefined' && process.env['DEBUG'] === 'true') {
|
|
989
|
+
console.log(`ModernTreasury:DEBUG:${action}`, ...args);
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
|
|
826
993
|
/**
|
|
827
994
|
* https://stackoverflow.com/a/2117523
|
|
828
995
|
*/
|
|
@@ -834,6 +1001,17 @@ const uuid4 = () => {
|
|
|
834
1001
|
});
|
|
835
1002
|
};
|
|
836
1003
|
|
|
1004
|
+
export const isRunningInBrowser = () => {
|
|
1005
|
+
return (
|
|
1006
|
+
// @ts-ignore
|
|
1007
|
+
typeof window !== 'undefined' &&
|
|
1008
|
+
// @ts-ignore
|
|
1009
|
+
typeof window.document !== 'undefined' &&
|
|
1010
|
+
// @ts-ignore
|
|
1011
|
+
typeof navigator !== 'undefined'
|
|
1012
|
+
);
|
|
1013
|
+
};
|
|
1014
|
+
|
|
837
1015
|
export interface HeadersProtocol {
|
|
838
1016
|
get: (header: string) => string | null | undefined;
|
|
839
1017
|
}
|