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.
Files changed (373) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +43 -15
  3. package/_shims/ReadableStream-node.d.ts +6 -0
  4. package/_shims/ReadableStream-node.d.ts.map +1 -0
  5. package/_shims/ReadableStream-node.js +14 -0
  6. package/_shims/ReadableStream-node.js.map +1 -0
  7. package/_shims/ReadableStream-node.mjs +3 -0
  8. package/_shims/ReadableStream-node.mjs.map +1 -0
  9. package/_shims/ReadableStream.d.ts +38 -0
  10. package/_shims/ReadableStream.js +5 -0
  11. package/_shims/ReadableStream.mjs +7 -0
  12. package/_shims/{agent.node.d.ts → agent-node.d.ts} +1 -1
  13. package/_shims/agent-node.d.ts.map +1 -0
  14. package/_shims/{agent.node.js → agent-node.js} +1 -1
  15. package/_shims/{agent.node.js.map → agent-node.js.map} +1 -1
  16. package/_shims/{agent.node.mjs → agent-node.mjs} +1 -1
  17. package/_shims/{agent.node.mjs.map → agent-node.mjs.map} +1 -1
  18. package/_shims/agent.d.ts +1 -1
  19. package/_shims/agent.js +1 -1
  20. package/_shims/agent.mjs +1 -1
  21. package/_shims/{fetch.node.d.ts → fetch-node.d.ts} +12 -1
  22. package/_shims/fetch.d.ts +9 -1
  23. package/_shims/{fileFromPath.node.d.ts → fileFromPath-node.d.ts} +2 -2
  24. package/_shims/{fileFromPath.node.d.ts.map → fileFromPath-node.d.ts.map} +1 -1
  25. package/_shims/{fileFromPath.node.js → fileFromPath-node.js} +1 -1
  26. package/_shims/{fileFromPath.node.js.map → fileFromPath-node.js.map} +1 -1
  27. package/_shims/{fileFromPath.node.mjs → fileFromPath-node.mjs} +1 -1
  28. package/_shims/{fileFromPath.node.mjs.map → fileFromPath-node.mjs.map} +1 -1
  29. package/_shims/fileFromPath.d.ts +2 -2
  30. package/_shims/fileFromPath.d.ts.map +1 -1
  31. package/_shims/fileFromPath.js +1 -1
  32. package/_shims/fileFromPath.mjs +1 -1
  33. package/_shims/form-data.js +17 -0
  34. package/_shims/form-data.mjs +20 -0
  35. package/_shims/{getMultipartRequestOptions.node.d.ts → getMultipartRequestOptions-node.d.ts} +2 -2
  36. package/_shims/getMultipartRequestOptions-node.d.ts.map +1 -0
  37. package/_shims/{getMultipartRequestOptions.node.js → getMultipartRequestOptions-node.js} +1 -1
  38. package/_shims/{getMultipartRequestOptions.node.js.map → getMultipartRequestOptions-node.js.map} +1 -1
  39. package/_shims/{getMultipartRequestOptions.node.mjs → getMultipartRequestOptions-node.mjs} +1 -1
  40. package/_shims/{getMultipartRequestOptions.node.mjs.map → getMultipartRequestOptions-node.mjs.map} +1 -1
  41. package/_shims/getMultipartRequestOptions.d.ts +1 -1
  42. package/_shims/getMultipartRequestOptions.d.ts.map +1 -1
  43. package/_shims/{node-readable.node.d.ts → node-readable-node.d.ts} +1 -1
  44. package/_shims/{node-readable.node.d.ts.map → node-readable-node.d.ts.map} +1 -1
  45. package/_shims/{node-readable.node.js → node-readable-node.js} +1 -1
  46. package/_shims/node-readable-node.js.map +1 -0
  47. package/_shims/{node-readable.node.mjs → node-readable-node.mjs} +1 -1
  48. package/_shims/node-readable-node.mjs.map +1 -0
  49. package/core.d.ts +91 -34
  50. package/core.d.ts.map +1 -1
  51. package/core.js +201 -70
  52. package/core.js.map +1 -1
  53. package/core.mjs +195 -70
  54. package/core.mjs.map +1 -1
  55. package/index.d.mts +19 -7
  56. package/index.d.ts +19 -7
  57. package/index.d.ts.map +1 -1
  58. package/index.js +23 -9
  59. package/index.js.map +1 -1
  60. package/index.mjs +23 -9
  61. package/index.mjs.map +1 -1
  62. package/package.json +32 -9
  63. package/pagination.d.ts +2 -2
  64. package/pagination.d.ts.map +1 -1
  65. package/pagination.js +5 -5
  66. package/pagination.js.map +1 -1
  67. package/pagination.mjs +5 -5
  68. package/pagination.mjs.map +1 -1
  69. package/resources/account-collection-flows.d.ts +8 -33
  70. package/resources/account-collection-flows.d.ts.map +1 -1
  71. package/resources/account-collection-flows.js +22 -17
  72. package/resources/account-collection-flows.js.map +1 -1
  73. package/resources/account-collection-flows.mjs +22 -17
  74. package/resources/account-collection-flows.mjs.map +1 -1
  75. package/resources/account-details.d.ts +8 -13
  76. package/resources/account-details.d.ts.map +1 -1
  77. package/resources/account-details.js +10 -4
  78. package/resources/account-details.js.map +1 -1
  79. package/resources/account-details.mjs +10 -4
  80. package/resources/account-details.mjs.map +1 -1
  81. package/resources/connections.d.ts +5 -2
  82. package/resources/connections.d.ts.map +1 -1
  83. package/resources/connections.js +3 -3
  84. package/resources/connections.js.map +1 -1
  85. package/resources/connections.mjs +3 -3
  86. package/resources/connections.mjs.map +1 -1
  87. package/resources/counterparties.d.ts +37 -51
  88. package/resources/counterparties.d.ts.map +1 -1
  89. package/resources/counterparties.js +17 -5
  90. package/resources/counterparties.js.map +1 -1
  91. package/resources/counterparties.mjs +17 -5
  92. package/resources/counterparties.mjs.map +1 -1
  93. package/resources/documents.d.ts +6 -17
  94. package/resources/documents.d.ts.map +1 -1
  95. package/resources/documents.js +13 -7
  96. package/resources/documents.js.map +1 -1
  97. package/resources/documents.mjs +13 -7
  98. package/resources/documents.mjs.map +1 -1
  99. package/resources/events.d.ts +3 -3
  100. package/resources/events.d.ts.map +1 -1
  101. package/resources/events.js +3 -3
  102. package/resources/events.mjs +3 -3
  103. package/resources/expected-payments.d.ts +30 -39
  104. package/resources/expected-payments.d.ts.map +1 -1
  105. package/resources/expected-payments.js +10 -4
  106. package/resources/expected-payments.js.map +1 -1
  107. package/resources/expected-payments.mjs +10 -4
  108. package/resources/expected-payments.mjs.map +1 -1
  109. package/resources/external-accounts.d.ts +27 -61
  110. package/resources/external-accounts.d.ts.map +1 -1
  111. package/resources/external-accounts.js +24 -6
  112. package/resources/external-accounts.js.map +1 -1
  113. package/resources/external-accounts.mjs +24 -6
  114. package/resources/external-accounts.mjs.map +1 -1
  115. package/resources/incoming-payment-details.d.ts +20 -21
  116. package/resources/incoming-payment-details.d.ts.map +1 -1
  117. package/resources/incoming-payment-details.js +10 -4
  118. package/resources/incoming-payment-details.js.map +1 -1
  119. package/resources/incoming-payment-details.mjs +10 -4
  120. package/resources/incoming-payment-details.mjs.map +1 -1
  121. package/resources/index.d.ts +0 -3
  122. package/resources/index.d.ts.map +1 -1
  123. package/resources/index.js.map +1 -1
  124. package/resources/index.mjs.map +1 -1
  125. package/resources/internal-accounts/balance-reports.d.ts +6 -3
  126. package/resources/internal-accounts/balance-reports.d.ts.map +1 -1
  127. package/resources/internal-accounts/balance-reports.js +3 -3
  128. package/resources/internal-accounts/balance-reports.js.map +1 -1
  129. package/resources/internal-accounts/balance-reports.mjs +3 -3
  130. package/resources/internal-accounts/balance-reports.mjs.map +1 -1
  131. package/resources/internal-accounts/internal-accounts.d.ts +16 -21
  132. package/resources/internal-accounts/internal-accounts.d.ts.map +1 -1
  133. package/resources/internal-accounts/internal-accounts.js +10 -4
  134. package/resources/internal-accounts/internal-accounts.js.map +1 -1
  135. package/resources/internal-accounts/internal-accounts.mjs +10 -4
  136. package/resources/internal-accounts/internal-accounts.mjs.map +1 -1
  137. package/resources/invoices/invoices.d.ts +67 -42
  138. package/resources/invoices/invoices.d.ts.map +1 -1
  139. package/resources/invoices/invoices.js +10 -4
  140. package/resources/invoices/invoices.js.map +1 -1
  141. package/resources/invoices/invoices.mjs +10 -4
  142. package/resources/invoices/invoices.mjs.map +1 -1
  143. package/resources/invoices/line-items.d.ts +32 -185
  144. package/resources/invoices/line-items.d.ts.map +1 -1
  145. package/resources/invoices/line-items.js +10 -4
  146. package/resources/invoices/line-items.js.map +1 -1
  147. package/resources/invoices/line-items.mjs +10 -4
  148. package/resources/invoices/line-items.mjs.map +1 -1
  149. package/resources/ledger-account-categories.d.ts +47 -87
  150. package/resources/ledger-account-categories.d.ts.map +1 -1
  151. package/resources/ledger-account-categories.js +21 -17
  152. package/resources/ledger-account-categories.js.map +1 -1
  153. package/resources/ledger-account-categories.mjs +21 -17
  154. package/resources/ledger-account-categories.mjs.map +1 -1
  155. package/resources/ledger-account-payouts.d.ts +33 -22
  156. package/resources/ledger-account-payouts.d.ts.map +1 -1
  157. package/resources/ledger-account-payouts.js +10 -4
  158. package/resources/ledger-account-payouts.js.map +1 -1
  159. package/resources/ledger-account-payouts.mjs +10 -4
  160. package/resources/ledger-account-payouts.mjs.map +1 -1
  161. package/resources/ledger-account-statements.d.ts +11 -16
  162. package/resources/ledger-account-statements.d.ts.map +1 -1
  163. package/resources/ledger-account-statements.js +8 -2
  164. package/resources/ledger-account-statements.js.map +1 -1
  165. package/resources/ledger-account-statements.mjs +8 -2
  166. package/resources/ledger-account-statements.mjs.map +1 -1
  167. package/resources/ledger-accounts.d.ts +30 -30
  168. package/resources/ledger-accounts.d.ts.map +1 -1
  169. package/resources/ledger-accounts.js +10 -4
  170. package/resources/ledger-accounts.js.map +1 -1
  171. package/resources/ledger-accounts.mjs +10 -4
  172. package/resources/ledger-accounts.mjs.map +1 -1
  173. package/resources/ledger-entries.d.ts +20 -6
  174. package/resources/ledger-entries.d.ts.map +1 -1
  175. package/resources/ledger-entries.js +3 -3
  176. package/resources/ledger-entries.js.map +1 -1
  177. package/resources/ledger-entries.mjs +3 -3
  178. package/resources/ledger-entries.mjs.map +1 -1
  179. package/resources/ledger-event-handlers.d.ts +12 -24
  180. package/resources/ledger-event-handlers.d.ts.map +1 -1
  181. package/resources/ledger-event-handlers.js +10 -4
  182. package/resources/ledger-event-handlers.js.map +1 -1
  183. package/resources/ledger-event-handlers.mjs +10 -4
  184. package/resources/ledger-event-handlers.mjs.map +1 -1
  185. package/resources/ledger-transactions/ledger-transactions.d.ts +48 -37
  186. package/resources/ledger-transactions/ledger-transactions.d.ts.map +1 -1
  187. package/resources/ledger-transactions/ledger-transactions.js +13 -7
  188. package/resources/ledger-transactions/ledger-transactions.js.map +1 -1
  189. package/resources/ledger-transactions/ledger-transactions.mjs +13 -7
  190. package/resources/ledger-transactions/ledger-transactions.mjs.map +1 -1
  191. package/resources/ledger-transactions/versions.d.ts +4 -2
  192. package/resources/ledger-transactions/versions.d.ts.map +1 -1
  193. package/resources/ledger-transactions/versions.js +3 -3
  194. package/resources/ledger-transactions/versions.js.map +1 -1
  195. package/resources/ledger-transactions/versions.mjs +3 -3
  196. package/resources/ledger-transactions/versions.mjs.map +1 -1
  197. package/resources/ledgerable-events.d.ts +13 -18
  198. package/resources/ledgerable-events.d.ts.map +1 -1
  199. package/resources/ledgerable-events.js +8 -2
  200. package/resources/ledgerable-events.js.map +1 -1
  201. package/resources/ledgerable-events.mjs +8 -2
  202. package/resources/ledgerable-events.mjs.map +1 -1
  203. package/resources/ledgers.d.ts +16 -20
  204. package/resources/ledgers.d.ts.map +1 -1
  205. package/resources/ledgers.js +10 -4
  206. package/resources/ledgers.js.map +1 -1
  207. package/resources/ledgers.mjs +10 -4
  208. package/resources/ledgers.mjs.map +1 -1
  209. package/resources/line-items.d.ts +5 -5
  210. package/resources/line-items.d.ts.map +1 -1
  211. package/resources/line-items.js +3 -3
  212. package/resources/line-items.mjs +3 -3
  213. package/resources/paper-items.d.ts +6 -3
  214. package/resources/paper-items.d.ts.map +1 -1
  215. package/resources/paper-items.js +3 -3
  216. package/resources/paper-items.js.map +1 -1
  217. package/resources/paper-items.mjs +3 -3
  218. package/resources/paper-items.mjs.map +1 -1
  219. package/resources/payment-flows.d.ts +18 -42
  220. package/resources/payment-flows.d.ts.map +1 -1
  221. package/resources/payment-flows.js +22 -17
  222. package/resources/payment-flows.js.map +1 -1
  223. package/resources/payment-flows.mjs +22 -17
  224. package/resources/payment-flows.mjs.map +1 -1
  225. package/resources/payment-orders/payment-orders.d.ts +172 -191
  226. package/resources/payment-orders/payment-orders.d.ts.map +1 -1
  227. package/resources/payment-orders/payment-orders.js +21 -11
  228. package/resources/payment-orders/payment-orders.js.map +1 -1
  229. package/resources/payment-orders/payment-orders.mjs +21 -11
  230. package/resources/payment-orders/payment-orders.mjs.map +1 -1
  231. package/resources/payment-orders/reversals.d.ts +21 -22
  232. package/resources/payment-orders/reversals.d.ts.map +1 -1
  233. package/resources/payment-orders/reversals.js +10 -4
  234. package/resources/payment-orders/reversals.js.map +1 -1
  235. package/resources/payment-orders/reversals.mjs +10 -4
  236. package/resources/payment-orders/reversals.mjs.map +1 -1
  237. package/resources/payment-references.d.ts +3 -3
  238. package/resources/payment-references.d.ts.map +1 -1
  239. package/resources/payment-references.js +3 -3
  240. package/resources/payment-references.mjs +3 -3
  241. package/resources/returns.d.ts +16 -19
  242. package/resources/returns.d.ts.map +1 -1
  243. package/resources/returns.js +10 -4
  244. package/resources/returns.js.map +1 -1
  245. package/resources/returns.mjs +10 -4
  246. package/resources/returns.mjs.map +1 -1
  247. package/resources/routing-details.d.ts +9 -15
  248. package/resources/routing-details.d.ts.map +1 -1
  249. package/resources/routing-details.js +10 -4
  250. package/resources/routing-details.js.map +1 -1
  251. package/resources/routing-details.mjs +10 -4
  252. package/resources/routing-details.mjs.map +1 -1
  253. package/resources/transactions/line-items.d.ts +5 -2
  254. package/resources/transactions/line-items.d.ts.map +1 -1
  255. package/resources/transactions/line-items.js +3 -3
  256. package/resources/transactions/line-items.js.map +1 -1
  257. package/resources/transactions/line-items.mjs +3 -3
  258. package/resources/transactions/line-items.mjs.map +1 -1
  259. package/resources/transactions/transactions.d.ts +8 -5
  260. package/resources/transactions/transactions.d.ts.map +1 -1
  261. package/resources/transactions/transactions.js +3 -3
  262. package/resources/transactions/transactions.js.map +1 -1
  263. package/resources/transactions/transactions.mjs +3 -3
  264. package/resources/transactions/transactions.mjs.map +1 -1
  265. package/resources/validations.d.ts +1 -1
  266. package/resources/validations.d.ts.map +1 -1
  267. package/resources/validations.js +1 -1
  268. package/resources/validations.mjs +1 -1
  269. package/resources/virtual-accounts.d.ts +19 -28
  270. package/resources/virtual-accounts.d.ts.map +1 -1
  271. package/resources/virtual-accounts.js +10 -4
  272. package/resources/virtual-accounts.js.map +1 -1
  273. package/resources/virtual-accounts.mjs +10 -4
  274. package/resources/virtual-accounts.mjs.map +1 -1
  275. package/resources/webhooks.js +2 -2
  276. package/resources/webhooks.mjs +2 -2
  277. package/src/_shims/ReadableStream-node.ts +6 -0
  278. package/src/_shims/ReadableStream.d.ts +38 -0
  279. package/src/_shims/ReadableStream.js +5 -0
  280. package/src/_shims/ReadableStream.mjs +7 -0
  281. package/src/_shims/agent.ts +1 -1
  282. package/src/_shims/{fetch.node.d.ts → fetch-node.d.ts} +20 -9
  283. package/src/_shims/fetch.d.ts +18 -10
  284. package/src/_shims/{fileFromPath.node.ts → fileFromPath-node.ts} +1 -1
  285. package/src/_shims/fileFromPath.ts +2 -2
  286. package/src/_shims/{formdata.node.d.ts → form-data-node.d.ts} +4 -4
  287. package/src/_shims/{formdata.d.ts → form-data.d.ts} +4 -4
  288. package/src/_shims/form-data.js +17 -0
  289. package/src/_shims/form-data.mjs +20 -0
  290. package/src/_shims/{getMultipartRequestOptions.node.ts → getMultipartRequestOptions-node.ts} +3 -3
  291. package/src/_shims/getMultipartRequestOptions.ts +3 -3
  292. package/src/core.ts +275 -97
  293. package/src/error.ts +1 -1
  294. package/src/index.ts +31 -18
  295. package/src/pagination.ts +6 -6
  296. package/src/resource.ts +1 -1
  297. package/src/resources/account-collection-flows.ts +29 -57
  298. package/src/resources/account-details.ts +22 -22
  299. package/src/resources/connections.ts +11 -8
  300. package/src/resources/counterparties.ts +61 -65
  301. package/src/resources/documents.ts +21 -30
  302. package/src/resources/events.ts +9 -9
  303. package/src/resources/expected-payments.ts +45 -49
  304. package/src/resources/external-accounts.ts +59 -78
  305. package/src/resources/incoming-payment-details.ts +38 -33
  306. package/src/resources/index.ts +39 -36
  307. package/src/resources/internal-accounts/balance-reports.ts +13 -10
  308. package/src/resources/internal-accounts/index.ts +2 -2
  309. package/src/resources/internal-accounts/internal-accounts.ts +35 -35
  310. package/src/resources/invoices/index.ts +2 -2
  311. package/src/resources/invoices/invoices.ts +91 -54
  312. package/src/resources/invoices/line-items.ts +46 -228
  313. package/src/resources/ledger-account-categories.ts +67 -111
  314. package/src/resources/ledger-account-payouts.ts +49 -30
  315. package/src/resources/ledger-account-statements.ts +21 -21
  316. package/src/resources/ledger-accounts.ts +46 -40
  317. package/src/resources/ledger-entries.ts +29 -13
  318. package/src/resources/ledger-event-handlers.ts +25 -35
  319. package/src/resources/ledger-transactions/index.ts +2 -2
  320. package/src/resources/ledger-transactions/ledger-transactions.ts +73 -53
  321. package/src/resources/ledger-transactions/versions.ts +10 -8
  322. package/src/resources/ledgerable-events.ts +23 -23
  323. package/src/resources/ledgers.ts +31 -29
  324. package/src/resources/line-items.ts +12 -12
  325. package/src/resources/paper-items.ts +13 -10
  326. package/src/resources/payment-flows.ts +39 -66
  327. package/src/resources/payment-orders/index.ts +2 -2
  328. package/src/resources/payment-orders/payment-orders.ts +204 -216
  329. package/src/resources/payment-orders/reversals.ts +36 -31
  330. package/src/resources/payment-references.ts +9 -9
  331. package/src/resources/returns.ts +30 -28
  332. package/src/resources/routing-details.ts +23 -24
  333. package/src/resources/top-level.ts +1 -1
  334. package/src/resources/transactions/index.ts +7 -2
  335. package/src/resources/transactions/line-items.ts +11 -8
  336. package/src/resources/transactions/transactions.ts +17 -14
  337. package/src/resources/validations.ts +4 -4
  338. package/src/resources/virtual-accounts.ts +35 -39
  339. package/src/resources/webhooks.ts +3 -3
  340. package/src/tsconfig.json +11 -0
  341. package/src/uploads.ts +6 -6
  342. package/src/version.ts +1 -1
  343. package/uploads.d.ts +1 -1
  344. package/uploads.d.ts.map +1 -1
  345. package/uploads.js +7 -7
  346. package/uploads.js.map +1 -1
  347. package/uploads.mjs +4 -4
  348. package/uploads.mjs.map +1 -1
  349. package/version.d.ts +1 -1
  350. package/version.js +1 -1
  351. package/version.mjs +1 -1
  352. package/_shims/agent.node.d.ts.map +0 -1
  353. package/_shims/formdata.js +0 -9
  354. package/_shims/formdata.mjs +0 -11
  355. package/_shims/getMultipartRequestOptions.node.d.ts.map +0 -1
  356. package/_shims/node-readable.node.js.map +0 -1
  357. package/_shims/node-readable.node.mjs.map +0 -1
  358. package/src/_shims/fetch.deno.ts +0 -23
  359. package/src/_shims/formdata.deno.ts +0 -16
  360. package/src/_shims/formdata.js +0 -9
  361. package/src/_shims/formdata.mjs +0 -11
  362. /package/_shims/{fetch.node.js → fetch-node.js} +0 -0
  363. /package/_shims/{fetch.node.mjs → fetch-node.mjs} +0 -0
  364. /package/_shims/{formdata.node.d.ts → form-data-node.d.ts} +0 -0
  365. /package/_shims/{formdata.node.js → form-data-node.js} +0 -0
  366. /package/_shims/{formdata.node.mjs → form-data-node.mjs} +0 -0
  367. /package/_shims/{formdata.d.ts → form-data.d.ts} +0 -0
  368. /package/src/_shims/{agent.node.ts → agent-node.ts} +0 -0
  369. /package/src/_shims/{fetch.node.js → fetch-node.js} +0 -0
  370. /package/src/_shims/{fetch.node.mjs → fetch-node.mjs} +0 -0
  371. /package/src/_shims/{formdata.node.js → form-data-node.js} +0 -0
  372. /package/src/_shims/{formdata.node.mjs → form-data-node.mjs} +0 -0
  373. /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
- import { isMultipartBody } from './uploads';
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 = 60 * 1000, // 60s
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>): Promise<Rsp> {
88
- return this.request({ method: 'get', path, ...opts });
183
+ get<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
184
+ return this.methodRequest('get', path, opts);
89
185
  }
90
- post<Req extends {}, Rsp>(path: string, opts?: RequestOptions<Req>): Promise<Rsp> {
91
- return this.request({ method: 'post', path, ...opts });
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
- patch<Req extends {}, Rsp>(path: string, opts?: RequestOptions<Req>): Promise<Rsp> {
94
- return this.request({ method: 'patch', path, ...opts });
194
+
195
+ put<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
196
+ return this.methodRequest('put', path, opts);
95
197
  }
96
- put<Req extends {}, Rsp>(path: string, opts?: RequestOptions<Req>): Promise<Rsp> {
97
- return this.request({ method: 'put', path, ...opts });
198
+
199
+ delete<Req extends {}, Rsp>(path: string, opts?: PromiseOrValue<RequestOptions<Req>>): APIPromise<Rsp> {
200
+ return this.methodRequest('delete', path, opts);
98
201
  }
99
- delete<Req extends {}, Rsp>(path: string, opts?: RequestOptions<Req>): Promise<Rsp> {
100
- return this.request({ method: 'delete', path, ...opts });
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 ((httpAgent as any)?.options && minAgentTimeout > ((httpAgent as any).options.timeout ?? 0)) {
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(request: RequestInit, { url }: { url: string }): Promise<void> {}
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
- async request<Req extends {}, Rsp>(
202
- options: FinalRequestOptions<Req>,
203
- retriesRemaining = options.maxRetries ?? this.maxRetries,
204
- ): Promise<APIResponse<Rsp>> {
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.debug('request', url, options, req.headers);
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
- this.debug('response', response.status, url, responseHeaders, errMessage);
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
- const contentType = response.headers.get('content-type');
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 requestPromise = this.request(options) as Promise<APIResponse<unknown>>;
276
- return new PagePromise(this, requestPromise, options, Page);
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>(path: string, query: Req | undefined): string {
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<Req extends {}, Rsp>(
357
- options: FinalRequestOptions<Req>,
471
+ private async retryRequest(
472
+ options: FinalRequestOptions,
358
473
  retriesRemaining: number,
359
474
  responseHeaders?: Headers | undefined,
360
- ): Promise<Rsp> {
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.request(options, retriesRemaining);
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
- constructor(client: APIClient, response: APIResponse<unknown>, options: FinalRequestOptions) {
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<AbstractPage<Item>> {
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 Promise<PageClass>
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
- requestPromise: Promise<APIResponse<unknown>>,
511
- options: FinalRequestOptions,
630
+ request: Promise<APIResponseProps>,
512
631
  Page: new (...args: ConstructorParameters<typeof AbstractPage>) => PageClass,
513
632
  ) {
514
- super((resolve, reject) =>
515
- requestPromise.then((response) => resolve(new Page(client, response, options))).catch(reject),
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
- // TODO add support for Cloudflare workers, browsers, etc.
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 an empty string if the environment variable doesn't exist or cannot be accessed.
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 === 'undefined') {
767
- return undefined;
925
+ if (typeof process !== 'undefined') {
926
+ return process.env?.[env] ?? undefined;
768
927
  }
769
-
770
- return process.env[env] ?? undefined;
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
  }
package/src/error.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  // File generated from our OpenAPI spec by Stainless.
2
2
 
3
- import { castToError, Headers } from './core';
3
+ import { castToError, Headers } from './core.js';
4
4
 
5
5
  export class APIError extends Error {
6
6
  readonly status: number | undefined;