@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,145 @@
1
+ /**
2
+ * Timesheets service for the Basecamp API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ */
6
+ import { BaseService } from "../../services/base.js";
7
+ import type { components } from "../schema.js";
8
+ /**
9
+ * Options for forProject.
10
+ */
11
+ export interface ForProjectTimesheetOptions {
12
+ /** From */
13
+ from?: string;
14
+ /** To */
15
+ to?: string;
16
+ /** Person id */
17
+ personId?: number;
18
+ }
19
+ /**
20
+ * Options for forRecording.
21
+ */
22
+ export interface ForRecordingTimesheetOptions {
23
+ /** From */
24
+ from?: string;
25
+ /** To */
26
+ to?: string;
27
+ /** Person id */
28
+ personId?: number;
29
+ }
30
+ /**
31
+ * Request parameters for create.
32
+ */
33
+ export interface CreateTimesheetRequest {
34
+ /** Date */
35
+ date: string;
36
+ /** Hours */
37
+ hours: string;
38
+ /** Rich text description (HTML) */
39
+ description?: string;
40
+ /** Person id */
41
+ personId?: number;
42
+ }
43
+ /**
44
+ * Options for report.
45
+ */
46
+ export interface ReportTimesheetOptions {
47
+ /** From */
48
+ from?: string;
49
+ /** To */
50
+ to?: string;
51
+ /** Person id */
52
+ personId?: number;
53
+ }
54
+ /**
55
+ * Request parameters for update.
56
+ */
57
+ export interface UpdateTimesheetRequest {
58
+ /** Date */
59
+ date?: string;
60
+ /** Hours */
61
+ hours?: string;
62
+ /** Rich text description (HTML) */
63
+ description?: string;
64
+ /** Person id */
65
+ personId?: number;
66
+ }
67
+ /**
68
+ * Service for Timesheets operations.
69
+ */
70
+ export declare class TimesheetsService extends BaseService {
71
+ /**
72
+ * Get timesheet for a specific project
73
+ * @param projectId - The project ID
74
+ * @param options - Optional query parameters
75
+ * @returns Array of results
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * const result = await client.timesheets.forProject(123);
80
+ * ```
81
+ */
82
+ forProject(projectId: number, options?: ForProjectTimesheetOptions): Promise<components["schemas"]["GetProjectTimesheetResponseContent"]>;
83
+ /**
84
+ * Get timesheet for a specific recording
85
+ * @param recordingId - The recording ID
86
+ * @param options - Optional query parameters
87
+ * @returns Array of results
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * const result = await client.timesheets.forRecording(123);
92
+ * ```
93
+ */
94
+ forRecording(recordingId: number, options?: ForRecordingTimesheetOptions): Promise<components["schemas"]["GetRecordingTimesheetResponseContent"]>;
95
+ /**
96
+ * Create a timesheet entry on a recording
97
+ * @param recordingId - The recording ID
98
+ * @param req - Timesheet_entry creation parameters
99
+ * @returns The timesheet_entry
100
+ * @throws {BasecampError} If required fields are missing or invalid
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * const result = await client.timesheets.create(123, { date: "example", hours: "example" });
105
+ * ```
106
+ */
107
+ create(recordingId: number, req: CreateTimesheetRequest): Promise<components["schemas"]["CreateTimesheetEntryResponseContent"]>;
108
+ /**
109
+ * Get account-wide timesheet report
110
+ * @param options - Optional query parameters
111
+ * @returns Array of results
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * const result = await client.timesheets.report();
116
+ * ```
117
+ */
118
+ report(options?: ReportTimesheetOptions): Promise<components["schemas"]["GetTimesheetReportResponseContent"]>;
119
+ /**
120
+ * Get a single timesheet entry
121
+ * @param entryId - The entry ID
122
+ * @returns The timesheet_entry
123
+ * @throws {BasecampError} If the resource is not found
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * const result = await client.timesheets.get(123);
128
+ * ```
129
+ */
130
+ get(entryId: number): Promise<components["schemas"]["GetTimesheetEntryResponseContent"]>;
131
+ /**
132
+ * Update a timesheet entry
133
+ * @param entryId - The entry ID
134
+ * @param req - Timesheet_entry update parameters
135
+ * @returns The timesheet_entry
136
+ * @throws {BasecampError} If the resource is not found or fields are invalid
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * const result = await client.timesheets.update(123, { });
141
+ * ```
142
+ */
143
+ update(entryId: number, req: UpdateTimesheetRequest): Promise<components["schemas"]["UpdateTimesheetEntryResponseContent"]>;
144
+ }
145
+ //# sourceMappingURL=timesheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timesheets.d.ts","sourceRoot":"","sources":["../../../src/generated/services/timesheets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ/C;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS;IACT,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS;IACT,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS;IACT,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,WAAW;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAEhD;;;;;;;;;;OAUG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,oCAAoC,CAAC,CAAC;IAoB/I;;;;;;;;;;OAUG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,sCAAsC,CAAC,CAAC;IAoBvJ;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,qCAAqC,CAAC,CAAC;IA+BrI;;;;;;;;;OASG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,mCAAmC,CAAC,CAAC;IAkBnH;;;;;;;;;;OAUG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,kCAAkC,CAAC,CAAC;IAmB9F;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,qCAAqC,CAAC,CAAC;CAwBlI"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Timesheets service for the Basecamp API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ */
6
+ import { BaseService } from "../../services/base.js";
7
+ import { Errors } from "../../errors.js";
8
+ // =============================================================================
9
+ // Service
10
+ // =============================================================================
11
+ /**
12
+ * Service for Timesheets operations.
13
+ */
14
+ export class TimesheetsService extends BaseService {
15
+ /**
16
+ * Get timesheet for a specific project
17
+ * @param projectId - The project ID
18
+ * @param options - Optional query parameters
19
+ * @returns Array of results
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const result = await client.timesheets.forProject(123);
24
+ * ```
25
+ */
26
+ async forProject(projectId, options) {
27
+ const response = await this.request({
28
+ service: "Timesheets",
29
+ operation: "GetProjectTimesheet",
30
+ resourceType: "project_timesheet",
31
+ isMutation: false,
32
+ projectId,
33
+ }, () => this.client.GET("/projects/{projectId}/timesheet.json", {
34
+ params: {
35
+ path: { projectId },
36
+ query: { from: options?.from, to: options?.to, "person_id": options?.personId },
37
+ },
38
+ }));
39
+ return response ?? [];
40
+ }
41
+ /**
42
+ * Get timesheet for a specific recording
43
+ * @param recordingId - The recording ID
44
+ * @param options - Optional query parameters
45
+ * @returns Array of results
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const result = await client.timesheets.forRecording(123);
50
+ * ```
51
+ */
52
+ async forRecording(recordingId, options) {
53
+ const response = await this.request({
54
+ service: "Timesheets",
55
+ operation: "GetRecordingTimesheet",
56
+ resourceType: "recording_timesheet",
57
+ isMutation: false,
58
+ resourceId: recordingId,
59
+ }, () => this.client.GET("/recordings/{recordingId}/timesheet.json", {
60
+ params: {
61
+ path: { recordingId },
62
+ query: { from: options?.from, to: options?.to, "person_id": options?.personId },
63
+ },
64
+ }));
65
+ return response ?? [];
66
+ }
67
+ /**
68
+ * Create a timesheet entry on a recording
69
+ * @param recordingId - The recording ID
70
+ * @param req - Timesheet_entry creation parameters
71
+ * @returns The timesheet_entry
72
+ * @throws {BasecampError} If required fields are missing or invalid
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * const result = await client.timesheets.create(123, { date: "example", hours: "example" });
77
+ * ```
78
+ */
79
+ async create(recordingId, req) {
80
+ if (!req.date) {
81
+ throw Errors.validation("Date is required");
82
+ }
83
+ if (!req.hours) {
84
+ throw Errors.validation("Hours is required");
85
+ }
86
+ const response = await this.request({
87
+ service: "Timesheets",
88
+ operation: "CreateTimesheetEntry",
89
+ resourceType: "timesheet_entry",
90
+ isMutation: true,
91
+ resourceId: recordingId,
92
+ }, () => this.client.POST("/recordings/{recordingId}/timesheet/entries.json", {
93
+ params: {
94
+ path: { recordingId },
95
+ },
96
+ body: {
97
+ date: req.date,
98
+ hours: req.hours,
99
+ description: req.description,
100
+ person_id: req.personId,
101
+ },
102
+ }));
103
+ return response;
104
+ }
105
+ /**
106
+ * Get account-wide timesheet report
107
+ * @param options - Optional query parameters
108
+ * @returns Array of results
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * const result = await client.timesheets.report();
113
+ * ```
114
+ */
115
+ async report(options) {
116
+ const response = await this.request({
117
+ service: "Timesheets",
118
+ operation: "GetTimesheetReport",
119
+ resourceType: "timesheet_report",
120
+ isMutation: false,
121
+ }, () => this.client.GET("/reports/timesheet.json", {
122
+ params: {
123
+ query: { from: options?.from, to: options?.to, "person_id": options?.personId },
124
+ },
125
+ }));
126
+ return response ?? [];
127
+ }
128
+ /**
129
+ * Get a single timesheet entry
130
+ * @param entryId - The entry ID
131
+ * @returns The timesheet_entry
132
+ * @throws {BasecampError} If the resource is not found
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * const result = await client.timesheets.get(123);
137
+ * ```
138
+ */
139
+ async get(entryId) {
140
+ const response = await this.request({
141
+ service: "Timesheets",
142
+ operation: "GetTimesheetEntry",
143
+ resourceType: "timesheet_entry",
144
+ isMutation: false,
145
+ resourceId: entryId,
146
+ }, () => this.client.GET("/timesheet_entries/{entryId}", {
147
+ params: {
148
+ path: { entryId },
149
+ },
150
+ }));
151
+ return response;
152
+ }
153
+ /**
154
+ * Update a timesheet entry
155
+ * @param entryId - The entry ID
156
+ * @param req - Timesheet_entry update parameters
157
+ * @returns The timesheet_entry
158
+ * @throws {BasecampError} If the resource is not found or fields are invalid
159
+ *
160
+ * @example
161
+ * ```ts
162
+ * const result = await client.timesheets.update(123, { });
163
+ * ```
164
+ */
165
+ async update(entryId, req) {
166
+ const response = await this.request({
167
+ service: "Timesheets",
168
+ operation: "UpdateTimesheetEntry",
169
+ resourceType: "timesheet_entry",
170
+ isMutation: true,
171
+ resourceId: entryId,
172
+ }, () => this.client.PUT("/timesheet_entries/{entryId}", {
173
+ params: {
174
+ path: { entryId },
175
+ },
176
+ body: {
177
+ date: req.date,
178
+ hours: req.hours,
179
+ description: req.description,
180
+ person_id: req.personId,
181
+ },
182
+ }));
183
+ return response;
184
+ }
185
+ }
186
+ //# sourceMappingURL=timesheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timesheets.js","sourceRoot":"","sources":["../../../src/generated/services/timesheets.ts"],"names":[],"mappings":"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"}
@@ -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
+ }