@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,294 @@
1
+ /**
2
+ * Templates 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
+ /** Template entity from the Basecamp API. */
18
+ export type Template = components["schemas"]["Template"];
19
+
20
+ /**
21
+ * Options for list.
22
+ */
23
+ export interface ListTemplateOptions extends PaginationOptions {
24
+ /** Filter by status */
25
+ status?: "active" | "archived" | "trashed";
26
+ }
27
+
28
+ /**
29
+ * Request parameters for create.
30
+ */
31
+ export interface CreateTemplateRequest {
32
+ /** Display name */
33
+ name: string;
34
+ /** Rich text description (HTML) */
35
+ description?: string;
36
+ }
37
+
38
+ /**
39
+ * Request parameters for update.
40
+ */
41
+ export interface UpdateTemplateRequest {
42
+ /** Display name */
43
+ name?: string;
44
+ /** Rich text description (HTML) */
45
+ description?: string;
46
+ }
47
+
48
+ /**
49
+ * Request parameters for createProject.
50
+ */
51
+ export interface CreateProjectTemplateRequest {
52
+ /** Display name */
53
+ name: string;
54
+ /** Rich text description (HTML) */
55
+ description?: string;
56
+ }
57
+
58
+
59
+ // =============================================================================
60
+ // Service
61
+ // =============================================================================
62
+
63
+ /**
64
+ * Service for Templates operations.
65
+ */
66
+ export class TemplatesService extends BaseService {
67
+
68
+ /**
69
+ * List all templates visible to the current user
70
+ * @param options - Optional query parameters
71
+ * @returns All Template across all pages, with .meta.totalCount
72
+ *
73
+ * @example
74
+ * ```ts
75
+ * const result = await client.templates.list();
76
+ *
77
+ * // With options
78
+ * const filtered = await client.templates.list({ status: "active" });
79
+ * ```
80
+ */
81
+ async list(options?: ListTemplateOptions): Promise<ListResult<Template>> {
82
+ return this.requestPaginated(
83
+ {
84
+ service: "Templates",
85
+ operation: "ListTemplates",
86
+ resourceType: "template",
87
+ isMutation: false,
88
+ },
89
+ () =>
90
+ this.client.GET("/templates.json", {
91
+ params: {
92
+ query: { status: options?.status },
93
+ },
94
+ })
95
+ , options
96
+ );
97
+ }
98
+
99
+ /**
100
+ * Create a new template
101
+ * @param req - Template creation parameters
102
+ * @returns The Template
103
+ * @throws {BasecampError} If required fields are missing or invalid
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * const result = await client.templates.create({ name: "My example" });
108
+ * ```
109
+ */
110
+ async create(req: CreateTemplateRequest): Promise<Template> {
111
+ if (!req.name) {
112
+ throw Errors.validation("Name is required");
113
+ }
114
+ const response = await this.request(
115
+ {
116
+ service: "Templates",
117
+ operation: "CreateTemplate",
118
+ resourceType: "template",
119
+ isMutation: true,
120
+ },
121
+ () =>
122
+ this.client.POST("/templates.json", {
123
+ body: {
124
+ name: req.name,
125
+ description: req.description,
126
+ },
127
+ })
128
+ );
129
+ return response;
130
+ }
131
+
132
+ /**
133
+ * Get a single template by id
134
+ * @param templateId - The template ID
135
+ * @returns The Template
136
+ * @throws {BasecampError} If the resource is not found
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * const result = await client.templates.get(123);
141
+ * ```
142
+ */
143
+ async get(templateId: number): Promise<Template> {
144
+ const response = await this.request(
145
+ {
146
+ service: "Templates",
147
+ operation: "GetTemplate",
148
+ resourceType: "template",
149
+ isMutation: false,
150
+ resourceId: templateId,
151
+ },
152
+ () =>
153
+ this.client.GET("/templates/{templateId}", {
154
+ params: {
155
+ path: { templateId },
156
+ },
157
+ })
158
+ );
159
+ return response;
160
+ }
161
+
162
+ /**
163
+ * Update an existing template
164
+ * @param templateId - The template ID
165
+ * @param req - Template update parameters
166
+ * @returns The Template
167
+ * @throws {BasecampError} If the resource is not found or fields are invalid
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * const result = await client.templates.update(123, { });
172
+ * ```
173
+ */
174
+ async update(templateId: number, req: UpdateTemplateRequest): Promise<Template> {
175
+ const response = await this.request(
176
+ {
177
+ service: "Templates",
178
+ operation: "UpdateTemplate",
179
+ resourceType: "template",
180
+ isMutation: true,
181
+ resourceId: templateId,
182
+ },
183
+ () =>
184
+ this.client.PUT("/templates/{templateId}", {
185
+ params: {
186
+ path: { templateId },
187
+ },
188
+ body: {
189
+ name: req.name,
190
+ description: req.description,
191
+ },
192
+ })
193
+ );
194
+ return response;
195
+ }
196
+
197
+ /**
198
+ * Delete a template (trash it)
199
+ * @param templateId - The template ID
200
+ * @returns void
201
+ * @throws {BasecampError} If the request fails
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * await client.templates.delete(123);
206
+ * ```
207
+ */
208
+ async delete(templateId: number): Promise<void> {
209
+ await this.request(
210
+ {
211
+ service: "Templates",
212
+ operation: "DeleteTemplate",
213
+ resourceType: "template",
214
+ isMutation: true,
215
+ resourceId: templateId,
216
+ },
217
+ () =>
218
+ this.client.DELETE("/templates/{templateId}", {
219
+ params: {
220
+ path: { templateId },
221
+ },
222
+ })
223
+ );
224
+ }
225
+
226
+ /**
227
+ * Create a project from a template (asynchronous)
228
+ * @param templateId - The template ID
229
+ * @param req - Project_from_template creation parameters
230
+ * @returns The project_from_template
231
+ * @throws {BasecampError} If required fields are missing or invalid
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * const result = await client.templates.createProject(123, { name: "My example" });
236
+ * ```
237
+ */
238
+ async createProject(templateId: number, req: CreateProjectTemplateRequest): Promise<components["schemas"]["CreateProjectFromTemplateResponseContent"]> {
239
+ if (!req.name) {
240
+ throw Errors.validation("Name is required");
241
+ }
242
+ const response = await this.request(
243
+ {
244
+ service: "Templates",
245
+ operation: "CreateProjectFromTemplate",
246
+ resourceType: "project_from_template",
247
+ isMutation: true,
248
+ resourceId: templateId,
249
+ },
250
+ () =>
251
+ this.client.POST("/templates/{templateId}/project_constructions.json", {
252
+ params: {
253
+ path: { templateId },
254
+ },
255
+ body: {
256
+ name: req.name,
257
+ description: req.description,
258
+ },
259
+ })
260
+ );
261
+ return response;
262
+ }
263
+
264
+ /**
265
+ * Get the status of a project construction
266
+ * @param templateId - The template ID
267
+ * @param constructionId - The construction ID
268
+ * @returns The project_construction
269
+ * @throws {BasecampError} If the resource is not found
270
+ *
271
+ * @example
272
+ * ```ts
273
+ * const result = await client.templates.getConstruction(123, 123);
274
+ * ```
275
+ */
276
+ async getConstruction(templateId: number, constructionId: number): Promise<components["schemas"]["GetProjectConstructionResponseContent"]> {
277
+ const response = await this.request(
278
+ {
279
+ service: "Templates",
280
+ operation: "GetProjectConstruction",
281
+ resourceType: "project_construction",
282
+ isMutation: false,
283
+ resourceId: templateId,
284
+ },
285
+ () =>
286
+ this.client.GET("/templates/{templateId}/project_constructions/{constructionId}", {
287
+ params: {
288
+ path: { templateId, constructionId },
289
+ },
290
+ })
291
+ );
292
+ return response;
293
+ }
294
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Timeline 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
+
12
+ // =============================================================================
13
+ // Types
14
+ // =============================================================================
15
+
16
+
17
+ /**
18
+ * Options for projectTimeline.
19
+ */
20
+ export interface ProjectTimelineTimelineOptions extends PaginationOptions {
21
+ }
22
+
23
+
24
+ // =============================================================================
25
+ // Service
26
+ // =============================================================================
27
+
28
+ /**
29
+ * Service for Timeline operations.
30
+ */
31
+ export class TimelineService extends BaseService {
32
+
33
+ /**
34
+ * Get project timeline
35
+ * @param projectId - The project ID
36
+ * @param options - Optional query parameters
37
+ * @returns All results across all pages, with .meta.totalCount
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const result = await client.timeline.projectTimeline(123);
42
+ * ```
43
+ */
44
+ async projectTimeline(projectId: number, options?: ProjectTimelineTimelineOptions): Promise<components["schemas"]["GetProjectTimelineResponseContent"]> {
45
+ return this.requestPaginated(
46
+ {
47
+ service: "Timeline",
48
+ operation: "GetProjectTimeline",
49
+ resourceType: "project_timeline",
50
+ isMutation: false,
51
+ projectId,
52
+ },
53
+ () =>
54
+ this.client.GET("/projects/{projectId}/timeline.json", {
55
+ params: {
56
+ path: { projectId },
57
+ },
58
+ })
59
+ , options
60
+ );
61
+ }
62
+ }
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Timesheets 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 { Errors } from "../../errors.js";
10
+
11
+ // =============================================================================
12
+ // Types
13
+ // =============================================================================
14
+
15
+
16
+ /**
17
+ * Options for forProject.
18
+ */
19
+ export interface ForProjectTimesheetOptions {
20
+ /** From */
21
+ from?: string;
22
+ /** To */
23
+ to?: string;
24
+ /** Person id */
25
+ personId?: number;
26
+ }
27
+
28
+ /**
29
+ * Options for forRecording.
30
+ */
31
+ export interface ForRecordingTimesheetOptions {
32
+ /** From */
33
+ from?: string;
34
+ /** To */
35
+ to?: string;
36
+ /** Person id */
37
+ personId?: number;
38
+ }
39
+
40
+ /**
41
+ * Request parameters for create.
42
+ */
43
+ export interface CreateTimesheetRequest {
44
+ /** Date */
45
+ date: string;
46
+ /** Hours */
47
+ hours: string;
48
+ /** Rich text description (HTML) */
49
+ description?: string;
50
+ /** Person id */
51
+ personId?: number;
52
+ }
53
+
54
+ /**
55
+ * Options for report.
56
+ */
57
+ export interface ReportTimesheetOptions {
58
+ /** From */
59
+ from?: string;
60
+ /** To */
61
+ to?: string;
62
+ /** Person id */
63
+ personId?: number;
64
+ }
65
+
66
+ /**
67
+ * Request parameters for update.
68
+ */
69
+ export interface UpdateTimesheetRequest {
70
+ /** Date */
71
+ date?: string;
72
+ /** Hours */
73
+ hours?: string;
74
+ /** Rich text description (HTML) */
75
+ description?: string;
76
+ /** Person id */
77
+ personId?: number;
78
+ }
79
+
80
+
81
+ // =============================================================================
82
+ // Service
83
+ // =============================================================================
84
+
85
+ /**
86
+ * Service for Timesheets operations.
87
+ */
88
+ export class TimesheetsService extends BaseService {
89
+
90
+ /**
91
+ * Get timesheet for a specific project
92
+ * @param projectId - The project ID
93
+ * @param options - Optional query parameters
94
+ * @returns Array of results
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * const result = await client.timesheets.forProject(123);
99
+ * ```
100
+ */
101
+ async forProject(projectId: number, options?: ForProjectTimesheetOptions): Promise<components["schemas"]["GetProjectTimesheetResponseContent"]> {
102
+ const response = await this.request(
103
+ {
104
+ service: "Timesheets",
105
+ operation: "GetProjectTimesheet",
106
+ resourceType: "project_timesheet",
107
+ isMutation: false,
108
+ projectId,
109
+ },
110
+ () =>
111
+ this.client.GET("/projects/{projectId}/timesheet.json", {
112
+ params: {
113
+ path: { projectId },
114
+ query: { from: options?.from, to: options?.to, "person_id": options?.personId },
115
+ },
116
+ })
117
+ );
118
+ return response ?? [];
119
+ }
120
+
121
+ /**
122
+ * Get timesheet for a specific recording
123
+ * @param recordingId - The recording ID
124
+ * @param options - Optional query parameters
125
+ * @returns Array of results
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * const result = await client.timesheets.forRecording(123);
130
+ * ```
131
+ */
132
+ async forRecording(recordingId: number, options?: ForRecordingTimesheetOptions): Promise<components["schemas"]["GetRecordingTimesheetResponseContent"]> {
133
+ const response = await this.request(
134
+ {
135
+ service: "Timesheets",
136
+ operation: "GetRecordingTimesheet",
137
+ resourceType: "recording_timesheet",
138
+ isMutation: false,
139
+ resourceId: recordingId,
140
+ },
141
+ () =>
142
+ this.client.GET("/recordings/{recordingId}/timesheet.json", {
143
+ params: {
144
+ path: { recordingId },
145
+ query: { from: options?.from, to: options?.to, "person_id": options?.personId },
146
+ },
147
+ })
148
+ );
149
+ return response ?? [];
150
+ }
151
+
152
+ /**
153
+ * Create a timesheet entry on a recording
154
+ * @param recordingId - The recording ID
155
+ * @param req - Timesheet_entry creation parameters
156
+ * @returns The timesheet_entry
157
+ * @throws {BasecampError} If required fields are missing or invalid
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * const result = await client.timesheets.create(123, { date: "example", hours: "example" });
162
+ * ```
163
+ */
164
+ async create(recordingId: number, req: CreateTimesheetRequest): Promise<components["schemas"]["CreateTimesheetEntryResponseContent"]> {
165
+ if (!req.date) {
166
+ throw Errors.validation("Date is required");
167
+ }
168
+ if (!req.hours) {
169
+ throw Errors.validation("Hours is required");
170
+ }
171
+ const response = await this.request(
172
+ {
173
+ service: "Timesheets",
174
+ operation: "CreateTimesheetEntry",
175
+ resourceType: "timesheet_entry",
176
+ isMutation: true,
177
+ resourceId: recordingId,
178
+ },
179
+ () =>
180
+ this.client.POST("/recordings/{recordingId}/timesheet/entries.json", {
181
+ params: {
182
+ path: { recordingId },
183
+ },
184
+ body: {
185
+ date: req.date,
186
+ hours: req.hours,
187
+ description: req.description,
188
+ person_id: req.personId,
189
+ },
190
+ })
191
+ );
192
+ return response;
193
+ }
194
+
195
+ /**
196
+ * Get account-wide timesheet report
197
+ * @param options - Optional query parameters
198
+ * @returns Array of results
199
+ *
200
+ * @example
201
+ * ```ts
202
+ * const result = await client.timesheets.report();
203
+ * ```
204
+ */
205
+ async report(options?: ReportTimesheetOptions): Promise<components["schemas"]["GetTimesheetReportResponseContent"]> {
206
+ const response = await this.request(
207
+ {
208
+ service: "Timesheets",
209
+ operation: "GetTimesheetReport",
210
+ resourceType: "timesheet_report",
211
+ isMutation: false,
212
+ },
213
+ () =>
214
+ this.client.GET("/reports/timesheet.json", {
215
+ params: {
216
+ query: { from: options?.from, to: options?.to, "person_id": options?.personId },
217
+ },
218
+ })
219
+ );
220
+ return response ?? [];
221
+ }
222
+
223
+ /**
224
+ * Get a single timesheet entry
225
+ * @param entryId - The entry ID
226
+ * @returns The timesheet_entry
227
+ * @throws {BasecampError} If the resource is not found
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * const result = await client.timesheets.get(123);
232
+ * ```
233
+ */
234
+ async get(entryId: number): Promise<components["schemas"]["GetTimesheetEntryResponseContent"]> {
235
+ const response = await this.request(
236
+ {
237
+ service: "Timesheets",
238
+ operation: "GetTimesheetEntry",
239
+ resourceType: "timesheet_entry",
240
+ isMutation: false,
241
+ resourceId: entryId,
242
+ },
243
+ () =>
244
+ this.client.GET("/timesheet_entries/{entryId}", {
245
+ params: {
246
+ path: { entryId },
247
+ },
248
+ })
249
+ );
250
+ return response;
251
+ }
252
+
253
+ /**
254
+ * Update a timesheet entry
255
+ * @param entryId - The entry ID
256
+ * @param req - Timesheet_entry update parameters
257
+ * @returns The timesheet_entry
258
+ * @throws {BasecampError} If the resource is not found or fields are invalid
259
+ *
260
+ * @example
261
+ * ```ts
262
+ * const result = await client.timesheets.update(123, { });
263
+ * ```
264
+ */
265
+ async update(entryId: number, req: UpdateTimesheetRequest): Promise<components["schemas"]["UpdateTimesheetEntryResponseContent"]> {
266
+ const response = await this.request(
267
+ {
268
+ service: "Timesheets",
269
+ operation: "UpdateTimesheetEntry",
270
+ resourceType: "timesheet_entry",
271
+ isMutation: true,
272
+ resourceId: entryId,
273
+ },
274
+ () =>
275
+ this.client.PUT("/timesheet_entries/{entryId}", {
276
+ params: {
277
+ path: { entryId },
278
+ },
279
+ body: {
280
+ date: req.date,
281
+ hours: req.hours,
282
+ description: req.description,
283
+ person_id: req.personId,
284
+ },
285
+ })
286
+ );
287
+ return response;
288
+ }
289
+ }