@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,151 @@
1
+ /**
2
+ * TodolistGroups service for the Basecamp API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ */
6
+
7
+ import { BaseService } from "../../services/base.js";
8
+ import type { components } from "../schema.js";
9
+ import { ListResult } from "../../pagination.js";
10
+ import type { PaginationOptions } from "../../pagination.js";
11
+ import { Errors } from "../../errors.js";
12
+
13
+ // =============================================================================
14
+ // Types
15
+ // =============================================================================
16
+
17
+ /** TodolistGroup entity from the Basecamp API. */
18
+ export type TodolistGroup = components["schemas"]["TodolistGroup"];
19
+
20
+ /**
21
+ * Request parameters for reposition.
22
+ */
23
+ export interface RepositionTodolistGroupRequest {
24
+ /** Position for ordering (1-based) */
25
+ position: number;
26
+ }
27
+
28
+ /**
29
+ * Options for list.
30
+ */
31
+ export interface ListTodolistGroupOptions extends PaginationOptions {
32
+ }
33
+
34
+ /**
35
+ * Request parameters for create.
36
+ */
37
+ export interface CreateTodolistGroupRequest {
38
+ /** Display name */
39
+ name: string;
40
+ }
41
+
42
+
43
+ // =============================================================================
44
+ // Service
45
+ // =============================================================================
46
+
47
+ /**
48
+ * Service for TodolistGroups operations.
49
+ */
50
+ export class TodolistGroupsService extends BaseService {
51
+
52
+ /**
53
+ * Reposition a todolist group
54
+ * @param groupId - The group ID
55
+ * @param req - Todolist_group request parameters
56
+ * @returns void
57
+ * @throws {BasecampError} If the request fails
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * await client.todolistGroups.reposition(123, { position: 1 });
62
+ * ```
63
+ */
64
+ async reposition(groupId: number, req: RepositionTodolistGroupRequest): Promise<void> {
65
+ await this.request(
66
+ {
67
+ service: "TodolistGroups",
68
+ operation: "RepositionTodolistGroup",
69
+ resourceType: "todolist_group",
70
+ isMutation: true,
71
+ resourceId: groupId,
72
+ },
73
+ () =>
74
+ this.client.PUT("/todolists/{groupId}/position.json", {
75
+ params: {
76
+ path: { groupId },
77
+ },
78
+ body: {
79
+ position: req.position,
80
+ },
81
+ })
82
+ );
83
+ }
84
+
85
+ /**
86
+ * List groups in a todolist
87
+ * @param todolistId - The todolist ID
88
+ * @param options - Optional query parameters
89
+ * @returns All TodolistGroup across all pages, with .meta.totalCount
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const result = await client.todolistGroups.list(123);
94
+ * ```
95
+ */
96
+ async list(todolistId: number, options?: ListTodolistGroupOptions): Promise<ListResult<TodolistGroup>> {
97
+ return this.requestPaginated(
98
+ {
99
+ service: "TodolistGroups",
100
+ operation: "ListTodolistGroups",
101
+ resourceType: "todolist_group",
102
+ isMutation: false,
103
+ resourceId: todolistId,
104
+ },
105
+ () =>
106
+ this.client.GET("/todolists/{todolistId}/groups.json", {
107
+ params: {
108
+ path: { todolistId },
109
+ },
110
+ })
111
+ , options
112
+ );
113
+ }
114
+
115
+ /**
116
+ * Create a new group in a todolist
117
+ * @param todolistId - The todolist ID
118
+ * @param req - Todolist_group creation parameters
119
+ * @returns The TodolistGroup
120
+ * @throws {BasecampError} If required fields are missing or invalid
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * const result = await client.todolistGroups.create(123, { name: "My example" });
125
+ * ```
126
+ */
127
+ async create(todolistId: number, req: CreateTodolistGroupRequest): Promise<TodolistGroup> {
128
+ if (!req.name) {
129
+ throw Errors.validation("Name is required");
130
+ }
131
+ const response = await this.request(
132
+ {
133
+ service: "TodolistGroups",
134
+ operation: "CreateTodolistGroup",
135
+ resourceType: "todolist_group",
136
+ isMutation: true,
137
+ resourceId: todolistId,
138
+ },
139
+ () =>
140
+ this.client.POST("/todolists/{todolistId}/groups.json", {
141
+ params: {
142
+ path: { todolistId },
143
+ },
144
+ body: {
145
+ name: req.name,
146
+ },
147
+ })
148
+ );
149
+ return response;
150
+ }
151
+ }
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Todolists service for the Basecamp API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ */
6
+
7
+ import { BaseService } from "../../services/base.js";
8
+ import type { components } from "../schema.js";
9
+ import { ListResult } from "../../pagination.js";
10
+ import type { PaginationOptions } from "../../pagination.js";
11
+ import { Errors } from "../../errors.js";
12
+
13
+ // =============================================================================
14
+ // Types
15
+ // =============================================================================
16
+
17
+ /** Todolist entity from the Basecamp API. */
18
+ export type Todolist = components["schemas"]["Todolist"];
19
+
20
+ /**
21
+ * Request parameters for update.
22
+ */
23
+ export interface UpdateTodolistRequest {
24
+ /** Name (required for both Todolist and TodolistGroup) */
25
+ name?: string;
26
+ /** Description (Todolist only, ignored for groups) */
27
+ description?: string;
28
+ }
29
+
30
+ /**
31
+ * Options for list.
32
+ */
33
+ export interface ListTodolistOptions extends PaginationOptions {
34
+ /** Filter by status */
35
+ status?: "active" | "archived" | "trashed";
36
+ }
37
+
38
+ /**
39
+ * Request parameters for create.
40
+ */
41
+ export interface CreateTodolistRequest {
42
+ /** Display name */
43
+ name: string;
44
+ /** Rich text description (HTML) */
45
+ description?: string;
46
+ }
47
+
48
+
49
+ // =============================================================================
50
+ // Service
51
+ // =============================================================================
52
+
53
+ /**
54
+ * Service for Todolists operations.
55
+ */
56
+ export class TodolistsService extends BaseService {
57
+
58
+ /**
59
+ * Get a single todolist or todolist group by id
60
+ * @param id - The id
61
+ * @returns The todolist_or_group
62
+ * @throws {BasecampError} If the resource is not found
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const result = await client.todolists.get(123);
67
+ * ```
68
+ */
69
+ async get(id: number): Promise<components["schemas"]["GetTodolistOrGroupResponseContent"]> {
70
+ const response = await this.request(
71
+ {
72
+ service: "Todolists",
73
+ operation: "GetTodolistOrGroup",
74
+ resourceType: "todolist_or_group",
75
+ isMutation: false,
76
+ },
77
+ () =>
78
+ this.client.GET("/todolists/{id}", {
79
+ params: {
80
+ path: { id },
81
+ },
82
+ })
83
+ );
84
+ return response;
85
+ }
86
+
87
+ /**
88
+ * Update an existing todolist or todolist group
89
+ * @param id - The id
90
+ * @param req - Todolist_or_group update parameters
91
+ * @returns The todolist_or_group
92
+ * @throws {BasecampError} If the resource is not found or fields are invalid
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * const result = await client.todolists.update(123, { });
97
+ * ```
98
+ */
99
+ async update(id: number, req: UpdateTodolistRequest): Promise<components["schemas"]["UpdateTodolistOrGroupResponseContent"]> {
100
+ const response = await this.request(
101
+ {
102
+ service: "Todolists",
103
+ operation: "UpdateTodolistOrGroup",
104
+ resourceType: "todolist_or_group",
105
+ isMutation: true,
106
+ },
107
+ () =>
108
+ this.client.PUT("/todolists/{id}", {
109
+ params: {
110
+ path: { id },
111
+ },
112
+ body: {
113
+ name: req.name,
114
+ description: req.description,
115
+ },
116
+ })
117
+ );
118
+ return response;
119
+ }
120
+
121
+ /**
122
+ * List todolists in a todoset
123
+ * @param todosetId - The todoset ID
124
+ * @param options - Optional query parameters
125
+ * @returns All Todolist across all pages, with .meta.totalCount
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * const result = await client.todolists.list(123);
130
+ *
131
+ * // With options
132
+ * const filtered = await client.todolists.list(123, { status: "active" });
133
+ * ```
134
+ */
135
+ async list(todosetId: number, options?: ListTodolistOptions): Promise<ListResult<Todolist>> {
136
+ return this.requestPaginated(
137
+ {
138
+ service: "Todolists",
139
+ operation: "ListTodolists",
140
+ resourceType: "todolist",
141
+ isMutation: false,
142
+ resourceId: todosetId,
143
+ },
144
+ () =>
145
+ this.client.GET("/todosets/{todosetId}/todolists.json", {
146
+ params: {
147
+ path: { todosetId },
148
+ query: { status: options?.status },
149
+ },
150
+ })
151
+ , options
152
+ );
153
+ }
154
+
155
+ /**
156
+ * Create a new todolist in a todoset
157
+ * @param todosetId - The todoset ID
158
+ * @param req - Todolist creation parameters
159
+ * @returns The Todolist
160
+ * @throws {BasecampError} If required fields are missing or invalid
161
+ *
162
+ * @example
163
+ * ```ts
164
+ * const result = await client.todolists.create(123, { name: "My example" });
165
+ * ```
166
+ */
167
+ async create(todosetId: number, req: CreateTodolistRequest): Promise<Todolist> {
168
+ if (!req.name) {
169
+ throw Errors.validation("Name is required");
170
+ }
171
+ const response = await this.request(
172
+ {
173
+ service: "Todolists",
174
+ operation: "CreateTodolist",
175
+ resourceType: "todolist",
176
+ isMutation: true,
177
+ resourceId: todosetId,
178
+ },
179
+ () =>
180
+ this.client.POST("/todosets/{todosetId}/todolists.json", {
181
+ params: {
182
+ path: { todosetId },
183
+ },
184
+ body: {
185
+ name: req.name,
186
+ description: req.description,
187
+ },
188
+ })
189
+ );
190
+ return response;
191
+ }
192
+ }
@@ -0,0 +1,369 @@
1
+ /**
2
+ * Todos service for the Basecamp API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ */
6
+
7
+ import { BaseService } from "../../services/base.js";
8
+ import type { components } from "../schema.js";
9
+ import { ListResult } from "../../pagination.js";
10
+ import type { PaginationOptions } from "../../pagination.js";
11
+ import { Errors } from "../../errors.js";
12
+
13
+ // =============================================================================
14
+ // Types
15
+ // =============================================================================
16
+
17
+ /** Todo entity from the Basecamp API. */
18
+ export type Todo = components["schemas"]["Todo"];
19
+
20
+ /**
21
+ * Options for list.
22
+ */
23
+ export interface ListTodoOptions extends PaginationOptions {
24
+ /** Filter by status */
25
+ status?: "active" | "archived" | "trashed";
26
+ /** Completed */
27
+ completed?: boolean;
28
+ }
29
+
30
+ /**
31
+ * Request parameters for create.
32
+ */
33
+ export interface CreateTodoRequest {
34
+ /** Text content */
35
+ content: string;
36
+ /** Rich text description (HTML) */
37
+ description?: string;
38
+ /** Person IDs to assign to */
39
+ assigneeIds?: number[];
40
+ /** Person IDs to notify on completion */
41
+ completionSubscriberIds?: number[];
42
+ /** Whether to send notifications to relevant people */
43
+ notify?: boolean;
44
+ /** Due date (YYYY-MM-DD) */
45
+ dueOn?: string;
46
+ /** Start date (YYYY-MM-DD) */
47
+ startsOn?: string;
48
+ }
49
+
50
+ /**
51
+ * Request parameters for update.
52
+ */
53
+ export interface UpdateTodoRequest {
54
+ /** Text content */
55
+ content?: string;
56
+ /** Rich text description (HTML) */
57
+ description?: string;
58
+ /** Person IDs to assign to */
59
+ assigneeIds?: number[];
60
+ /** Person IDs to notify on completion */
61
+ completionSubscriberIds?: number[];
62
+ /** Whether to send notifications to relevant people */
63
+ notify?: boolean;
64
+ /** Due date (YYYY-MM-DD) */
65
+ dueOn?: string;
66
+ /** Start date (YYYY-MM-DD) */
67
+ startsOn?: string;
68
+ }
69
+
70
+ /**
71
+ * Request parameters for reposition.
72
+ */
73
+ export interface RepositionTodoRequest {
74
+ /** Position for ordering (1-based) */
75
+ position: number;
76
+ /** Optional todolist ID to move the todo to a different parent */
77
+ parentId?: number;
78
+ }
79
+
80
+
81
+ // =============================================================================
82
+ // Service
83
+ // =============================================================================
84
+
85
+ /**
86
+ * Service for Todos operations.
87
+ */
88
+ export class TodosService extends BaseService {
89
+
90
+ /**
91
+ * List todos in a todolist
92
+ * @param todolistId - The todolist ID
93
+ * @param options - Optional query parameters
94
+ * @returns All Todo across all pages, with .meta.totalCount
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * const result = await client.todos.list(123);
99
+ *
100
+ * // With options
101
+ * const filtered = await client.todos.list(123, { status: "active" });
102
+ * ```
103
+ */
104
+ async list(todolistId: number, options?: ListTodoOptions): Promise<ListResult<Todo>> {
105
+ return this.requestPaginated(
106
+ {
107
+ service: "Todos",
108
+ operation: "ListTodos",
109
+ resourceType: "todo",
110
+ isMutation: false,
111
+ resourceId: todolistId,
112
+ },
113
+ () =>
114
+ this.client.GET("/todolists/{todolistId}/todos.json", {
115
+ params: {
116
+ path: { todolistId },
117
+ query: { status: options?.status, completed: options?.completed },
118
+ },
119
+ })
120
+ , options
121
+ );
122
+ }
123
+
124
+ /**
125
+ * Create a new todo in a todolist
126
+ * @param todolistId - The todolist ID
127
+ * @param req - Todo creation parameters
128
+ * @returns The Todo
129
+ * @throws {BasecampError} If required fields are missing or invalid
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * const result = await client.todos.create(123, { content: "Hello world" });
134
+ * ```
135
+ */
136
+ async create(todolistId: number, req: CreateTodoRequest): Promise<Todo> {
137
+ if (!req.content) {
138
+ throw Errors.validation("Content is required");
139
+ }
140
+ if (req.dueOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.dueOn)) {
141
+ throw Errors.validation("Due on must be in YYYY-MM-DD format");
142
+ }
143
+ if (req.startsOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.startsOn)) {
144
+ throw Errors.validation("Starts on must be in YYYY-MM-DD format");
145
+ }
146
+ const response = await this.request(
147
+ {
148
+ service: "Todos",
149
+ operation: "CreateTodo",
150
+ resourceType: "todo",
151
+ isMutation: true,
152
+ resourceId: todolistId,
153
+ },
154
+ () =>
155
+ this.client.POST("/todolists/{todolistId}/todos.json", {
156
+ params: {
157
+ path: { todolistId },
158
+ },
159
+ body: {
160
+ content: req.content,
161
+ description: req.description,
162
+ assignee_ids: req.assigneeIds,
163
+ completion_subscriber_ids: req.completionSubscriberIds,
164
+ notify: req.notify,
165
+ due_on: req.dueOn,
166
+ starts_on: req.startsOn,
167
+ },
168
+ })
169
+ );
170
+ return response;
171
+ }
172
+
173
+ /**
174
+ * Get a single todo by id
175
+ * @param todoId - The todo ID
176
+ * @returns The Todo
177
+ * @throws {BasecampError} If the resource is not found
178
+ *
179
+ * @example
180
+ * ```ts
181
+ * const result = await client.todos.get(123);
182
+ * ```
183
+ */
184
+ async get(todoId: number): Promise<Todo> {
185
+ const response = await this.request(
186
+ {
187
+ service: "Todos",
188
+ operation: "GetTodo",
189
+ resourceType: "todo",
190
+ isMutation: false,
191
+ resourceId: todoId,
192
+ },
193
+ () =>
194
+ this.client.GET("/todos/{todoId}", {
195
+ params: {
196
+ path: { todoId },
197
+ },
198
+ })
199
+ );
200
+ return response;
201
+ }
202
+
203
+ /**
204
+ * Update an existing todo
205
+ * @param todoId - The todo ID
206
+ * @param req - Todo update parameters
207
+ * @returns The Todo
208
+ * @throws {BasecampError} If the resource is not found or fields are invalid
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * const result = await client.todos.update(123, { });
213
+ * ```
214
+ */
215
+ async update(todoId: number, req: UpdateTodoRequest): Promise<Todo> {
216
+ if (req.dueOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.dueOn)) {
217
+ throw Errors.validation("Due on must be in YYYY-MM-DD format");
218
+ }
219
+ if (req.startsOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.startsOn)) {
220
+ throw Errors.validation("Starts on must be in YYYY-MM-DD format");
221
+ }
222
+ const response = await this.request(
223
+ {
224
+ service: "Todos",
225
+ operation: "UpdateTodo",
226
+ resourceType: "todo",
227
+ isMutation: true,
228
+ resourceId: todoId,
229
+ },
230
+ () =>
231
+ this.client.PUT("/todos/{todoId}", {
232
+ params: {
233
+ path: { todoId },
234
+ },
235
+ body: {
236
+ content: req.content,
237
+ description: req.description,
238
+ assignee_ids: req.assigneeIds,
239
+ completion_subscriber_ids: req.completionSubscriberIds,
240
+ notify: req.notify,
241
+ due_on: req.dueOn,
242
+ starts_on: req.startsOn,
243
+ },
244
+ })
245
+ );
246
+ return response;
247
+ }
248
+
249
+ /**
250
+ * Trash a todo. Trashed items can be recovered.
251
+ * @param todoId - The todo ID
252
+ * @returns void
253
+ * @throws {BasecampError} If the request fails
254
+ *
255
+ * @example
256
+ * ```ts
257
+ * await client.todos.trash(123);
258
+ * ```
259
+ */
260
+ async trash(todoId: number): Promise<void> {
261
+ await this.request(
262
+ {
263
+ service: "Todos",
264
+ operation: "TrashTodo",
265
+ resourceType: "todo",
266
+ isMutation: true,
267
+ resourceId: todoId,
268
+ },
269
+ () =>
270
+ this.client.DELETE("/todos/{todoId}", {
271
+ params: {
272
+ path: { todoId },
273
+ },
274
+ })
275
+ );
276
+ }
277
+
278
+ /**
279
+ * Mark a todo as complete
280
+ * @param todoId - The todo ID
281
+ * @returns void
282
+ * @throws {BasecampError} If the request fails
283
+ *
284
+ * @example
285
+ * ```ts
286
+ * await client.todos.complete(123);
287
+ * ```
288
+ */
289
+ async complete(todoId: number): Promise<void> {
290
+ await this.request(
291
+ {
292
+ service: "Todos",
293
+ operation: "CompleteTodo",
294
+ resourceType: "todo",
295
+ isMutation: true,
296
+ resourceId: todoId,
297
+ },
298
+ () =>
299
+ this.client.POST("/todos/{todoId}/completion.json", {
300
+ params: {
301
+ path: { todoId },
302
+ },
303
+ })
304
+ );
305
+ }
306
+
307
+ /**
308
+ * Mark a todo as incomplete
309
+ * @param todoId - The todo ID
310
+ * @returns void
311
+ * @throws {BasecampError} If the request fails
312
+ *
313
+ * @example
314
+ * ```ts
315
+ * await client.todos.uncomplete(123);
316
+ * ```
317
+ */
318
+ async uncomplete(todoId: number): Promise<void> {
319
+ await this.request(
320
+ {
321
+ service: "Todos",
322
+ operation: "UncompleteTodo",
323
+ resourceType: "todo",
324
+ isMutation: true,
325
+ resourceId: todoId,
326
+ },
327
+ () =>
328
+ this.client.DELETE("/todos/{todoId}/completion.json", {
329
+ params: {
330
+ path: { todoId },
331
+ },
332
+ })
333
+ );
334
+ }
335
+
336
+ /**
337
+ * Reposition a todo within its todolist
338
+ * @param todoId - The todo ID
339
+ * @param req - Todo request parameters
340
+ * @returns void
341
+ * @throws {BasecampError} If the request fails
342
+ *
343
+ * @example
344
+ * ```ts
345
+ * await client.todos.reposition(123, { position: 1 });
346
+ * ```
347
+ */
348
+ async reposition(todoId: number, req: RepositionTodoRequest): Promise<void> {
349
+ await this.request(
350
+ {
351
+ service: "Todos",
352
+ operation: "RepositionTodo",
353
+ resourceType: "todo",
354
+ isMutation: true,
355
+ resourceId: todoId,
356
+ },
357
+ () =>
358
+ this.client.PUT("/todos/{todoId}/position.json", {
359
+ params: {
360
+ path: { todoId },
361
+ },
362
+ body: {
363
+ position: req.position,
364
+ parent_id: req.parentId,
365
+ },
366
+ })
367
+ );
368
+ }
369
+ }