@37signals/basecamp 0.2.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 (356) hide show
  1. package/README.md +600 -0
  2. package/dist/auth-strategy.d.ts +36 -0
  3. package/dist/auth-strategy.d.ts.map +1 -0
  4. package/dist/auth-strategy.js +33 -0
  5. package/dist/auth-strategy.js.map +1 -0
  6. package/dist/client.d.ts +224 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +715 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/errors.d.ts +137 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +269 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/generated/metadata.json +2281 -0
  15. package/dist/generated/openapi-stripped.json +21268 -0
  16. package/dist/generated/path-mapping.d.ts +8 -0
  17. package/dist/generated/path-mapping.d.ts.map +1 -0
  18. package/dist/generated/path-mapping.js +192 -0
  19. package/dist/generated/path-mapping.js.map +1 -0
  20. package/dist/generated/path-mapping.ts +199 -0
  21. package/dist/generated/schema.d.ts +14883 -0
  22. package/dist/generated/services/attachments.d.ts +27 -0
  23. package/dist/generated/services/attachments.d.ts.map +1 -0
  24. package/dist/generated/services/attachments.js +49 -0
  25. package/dist/generated/services/attachments.js.map +1 -0
  26. package/dist/generated/services/attachments.ts +59 -0
  27. package/dist/generated/services/boosts.d.ts +114 -0
  28. package/dist/generated/services/boosts.d.ts.map +1 -0
  29. package/dist/generated/services/boosts.js +179 -0
  30. package/dist/generated/services/boosts.js.map +1 -0
  31. package/dist/generated/services/boosts.ts +250 -0
  32. package/dist/generated/services/campfires.d.ts +202 -0
  33. package/dist/generated/services/campfires.d.ts.map +1 -0
  34. package/dist/generated/services/campfires.js +309 -0
  35. package/dist/generated/services/campfires.js.map +1 -0
  36. package/dist/generated/services/campfires.ts +433 -0
  37. package/dist/generated/services/card-columns.d.ts +163 -0
  38. package/dist/generated/services/card-columns.d.ts.map +1 -0
  39. package/dist/generated/services/card-columns.js +264 -0
  40. package/dist/generated/services/card-columns.js.map +1 -0
  41. package/dist/generated/services/card-columns.ts +360 -0
  42. package/dist/generated/services/card-steps.d.ts +105 -0
  43. package/dist/generated/services/card-steps.d.ts.map +1 -0
  44. package/dist/generated/services/card-steps.js +148 -0
  45. package/dist/generated/services/card-steps.js.map +1 -0
  46. package/dist/generated/services/card-steps.ts +221 -0
  47. package/dist/generated/services/card-tables.d.ts +27 -0
  48. package/dist/generated/services/card-tables.d.ts.map +1 -0
  49. package/dist/generated/services/card-tables.js +40 -0
  50. package/dist/generated/services/card-tables.js.map +1 -0
  51. package/dist/generated/services/card-tables.ts +55 -0
  52. package/dist/generated/services/cards.d.ts +118 -0
  53. package/dist/generated/services/cards.d.ts.map +1 -0
  54. package/dist/generated/services/cards.js +166 -0
  55. package/dist/generated/services/cards.js.map +1 -0
  56. package/dist/generated/services/cards.ts +247 -0
  57. package/dist/generated/services/checkins.d.ts +278 -0
  58. package/dist/generated/services/checkins.d.ts.map +1 -0
  59. package/dist/generated/services/checkins.js +420 -0
  60. package/dist/generated/services/checkins.js.map +1 -0
  61. package/dist/generated/services/checkins.ts +600 -0
  62. package/dist/generated/services/client-approvals.d.ts +45 -0
  63. package/dist/generated/services/client-approvals.d.ts.map +1 -0
  64. package/dist/generated/services/client-approvals.js +58 -0
  65. package/dist/generated/services/client-approvals.js.map +1 -0
  66. package/dist/generated/services/client-approvals.ts +89 -0
  67. package/dist/generated/services/client-correspondences.d.ts +45 -0
  68. package/dist/generated/services/client-correspondences.d.ts.map +1 -0
  69. package/dist/generated/services/client-correspondences.js +58 -0
  70. package/dist/generated/services/client-correspondences.js.map +1 -0
  71. package/dist/generated/services/client-correspondences.ts +89 -0
  72. package/dist/generated/services/client-replies.d.ts +47 -0
  73. package/dist/generated/services/client-replies.d.ts.map +1 -0
  74. package/dist/generated/services/client-replies.js +65 -0
  75. package/dist/generated/services/client-replies.js.map +1 -0
  76. package/dist/generated/services/client-replies.ts +95 -0
  77. package/dist/generated/services/client-visibility.d.ts +35 -0
  78. package/dist/generated/services/client-visibility.d.ts.map +1 -0
  79. package/dist/generated/services/client-visibility.js +44 -0
  80. package/dist/generated/services/client-visibility.js.map +1 -0
  81. package/dist/generated/services/client-visibility.ts +68 -0
  82. package/dist/generated/services/comments.d.ts +86 -0
  83. package/dist/generated/services/comments.d.ts.map +1 -0
  84. package/dist/generated/services/comments.js +129 -0
  85. package/dist/generated/services/comments.js.map +1 -0
  86. package/dist/generated/services/comments.ts +185 -0
  87. package/dist/generated/services/documents.d.ts +92 -0
  88. package/dist/generated/services/documents.d.ts.map +1 -0
  89. package/dist/generated/services/documents.js +129 -0
  90. package/dist/generated/services/documents.js.map +1 -0
  91. package/dist/generated/services/documents.ts +191 -0
  92. package/dist/generated/services/events.d.ts +34 -0
  93. package/dist/generated/services/events.d.ts.map +1 -0
  94. package/dist/generated/services/events.js +39 -0
  95. package/dist/generated/services/events.js.map +1 -0
  96. package/dist/generated/services/events.ts +64 -0
  97. package/dist/generated/services/forwards.d.ts +112 -0
  98. package/dist/generated/services/forwards.d.ts.map +1 -0
  99. package/dist/generated/services/forwards.js +172 -0
  100. package/dist/generated/services/forwards.js.map +1 -0
  101. package/dist/generated/services/forwards.ts +241 -0
  102. package/dist/generated/services/index.d.ts +39 -0
  103. package/dist/generated/services/index.d.ts.map +1 -0
  104. package/dist/generated/services/index.js +39 -0
  105. package/dist/generated/services/index.js.map +1 -0
  106. package/dist/generated/services/index.ts +38 -0
  107. package/dist/generated/services/lineup.d.ts +67 -0
  108. package/dist/generated/services/lineup.d.ts.map +1 -0
  109. package/dist/generated/services/lineup.js +99 -0
  110. package/dist/generated/services/lineup.js.map +1 -0
  111. package/dist/generated/services/lineup.ts +143 -0
  112. package/dist/generated/services/message-boards.d.ts +27 -0
  113. package/dist/generated/services/message-boards.d.ts.map +1 -0
  114. package/dist/generated/services/message-boards.js +40 -0
  115. package/dist/generated/services/message-boards.js.map +1 -0
  116. package/dist/generated/services/message-boards.ts +55 -0
  117. package/dist/generated/services/message-types.d.ts +100 -0
  118. package/dist/generated/services/message-types.d.ts.map +1 -0
  119. package/dist/generated/services/message-types.js +144 -0
  120. package/dist/generated/services/message-types.js.map +1 -0
  121. package/dist/generated/services/message-types.ts +210 -0
  122. package/dist/generated/services/messages.d.ts +122 -0
  123. package/dist/generated/services/messages.d.ts.map +1 -0
  124. package/dist/generated/services/messages.js +180 -0
  125. package/dist/generated/services/messages.js.map +1 -0
  126. package/dist/generated/services/messages.ts +258 -0
  127. package/dist/generated/services/people.d.ts +122 -0
  128. package/dist/generated/services/people.d.ts.map +1 -0
  129. package/dist/generated/services/people.js +167 -0
  130. package/dist/generated/services/people.js.map +1 -0
  131. package/dist/generated/services/people.ts +252 -0
  132. package/dist/generated/services/projects.d.ts +109 -0
  133. package/dist/generated/services/projects.d.ts.map +1 -0
  134. package/dist/generated/services/projects.js +153 -0
  135. package/dist/generated/services/projects.js.map +1 -0
  136. package/dist/generated/services/projects.ts +224 -0
  137. package/dist/generated/services/recordings.d.ts +93 -0
  138. package/dist/generated/services/recordings.d.ts.map +1 -0
  139. package/dist/generated/services/recordings.js +138 -0
  140. package/dist/generated/services/recordings.js.map +1 -0
  141. package/dist/generated/services/recordings.ts +191 -0
  142. package/dist/generated/services/reports.d.ts +90 -0
  143. package/dist/generated/services/reports.d.ts.map +1 -0
  144. package/dist/generated/services/reports.js +124 -0
  145. package/dist/generated/services/reports.js.map +1 -0
  146. package/dist/generated/services/reports.ts +187 -0
  147. package/dist/generated/services/schedules.d.ts +162 -0
  148. package/dist/generated/services/schedules.d.ts.map +1 -0
  149. package/dist/generated/services/schedules.js +228 -0
  150. package/dist/generated/services/schedules.js.map +1 -0
  151. package/dist/generated/services/schedules.ts +335 -0
  152. package/dist/generated/services/search.d.ts +45 -0
  153. package/dist/generated/services/search.d.ts.map +1 -0
  154. package/dist/generated/services/search.js +56 -0
  155. package/dist/generated/services/search.js.map +1 -0
  156. package/dist/generated/services/search.ts +89 -0
  157. package/dist/generated/services/subscriptions.d.ts +73 -0
  158. package/dist/generated/services/subscriptions.d.ts.map +1 -0
  159. package/dist/generated/services/subscriptions.js +119 -0
  160. package/dist/generated/services/subscriptions.js.map +1 -0
  161. package/dist/generated/services/subscriptions.ts +160 -0
  162. package/dist/generated/services/templates.d.ts +140 -0
  163. package/dist/generated/services/templates.d.ts.map +1 -0
  164. package/dist/generated/services/templates.js +207 -0
  165. package/dist/generated/services/templates.js.map +1 -0
  166. package/dist/generated/services/templates.ts +294 -0
  167. package/dist/generated/services/timeline.d.ts +31 -0
  168. package/dist/generated/services/timeline.d.ts.map +1 -0
  169. package/dist/generated/services/timeline.js +39 -0
  170. package/dist/generated/services/timeline.js.map +1 -0
  171. package/dist/generated/services/timeline.ts +62 -0
  172. package/dist/generated/services/timesheets.d.ts +145 -0
  173. package/dist/generated/services/timesheets.d.ts.map +1 -0
  174. package/dist/generated/services/timesheets.js +186 -0
  175. package/dist/generated/services/timesheets.js.map +1 -0
  176. package/dist/generated/services/timesheets.ts +289 -0
  177. package/dist/generated/services/todolist-groups.d.ts +74 -0
  178. package/dist/generated/services/todolist-groups.d.ts.map +1 -0
  179. package/dist/generated/services/todolist-groups.js +100 -0
  180. package/dist/generated/services/todolist-groups.js.map +1 -0
  181. package/dist/generated/services/todolist-groups.ts +151 -0
  182. package/dist/generated/services/todolists.d.ts +95 -0
  183. package/dist/generated/services/todolists.d.ts.map +1 -0
  184. package/dist/generated/services/todolists.js +130 -0
  185. package/dist/generated/services/todolists.js.map +1 -0
  186. package/dist/generated/services/todolists.ts +192 -0
  187. package/dist/generated/services/todos.d.ts +175 -0
  188. package/dist/generated/services/todos.d.ts.map +1 -0
  189. package/dist/generated/services/todos.js +255 -0
  190. package/dist/generated/services/todos.js.map +1 -0
  191. package/dist/generated/services/todos.ts +369 -0
  192. package/dist/generated/services/todosets.d.ts +27 -0
  193. package/dist/generated/services/todosets.d.ts.map +1 -0
  194. package/dist/generated/services/todosets.js +40 -0
  195. package/dist/generated/services/todosets.js.map +1 -0
  196. package/dist/generated/services/todosets.ts +55 -0
  197. package/dist/generated/services/tools.d.ts +122 -0
  198. package/dist/generated/services/tools.d.ts.map +1 -0
  199. package/dist/generated/services/tools.js +197 -0
  200. package/dist/generated/services/tools.js.map +1 -0
  201. package/dist/generated/services/tools.ts +267 -0
  202. package/dist/generated/services/uploads.d.ts +109 -0
  203. package/dist/generated/services/uploads.d.ts.map +1 -0
  204. package/dist/generated/services/uploads.js +153 -0
  205. package/dist/generated/services/uploads.js.map +1 -0
  206. package/dist/generated/services/uploads.ts +227 -0
  207. package/dist/generated/services/vaults.d.ts +86 -0
  208. package/dist/generated/services/vaults.d.ts.map +1 -0
  209. package/dist/generated/services/vaults.js +126 -0
  210. package/dist/generated/services/vaults.js.map +1 -0
  211. package/dist/generated/services/vaults.ts +182 -0
  212. package/dist/generated/services/webhooks.d.ts +106 -0
  213. package/dist/generated/services/webhooks.d.ts.map +1 -0
  214. package/dist/generated/services/webhooks.js +157 -0
  215. package/dist/generated/services/webhooks.js.map +1 -0
  216. package/dist/generated/services/webhooks.ts +226 -0
  217. package/dist/hooks/otel.d.ts +136 -0
  218. package/dist/hooks/otel.d.ts.map +1 -0
  219. package/dist/hooks/otel.js +240 -0
  220. package/dist/hooks/otel.js.map +1 -0
  221. package/dist/hooks.d.ts +171 -0
  222. package/dist/hooks.d.ts.map +1 -0
  223. package/dist/hooks.js +196 -0
  224. package/dist/hooks.js.map +1 -0
  225. package/dist/index.d.ts +90 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +122 -0
  228. package/dist/index.js.map +1 -0
  229. package/dist/oauth/authorize.d.ts +48 -0
  230. package/dist/oauth/authorize.d.ts.map +1 -0
  231. package/dist/oauth/authorize.js +56 -0
  232. package/dist/oauth/authorize.js.map +1 -0
  233. package/dist/oauth/callback-server.d.ts +56 -0
  234. package/dist/oauth/callback-server.d.ts.map +1 -0
  235. package/dist/oauth/callback-server.js +150 -0
  236. package/dist/oauth/callback-server.js.map +1 -0
  237. package/dist/oauth/discovery.d.ts +54 -0
  238. package/dist/oauth/discovery.d.ts.map +1 -0
  239. package/dist/oauth/discovery.js +116 -0
  240. package/dist/oauth/discovery.js.map +1 -0
  241. package/dist/oauth/exchange.d.ts +96 -0
  242. package/dist/oauth/exchange.d.ts.map +1 -0
  243. package/dist/oauth/exchange.js +324 -0
  244. package/dist/oauth/exchange.js.map +1 -0
  245. package/dist/oauth/identity.d.ts +30 -0
  246. package/dist/oauth/identity.d.ts.map +1 -0
  247. package/dist/oauth/identity.js +82 -0
  248. package/dist/oauth/identity.js.map +1 -0
  249. package/dist/oauth/index.d.ts +50 -0
  250. package/dist/oauth/index.d.ts.map +1 -0
  251. package/dist/oauth/index.js +58 -0
  252. package/dist/oauth/index.js.map +1 -0
  253. package/dist/oauth/interactive-login.d.ts +62 -0
  254. package/dist/oauth/interactive-login.d.ts.map +1 -0
  255. package/dist/oauth/interactive-login.js +106 -0
  256. package/dist/oauth/interactive-login.js.map +1 -0
  257. package/dist/oauth/pkce.d.ts +68 -0
  258. package/dist/oauth/pkce.d.ts.map +1 -0
  259. package/dist/oauth/pkce.js +80 -0
  260. package/dist/oauth/pkce.js.map +1 -0
  261. package/dist/oauth/token-manager.d.ts +92 -0
  262. package/dist/oauth/token-manager.d.ts.map +1 -0
  263. package/dist/oauth/token-manager.js +126 -0
  264. package/dist/oauth/token-manager.js.map +1 -0
  265. package/dist/oauth/token-store.d.ts +45 -0
  266. package/dist/oauth/token-store.d.ts.map +1 -0
  267. package/dist/oauth/token-store.js +105 -0
  268. package/dist/oauth/token-store.js.map +1 -0
  269. package/dist/oauth/types.d.ts +98 -0
  270. package/dist/oauth/types.d.ts.map +1 -0
  271. package/dist/oauth/types.js +8 -0
  272. package/dist/oauth/types.js.map +1 -0
  273. package/dist/pagination-utils.d.ts +27 -0
  274. package/dist/pagination-utils.d.ts.map +1 -0
  275. package/dist/pagination-utils.js +54 -0
  276. package/dist/pagination-utils.js.map +1 -0
  277. package/dist/pagination.d.ts +56 -0
  278. package/dist/pagination.d.ts.map +1 -0
  279. package/dist/pagination.js +57 -0
  280. package/dist/pagination.js.map +1 -0
  281. package/dist/security.d.ts +68 -0
  282. package/dist/security.d.ts.map +1 -0
  283. package/dist/security.js +107 -0
  284. package/dist/security.js.map +1 -0
  285. package/dist/services/authorization.d.ts +124 -0
  286. package/dist/services/authorization.d.ts.map +1 -0
  287. package/dist/services/authorization.js +117 -0
  288. package/dist/services/authorization.js.map +1 -0
  289. package/dist/services/base.d.ts +102 -0
  290. package/dist/services/base.d.ts.map +1 -0
  291. package/dist/services/base.js +230 -0
  292. package/dist/services/base.js.map +1 -0
  293. package/dist/webhooks/adapters/node-http.d.ts +14 -0
  294. package/dist/webhooks/adapters/node-http.d.ts.map +1 -0
  295. package/dist/webhooks/adapters/node-http.js +60 -0
  296. package/dist/webhooks/adapters/node-http.js.map +1 -0
  297. package/dist/webhooks/events.d.ts +52 -0
  298. package/dist/webhooks/events.d.ts.map +1 -0
  299. package/dist/webhooks/events.js +52 -0
  300. package/dist/webhooks/events.js.map +1 -0
  301. package/dist/webhooks/handler.d.ts +62 -0
  302. package/dist/webhooks/handler.d.ts.map +1 -0
  303. package/dist/webhooks/handler.js +226 -0
  304. package/dist/webhooks/handler.js.map +1 -0
  305. package/dist/webhooks/index.d.ts +5 -0
  306. package/dist/webhooks/index.d.ts.map +1 -0
  307. package/dist/webhooks/index.js +5 -0
  308. package/dist/webhooks/index.js.map +1 -0
  309. package/dist/webhooks/verify.d.ts +11 -0
  310. package/dist/webhooks/verify.d.ts.map +1 -0
  311. package/dist/webhooks/verify.js +25 -0
  312. package/dist/webhooks/verify.js.map +1 -0
  313. package/package.json +70 -0
  314. package/src/generated/metadata.json +2281 -0
  315. package/src/generated/openapi-stripped.json +21268 -0
  316. package/src/generated/path-mapping.ts +199 -0
  317. package/src/generated/schema.d.ts +14883 -0
  318. package/src/generated/services/attachments.ts +59 -0
  319. package/src/generated/services/boosts.ts +250 -0
  320. package/src/generated/services/campfires.ts +433 -0
  321. package/src/generated/services/card-columns.ts +360 -0
  322. package/src/generated/services/card-steps.ts +221 -0
  323. package/src/generated/services/card-tables.ts +55 -0
  324. package/src/generated/services/cards.ts +247 -0
  325. package/src/generated/services/checkins.ts +600 -0
  326. package/src/generated/services/client-approvals.ts +89 -0
  327. package/src/generated/services/client-correspondences.ts +89 -0
  328. package/src/generated/services/client-replies.ts +95 -0
  329. package/src/generated/services/client-visibility.ts +68 -0
  330. package/src/generated/services/comments.ts +185 -0
  331. package/src/generated/services/documents.ts +191 -0
  332. package/src/generated/services/events.ts +64 -0
  333. package/src/generated/services/forwards.ts +241 -0
  334. package/src/generated/services/index.ts +38 -0
  335. package/src/generated/services/lineup.ts +143 -0
  336. package/src/generated/services/message-boards.ts +55 -0
  337. package/src/generated/services/message-types.ts +210 -0
  338. package/src/generated/services/messages.ts +258 -0
  339. package/src/generated/services/people.ts +252 -0
  340. package/src/generated/services/projects.ts +224 -0
  341. package/src/generated/services/recordings.ts +191 -0
  342. package/src/generated/services/reports.ts +187 -0
  343. package/src/generated/services/schedules.ts +335 -0
  344. package/src/generated/services/search.ts +89 -0
  345. package/src/generated/services/subscriptions.ts +160 -0
  346. package/src/generated/services/templates.ts +294 -0
  347. package/src/generated/services/timeline.ts +62 -0
  348. package/src/generated/services/timesheets.ts +289 -0
  349. package/src/generated/services/todolist-groups.ts +151 -0
  350. package/src/generated/services/todolists.ts +192 -0
  351. package/src/generated/services/todos.ts +369 -0
  352. package/src/generated/services/todosets.ts +55 -0
  353. package/src/generated/services/tools.ts +267 -0
  354. package/src/generated/services/uploads.ts +227 -0
  355. package/src/generated/services/vaults.ts +182 -0
  356. package/src/generated/services/webhooks.ts +226 -0
package/dist/hooks.js ADDED
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Observability hooks system for the Basecamp SDK.
3
+ *
4
+ * Provides a way to observe API operations and HTTP requests
5
+ * without modifying the core client logic. Hooks compile away
6
+ * when unused (no overhead).
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { createBasecampClient, consoleHooks } from "@37signals/basecamp";
11
+ *
12
+ * // Simple console logging
13
+ * const client = createBasecampClient({
14
+ * accountId: "12345",
15
+ * accessToken: "token",
16
+ * hooks: consoleHooks(),
17
+ * });
18
+ *
19
+ * // Custom metrics
20
+ * const client = createBasecampClient({
21
+ * accountId: "12345",
22
+ * accessToken: "token",
23
+ * hooks: {
24
+ * onOperationEnd: (info, result) => {
25
+ * metrics.recordLatency(info.service, info.operation, result.durationMs);
26
+ * if (result.error) {
27
+ * metrics.recordError(info.service, info.operation);
28
+ * }
29
+ * },
30
+ * },
31
+ * });
32
+ * ```
33
+ */
34
+ /**
35
+ * Combines multiple hooks into a single hooks object.
36
+ * All hooks are called in order. Errors in hooks are caught and logged.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const hooks = chainHooks(
41
+ * consoleHooks(),
42
+ * metricsHooks(),
43
+ * sentryHooks(),
44
+ * );
45
+ * ```
46
+ */
47
+ export function chainHooks(...hooks) {
48
+ // Filter out undefined/null hooks
49
+ const activeHooks = hooks.filter(Boolean);
50
+ if (activeHooks.length === 0) {
51
+ return {};
52
+ }
53
+ if (activeHooks.length === 1) {
54
+ return activeHooks[0];
55
+ }
56
+ return {
57
+ onOperationStart: (info) => {
58
+ for (const h of activeHooks) {
59
+ try {
60
+ h.onOperationStart?.(info);
61
+ }
62
+ catch (err) {
63
+ console.error("Hook onOperationStart error:", err);
64
+ }
65
+ }
66
+ },
67
+ onOperationEnd: (info, result) => {
68
+ for (const h of activeHooks) {
69
+ try {
70
+ h.onOperationEnd?.(info, result);
71
+ }
72
+ catch (err) {
73
+ console.error("Hook onOperationEnd error:", err);
74
+ }
75
+ }
76
+ },
77
+ onRequestStart: (info) => {
78
+ for (const h of activeHooks) {
79
+ try {
80
+ h.onRequestStart?.(info);
81
+ }
82
+ catch (err) {
83
+ console.error("Hook onRequestStart error:", err);
84
+ }
85
+ }
86
+ },
87
+ onRequestEnd: (info, result) => {
88
+ for (const h of activeHooks) {
89
+ try {
90
+ h.onRequestEnd?.(info, result);
91
+ }
92
+ catch (err) {
93
+ console.error("Hook onRequestEnd error:", err);
94
+ }
95
+ }
96
+ },
97
+ onRetry: (info, attempt, error, delayMs) => {
98
+ for (const h of activeHooks) {
99
+ try {
100
+ h.onRetry?.(info, attempt, error, delayMs);
101
+ }
102
+ catch (err) {
103
+ console.error("Hook onRetry error:", err);
104
+ }
105
+ }
106
+ },
107
+ };
108
+ }
109
+ /**
110
+ * Creates hooks that log to the console.
111
+ * Useful for debugging and development.
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * // Basic usage
116
+ * const hooks = consoleHooks();
117
+ *
118
+ * // With custom options
119
+ * const hooks = consoleHooks({
120
+ * logRequests: true,
121
+ * minDurationMs: 100,
122
+ * });
123
+ * ```
124
+ */
125
+ export function consoleHooks(options = {}) {
126
+ const { logOperations = true, logRequests = false, logRetries = true, minDurationMs = 0, logger = console, } = options;
127
+ return {
128
+ onOperationStart: logOperations
129
+ ? (info) => {
130
+ const mutation = info.isMutation ? " [mutation]" : "";
131
+ const resource = info.resourceId ? ` #${info.resourceId}` : "";
132
+ const project = info.projectId ? ` (project: ${info.projectId})` : "";
133
+ logger.log(`[Basecamp] ${info.service}.${info.operation}${resource}${project}${mutation}`);
134
+ }
135
+ : undefined,
136
+ onOperationEnd: logOperations
137
+ ? (info, result) => {
138
+ if (result.durationMs < minDurationMs)
139
+ return;
140
+ const duration = `${result.durationMs}ms`;
141
+ if (result.error) {
142
+ logger.error(`[Basecamp] ${info.service}.${info.operation} failed (${duration}):`, result.error.message);
143
+ }
144
+ else {
145
+ logger.log(`[Basecamp] ${info.service}.${info.operation} completed (${duration})`);
146
+ }
147
+ }
148
+ : undefined,
149
+ onRequestStart: logRequests
150
+ ? (info) => {
151
+ const retry = info.attempt > 1 ? ` (attempt ${info.attempt})` : "";
152
+ logger.log(`[Basecamp] -> ${info.method} ${info.url}${retry}`);
153
+ }
154
+ : undefined,
155
+ onRequestEnd: logRequests
156
+ ? (info, result) => {
157
+ if (result.durationMs < minDurationMs)
158
+ return;
159
+ const cache = result.fromCache ? " (cached)" : "";
160
+ const status = result.error ? "error" : result.statusCode;
161
+ logger.log(`[Basecamp] <- ${info.method} ${info.url} ${status} (${result.durationMs}ms)${cache}`);
162
+ }
163
+ : undefined,
164
+ onRetry: logRetries
165
+ ? (info, attempt, error, delayMs) => {
166
+ logger.warn(`[Basecamp] Retrying ${info.method} ${info.url} (attempt ${attempt + 1}, waiting ${delayMs}ms): ${error.message}`);
167
+ }
168
+ : undefined,
169
+ };
170
+ }
171
+ /**
172
+ * Creates a no-op hooks object.
173
+ * Useful as a default when hooks are optional.
174
+ */
175
+ export function noopHooks() {
176
+ return {};
177
+ }
178
+ /**
179
+ * Internal helper to safely invoke a hook.
180
+ * Returns silently if the hook throws.
181
+ */
182
+ export function safeInvoke(hooks, hookName, ...args) {
183
+ if (!hooks)
184
+ return;
185
+ const hook = hooks[hookName];
186
+ if (!hook)
187
+ return;
188
+ try {
189
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
+ hook(...args);
191
+ }
192
+ catch (err) {
193
+ console.error(`Hook ${hookName} error:`, err);
194
+ }
195
+ }
196
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Basecamp TypeScript SDK
3
+ *
4
+ * Type-safe client for the Basecamp 3 API.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { createBasecampClient } from "@37signals/basecamp";
9
+ *
10
+ * const client = createBasecampClient({
11
+ * accountId: "12345",
12
+ * accessToken: process.env.BASECAMP_TOKEN!,
13
+ * });
14
+ *
15
+ * // High-level service methods
16
+ * const projects = await client.projects.list();
17
+ * const todo = await client.todos.create(projectId, todolistId, {
18
+ * content: "Ship the feature",
19
+ * assigneeIds: [userId],
20
+ * });
21
+ *
22
+ * // Or use low-level typed API calls
23
+ * const { data, error } = await client.GET("/projects.json");
24
+ *
25
+ * if (data) {
26
+ * console.log(data.map(p => p.name));
27
+ * }
28
+ * ```
29
+ *
30
+ * @packageDocumentation
31
+ */
32
+ export { createBasecampClient, type BasecampClient, type BasecampClientOptions, type TokenProvider, type RawClient, } from "./client.js";
33
+ export { type AuthStrategy, BearerAuth, bearerAuth } from "./auth-strategy.js";
34
+ export { fetchAllPages, paginateAll } from "./client.js";
35
+ export { ListResult, parseTotalCount, type ListMeta, type PaginationOptions } from "./pagination.js";
36
+ export { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
37
+ export { BasecampError, Errors, errorFromResponse, isBasecampError, isErrorCode, type ErrorCode, type BasecampErrorOptions, } from "./errors.js";
38
+ export { chainHooks, consoleHooks, noopHooks, safeInvoke, type BasecampHooks, type OperationInfo, type RequestInfo, type RequestResult, type OperationResult, type ConsoleHooksOptions, } from "./hooks.js";
39
+ export { BaseService, type FetchResponse } from "./services/base.js";
40
+ export { AuthorizationService, type Identity, type AuthorizedAccount, type AuthorizationInfo, type GetAuthorizationInfoOptions, } from "./services/authorization.js";
41
+ export { ProjectsService, type Project, type ListProjectOptions, type CreateProjectRequest, type UpdateProjectRequest, } from "./generated/services/projects.js";
42
+ export { TodosService, type Todo, type ListTodoOptions, type CreateTodoRequest, type UpdateTodoRequest, type RepositionTodoRequest, } from "./generated/services/todos.js";
43
+ export { TodolistsService, type Todolist, type ListTodolistOptions, type CreateTodolistRequest, type UpdateTodolistRequest, } from "./generated/services/todolists.js";
44
+ export { TodosetsService, type Todoset, } from "./generated/services/todosets.js";
45
+ export { PeopleService, type Person, type UpdateProjectAccessPeopleRequest, } from "./generated/services/people.js";
46
+ export { MessagesService, type Message, type CreateMessageRequest, type UpdateMessageRequest, } from "./generated/services/messages.js";
47
+ export { CommentsService, type Comment, type CreateCommentRequest, type UpdateCommentRequest, } from "./generated/services/comments.js";
48
+ export { CampfiresService, type Campfire, type CampfireLine, type Chatbot, type CreateChatbotCampfireRequest, type UpdateChatbotCampfireRequest, type CreateLineCampfireRequest, } from "./generated/services/campfires.js";
49
+ export { CardTablesService, type CardTable, } from "./generated/services/card-tables.js";
50
+ export { CardsService, type Card, type CreateCardRequest, type UpdateCardRequest, type MoveCardRequest, } from "./generated/services/cards.js";
51
+ export { CardColumnsService, type CardColumn, type CreateCardColumnRequest, type UpdateCardColumnRequest, type MoveCardColumnRequest, type SetColorCardColumnRequest, } from "./generated/services/card-columns.js";
52
+ export { CardStepsService, type CardStep, type CreateCardStepRequest, type UpdateCardStepRequest, } from "./generated/services/card-steps.js";
53
+ export { MessageBoardsService, type MessageBoard, } from "./generated/services/message-boards.js";
54
+ export { MessageTypesService, type MessageType, type CreateMessageTypeRequest, type UpdateMessageTypeRequest, } from "./generated/services/message-types.js";
55
+ export { ForwardsService, type Inbox, type Forward, type ForwardReply, type CreateReplyForwardRequest, } from "./generated/services/forwards.js";
56
+ export { CheckinsService, type Questionnaire, type Question, type Answer, type CreateQuestionCheckinRequest, type UpdateQuestionCheckinRequest, type CreateAnswerCheckinRequest, type UpdateAnswerCheckinRequest, type UpdateNotificationSettingsCheckinRequest, } from "./generated/services/checkins.js";
57
+ export { ClientApprovalsService, type ClientApproval, } from "./generated/services/client-approvals.js";
58
+ export { ClientCorrespondencesService, type ClientCorrespondence, } from "./generated/services/client-correspondences.js";
59
+ export { ClientRepliesService, type ClientReply, } from "./generated/services/client-replies.js";
60
+ export { ClientVisibilityService, } from "./generated/services/client-visibility.js";
61
+ export { WebhooksService, type Webhook, type CreateWebhookRequest, type UpdateWebhookRequest, } from "./generated/services/webhooks.js";
62
+ export { WebhookReceiver, WebhookVerificationError, type WebhookEventHandler, type WebhookMiddleware, type WebhookReceiverOptions, type HeaderAccessor, } from "./webhooks/handler.js";
63
+ export { verifyWebhookSignature, signWebhookPayload } from "./webhooks/verify.js";
64
+ export { parseEventKind, WebhookEventKind, type WebhookEvent, type WebhookDelivery, type WebhookDeliveryRequest, type WebhookDeliveryResponse, type WebhookCopy, } from "./webhooks/events.js";
65
+ export { createNodeHandler, type NodeHandlerOptions } from "./webhooks/adapters/node-http.js";
66
+ export { SubscriptionsService, type Subscription, type UpdateSubscriptionRequest, } from "./generated/services/subscriptions.js";
67
+ export { EventsService, type Event, } from "./generated/services/events.js";
68
+ export { AttachmentsService, } from "./generated/services/attachments.js";
69
+ export { VaultsService, type Vault, type CreateVaultRequest, type UpdateVaultRequest, } from "./generated/services/vaults.js";
70
+ export { DocumentsService, type Document, type CreateDocumentRequest, type UpdateDocumentRequest, } from "./generated/services/documents.js";
71
+ export { UploadsService, type Upload, type CreateUploadRequest, type UpdateUploadRequest, } from "./generated/services/uploads.js";
72
+ export { SchedulesService, type Schedule, type ScheduleEntry, type CreateEntryScheduleRequest, type UpdateEntryScheduleRequest, type UpdateSettingsScheduleRequest, type ListEntriesScheduleOptions, } from "./generated/services/schedules.js";
73
+ export { TimesheetsService, type ForRecordingTimesheetOptions, type ForProjectTimesheetOptions, type ReportTimesheetOptions, } from "./generated/services/timesheets.js";
74
+ export { TimelineService, } from "./generated/services/timeline.js";
75
+ export { SearchService, type SearchSearchOptions, } from "./generated/services/search.js";
76
+ export { ReportsService, } from "./generated/services/reports.js";
77
+ export { RecordingsService, type Recording, type ListRecordingOptions, } from "./generated/services/recordings.js";
78
+ export { TemplatesService, type Template, type ListTemplateOptions, type CreateTemplateRequest, type UpdateTemplateRequest, type CreateProjectTemplateRequest, } from "./generated/services/templates.js";
79
+ export { LineupService, type CreateLineupRequest, type UpdateLineupRequest, } from "./generated/services/lineup.js";
80
+ export { TodolistGroupsService, type TodolistGroup, type CreateTodolistGroupRequest, } from "./generated/services/todolist-groups.js";
81
+ export { ToolsService, type Tool, } from "./generated/services/tools.js";
82
+ export { BoostsService, type ListForRecordingBoostOptions, type CreateForRecordingBoostRequest, type ListForEventBoostOptions, type CreateForEventBoostRequest, } from "./generated/services/boosts.js";
83
+ export { otelHooks, type OtelHooksOptions, } from "./hooks/otel.js";
84
+ export type { OAuthConfig, OAuthToken, ExchangeRequest, RefreshRequest, RawTokenResponse, OAuthErrorResponse, } from "./oauth/types.js";
85
+ export { discover, discoverLaunchpad, LAUNCHPAD_BASE_URL, type DiscoverOptions, } from "./oauth/discovery.js";
86
+ export { exchangeCode, refreshToken, isTokenExpired, type TokenOptions, } from "./oauth/exchange.js";
87
+ export { generatePKCE, generateState, type PKCE, } from "./oauth/pkce.js";
88
+ export { redactHeaders, redactHeadersRecord, } from "./security.js";
89
+ export type { paths } from "./generated/schema.js";
90
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Basecamp TypeScript SDK
3
+ *
4
+ * Type-safe client for the Basecamp 3 API.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { createBasecampClient } from "@37signals/basecamp";
9
+ *
10
+ * const client = createBasecampClient({
11
+ * accountId: "12345",
12
+ * accessToken: process.env.BASECAMP_TOKEN!,
13
+ * });
14
+ *
15
+ * // High-level service methods
16
+ * const projects = await client.projects.list();
17
+ * const todo = await client.todos.create(projectId, todolistId, {
18
+ * content: "Ship the feature",
19
+ * assigneeIds: [userId],
20
+ * });
21
+ *
22
+ * // Or use low-level typed API calls
23
+ * const { data, error } = await client.GET("/projects.json");
24
+ *
25
+ * if (data) {
26
+ * console.log(data.map(p => p.name));
27
+ * }
28
+ * ```
29
+ *
30
+ * @packageDocumentation
31
+ */
32
+ // Main client factory
33
+ export { createBasecampClient, } from "./client.js";
34
+ // Authentication strategies
35
+ export { BearerAuth, bearerAuth } from "./auth-strategy.js";
36
+ // Pagination helpers
37
+ export { fetchAllPages, paginateAll } from "./client.js";
38
+ // Pagination types and utilities
39
+ export { ListResult, parseTotalCount } from "./pagination.js";
40
+ export { parseNextLink, resolveURL, isSameOrigin } from "./pagination-utils.js";
41
+ // Errors
42
+ export { BasecampError, Errors, errorFromResponse, isBasecampError, isErrorCode, } from "./errors.js";
43
+ // Hooks
44
+ export { chainHooks, consoleHooks, noopHooks, safeInvoke, } from "./hooks.js";
45
+ // =============================================================================
46
+ // Services - Generated from OpenAPI spec (spec-driven)
47
+ // =============================================================================
48
+ // Base service (for extending) - hand-written infrastructure
49
+ export { BaseService } from "./services/base.js";
50
+ // Authorization service - hand-written (OAuth flows not in OpenAPI spec)
51
+ export { AuthorizationService, } from "./services/authorization.js";
52
+ // Core services - generated
53
+ export { ProjectsService, } from "./generated/services/projects.js";
54
+ export { TodosService, } from "./generated/services/todos.js";
55
+ export { TodolistsService, } from "./generated/services/todolists.js";
56
+ export { TodosetsService, } from "./generated/services/todosets.js";
57
+ export { PeopleService, } from "./generated/services/people.js";
58
+ // Communication services - generated
59
+ export { MessagesService, } from "./generated/services/messages.js";
60
+ export { CommentsService, } from "./generated/services/comments.js";
61
+ export { CampfiresService, } from "./generated/services/campfires.js";
62
+ // Card services (kanban boards) - generated
63
+ export { CardTablesService, } from "./generated/services/card-tables.js";
64
+ export { CardsService, } from "./generated/services/cards.js";
65
+ export { CardColumnsService, } from "./generated/services/card-columns.js";
66
+ export { CardStepsService, } from "./generated/services/card-steps.js";
67
+ // Message services - generated
68
+ export { MessageBoardsService, } from "./generated/services/message-boards.js";
69
+ export { MessageTypesService, } from "./generated/services/message-types.js";
70
+ // Forwards service - generated
71
+ export { ForwardsService, } from "./generated/services/forwards.js";
72
+ // Checkins service - generated
73
+ export { CheckinsService, } from "./generated/services/checkins.js";
74
+ // Client Portal services - generated
75
+ export { ClientApprovalsService, } from "./generated/services/client-approvals.js";
76
+ export { ClientCorrespondencesService, } from "./generated/services/client-correspondences.js";
77
+ export { ClientRepliesService, } from "./generated/services/client-replies.js";
78
+ export { ClientVisibilityService, } from "./generated/services/client-visibility.js";
79
+ // Automation services - generated
80
+ export { WebhooksService, } from "./generated/services/webhooks.js";
81
+ // Webhook Receiving Infrastructure (hand-written, uses generated types)
82
+ export { WebhookReceiver, WebhookVerificationError, } from "./webhooks/handler.js";
83
+ export { verifyWebhookSignature, signWebhookPayload } from "./webhooks/verify.js";
84
+ export { parseEventKind, WebhookEventKind, } from "./webhooks/events.js";
85
+ export { createNodeHandler } from "./webhooks/adapters/node-http.js";
86
+ export { SubscriptionsService, } from "./generated/services/subscriptions.js";
87
+ export { EventsService, } from "./generated/services/events.js";
88
+ // File services - generated
89
+ export { AttachmentsService, } from "./generated/services/attachments.js";
90
+ export { VaultsService, } from "./generated/services/vaults.js";
91
+ export { DocumentsService, } from "./generated/services/documents.js";
92
+ export { UploadsService, } from "./generated/services/uploads.js";
93
+ // Schedule & Time services - generated
94
+ export { SchedulesService, } from "./generated/services/schedules.js";
95
+ export { TimesheetsService, } from "./generated/services/timesheets.js";
96
+ export { TimelineService, } from "./generated/services/timeline.js";
97
+ // Search & Reports services - generated
98
+ export { SearchService, } from "./generated/services/search.js";
99
+ export { ReportsService, } from "./generated/services/reports.js";
100
+ // Recording services - generated
101
+ export { RecordingsService, } from "./generated/services/recordings.js";
102
+ // Templates service - generated
103
+ export { TemplatesService, } from "./generated/services/templates.js";
104
+ // Lineup service - generated
105
+ export { LineupService, } from "./generated/services/lineup.js";
106
+ // Organization services - generated
107
+ export { TodolistGroupsService, } from "./generated/services/todolist-groups.js";
108
+ export { ToolsService, } from "./generated/services/tools.js";
109
+ // Boosts service - generated
110
+ export { BoostsService, } from "./generated/services/boosts.js";
111
+ // OpenTelemetry hooks
112
+ export { otelHooks, } from "./hooks/otel.js";
113
+ // OAuth functions
114
+ export { discover, discoverLaunchpad, LAUNCHPAD_BASE_URL, } from "./oauth/discovery.js";
115
+ export { exchangeCode, refreshToken, isTokenExpired, } from "./oauth/exchange.js";
116
+ // PKCE utilities
117
+ export { generatePKCE, generateState, } from "./oauth/pkce.js";
118
+ // =============================================================================
119
+ // Security Utilities
120
+ // =============================================================================
121
+ export { redactHeaders, redactHeadersRecord, } from "./security.js";
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * OAuth 2.0 authorization URL construction for Basecamp SDK.
3
+ *
4
+ * Builds the authorization URL to redirect users to the OAuth provider.
5
+ */
6
+ import type { PKCE } from "./pkce.js";
7
+ /**
8
+ * Parameters for building an OAuth authorization URL.
9
+ */
10
+ export interface AuthorizeParams {
11
+ /** URL of the authorization endpoint */
12
+ authorizationEndpoint: string;
13
+ /** The client identifier */
14
+ clientId: string;
15
+ /** The redirect URI for the callback */
16
+ redirectUri: string;
17
+ /** CSRF protection state parameter */
18
+ state: string;
19
+ /** PKCE parameters (optional) */
20
+ pkce?: PKCE;
21
+ /** OAuth scope to request (optional) */
22
+ scope?: string;
23
+ }
24
+ /**
25
+ * Builds an OAuth 2.0 authorization URL.
26
+ *
27
+ * Constructs a URL with the required OAuth parameters for initiating
28
+ * the authorization code flow. Validates that the endpoint uses HTTPS
29
+ * (localhost is allowed for development).
30
+ *
31
+ * @param params - Authorization parameters
32
+ * @returns The complete authorization URL
33
+ * @throws BasecampError on validation errors (non-HTTPS, invalid URL)
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * const url = buildAuthorizationUrl({
38
+ * authorizationEndpoint: config.authorizationEndpoint,
39
+ * clientId: "my_client_id",
40
+ * redirectUri: "http://localhost:14923/callback",
41
+ * state: generateState(),
42
+ * pkce: await generatePKCE(),
43
+ * });
44
+ * // Redirect user to url.toString()
45
+ * ```
46
+ */
47
+ export declare function buildAuthorizationUrl(params: AuthorizeParams): URL;
48
+ //# sourceMappingURL=authorize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../src/oauth/authorize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,GAAG,CA6BlE"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * OAuth 2.0 authorization URL construction for Basecamp SDK.
3
+ *
4
+ * Builds the authorization URL to redirect users to the OAuth provider.
5
+ */
6
+ import { BasecampError } from "../errors.js";
7
+ import { isLocalhost } from "../security.js";
8
+ /**
9
+ * Builds an OAuth 2.0 authorization URL.
10
+ *
11
+ * Constructs a URL with the required OAuth parameters for initiating
12
+ * the authorization code flow. Validates that the endpoint uses HTTPS
13
+ * (localhost is allowed for development).
14
+ *
15
+ * @param params - Authorization parameters
16
+ * @returns The complete authorization URL
17
+ * @throws BasecampError on validation errors (non-HTTPS, invalid URL)
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const url = buildAuthorizationUrl({
22
+ * authorizationEndpoint: config.authorizationEndpoint,
23
+ * clientId: "my_client_id",
24
+ * redirectUri: "http://localhost:14923/callback",
25
+ * state: generateState(),
26
+ * pkce: await generatePKCE(),
27
+ * });
28
+ * // Redirect user to url.toString()
29
+ * ```
30
+ */
31
+ export function buildAuthorizationUrl(params) {
32
+ const { authorizationEndpoint, clientId, redirectUri, state, pkce, scope } = params;
33
+ let url;
34
+ try {
35
+ url = new URL(authorizationEndpoint);
36
+ }
37
+ catch {
38
+ throw new BasecampError("validation", `Invalid authorization endpoint URL: ${authorizationEndpoint}`);
39
+ }
40
+ if (url.protocol !== "https:" && !isLocalhost(url.hostname)) {
41
+ throw new BasecampError("validation", `Authorization endpoint must use HTTPS: ${authorizationEndpoint}`);
42
+ }
43
+ url.searchParams.set("response_type", "code");
44
+ url.searchParams.set("client_id", clientId);
45
+ url.searchParams.set("redirect_uri", redirectUri);
46
+ url.searchParams.set("state", state);
47
+ if (pkce) {
48
+ url.searchParams.set("code_challenge", pkce.challenge);
49
+ url.searchParams.set("code_challenge_method", "S256");
50
+ }
51
+ if (scope) {
52
+ url.searchParams.set("scope", scope);
53
+ }
54
+ return url;
55
+ }
56
+ //# sourceMappingURL=authorize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../src/oauth/authorize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqB7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEpF,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,uCAAuC,qBAAqB,EAAE,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,0CAA0C,qBAAqB,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAErC,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Local HTTP callback server for OAuth 2.0 authorization code flow.
3
+ *
4
+ * Starts a temporary server to receive the authorization callback,
5
+ * validates the state parameter, and extracts the authorization code.
6
+ */
7
+ /**
8
+ * Result from a successful OAuth callback.
9
+ */
10
+ export interface CallbackResult {
11
+ /** The authorization code */
12
+ code: string;
13
+ /** The state parameter (already validated) */
14
+ state: string;
15
+ }
16
+ /**
17
+ * Options for the callback server.
18
+ */
19
+ export interface CallbackServerOptions {
20
+ /** Port to listen on (default: 14923) */
21
+ port?: number;
22
+ /** Host to bind to (default: "localhost") */
23
+ host?: string;
24
+ /** Timeout in milliseconds (default: 120000) */
25
+ timeoutMs?: number;
26
+ /** Expected state parameter for CSRF validation */
27
+ expectedState: string;
28
+ }
29
+ /**
30
+ * Starts a local HTTP server to receive the OAuth callback.
31
+ *
32
+ * The server listens for a single GET /callback request, validates
33
+ * the state parameter, and extracts the authorization code.
34
+ * It auto-closes after receiving the callback or on timeout.
35
+ *
36
+ * @param options - Server configuration
37
+ * @returns The callback URL, a promise for the result, and a close function
38
+ * @throws BasecampError if the port is already in use
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const { url, waitForCallback, close } = await startCallbackServer({
43
+ * expectedState: myState,
44
+ * });
45
+ *
46
+ * // Use `url` as the redirect_uri in the authorization request
47
+ * // Then wait for the user to complete the flow:
48
+ * const { code } = await waitForCallback();
49
+ * ```
50
+ */
51
+ export declare function startCallbackServer(options: CallbackServerOptions): Promise<{
52
+ url: string;
53
+ waitForCallback: () => Promise<CallbackResult>;
54
+ close: () => void;
55
+ }>;
56
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../src/oauth/callback-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CA8H7F"}