@roarkanalytics/sdk 0.1.0-alpha.1 → 0.1.0-alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (347) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +1 -1
  3. package/README.md +48 -85
  4. package/_shims/MultipartBody.d.ts +9 -0
  5. package/_shims/MultipartBody.d.ts.map +1 -0
  6. package/_shims/MultipartBody.js +16 -0
  7. package/_shims/MultipartBody.js.map +1 -0
  8. package/_shims/MultipartBody.mjs +12 -0
  9. package/_shims/MultipartBody.mjs.map +1 -0
  10. package/_shims/README.md +46 -0
  11. package/_shims/auto/runtime-bun.d.ts +5 -0
  12. package/_shims/auto/runtime-bun.d.ts.map +1 -0
  13. package/{internal/utils.js → _shims/auto/runtime-bun.js} +5 -8
  14. package/_shims/auto/runtime-bun.js.map +1 -0
  15. package/_shims/auto/runtime-bun.mjs +2 -0
  16. package/_shims/auto/runtime-bun.mjs.map +1 -0
  17. package/_shims/auto/runtime-node.d.ts +5 -0
  18. package/_shims/auto/runtime-node.d.ts.map +1 -0
  19. package/_shims/auto/runtime-node.js +21 -0
  20. package/_shims/auto/runtime-node.js.map +1 -0
  21. package/_shims/auto/runtime-node.mjs +2 -0
  22. package/_shims/auto/runtime-node.mjs.map +1 -0
  23. package/_shims/auto/runtime.d.ts +5 -0
  24. package/_shims/auto/runtime.d.ts.map +1 -0
  25. package/_shims/auto/runtime.js +21 -0
  26. package/_shims/auto/runtime.js.map +1 -0
  27. package/_shims/auto/runtime.mjs +2 -0
  28. package/_shims/auto/runtime.mjs.map +1 -0
  29. package/_shims/auto/types-node.d.ts +5 -0
  30. package/_shims/auto/types-node.d.ts.map +1 -0
  31. package/_shims/auto/types-node.js +21 -0
  32. package/_shims/auto/types-node.js.map +1 -0
  33. package/_shims/auto/types-node.mjs +2 -0
  34. package/_shims/auto/types-node.mjs.map +1 -0
  35. package/_shims/auto/types.d.ts +101 -0
  36. package/_shims/auto/types.js +3 -0
  37. package/_shims/auto/types.mjs +3 -0
  38. package/_shims/bun-runtime.d.ts +6 -0
  39. package/_shims/bun-runtime.d.ts.map +1 -0
  40. package/_shims/bun-runtime.js +14 -0
  41. package/_shims/bun-runtime.js.map +1 -0
  42. package/_shims/bun-runtime.mjs +10 -0
  43. package/_shims/bun-runtime.mjs.map +1 -0
  44. package/_shims/index.d.ts +81 -0
  45. package/_shims/index.js +13 -0
  46. package/_shims/index.mjs +7 -0
  47. package/_shims/manual-types.d.ts +12 -0
  48. package/_shims/manual-types.js +3 -0
  49. package/_shims/manual-types.mjs +3 -0
  50. package/_shims/node-runtime.d.ts +3 -0
  51. package/_shims/node-runtime.d.ts.map +1 -0
  52. package/_shims/node-runtime.js +89 -0
  53. package/_shims/node-runtime.js.map +1 -0
  54. package/_shims/node-runtime.mjs +56 -0
  55. package/_shims/node-runtime.mjs.map +1 -0
  56. package/_shims/node-types.d.ts +42 -0
  57. package/_shims/node-types.js +3 -0
  58. package/_shims/node-types.mjs +3 -0
  59. package/_shims/registry.d.ts +37 -0
  60. package/_shims/registry.d.ts.map +1 -0
  61. package/_shims/registry.js +41 -0
  62. package/_shims/registry.js.map +1 -0
  63. package/_shims/registry.mjs +37 -0
  64. package/_shims/registry.mjs.map +1 -0
  65. package/_shims/web-runtime.d.ts +5 -0
  66. package/_shims/web-runtime.d.ts.map +1 -0
  67. package/_shims/web-runtime.js +78 -0
  68. package/_shims/web-runtime.js.map +1 -0
  69. package/_shims/web-runtime.mjs +71 -0
  70. package/_shims/web-runtime.mjs.map +1 -0
  71. package/_shims/web-types.d.ts +83 -0
  72. package/_shims/web-types.js +3 -0
  73. package/_shims/web-types.mjs +3 -0
  74. package/core.d.ts +241 -0
  75. package/core.d.ts.map +1 -0
  76. package/core.js +908 -0
  77. package/core.js.map +1 -0
  78. package/core.mjs +876 -0
  79. package/core.mjs.map +1 -0
  80. package/error.d.ts +3 -3
  81. package/error.d.ts.map +1 -1
  82. package/error.js +6 -6
  83. package/error.js.map +1 -1
  84. package/error.mjs +3 -3
  85. package/error.mjs.map +1 -1
  86. package/index.d.mts +109 -5
  87. package/index.d.ts +109 -5
  88. package/index.d.ts.map +1 -1
  89. package/index.js +103 -11
  90. package/index.js.map +1 -1
  91. package/index.mjs +77 -5
  92. package/index.mjs.map +1 -1
  93. package/package.json +66 -82
  94. package/resource.d.ts +3 -3
  95. package/resource.d.ts.map +1 -1
  96. package/resource.js.map +1 -1
  97. package/resource.mjs.map +1 -1
  98. package/resources/calls.d.ts +2 -3
  99. package/resources/calls.d.ts.map +1 -1
  100. package/resources/calls.js.map +1 -1
  101. package/resources/calls.mjs.map +1 -1
  102. package/resources/index.d.ts.map +1 -1
  103. package/shims/node.d.ts +30 -0
  104. package/shims/node.d.ts.map +1 -0
  105. package/shims/node.js +31 -0
  106. package/shims/node.js.map +1 -0
  107. package/shims/node.mjs +5 -0
  108. package/shims/node.mjs.map +1 -0
  109. package/shims/web.d.ts +26 -0
  110. package/shims/web.d.ts.map +1 -0
  111. package/shims/web.js +31 -0
  112. package/shims/web.js.map +1 -0
  113. package/shims/web.mjs +5 -0
  114. package/shims/web.mjs.map +1 -0
  115. package/src/_shims/MultipartBody.ts +9 -0
  116. package/src/_shims/README.md +46 -0
  117. package/src/_shims/auto/runtime-bun.ts +4 -0
  118. package/src/_shims/auto/runtime-node.ts +4 -0
  119. package/src/_shims/auto/runtime.ts +4 -0
  120. package/src/_shims/auto/types-node.ts +4 -0
  121. package/src/_shims/auto/types.d.ts +101 -0
  122. package/src/_shims/auto/types.js +3 -0
  123. package/src/_shims/auto/types.mjs +3 -0
  124. package/src/_shims/bun-runtime.ts +14 -0
  125. package/src/_shims/index.d.ts +81 -0
  126. package/src/_shims/index.js +13 -0
  127. package/src/_shims/index.mjs +7 -0
  128. package/src/_shims/manual-types.d.ts +12 -0
  129. package/src/_shims/manual-types.js +3 -0
  130. package/src/_shims/manual-types.mjs +3 -0
  131. package/src/_shims/node-runtime.ts +81 -0
  132. package/src/_shims/node-types.d.ts +42 -0
  133. package/src/_shims/node-types.js +3 -0
  134. package/src/_shims/node-types.mjs +3 -0
  135. package/src/_shims/registry.ts +67 -0
  136. package/src/_shims/web-runtime.ts +103 -0
  137. package/src/_shims/web-types.d.ts +83 -0
  138. package/src/_shims/web-types.js +3 -0
  139. package/src/_shims/web-types.mjs +3 -0
  140. package/src/core.ts +1200 -0
  141. package/src/error.ts +3 -3
  142. package/src/index.ts +172 -5
  143. package/src/resource.ts +3 -3
  144. package/src/resources/calls.ts +2 -3
  145. package/src/shims/node.ts +50 -0
  146. package/src/shims/web.ts +50 -0
  147. package/src/tsconfig.json +2 -2
  148. package/src/uploads.ts +255 -1
  149. package/src/version.ts +1 -1
  150. package/uploads.d.ts +74 -1
  151. package/uploads.d.ts.map +1 -1
  152. package/uploads.js +168 -3
  153. package/uploads.js.map +1 -1
  154. package/uploads.mjs +157 -1
  155. package/uploads.mjs.map +1 -1
  156. package/version.d.ts +1 -1
  157. package/version.js +1 -1
  158. package/version.mjs +1 -1
  159. package/api-promise.d.mts +0 -47
  160. package/api-promise.d.mts.map +0 -1
  161. package/api-promise.d.ts +0 -47
  162. package/api-promise.d.ts.map +0 -1
  163. package/api-promise.js +0 -84
  164. package/api-promise.js.map +0 -1
  165. package/api-promise.mjs +0 -80
  166. package/api-promise.mjs.map +0 -1
  167. package/client.d.mts +0 -186
  168. package/client.d.mts.map +0 -1
  169. package/client.d.ts +0 -186
  170. package/client.d.ts.map +0 -1
  171. package/client.js +0 -449
  172. package/client.js.map +0 -1
  173. package/client.mjs +0 -422
  174. package/client.mjs.map +0 -1
  175. package/error.d.mts +0 -47
  176. package/error.d.mts.map +0 -1
  177. package/index.d.mts.map +0 -1
  178. package/internal/builtin-types.d.mts +0 -65
  179. package/internal/builtin-types.d.mts.map +0 -1
  180. package/internal/builtin-types.d.ts +0 -65
  181. package/internal/builtin-types.d.ts.map +0 -1
  182. package/internal/builtin-types.js +0 -4
  183. package/internal/builtin-types.js.map +0 -1
  184. package/internal/builtin-types.mjs +0 -3
  185. package/internal/builtin-types.mjs.map +0 -1
  186. package/internal/detect-platform.d.mts +0 -15
  187. package/internal/detect-platform.d.mts.map +0 -1
  188. package/internal/detect-platform.d.ts +0 -15
  189. package/internal/detect-platform.d.ts.map +0 -1
  190. package/internal/detect-platform.js +0 -162
  191. package/internal/detect-platform.js.map +0 -1
  192. package/internal/detect-platform.mjs +0 -157
  193. package/internal/detect-platform.mjs.map +0 -1
  194. package/internal/errors.d.mts +0 -3
  195. package/internal/errors.d.mts.map +0 -1
  196. package/internal/errors.d.ts +0 -3
  197. package/internal/errors.d.ts.map +0 -1
  198. package/internal/errors.js +0 -26
  199. package/internal/errors.js.map +0 -1
  200. package/internal/errors.mjs +0 -21
  201. package/internal/errors.mjs.map +0 -1
  202. package/internal/headers.d.mts +0 -21
  203. package/internal/headers.d.mts.map +0 -1
  204. package/internal/headers.d.ts +0 -21
  205. package/internal/headers.d.ts.map +0 -1
  206. package/internal/headers.js +0 -77
  207. package/internal/headers.js.map +0 -1
  208. package/internal/headers.mjs +0 -72
  209. package/internal/headers.mjs.map +0 -1
  210. package/internal/parse.d.mts +0 -10
  211. package/internal/parse.d.mts.map +0 -1
  212. package/internal/parse.d.ts +0 -10
  213. package/internal/parse.d.ts.map +0 -1
  214. package/internal/parse.js +0 -28
  215. package/internal/parse.js.map +0 -1
  216. package/internal/parse.mjs +0 -24
  217. package/internal/parse.mjs.map +0 -1
  218. package/internal/polyfill/crypto.node.d.ts +0 -10
  219. package/internal/polyfill/crypto.node.js +0 -11
  220. package/internal/polyfill/crypto.node.mjs +0 -2
  221. package/internal/polyfill/file.node.d.ts +0 -9
  222. package/internal/polyfill/file.node.js +0 -17
  223. package/internal/polyfill/file.node.mjs +0 -9
  224. package/internal/request-options.d.mts +0 -34
  225. package/internal/request-options.d.mts.map +0 -1
  226. package/internal/request-options.d.ts +0 -34
  227. package/internal/request-options.d.ts.map +0 -1
  228. package/internal/request-options.js +0 -39
  229. package/internal/request-options.js.map +0 -1
  230. package/internal/request-options.mjs +0 -34
  231. package/internal/request-options.mjs.map +0 -1
  232. package/internal/shim-types.d.mts +0 -28
  233. package/internal/shim-types.d.ts +0 -28
  234. package/internal/shims.d.mts +0 -61
  235. package/internal/shims.d.mts.map +0 -1
  236. package/internal/shims.d.ts +0 -61
  237. package/internal/shims.d.ts.map +0 -1
  238. package/internal/shims.js +0 -101
  239. package/internal/shims.js.map +0 -1
  240. package/internal/shims.mjs +0 -92
  241. package/internal/shims.mjs.map +0 -1
  242. package/internal/types.d.mts +0 -68
  243. package/internal/types.d.mts.map +0 -1
  244. package/internal/types.d.ts +0 -68
  245. package/internal/types.d.ts.map +0 -1
  246. package/internal/types.js +0 -4
  247. package/internal/types.js.map +0 -1
  248. package/internal/types.mjs +0 -3
  249. package/internal/types.mjs.map +0 -1
  250. package/internal/uploads.d.mts +0 -73
  251. package/internal/uploads.d.mts.map +0 -1
  252. package/internal/uploads.d.ts +0 -73
  253. package/internal/uploads.d.ts.map +0 -1
  254. package/internal/uploads.js +0 -208
  255. package/internal/uploads.js.map +0 -1
  256. package/internal/uploads.mjs +0 -200
  257. package/internal/uploads.mjs.map +0 -1
  258. package/internal/utils/base64.d.mts +0 -3
  259. package/internal/utils/base64.d.mts.map +0 -1
  260. package/internal/utils/base64.d.ts +0 -3
  261. package/internal/utils/base64.d.ts.map +0 -1
  262. package/internal/utils/base64.js +0 -33
  263. package/internal/utils/base64.js.map +0 -1
  264. package/internal/utils/base64.mjs +0 -28
  265. package/internal/utils/base64.mjs.map +0 -1
  266. package/internal/utils/env.d.mts +0 -9
  267. package/internal/utils/env.d.mts.map +0 -1
  268. package/internal/utils/env.d.ts +0 -9
  269. package/internal/utils/env.d.ts.map +0 -1
  270. package/internal/utils/env.js +0 -22
  271. package/internal/utils/env.js.map +0 -1
  272. package/internal/utils/env.mjs +0 -18
  273. package/internal/utils/env.mjs.map +0 -1
  274. package/internal/utils/log.d.mts +0 -4
  275. package/internal/utils/log.d.mts.map +0 -1
  276. package/internal/utils/log.d.ts +0 -4
  277. package/internal/utils/log.d.ts.map +0 -1
  278. package/internal/utils/log.js +0 -47
  279. package/internal/utils/log.js.map +0 -1
  280. package/internal/utils/log.mjs +0 -43
  281. package/internal/utils/log.mjs.map +0 -1
  282. package/internal/utils/sleep.d.mts +0 -2
  283. package/internal/utils/sleep.d.mts.map +0 -1
  284. package/internal/utils/sleep.d.ts +0 -2
  285. package/internal/utils/sleep.d.ts.map +0 -1
  286. package/internal/utils/sleep.js +0 -7
  287. package/internal/utils/sleep.js.map +0 -1
  288. package/internal/utils/sleep.mjs +0 -3
  289. package/internal/utils/sleep.mjs.map +0 -1
  290. package/internal/utils/uuid.d.mts +0 -5
  291. package/internal/utils/uuid.d.mts.map +0 -1
  292. package/internal/utils/uuid.d.ts +0 -5
  293. package/internal/utils/uuid.d.ts.map +0 -1
  294. package/internal/utils/uuid.js +0 -15
  295. package/internal/utils/uuid.js.map +0 -1
  296. package/internal/utils/uuid.mjs +0 -11
  297. package/internal/utils/uuid.mjs.map +0 -1
  298. package/internal/utils/values.d.mts +0 -15
  299. package/internal/utils/values.d.mts.map +0 -1
  300. package/internal/utils/values.d.ts +0 -15
  301. package/internal/utils/values.d.ts.map +0 -1
  302. package/internal/utils/values.js +0 -100
  303. package/internal/utils/values.js.map +0 -1
  304. package/internal/utils/values.mjs +0 -84
  305. package/internal/utils/values.mjs.map +0 -1
  306. package/internal/utils.d.mts +0 -7
  307. package/internal/utils.d.mts.map +0 -1
  308. package/internal/utils.d.ts +0 -7
  309. package/internal/utils.d.ts.map +0 -1
  310. package/internal/utils.js.map +0 -1
  311. package/internal/utils.mjs +0 -8
  312. package/internal/utils.mjs.map +0 -1
  313. package/resource.d.mts +0 -6
  314. package/resource.d.mts.map +0 -1
  315. package/resources/calls.d.mts +0 -85
  316. package/resources/calls.d.mts.map +0 -1
  317. package/resources/index.d.mts +0 -2
  318. package/resources/index.d.mts.map +0 -1
  319. package/src/api-promise.ts +0 -92
  320. package/src/client.ts +0 -646
  321. package/src/internal/builtin-types.ts +0 -79
  322. package/src/internal/detect-platform.ts +0 -196
  323. package/src/internal/errors.ts +0 -22
  324. package/src/internal/headers.ts +0 -96
  325. package/src/internal/parse.ts +0 -41
  326. package/src/internal/polyfill/crypto.node.d.ts +0 -10
  327. package/src/internal/polyfill/crypto.node.js +0 -11
  328. package/src/internal/polyfill/crypto.node.mjs +0 -2
  329. package/src/internal/polyfill/file.node.d.ts +0 -9
  330. package/src/internal/polyfill/file.node.js +0 -17
  331. package/src/internal/polyfill/file.node.mjs +0 -9
  332. package/src/internal/request-options.ts +0 -67
  333. package/src/internal/shim-types.d.ts +0 -28
  334. package/src/internal/shims.ts +0 -145
  335. package/src/internal/types.ts +0 -98
  336. package/src/internal/uploads.ts +0 -307
  337. package/src/internal/utils/base64.ts +0 -37
  338. package/src/internal/utils/env.ts +0 -18
  339. package/src/internal/utils/log.ts +0 -49
  340. package/src/internal/utils/sleep.ts +0 -3
  341. package/src/internal/utils/uuid.ts +0 -13
  342. package/src/internal/utils/values.ts +0 -94
  343. package/src/internal/utils.ts +0 -8
  344. package/uploads.d.mts +0 -2
  345. package/uploads.d.mts.map +0 -1
  346. package/version.d.mts +0 -2
  347. package/version.d.mts.map +0 -1
package/core.js ADDED
@@ -0,0 +1,908 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _AbstractPage_client;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.isObj = exports.toBase64 = exports.getHeader = exports.getRequiredHeader = exports.isHeadersProtocol = exports.isRunningInBrowser = exports.debug = exports.hasOwn = exports.isEmptyObj = exports.maybeCoerceBoolean = exports.maybeCoerceFloat = exports.maybeCoerceInteger = exports.coerceBoolean = exports.coerceFloat = exports.coerceInteger = exports.readEnv = exports.ensurePresent = exports.castToError = exports.sleep = exports.safeJSON = exports.isRequestOptions = exports.createResponseHeaders = exports.PagePromise = exports.AbstractPage = exports.APIClient = exports.APIPromise = exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = void 0;
16
+ const version_1 = require("./version.js");
17
+ const error_1 = require("./error.js");
18
+ const index_1 = require("./_shims/index.js");
19
+ const uploads_1 = require("./uploads.js");
20
+ var uploads_2 = require("./uploads.js");
21
+ Object.defineProperty(exports, "maybeMultipartFormRequestOptions", { enumerable: true, get: function () { return uploads_2.maybeMultipartFormRequestOptions; } });
22
+ Object.defineProperty(exports, "multipartFormRequestOptions", { enumerable: true, get: function () { return uploads_2.multipartFormRequestOptions; } });
23
+ Object.defineProperty(exports, "createForm", { enumerable: true, get: function () { return uploads_2.createForm; } });
24
+ async function defaultParseResponse(props) {
25
+ const { response } = props;
26
+ // fetch refuses to read the body when the status code is 204.
27
+ if (response.status === 204) {
28
+ return null;
29
+ }
30
+ if (props.options.__binaryResponse) {
31
+ return response;
32
+ }
33
+ const contentType = response.headers.get('content-type');
34
+ const isJSON = contentType?.includes('application/json') || contentType?.includes('application/vnd.api+json');
35
+ if (isJSON) {
36
+ const json = await response.json();
37
+ debug('response', response.status, response.url, response.headers, json);
38
+ return json;
39
+ }
40
+ const text = await response.text();
41
+ debug('response', response.status, response.url, response.headers, text);
42
+ // TODO handle blob, arraybuffer, other content types, etc.
43
+ return text;
44
+ }
45
+ /**
46
+ * A subclass of `Promise` providing additional helper methods
47
+ * for interacting with the SDK.
48
+ */
49
+ class APIPromise extends Promise {
50
+ constructor(responsePromise, parseResponse = defaultParseResponse) {
51
+ super((resolve) => {
52
+ // this is maybe a bit weird but this has to be a no-op to not implicitly
53
+ // parse the response body; instead .then, .catch, .finally are overridden
54
+ // to parse the response
55
+ resolve(null);
56
+ });
57
+ this.responsePromise = responsePromise;
58
+ this.parseResponse = parseResponse;
59
+ }
60
+ _thenUnwrap(transform) {
61
+ return new APIPromise(this.responsePromise, async (props) => transform(await this.parseResponse(props), props));
62
+ }
63
+ /**
64
+ * Gets the raw `Response` instance instead of parsing the response
65
+ * data.
66
+ *
67
+ * If you want to parse the response body but still get the `Response`
68
+ * instance, you can use {@link withResponse()}.
69
+ *
70
+ * 👋 Getting the wrong TypeScript type for `Response`?
71
+ * Try setting `"moduleResolution": "NodeNext"` if you can,
72
+ * or add one of these imports before your first `import … from '@roarkanalytics/sdk'`:
73
+ * - `import '@roarkanalytics/sdk/shims/node'` (if you're running on Node)
74
+ * - `import '@roarkanalytics/sdk/shims/web'` (otherwise)
75
+ */
76
+ asResponse() {
77
+ return this.responsePromise.then((p) => p.response);
78
+ }
79
+ /**
80
+ * Gets the parsed response data and the raw `Response` instance.
81
+ *
82
+ * If you just want to get the raw `Response` instance without parsing it,
83
+ * you can use {@link asResponse()}.
84
+ *
85
+ *
86
+ * 👋 Getting the wrong TypeScript type for `Response`?
87
+ * Try setting `"moduleResolution": "NodeNext"` if you can,
88
+ * or add one of these imports before your first `import … from '@roarkanalytics/sdk'`:
89
+ * - `import '@roarkanalytics/sdk/shims/node'` (if you're running on Node)
90
+ * - `import '@roarkanalytics/sdk/shims/web'` (otherwise)
91
+ */
92
+ async withResponse() {
93
+ const [data, response] = await Promise.all([this.parse(), this.asResponse()]);
94
+ return { data, response };
95
+ }
96
+ parse() {
97
+ if (!this.parsedPromise) {
98
+ this.parsedPromise = this.responsePromise.then(this.parseResponse);
99
+ }
100
+ return this.parsedPromise;
101
+ }
102
+ then(onfulfilled, onrejected) {
103
+ return this.parse().then(onfulfilled, onrejected);
104
+ }
105
+ catch(onrejected) {
106
+ return this.parse().catch(onrejected);
107
+ }
108
+ finally(onfinally) {
109
+ return this.parse().finally(onfinally);
110
+ }
111
+ }
112
+ exports.APIPromise = APIPromise;
113
+ class APIClient {
114
+ constructor({ baseURL, maxRetries = 2, timeout = 60000, // 1 minute
115
+ httpAgent, fetch: overriddenFetch, }) {
116
+ this.baseURL = baseURL;
117
+ this.maxRetries = validatePositiveInteger('maxRetries', maxRetries);
118
+ this.timeout = validatePositiveInteger('timeout', timeout);
119
+ this.httpAgent = httpAgent;
120
+ this.fetch = overriddenFetch ?? index_1.fetch;
121
+ }
122
+ authHeaders(opts) {
123
+ return {};
124
+ }
125
+ /**
126
+ * Override this to add your own default headers, for example:
127
+ *
128
+ * {
129
+ * ...super.defaultHeaders(),
130
+ * Authorization: 'Bearer 123',
131
+ * }
132
+ */
133
+ defaultHeaders(opts) {
134
+ return {
135
+ Accept: 'application/json',
136
+ 'Content-Type': 'application/json',
137
+ 'User-Agent': this.getUserAgent(),
138
+ ...getPlatformHeaders(),
139
+ ...this.authHeaders(opts),
140
+ };
141
+ }
142
+ /**
143
+ * Override this to add your own headers validation:
144
+ */
145
+ validateHeaders(headers, customHeaders) { }
146
+ defaultIdempotencyKey() {
147
+ return `stainless-node-retry-${uuid4()}`;
148
+ }
149
+ get(path, opts) {
150
+ return this.methodRequest('get', path, opts);
151
+ }
152
+ post(path, opts) {
153
+ return this.methodRequest('post', path, opts);
154
+ }
155
+ patch(path, opts) {
156
+ return this.methodRequest('patch', path, opts);
157
+ }
158
+ put(path, opts) {
159
+ return this.methodRequest('put', path, opts);
160
+ }
161
+ delete(path, opts) {
162
+ return this.methodRequest('delete', path, opts);
163
+ }
164
+ methodRequest(method, path, opts) {
165
+ return this.request(Promise.resolve(opts).then(async (opts) => {
166
+ const body = opts && (0, uploads_1.isBlobLike)(opts?.body) ? new DataView(await opts.body.arrayBuffer())
167
+ : opts?.body instanceof DataView ? opts.body
168
+ : opts?.body instanceof ArrayBuffer ? new DataView(opts.body)
169
+ : opts && ArrayBuffer.isView(opts?.body) ? new DataView(opts.body.buffer)
170
+ : opts?.body;
171
+ return { method, path, ...opts, body };
172
+ }));
173
+ }
174
+ getAPIList(path, Page, opts) {
175
+ return this.requestAPIList(Page, { method: 'get', path, ...opts });
176
+ }
177
+ calculateContentLength(body) {
178
+ if (typeof body === 'string') {
179
+ if (typeof Buffer !== 'undefined') {
180
+ return Buffer.byteLength(body, 'utf8').toString();
181
+ }
182
+ if (typeof TextEncoder !== 'undefined') {
183
+ const encoder = new TextEncoder();
184
+ const encoded = encoder.encode(body);
185
+ return encoded.length.toString();
186
+ }
187
+ }
188
+ else if (ArrayBuffer.isView(body)) {
189
+ return body.byteLength.toString();
190
+ }
191
+ return null;
192
+ }
193
+ buildRequest(options, { retryCount = 0 } = {}) {
194
+ const { method, path, query, headers: headers = {} } = options;
195
+ const body = ArrayBuffer.isView(options.body) || (options.__binaryRequest && typeof options.body === 'string') ?
196
+ options.body
197
+ : (0, uploads_1.isMultipartBody)(options.body) ? options.body.body
198
+ : options.body ? JSON.stringify(options.body, null, 2)
199
+ : null;
200
+ const contentLength = this.calculateContentLength(body);
201
+ const url = this.buildURL(path, query);
202
+ if ('timeout' in options)
203
+ validatePositiveInteger('timeout', options.timeout);
204
+ const timeout = options.timeout ?? this.timeout;
205
+ const httpAgent = options.httpAgent ?? this.httpAgent ?? (0, index_1.getDefaultAgent)(url);
206
+ const minAgentTimeout = timeout + 1000;
207
+ if (typeof httpAgent?.options?.timeout === 'number' &&
208
+ minAgentTimeout > (httpAgent.options.timeout ?? 0)) {
209
+ // Allow any given request to bump our agent active socket timeout.
210
+ // This may seem strange, but leaking active sockets should be rare and not particularly problematic,
211
+ // and without mutating agent we would need to create more of them.
212
+ // This tradeoff optimizes for performance.
213
+ httpAgent.options.timeout = minAgentTimeout;
214
+ }
215
+ if (this.idempotencyHeader && method !== 'get') {
216
+ if (!options.idempotencyKey)
217
+ options.idempotencyKey = this.defaultIdempotencyKey();
218
+ headers[this.idempotencyHeader] = options.idempotencyKey;
219
+ }
220
+ const reqHeaders = this.buildHeaders({ options, headers, contentLength, retryCount });
221
+ const req = {
222
+ method,
223
+ ...(body && { body: body }),
224
+ headers: reqHeaders,
225
+ ...(httpAgent && { agent: httpAgent }),
226
+ // @ts-ignore node-fetch uses a custom AbortSignal type that is
227
+ // not compatible with standard web types
228
+ signal: options.signal ?? null,
229
+ };
230
+ return { req, url, timeout };
231
+ }
232
+ buildHeaders({ options, headers, contentLength, retryCount, }) {
233
+ const reqHeaders = {};
234
+ if (contentLength) {
235
+ reqHeaders['content-length'] = contentLength;
236
+ }
237
+ const defaultHeaders = this.defaultHeaders(options);
238
+ applyHeadersMut(reqHeaders, defaultHeaders);
239
+ applyHeadersMut(reqHeaders, headers);
240
+ // let builtin fetch set the Content-Type for multipart bodies
241
+ if ((0, uploads_1.isMultipartBody)(options.body) && index_1.kind !== 'node') {
242
+ delete reqHeaders['content-type'];
243
+ }
244
+ // Don't set the retry count header if it was already set or removed through default headers or by the
245
+ // caller. We check `defaultHeaders` and `headers`, which can contain nulls, instead of `reqHeaders` to
246
+ // account for the removal case.
247
+ if ((0, exports.getHeader)(defaultHeaders, 'x-stainless-retry-count') === undefined &&
248
+ (0, exports.getHeader)(headers, 'x-stainless-retry-count') === undefined) {
249
+ reqHeaders['x-stainless-retry-count'] = String(retryCount);
250
+ }
251
+ this.validateHeaders(reqHeaders, headers);
252
+ return reqHeaders;
253
+ }
254
+ /**
255
+ * Used as a callback for mutating the given `FinalRequestOptions` object.
256
+ */
257
+ async prepareOptions(options) { }
258
+ /**
259
+ * Used as a callback for mutating the given `RequestInit` object.
260
+ *
261
+ * This is useful for cases where you want to add certain headers based off of
262
+ * the request properties, e.g. `method` or `url`.
263
+ */
264
+ async prepareRequest(request, { url, options }) { }
265
+ parseHeaders(headers) {
266
+ return (!headers ? {}
267
+ : Symbol.iterator in headers ?
268
+ Object.fromEntries(Array.from(headers).map((header) => [...header]))
269
+ : { ...headers });
270
+ }
271
+ makeStatusError(status, error, message, headers) {
272
+ return error_1.APIError.generate(status, error, message, headers);
273
+ }
274
+ request(options, remainingRetries = null) {
275
+ return new APIPromise(this.makeRequest(options, remainingRetries));
276
+ }
277
+ async makeRequest(optionsInput, retriesRemaining) {
278
+ const options = await optionsInput;
279
+ const maxRetries = options.maxRetries ?? this.maxRetries;
280
+ if (retriesRemaining == null) {
281
+ retriesRemaining = maxRetries;
282
+ }
283
+ await this.prepareOptions(options);
284
+ const { req, url, timeout } = this.buildRequest(options, { retryCount: maxRetries - retriesRemaining });
285
+ await this.prepareRequest(req, { url, options });
286
+ debug('request', url, options, req.headers);
287
+ if (options.signal?.aborted) {
288
+ throw new error_1.APIUserAbortError();
289
+ }
290
+ const controller = new AbortController();
291
+ const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(exports.castToError);
292
+ if (response instanceof Error) {
293
+ if (options.signal?.aborted) {
294
+ throw new error_1.APIUserAbortError();
295
+ }
296
+ if (retriesRemaining) {
297
+ return this.retryRequest(options, retriesRemaining);
298
+ }
299
+ if (response.name === 'AbortError') {
300
+ throw new error_1.APIConnectionTimeoutError();
301
+ }
302
+ throw new error_1.APIConnectionError({ cause: response });
303
+ }
304
+ const responseHeaders = (0, exports.createResponseHeaders)(response.headers);
305
+ if (!response.ok) {
306
+ if (retriesRemaining && this.shouldRetry(response)) {
307
+ const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;
308
+ debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders);
309
+ return this.retryRequest(options, retriesRemaining, responseHeaders);
310
+ }
311
+ const errText = await response.text().catch((e) => (0, exports.castToError)(e).message);
312
+ const errJSON = (0, exports.safeJSON)(errText);
313
+ const errMessage = errJSON ? undefined : errText;
314
+ const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`;
315
+ debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage);
316
+ const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders);
317
+ throw err;
318
+ }
319
+ return { response, options, controller };
320
+ }
321
+ requestAPIList(Page, options) {
322
+ const request = this.makeRequest(options, null);
323
+ return new PagePromise(this, request, Page);
324
+ }
325
+ buildURL(path, query) {
326
+ const url = isAbsoluteURL(path) ?
327
+ new URL(path)
328
+ : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path));
329
+ const defaultQuery = this.defaultQuery();
330
+ if (!isEmptyObj(defaultQuery)) {
331
+ query = { ...defaultQuery, ...query };
332
+ }
333
+ if (typeof query === 'object' && query && !Array.isArray(query)) {
334
+ url.search = this.stringifyQuery(query);
335
+ }
336
+ return url.toString();
337
+ }
338
+ stringifyQuery(query) {
339
+ return Object.entries(query)
340
+ .filter(([_, value]) => typeof value !== 'undefined')
341
+ .map(([key, value]) => {
342
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
343
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
344
+ }
345
+ if (value === null) {
346
+ return `${encodeURIComponent(key)}=`;
347
+ }
348
+ throw new error_1.RoarkError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`);
349
+ })
350
+ .join('&');
351
+ }
352
+ async fetchWithTimeout(url, init, ms, controller) {
353
+ const { signal, ...options } = init || {};
354
+ if (signal)
355
+ signal.addEventListener('abort', () => controller.abort());
356
+ const timeout = setTimeout(() => controller.abort(), ms);
357
+ const fetchOptions = {
358
+ signal: controller.signal,
359
+ ...options,
360
+ };
361
+ if (fetchOptions.method) {
362
+ // Custom methods like 'patch' need to be uppercased
363
+ // See https://github.com/nodejs/undici/issues/2294
364
+ fetchOptions.method = fetchOptions.method.toUpperCase();
365
+ }
366
+ return (
367
+ // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
368
+ this.fetch.call(undefined, url, fetchOptions).finally(() => {
369
+ clearTimeout(timeout);
370
+ }));
371
+ }
372
+ shouldRetry(response) {
373
+ // Note this is not a standard header.
374
+ const shouldRetryHeader = response.headers.get('x-should-retry');
375
+ // If the server explicitly says whether or not to retry, obey.
376
+ if (shouldRetryHeader === 'true')
377
+ return true;
378
+ if (shouldRetryHeader === 'false')
379
+ return false;
380
+ // Retry on request timeouts.
381
+ if (response.status === 408)
382
+ return true;
383
+ // Retry on lock timeouts.
384
+ if (response.status === 409)
385
+ return true;
386
+ // Retry on rate limits.
387
+ if (response.status === 429)
388
+ return true;
389
+ // Retry internal errors.
390
+ if (response.status >= 500)
391
+ return true;
392
+ return false;
393
+ }
394
+ async retryRequest(options, retriesRemaining, responseHeaders) {
395
+ let timeoutMillis;
396
+ // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it.
397
+ const retryAfterMillisHeader = responseHeaders?.['retry-after-ms'];
398
+ if (retryAfterMillisHeader) {
399
+ const timeoutMs = parseFloat(retryAfterMillisHeader);
400
+ if (!Number.isNaN(timeoutMs)) {
401
+ timeoutMillis = timeoutMs;
402
+ }
403
+ }
404
+ // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
405
+ const retryAfterHeader = responseHeaders?.['retry-after'];
406
+ if (retryAfterHeader && !timeoutMillis) {
407
+ const timeoutSeconds = parseFloat(retryAfterHeader);
408
+ if (!Number.isNaN(timeoutSeconds)) {
409
+ timeoutMillis = timeoutSeconds * 1000;
410
+ }
411
+ else {
412
+ timeoutMillis = Date.parse(retryAfterHeader) - Date.now();
413
+ }
414
+ }
415
+ // If the API asks us to wait a certain amount of time (and it's a reasonable amount),
416
+ // just do what it says, but otherwise calculate a default
417
+ if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {
418
+ const maxRetries = options.maxRetries ?? this.maxRetries;
419
+ timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries);
420
+ }
421
+ await (0, exports.sleep)(timeoutMillis);
422
+ return this.makeRequest(options, retriesRemaining - 1);
423
+ }
424
+ calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) {
425
+ const initialRetryDelay = 0.5;
426
+ const maxRetryDelay = 8.0;
427
+ const numRetries = maxRetries - retriesRemaining;
428
+ // Apply exponential backoff, but not more than the max.
429
+ const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay);
430
+ // Apply some jitter, take up to at most 25 percent of the retry time.
431
+ const jitter = 1 - Math.random() * 0.25;
432
+ return sleepSeconds * jitter * 1000;
433
+ }
434
+ getUserAgent() {
435
+ return `${this.constructor.name}/JS ${version_1.VERSION}`;
436
+ }
437
+ }
438
+ exports.APIClient = APIClient;
439
+ class AbstractPage {
440
+ constructor(client, response, body, options) {
441
+ _AbstractPage_client.set(this, void 0);
442
+ __classPrivateFieldSet(this, _AbstractPage_client, client, "f");
443
+ this.options = options;
444
+ this.response = response;
445
+ this.body = body;
446
+ }
447
+ hasNextPage() {
448
+ const items = this.getPaginatedItems();
449
+ if (!items.length)
450
+ return false;
451
+ return this.nextPageInfo() != null;
452
+ }
453
+ async getNextPage() {
454
+ const nextInfo = this.nextPageInfo();
455
+ if (!nextInfo) {
456
+ throw new error_1.RoarkError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.');
457
+ }
458
+ const nextOptions = { ...this.options };
459
+ if ('params' in nextInfo && typeof nextOptions.query === 'object') {
460
+ nextOptions.query = { ...nextOptions.query, ...nextInfo.params };
461
+ }
462
+ else if ('url' in nextInfo) {
463
+ const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()];
464
+ for (const [key, value] of params) {
465
+ nextInfo.url.searchParams.set(key, value);
466
+ }
467
+ nextOptions.query = undefined;
468
+ nextOptions.path = nextInfo.url.toString();
469
+ }
470
+ return await __classPrivateFieldGet(this, _AbstractPage_client, "f").requestAPIList(this.constructor, nextOptions);
471
+ }
472
+ async *iterPages() {
473
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
474
+ let page = this;
475
+ yield page;
476
+ while (page.hasNextPage()) {
477
+ page = await page.getNextPage();
478
+ yield page;
479
+ }
480
+ }
481
+ async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() {
482
+ for await (const page of this.iterPages()) {
483
+ for (const item of page.getPaginatedItems()) {
484
+ yield item;
485
+ }
486
+ }
487
+ }
488
+ }
489
+ exports.AbstractPage = AbstractPage;
490
+ /**
491
+ * This subclass of Promise will resolve to an instantiated Page once the request completes.
492
+ *
493
+ * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg:
494
+ *
495
+ * for await (const item of client.items.list()) {
496
+ * console.log(item)
497
+ * }
498
+ */
499
+ class PagePromise extends APIPromise {
500
+ constructor(client, request, Page) {
501
+ super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options));
502
+ }
503
+ /**
504
+ * Allow auto-paginating iteration on an unawaited list call, eg:
505
+ *
506
+ * for await (const item of client.items.list()) {
507
+ * console.log(item)
508
+ * }
509
+ */
510
+ async *[Symbol.asyncIterator]() {
511
+ const page = await this;
512
+ for await (const item of page) {
513
+ yield item;
514
+ }
515
+ }
516
+ }
517
+ exports.PagePromise = PagePromise;
518
+ const createResponseHeaders = (headers) => {
519
+ return new Proxy(Object.fromEntries(
520
+ // @ts-ignore
521
+ headers.entries()), {
522
+ get(target, name) {
523
+ const key = name.toString();
524
+ return target[key.toLowerCase()] || target[key];
525
+ },
526
+ });
527
+ };
528
+ exports.createResponseHeaders = createResponseHeaders;
529
+ // This is required so that we can determine if a given object matches the RequestOptions
530
+ // type at runtime. While this requires duplication, it is enforced by the TypeScript
531
+ // compiler such that any missing / extraneous keys will cause an error.
532
+ const requestOptionsKeys = {
533
+ method: true,
534
+ path: true,
535
+ query: true,
536
+ body: true,
537
+ headers: true,
538
+ maxRetries: true,
539
+ stream: true,
540
+ timeout: true,
541
+ httpAgent: true,
542
+ signal: true,
543
+ idempotencyKey: true,
544
+ __binaryRequest: true,
545
+ __binaryResponse: true,
546
+ };
547
+ const isRequestOptions = (obj) => {
548
+ return (typeof obj === 'object' &&
549
+ obj !== null &&
550
+ !isEmptyObj(obj) &&
551
+ Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k)));
552
+ };
553
+ exports.isRequestOptions = isRequestOptions;
554
+ const getPlatformProperties = () => {
555
+ if (typeof Deno !== 'undefined' && Deno.build != null) {
556
+ return {
557
+ 'X-Stainless-Lang': 'js',
558
+ 'X-Stainless-Package-Version': version_1.VERSION,
559
+ 'X-Stainless-OS': normalizePlatform(Deno.build.os),
560
+ 'X-Stainless-Arch': normalizeArch(Deno.build.arch),
561
+ 'X-Stainless-Runtime': 'deno',
562
+ 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown',
563
+ };
564
+ }
565
+ if (typeof EdgeRuntime !== 'undefined') {
566
+ return {
567
+ 'X-Stainless-Lang': 'js',
568
+ 'X-Stainless-Package-Version': version_1.VERSION,
569
+ 'X-Stainless-OS': 'Unknown',
570
+ 'X-Stainless-Arch': `other:${EdgeRuntime}`,
571
+ 'X-Stainless-Runtime': 'edge',
572
+ 'X-Stainless-Runtime-Version': process.version,
573
+ };
574
+ }
575
+ // Check if Node.js
576
+ if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') {
577
+ return {
578
+ 'X-Stainless-Lang': 'js',
579
+ 'X-Stainless-Package-Version': version_1.VERSION,
580
+ 'X-Stainless-OS': normalizePlatform(process.platform),
581
+ 'X-Stainless-Arch': normalizeArch(process.arch),
582
+ 'X-Stainless-Runtime': 'node',
583
+ 'X-Stainless-Runtime-Version': process.version,
584
+ };
585
+ }
586
+ const browserInfo = getBrowserInfo();
587
+ if (browserInfo) {
588
+ return {
589
+ 'X-Stainless-Lang': 'js',
590
+ 'X-Stainless-Package-Version': version_1.VERSION,
591
+ 'X-Stainless-OS': 'Unknown',
592
+ 'X-Stainless-Arch': 'unknown',
593
+ 'X-Stainless-Runtime': `browser:${browserInfo.browser}`,
594
+ 'X-Stainless-Runtime-Version': browserInfo.version,
595
+ };
596
+ }
597
+ // TODO add support for Cloudflare workers, etc.
598
+ return {
599
+ 'X-Stainless-Lang': 'js',
600
+ 'X-Stainless-Package-Version': version_1.VERSION,
601
+ 'X-Stainless-OS': 'Unknown',
602
+ 'X-Stainless-Arch': 'unknown',
603
+ 'X-Stainless-Runtime': 'unknown',
604
+ 'X-Stainless-Runtime-Version': 'unknown',
605
+ };
606
+ };
607
+ // Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts
608
+ function getBrowserInfo() {
609
+ if (typeof navigator === 'undefined' || !navigator) {
610
+ return null;
611
+ }
612
+ // NOTE: The order matters here!
613
+ const browserPatterns = [
614
+ { key: 'edge', pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
615
+ { key: 'ie', pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
616
+ { key: 'ie', pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ },
617
+ { key: 'chrome', pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
618
+ { key: 'firefox', pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
619
+ { key: 'safari', pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/ },
620
+ ];
621
+ // Find the FIRST matching browser
622
+ for (const { key, pattern } of browserPatterns) {
623
+ const match = pattern.exec(navigator.userAgent);
624
+ if (match) {
625
+ const major = match[1] || 0;
626
+ const minor = match[2] || 0;
627
+ const patch = match[3] || 0;
628
+ return { browser: key, version: `${major}.${minor}.${patch}` };
629
+ }
630
+ }
631
+ return null;
632
+ }
633
+ const normalizeArch = (arch) => {
634
+ // Node docs:
635
+ // - https://nodejs.org/api/process.html#processarch
636
+ // Deno docs:
637
+ // - https://doc.deno.land/deno/stable/~/Deno.build
638
+ if (arch === 'x32')
639
+ return 'x32';
640
+ if (arch === 'x86_64' || arch === 'x64')
641
+ return 'x64';
642
+ if (arch === 'arm')
643
+ return 'arm';
644
+ if (arch === 'aarch64' || arch === 'arm64')
645
+ return 'arm64';
646
+ if (arch)
647
+ return `other:${arch}`;
648
+ return 'unknown';
649
+ };
650
+ const normalizePlatform = (platform) => {
651
+ // Node platforms:
652
+ // - https://nodejs.org/api/process.html#processplatform
653
+ // Deno platforms:
654
+ // - https://doc.deno.land/deno/stable/~/Deno.build
655
+ // - https://github.com/denoland/deno/issues/14799
656
+ platform = platform.toLowerCase();
657
+ // NOTE: this iOS check is untested and may not work
658
+ // Node does not work natively on IOS, there is a fork at
659
+ // https://github.com/nodejs-mobile/nodejs-mobile
660
+ // however it is unknown at the time of writing how to detect if it is running
661
+ if (platform.includes('ios'))
662
+ return 'iOS';
663
+ if (platform === 'android')
664
+ return 'Android';
665
+ if (platform === 'darwin')
666
+ return 'MacOS';
667
+ if (platform === 'win32')
668
+ return 'Windows';
669
+ if (platform === 'freebsd')
670
+ return 'FreeBSD';
671
+ if (platform === 'openbsd')
672
+ return 'OpenBSD';
673
+ if (platform === 'linux')
674
+ return 'Linux';
675
+ if (platform)
676
+ return `Other:${platform}`;
677
+ return 'Unknown';
678
+ };
679
+ let _platformHeaders;
680
+ const getPlatformHeaders = () => {
681
+ return (_platformHeaders ?? (_platformHeaders = getPlatformProperties()));
682
+ };
683
+ const safeJSON = (text) => {
684
+ try {
685
+ return JSON.parse(text);
686
+ }
687
+ catch (err) {
688
+ return undefined;
689
+ }
690
+ };
691
+ exports.safeJSON = safeJSON;
692
+ // https://url.spec.whatwg.org/#url-scheme-string
693
+ const startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;
694
+ const isAbsoluteURL = (url) => {
695
+ return startsWithSchemeRegexp.test(url);
696
+ };
697
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
698
+ exports.sleep = sleep;
699
+ const validatePositiveInteger = (name, n) => {
700
+ if (typeof n !== 'number' || !Number.isInteger(n)) {
701
+ throw new error_1.RoarkError(`${name} must be an integer`);
702
+ }
703
+ if (n < 0) {
704
+ throw new error_1.RoarkError(`${name} must be a positive integer`);
705
+ }
706
+ return n;
707
+ };
708
+ const castToError = (err) => {
709
+ if (err instanceof Error)
710
+ return err;
711
+ if (typeof err === 'object' && err !== null) {
712
+ try {
713
+ return new Error(JSON.stringify(err));
714
+ }
715
+ catch { }
716
+ }
717
+ return new Error(err);
718
+ };
719
+ exports.castToError = castToError;
720
+ const ensurePresent = (value) => {
721
+ if (value == null)
722
+ throw new error_1.RoarkError(`Expected a value to be given but received ${value} instead.`);
723
+ return value;
724
+ };
725
+ exports.ensurePresent = ensurePresent;
726
+ /**
727
+ * Read an environment variable.
728
+ *
729
+ * Trims beginning and trailing whitespace.
730
+ *
731
+ * Will return undefined if the environment variable doesn't exist or cannot be accessed.
732
+ */
733
+ const readEnv = (env) => {
734
+ if (typeof process !== 'undefined') {
735
+ return process.env?.[env]?.trim() ?? undefined;
736
+ }
737
+ if (typeof Deno !== 'undefined') {
738
+ return Deno.env?.get?.(env)?.trim();
739
+ }
740
+ return undefined;
741
+ };
742
+ exports.readEnv = readEnv;
743
+ const coerceInteger = (value) => {
744
+ if (typeof value === 'number')
745
+ return Math.round(value);
746
+ if (typeof value === 'string')
747
+ return parseInt(value, 10);
748
+ throw new error_1.RoarkError(`Could not coerce ${value} (type: ${typeof value}) into a number`);
749
+ };
750
+ exports.coerceInteger = coerceInteger;
751
+ const coerceFloat = (value) => {
752
+ if (typeof value === 'number')
753
+ return value;
754
+ if (typeof value === 'string')
755
+ return parseFloat(value);
756
+ throw new error_1.RoarkError(`Could not coerce ${value} (type: ${typeof value}) into a number`);
757
+ };
758
+ exports.coerceFloat = coerceFloat;
759
+ const coerceBoolean = (value) => {
760
+ if (typeof value === 'boolean')
761
+ return value;
762
+ if (typeof value === 'string')
763
+ return value === 'true';
764
+ return Boolean(value);
765
+ };
766
+ exports.coerceBoolean = coerceBoolean;
767
+ const maybeCoerceInteger = (value) => {
768
+ if (value === undefined) {
769
+ return undefined;
770
+ }
771
+ return (0, exports.coerceInteger)(value);
772
+ };
773
+ exports.maybeCoerceInteger = maybeCoerceInteger;
774
+ const maybeCoerceFloat = (value) => {
775
+ if (value === undefined) {
776
+ return undefined;
777
+ }
778
+ return (0, exports.coerceFloat)(value);
779
+ };
780
+ exports.maybeCoerceFloat = maybeCoerceFloat;
781
+ const maybeCoerceBoolean = (value) => {
782
+ if (value === undefined) {
783
+ return undefined;
784
+ }
785
+ return (0, exports.coerceBoolean)(value);
786
+ };
787
+ exports.maybeCoerceBoolean = maybeCoerceBoolean;
788
+ // https://stackoverflow.com/a/34491287
789
+ function isEmptyObj(obj) {
790
+ if (!obj)
791
+ return true;
792
+ for (const _k in obj)
793
+ return false;
794
+ return true;
795
+ }
796
+ exports.isEmptyObj = isEmptyObj;
797
+ // https://eslint.org/docs/latest/rules/no-prototype-builtins
798
+ function hasOwn(obj, key) {
799
+ return Object.prototype.hasOwnProperty.call(obj, key);
800
+ }
801
+ exports.hasOwn = hasOwn;
802
+ /**
803
+ * Copies headers from "newHeaders" onto "targetHeaders",
804
+ * using lower-case for all properties,
805
+ * ignoring any keys with undefined values,
806
+ * and deleting any keys with null values.
807
+ */
808
+ function applyHeadersMut(targetHeaders, newHeaders) {
809
+ for (const k in newHeaders) {
810
+ if (!hasOwn(newHeaders, k))
811
+ continue;
812
+ const lowerKey = k.toLowerCase();
813
+ if (!lowerKey)
814
+ continue;
815
+ const val = newHeaders[k];
816
+ if (val === null) {
817
+ delete targetHeaders[lowerKey];
818
+ }
819
+ else if (val !== undefined) {
820
+ targetHeaders[lowerKey] = val;
821
+ }
822
+ }
823
+ }
824
+ function debug(action, ...args) {
825
+ if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') {
826
+ console.log(`Roark:DEBUG:${action}`, ...args);
827
+ }
828
+ }
829
+ exports.debug = debug;
830
+ /**
831
+ * https://stackoverflow.com/a/2117523
832
+ */
833
+ const uuid4 = () => {
834
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
835
+ const r = (Math.random() * 16) | 0;
836
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
837
+ return v.toString(16);
838
+ });
839
+ };
840
+ const isRunningInBrowser = () => {
841
+ return (
842
+ // @ts-ignore
843
+ typeof window !== 'undefined' &&
844
+ // @ts-ignore
845
+ typeof window.document !== 'undefined' &&
846
+ // @ts-ignore
847
+ typeof navigator !== 'undefined');
848
+ };
849
+ exports.isRunningInBrowser = isRunningInBrowser;
850
+ const isHeadersProtocol = (headers) => {
851
+ return typeof headers?.get === 'function';
852
+ };
853
+ exports.isHeadersProtocol = isHeadersProtocol;
854
+ const getRequiredHeader = (headers, header) => {
855
+ const foundHeader = (0, exports.getHeader)(headers, header);
856
+ if (foundHeader === undefined) {
857
+ throw new Error(`Could not find ${header} header`);
858
+ }
859
+ return foundHeader;
860
+ };
861
+ exports.getRequiredHeader = getRequiredHeader;
862
+ const getHeader = (headers, header) => {
863
+ const lowerCasedHeader = header.toLowerCase();
864
+ if ((0, exports.isHeadersProtocol)(headers)) {
865
+ // to deal with the case where the header looks like Stainless-Event-Id
866
+ const intercapsHeader = header[0]?.toUpperCase() +
867
+ header.substring(1).replace(/([^\w])(\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase());
868
+ for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) {
869
+ const value = headers.get(key);
870
+ if (value) {
871
+ return value;
872
+ }
873
+ }
874
+ }
875
+ for (const [key, value] of Object.entries(headers)) {
876
+ if (key.toLowerCase() === lowerCasedHeader) {
877
+ if (Array.isArray(value)) {
878
+ if (value.length <= 1)
879
+ return value[0];
880
+ console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`);
881
+ return value[0];
882
+ }
883
+ return value;
884
+ }
885
+ }
886
+ return undefined;
887
+ };
888
+ exports.getHeader = getHeader;
889
+ /**
890
+ * Encodes a string to Base64 format.
891
+ */
892
+ const toBase64 = (str) => {
893
+ if (!str)
894
+ return '';
895
+ if (typeof Buffer !== 'undefined') {
896
+ return Buffer.from(str).toString('base64');
897
+ }
898
+ if (typeof btoa !== 'undefined') {
899
+ return btoa(str);
900
+ }
901
+ throw new error_1.RoarkError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined');
902
+ };
903
+ exports.toBase64 = toBase64;
904
+ function isObj(obj) {
905
+ return obj != null && typeof obj === 'object' && !Array.isArray(obj);
906
+ }
907
+ exports.isObj = isObj;
908
+ //# sourceMappingURL=core.js.map