@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
@@ -0,0 +1,98 @@
1
+ /**
2
+ * OAuth 2.0 type definitions for Basecamp SDK.
3
+ *
4
+ * Provides types for OAuth configuration, tokens, and exchange requests.
5
+ * Supports both standard OAuth 2.0 and Basecamp's Launchpad legacy format.
6
+ */
7
+ /**
8
+ * OAuth 2.0 server configuration from discovery endpoint.
9
+ */
10
+ export interface OAuthConfig {
11
+ /** The authorization server's issuer identifier */
12
+ issuer: string;
13
+ /** URL of the authorization endpoint */
14
+ authorizationEndpoint: string;
15
+ /** URL of the token endpoint */
16
+ tokenEndpoint: string;
17
+ /** URL of the dynamic client registration endpoint (optional) */
18
+ registrationEndpoint?: string;
19
+ /** List of OAuth 2.0 scopes supported (optional) */
20
+ scopesSupported?: string[];
21
+ }
22
+ /**
23
+ * OAuth 2.0 access token response.
24
+ */
25
+ export interface OAuthToken {
26
+ /** The access token string */
27
+ accessToken: string;
28
+ /** The refresh token string (optional) */
29
+ refreshToken?: string;
30
+ /** Token type (usually "Bearer") */
31
+ tokenType: string;
32
+ /** Lifetime of the access token in seconds (optional) */
33
+ expiresIn?: number;
34
+ /** Calculated expiration date (optional) */
35
+ expiresAt?: Date;
36
+ /** OAuth scope granted (optional) */
37
+ scope?: string;
38
+ }
39
+ /**
40
+ * Parameters for exchanging an authorization code for tokens.
41
+ */
42
+ export interface ExchangeRequest {
43
+ /** URL of the token endpoint */
44
+ tokenEndpoint: string;
45
+ /** The authorization code received from the authorization server */
46
+ code: string;
47
+ /** The redirect URI used in the authorization request */
48
+ redirectUri: string;
49
+ /** The client identifier */
50
+ clientId: string;
51
+ /** The client secret (optional for public clients) */
52
+ clientSecret?: string;
53
+ /** PKCE code verifier (optional) */
54
+ codeVerifier?: string;
55
+ /**
56
+ * Use Launchpad's non-standard token format.
57
+ * When true, uses `type=web_server` instead of `grant_type=authorization_code`.
58
+ */
59
+ useLegacyFormat?: boolean;
60
+ }
61
+ /**
62
+ * Parameters for refreshing an access token.
63
+ */
64
+ export interface RefreshRequest {
65
+ /** URL of the token endpoint */
66
+ tokenEndpoint: string;
67
+ /** The refresh token */
68
+ refreshToken: string;
69
+ /** The client identifier (optional) */
70
+ clientId?: string;
71
+ /** The client secret (optional) */
72
+ clientSecret?: string;
73
+ /**
74
+ * Use Launchpad's non-standard token format.
75
+ * When true, uses `type=refresh` instead of `grant_type=refresh_token`.
76
+ */
77
+ useLegacyFormat?: boolean;
78
+ }
79
+ /**
80
+ * Raw token response from OAuth server.
81
+ * Used internally for JSON parsing.
82
+ */
83
+ export interface RawTokenResponse {
84
+ access_token: string;
85
+ refresh_token?: string;
86
+ token_type: string;
87
+ expires_in?: number;
88
+ scope?: string;
89
+ }
90
+ /**
91
+ * OAuth error response from server.
92
+ */
93
+ export interface OAuthErrorResponse {
94
+ error: string;
95
+ error_description?: string;
96
+ error_uri?: string;
97
+ }
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/oauth/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * OAuth 2.0 type definitions for Basecamp SDK.
3
+ *
4
+ * Provides types for OAuth configuration, tokens, and exchange requests.
5
+ * Supports both standard OAuth 2.0 and Basecamp's Launchpad legacy format.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/oauth/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Pagination utility functions.
3
+ *
4
+ * Extracted to its own module to avoid circular dependencies between
5
+ * client.ts (which imports generated services) and base.ts (which
6
+ * generated services extend).
7
+ */
8
+ /**
9
+ * Parses the next URL from a Link header.
10
+ * Looks for rel="next" in the header value.
11
+ *
12
+ * @param linkHeader - The Link header value
13
+ * @returns The URL for the next page, or null if not found
14
+ */
15
+ export declare function parseNextLink(linkHeader: string | null): string | null;
16
+ /**
17
+ * Resolves a possibly-relative URL against a base URL.
18
+ * If target is already absolute, it is returned unchanged.
19
+ */
20
+ export declare function resolveURL(base: string, target: string): string;
21
+ /**
22
+ * Checks whether two absolute URLs share the same origin (scheme + host + port).
23
+ * Handles default port normalization (e.g. https://example.com:443 === https://example.com).
24
+ * Relative URLs should be resolved with resolveURL before calling this function.
25
+ */
26
+ export declare function isSameOrigin(a: string, b: string): boolean;
27
+ //# sourceMappingURL=pagination-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination-utils.d.ts","sourceRoot":"","sources":["../src/pagination-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAYtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ1D"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Pagination utility functions.
3
+ *
4
+ * Extracted to its own module to avoid circular dependencies between
5
+ * client.ts (which imports generated services) and base.ts (which
6
+ * generated services extend).
7
+ */
8
+ /**
9
+ * Parses the next URL from a Link header.
10
+ * Looks for rel="next" in the header value.
11
+ *
12
+ * @param linkHeader - The Link header value
13
+ * @returns The URL for the next page, or null if not found
14
+ */
15
+ export function parseNextLink(linkHeader) {
16
+ if (!linkHeader)
17
+ return null;
18
+ for (const part of linkHeader.split(",")) {
19
+ const trimmed = part.trim();
20
+ if (trimmed.includes('rel="next"')) {
21
+ const match = trimmed.match(/<([^>]+)>/);
22
+ return match?.[1] ?? null;
23
+ }
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Resolves a possibly-relative URL against a base URL.
29
+ * If target is already absolute, it is returned unchanged.
30
+ */
31
+ export function resolveURL(base, target) {
32
+ try {
33
+ return new URL(target, base).href;
34
+ }
35
+ catch {
36
+ return target;
37
+ }
38
+ }
39
+ /**
40
+ * Checks whether two absolute URLs share the same origin (scheme + host + port).
41
+ * Handles default port normalization (e.g. https://example.com:443 === https://example.com).
42
+ * Relative URLs should be resolved with resolveURL before calling this function.
43
+ */
44
+ export function isSameOrigin(a, b) {
45
+ try {
46
+ const urlA = new URL(a);
47
+ const urlB = new URL(b);
48
+ return urlA.origin === urlB.origin;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ //# sourceMappingURL=pagination-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination-utils.js","sourceRoot":"","sources":["../src/pagination-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAc;IACrD,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Pagination types and utilities for the Basecamp SDK.
3
+ *
4
+ * Provides ListResult (an Array subclass with metadata), pagination options,
5
+ * and header parsing utilities used by generated service methods.
6
+ */
7
+ /**
8
+ * Metadata about a paginated list response.
9
+ */
10
+ export interface ListMeta {
11
+ /** Total number of items across all pages (from X-Total-Count header). */
12
+ readonly totalCount: number;
13
+ /** True when results were truncated (by maxItems or page safety cap). */
14
+ readonly truncated: boolean;
15
+ }
16
+ /**
17
+ * Options for controlling pagination behavior.
18
+ */
19
+ export interface PaginationOptions {
20
+ /**
21
+ * Maximum number of items to return across all pages.
22
+ * When undefined or 0, all pages are fetched.
23
+ */
24
+ maxItems?: number;
25
+ }
26
+ /**
27
+ * An array of results with pagination metadata.
28
+ *
29
+ * Extends Array<T> so it's fully backwards-compatible: works with
30
+ * .forEach(), .map(), spread, .length, indexing, and Array.isArray().
31
+ * Additional metadata is accessible via the `.meta` property.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * const todos = await client.todos.list(projectId, todolistId);
36
+ * console.log(`Showing ${todos.length} of ${todos.meta.totalCount} todos`);
37
+ * todos.forEach(todo => console.log(todo.content));
38
+ * ```
39
+ */
40
+ export declare class ListResult<T> extends Array<T> {
41
+ readonly meta: ListMeta;
42
+ /**
43
+ * Array species methods (map, filter, slice, etc.) should return plain
44
+ * Arrays, not ListResult instances. Without this override, those methods
45
+ * would call `new ListResult(length)` which fails because our constructor
46
+ * expects (items[], meta).
47
+ */
48
+ static get [Symbol.species](): ArrayConstructor;
49
+ constructor(items: T[], meta: ListMeta);
50
+ }
51
+ /**
52
+ * Parses the X-Total-Count header from a Response.
53
+ * Returns 0 if the header is missing or invalid.
54
+ */
55
+ export declare function parseTotalCount(response: Response): number;
56
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAU,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAExB;;;;;OAKG;IACH,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ;CAavC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAK1D"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Pagination types and utilities for the Basecamp SDK.
3
+ *
4
+ * Provides ListResult (an Array subclass with metadata), pagination options,
5
+ * and header parsing utilities used by generated service methods.
6
+ */
7
+ /**
8
+ * An array of results with pagination metadata.
9
+ *
10
+ * Extends Array<T> so it's fully backwards-compatible: works with
11
+ * .forEach(), .map(), spread, .length, indexing, and Array.isArray().
12
+ * Additional metadata is accessible via the `.meta` property.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const todos = await client.todos.list(projectId, todolistId);
17
+ * console.log(`Showing ${todos.length} of ${todos.meta.totalCount} todos`);
18
+ * todos.forEach(todo => console.log(todo.content));
19
+ * ```
20
+ */
21
+ export class ListResult extends Array {
22
+ meta;
23
+ /**
24
+ * Array species methods (map, filter, slice, etc.) should return plain
25
+ * Arrays, not ListResult instances. Without this override, those methods
26
+ * would call `new ListResult(length)` which fails because our constructor
27
+ * expects (items[], meta).
28
+ */
29
+ static get [Symbol.species]() {
30
+ return Array;
31
+ }
32
+ constructor(items, meta) {
33
+ // Use super(0) + length + indexed assignment to avoid:
34
+ // 1. The single-number-argument trap (super(5) creates 5 empty slots)
35
+ // 2. The ...spread limit (push(...items) throws RangeError on ~300k+ items)
36
+ super(0);
37
+ if (items.length > 0) {
38
+ this.length = items.length;
39
+ for (let i = 0; i < items.length; i++) {
40
+ this[i] = items[i];
41
+ }
42
+ }
43
+ this.meta = meta;
44
+ }
45
+ }
46
+ /**
47
+ * Parses the X-Total-Count header from a Response.
48
+ * Returns 0 if the header is missing or invalid.
49
+ */
50
+ export function parseTotalCount(response) {
51
+ const header = response.headers.get("X-Total-Count");
52
+ if (!header)
53
+ return 0;
54
+ const parsed = parseInt(header, 10);
55
+ return isNaN(parsed) ? 0 : parsed;
56
+ }
57
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,UAAc,SAAQ,KAAQ;IAChC,IAAI,CAAW;IAExB;;;;;OAKG;IACH,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY,KAAU,EAAE,IAAc;QACpC,uDAAuD;QACvD,sEAAsE;QACtE,4EAA4E;QAC5E,KAAK,CAAC,CAAC,CAAC,CAAC;QACT,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpC,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Security utilities for the Basecamp SDK.
3
+ *
4
+ * Provides helpers for safely logging HTTP requests without exposing
5
+ * sensitive information like tokens and cookies.
6
+ */
7
+ /**
8
+ * Returns a copy of the headers with sensitive values replaced by "[REDACTED]".
9
+ *
10
+ * This is useful for safely logging HTTP requests and responses without
11
+ * exposing tokens, cookies, or other credentials.
12
+ *
13
+ * Redacted headers:
14
+ * - Authorization
15
+ * - Cookie
16
+ * - Set-Cookie
17
+ * - X-CSRF-Token
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const safeHeaders = redactHeaders(response.headers);
22
+ * console.log("Response headers:", safeHeaders);
23
+ * // { "content-type": "application/json", "authorization": "[REDACTED]" }
24
+ * ```
25
+ */
26
+ export declare function redactHeaders(headers: Headers): Record<string, string>;
27
+ /**
28
+ * Returns a copy of the header record with sensitive values replaced by "[REDACTED]".
29
+ *
30
+ * Similar to redactHeaders, but works with plain objects instead of Headers instances.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const headers = { Authorization: "Bearer token", "Content-Type": "application/json" };
35
+ * const safe = redactHeadersRecord(headers);
36
+ * // { Authorization: "[REDACTED]", "Content-Type": "application/json" }
37
+ * ```
38
+ */
39
+ export declare function redactHeadersRecord(headers: Record<string, string>): Record<string, string>;
40
+ /**
41
+ * Checks if a hostname represents localhost for development/testing purposes.
42
+ *
43
+ * Matches:
44
+ * - "localhost" exactly
45
+ * - Any subdomain of localhost (e.g., "api.localhost", "dev.api.localhost")
46
+ * - IPv4 loopback "127.0.0.1"
47
+ * - IPv6 loopback "::1"
48
+ * - The .localhost TLD (RFC 6761) - any hostname ending in ".localhost"
49
+ *
50
+ * This is used to allow HTTP (non-HTTPS) connections during local development
51
+ * while enforcing HTTPS for all production traffic.
52
+ *
53
+ * @param hostname - The hostname to check (without port)
54
+ * @returns true if the hostname represents localhost
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * isLocalhost("localhost"); // true
59
+ * isLocalhost("api.localhost"); // true
60
+ * isLocalhost("myapp.localhost"); // true
61
+ * isLocalhost("127.0.0.1"); // true
62
+ * isLocalhost("::1"); // true
63
+ * isLocalhost("example.com"); // false
64
+ * isLocalhost("localhost.example.com"); // false
65
+ * ```
66
+ */
67
+ export declare function isLocalhost(hostname: string): boolean;
68
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAatE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQrD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Security utilities for the Basecamp SDK.
3
+ *
4
+ * Provides helpers for safely logging HTTP requests without exposing
5
+ * sensitive information like tokens and cookies.
6
+ */
7
+ /**
8
+ * Headers that contain sensitive values and should be redacted.
9
+ */
10
+ const SENSITIVE_HEADERS = [
11
+ "authorization",
12
+ "cookie",
13
+ "set-cookie",
14
+ "x-csrf-token",
15
+ ];
16
+ /**
17
+ * Returns a copy of the headers with sensitive values replaced by "[REDACTED]".
18
+ *
19
+ * This is useful for safely logging HTTP requests and responses without
20
+ * exposing tokens, cookies, or other credentials.
21
+ *
22
+ * Redacted headers:
23
+ * - Authorization
24
+ * - Cookie
25
+ * - Set-Cookie
26
+ * - X-CSRF-Token
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const safeHeaders = redactHeaders(response.headers);
31
+ * console.log("Response headers:", safeHeaders);
32
+ * // { "content-type": "application/json", "authorization": "[REDACTED]" }
33
+ * ```
34
+ */
35
+ export function redactHeaders(headers) {
36
+ const result = {};
37
+ headers.forEach((value, key) => {
38
+ const lowerKey = key.toLowerCase();
39
+ if (SENSITIVE_HEADERS.includes(lowerKey)) {
40
+ result[key] = "[REDACTED]";
41
+ }
42
+ else {
43
+ result[key] = value;
44
+ }
45
+ });
46
+ return result;
47
+ }
48
+ /**
49
+ * Returns a copy of the header record with sensitive values replaced by "[REDACTED]".
50
+ *
51
+ * Similar to redactHeaders, but works with plain objects instead of Headers instances.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const headers = { Authorization: "Bearer token", "Content-Type": "application/json" };
56
+ * const safe = redactHeadersRecord(headers);
57
+ * // { Authorization: "[REDACTED]", "Content-Type": "application/json" }
58
+ * ```
59
+ */
60
+ export function redactHeadersRecord(headers) {
61
+ const result = {};
62
+ for (const [key, value] of Object.entries(headers)) {
63
+ const lowerKey = key.toLowerCase();
64
+ if (SENSITIVE_HEADERS.includes(lowerKey)) {
65
+ result[key] = "[REDACTED]";
66
+ }
67
+ else {
68
+ result[key] = value;
69
+ }
70
+ }
71
+ return result;
72
+ }
73
+ /**
74
+ * Checks if a hostname represents localhost for development/testing purposes.
75
+ *
76
+ * Matches:
77
+ * - "localhost" exactly
78
+ * - Any subdomain of localhost (e.g., "api.localhost", "dev.api.localhost")
79
+ * - IPv4 loopback "127.0.0.1"
80
+ * - IPv6 loopback "::1"
81
+ * - The .localhost TLD (RFC 6761) - any hostname ending in ".localhost"
82
+ *
83
+ * This is used to allow HTTP (non-HTTPS) connections during local development
84
+ * while enforcing HTTPS for all production traffic.
85
+ *
86
+ * @param hostname - The hostname to check (without port)
87
+ * @returns true if the hostname represents localhost
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * isLocalhost("localhost"); // true
92
+ * isLocalhost("api.localhost"); // true
93
+ * isLocalhost("myapp.localhost"); // true
94
+ * isLocalhost("127.0.0.1"); // true
95
+ * isLocalhost("::1"); // true
96
+ * isLocalhost("example.com"); // false
97
+ * isLocalhost("localhost.example.com"); // false
98
+ * ```
99
+ */
100
+ export function isLocalhost(hostname) {
101
+ const normalized = hostname.toLowerCase();
102
+ return (normalized === "localhost" ||
103
+ normalized === "127.0.0.1" ||
104
+ normalized === "::1" ||
105
+ normalized.endsWith(".localhost"));
106
+ }
107
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,eAAe;IACf,QAAQ;IACR,YAAY;IACZ,cAAc;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA+B;IAE/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,CACL,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,KAAK;QACpB,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Authorization service for Basecamp SDK.
3
+ *
4
+ * Provides functionality to fetch authorization information including
5
+ * the authenticated user's identity and list of accessible accounts.
6
+ */
7
+ import { BaseService, type RawClient } from "./base.js";
8
+ import type { BasecampHooks } from "../hooks.js";
9
+ import type { AuthStrategy } from "../auth-strategy.js";
10
+ /**
11
+ * The authenticated user's identity.
12
+ */
13
+ export interface Identity {
14
+ /** User's unique identifier */
15
+ id: number;
16
+ /** User's first name */
17
+ firstName: string;
18
+ /** User's last name */
19
+ lastName: string;
20
+ /** User's email address */
21
+ emailAddress: string;
22
+ }
23
+ /**
24
+ * A Basecamp account the user has access to.
25
+ */
26
+ export interface AuthorizedAccount {
27
+ /** Account's unique identifier */
28
+ id: number;
29
+ /** Account name */
30
+ name: string;
31
+ /** Product type (e.g., "bc3" for Basecamp, "hey" for HEY) */
32
+ product: string;
33
+ /** API URL for this account */
34
+ href: string;
35
+ /** Web app URL for this account */
36
+ appHref: string;
37
+ /** Whether the account is hidden from the user's view */
38
+ hidden?: boolean;
39
+ /** Whether the account subscription has expired */
40
+ expired?: boolean;
41
+ /** Whether this is the user's featured/primary account */
42
+ featured?: boolean;
43
+ }
44
+ /**
45
+ * Authorization information response.
46
+ */
47
+ export interface AuthorizationInfo {
48
+ /** Token expiration timestamp */
49
+ expiresAt: Date;
50
+ /** The authenticated user's identity */
51
+ identity: Identity;
52
+ /** List of accounts the user can access */
53
+ accounts: AuthorizedAccount[];
54
+ }
55
+ /**
56
+ * Options for fetching authorization information.
57
+ */
58
+ export interface GetAuthorizationInfoOptions {
59
+ /**
60
+ * Override the default authorization endpoint URL.
61
+ * Defaults to "https://launchpad.37signals.com/authorization.json"
62
+ */
63
+ endpoint?: string;
64
+ /**
65
+ * Filter accounts by product type.
66
+ * Common values: "bc3" (Basecamp 3), "bcx" (Basecamp 2), "hey" (HEY)
67
+ */
68
+ filterProduct?: string;
69
+ }
70
+ /**
71
+ * Service for authorization-related operations.
72
+ *
73
+ * This service communicates with the Launchpad authorization endpoint
74
+ * rather than the standard Basecamp API.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * import { createBasecampClient } from "@37signals/basecamp";
79
+ *
80
+ * const client = createBasecampClient({
81
+ * accountId: "12345",
82
+ * accessToken: "your-token",
83
+ * });
84
+ *
85
+ * // Get all accounts
86
+ * const info = await client.authorization.getInfo();
87
+ * console.log(`Logged in as ${info.identity.firstName}`);
88
+ *
89
+ * // Filter to only Basecamp 3 accounts
90
+ * const bc3Info = await client.authorization.getInfo({ filterProduct: "bc3" });
91
+ * for (const account of bc3Info.accounts) {
92
+ * console.log(account.name);
93
+ * }
94
+ * ```
95
+ */
96
+ export declare class AuthorizationService extends BaseService {
97
+ private authStrategy;
98
+ private userAgent;
99
+ constructor(client: RawClient, hooks: BasecampHooks | undefined, authStrategy: AuthStrategy, userAgent: string);
100
+ /**
101
+ * Fetches authorization information for the current access token.
102
+ *
103
+ * Returns the authenticated user's identity and list of accounts
104
+ * they have access to.
105
+ *
106
+ * @param options - Optional configuration
107
+ * @returns Authorization information including identity and accounts
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * const info = await authService.getInfo();
112
+ *
113
+ * console.log(`User: ${info.identity.firstName} ${info.identity.lastName}`);
114
+ * console.log(`Email: ${info.identity.emailAddress}`);
115
+ * console.log(`Token expires: ${info.expiresAt}`);
116
+ *
117
+ * for (const account of info.accounts) {
118
+ * console.log(`${account.name} (${account.product})`);
119
+ * }
120
+ * ```
121
+ */
122
+ getInfo(options?: GetAuthorizationInfoOptions): Promise<AuthorizationInfo>;
123
+ }
124
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/services/authorization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAS;gBAGxB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM;IAOnB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,OAAO,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA8DrF"}