@37signals/basecamp 0.7.3 → 0.9.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 (162) hide show
  1. package/README.md +82 -2
  2. package/dist/client.d.ts +7 -4
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +32 -23
  5. package/dist/client.js.map +1 -1
  6. package/dist/download.d.ts.map +1 -1
  7. package/dist/errors.d.ts +10 -0
  8. package/dist/errors.d.ts.map +1 -1
  9. package/dist/errors.js +7 -1
  10. package/dist/errors.js.map +1 -1
  11. package/dist/generated/metadata.d.ts +32 -0
  12. package/dist/generated/metadata.d.ts.map +1 -0
  13. package/dist/generated/metadata.js +2723 -0
  14. package/dist/generated/metadata.js.map +1 -0
  15. package/dist/generated/{metadata.json → metadata.ts} +141 -35
  16. package/dist/generated/openapi-stripped.json +1713 -478
  17. package/dist/generated/path-mapping.d.ts.map +1 -1
  18. package/dist/generated/path-mapping.js +10 -5
  19. package/dist/generated/path-mapping.js.map +1 -1
  20. package/dist/generated/path-mapping.ts +10 -5
  21. package/dist/generated/schema.d.ts +1027 -265
  22. package/dist/generated/services/campfires.d.ts +22 -1
  23. package/dist/generated/services/campfires.d.ts.map +1 -1
  24. package/dist/generated/services/campfires.js +33 -1
  25. package/dist/generated/services/campfires.js.map +1 -1
  26. package/dist/generated/services/campfires.ts +46 -1
  27. package/dist/generated/services/card-columns.d.ts +31 -28
  28. package/dist/generated/services/card-columns.d.ts.map +1 -1
  29. package/dist/generated/services/card-columns.js +57 -51
  30. package/dist/generated/services/card-columns.js.map +1 -1
  31. package/dist/generated/services/card-columns.ts +65 -59
  32. package/dist/generated/services/checkins.d.ts +3 -1
  33. package/dist/generated/services/checkins.d.ts.map +1 -1
  34. package/dist/generated/services/checkins.js +2 -1
  35. package/dist/generated/services/checkins.js.map +1 -1
  36. package/dist/generated/services/checkins.ts +4 -1
  37. package/dist/generated/services/documents.d.ts +2 -0
  38. package/dist/generated/services/documents.d.ts.map +1 -1
  39. package/dist/generated/services/documents.js +1 -0
  40. package/dist/generated/services/documents.js.map +1 -1
  41. package/dist/generated/services/documents.ts +3 -0
  42. package/dist/generated/services/gauges.d.ts +2 -2
  43. package/dist/generated/services/gauges.js +2 -2
  44. package/dist/generated/services/gauges.ts +2 -2
  45. package/dist/generated/services/index.d.ts +3 -2
  46. package/dist/generated/services/index.d.ts.map +1 -1
  47. package/dist/generated/services/index.js +3 -2
  48. package/dist/generated/services/index.js.map +1 -1
  49. package/dist/generated/services/index.ts +3 -2
  50. package/dist/generated/services/messages.d.ts +2 -0
  51. package/dist/generated/services/messages.d.ts.map +1 -1
  52. package/dist/generated/services/messages.js +1 -0
  53. package/dist/generated/services/messages.js.map +1 -1
  54. package/dist/generated/services/messages.ts +3 -0
  55. package/dist/generated/services/people.d.ts +2 -2
  56. package/dist/generated/services/people.js +2 -2
  57. package/dist/generated/services/people.ts +2 -2
  58. package/dist/generated/services/reports.d.ts +1 -1
  59. package/dist/generated/services/reports.js +1 -1
  60. package/dist/generated/services/reports.ts +1 -1
  61. package/dist/generated/services/schedules.d.ts +2 -0
  62. package/dist/generated/services/schedules.d.ts.map +1 -1
  63. package/dist/generated/services/schedules.js +1 -0
  64. package/dist/generated/services/schedules.js.map +1 -1
  65. package/dist/generated/services/schedules.ts +3 -0
  66. package/dist/generated/services/search.d.ts +30 -1
  67. package/dist/generated/services/search.d.ts.map +1 -1
  68. package/dist/generated/services/search.js +1 -1
  69. package/dist/generated/services/search.js.map +1 -1
  70. package/dist/generated/services/search.ts +31 -2
  71. package/dist/generated/services/templates.d.ts +3 -5
  72. package/dist/generated/services/templates.d.ts.map +1 -1
  73. package/dist/generated/services/templates.js +4 -5
  74. package/dist/generated/services/templates.js.map +1 -1
  75. package/dist/generated/services/templates.ts +6 -9
  76. package/dist/generated/services/todolists.d.ts +22 -0
  77. package/dist/generated/services/todolists.d.ts.map +1 -1
  78. package/dist/generated/services/todolists.js +31 -0
  79. package/dist/generated/services/todolists.js.map +1 -1
  80. package/dist/generated/services/todolists.ts +46 -0
  81. package/dist/generated/services/todos.d.ts +8 -8
  82. package/dist/generated/services/todos.d.ts.map +1 -1
  83. package/dist/generated/services/todos.js +9 -6
  84. package/dist/generated/services/todos.js.map +1 -1
  85. package/dist/generated/services/todos.ts +12 -9
  86. package/dist/generated/services/tools.d.ts +11 -10
  87. package/dist/generated/services/tools.d.ts.map +1 -1
  88. package/dist/generated/services/tools.js +16 -8
  89. package/dist/generated/services/tools.js.map +1 -1
  90. package/dist/generated/services/tools.ts +21 -13
  91. package/dist/generated/services/uploads.d.ts +2 -0
  92. package/dist/generated/services/uploads.d.ts.map +1 -1
  93. package/dist/generated/services/uploads.js +1 -0
  94. package/dist/generated/services/uploads.js.map +1 -1
  95. package/dist/generated/services/uploads.ts +3 -0
  96. package/dist/generated/services/webhooks.js +2 -2
  97. package/dist/generated/services/webhooks.js.map +1 -1
  98. package/dist/generated/services/webhooks.ts +2 -2
  99. package/dist/generated/services/wormholes.d.ts +70 -0
  100. package/dist/generated/services/wormholes.d.ts.map +1 -0
  101. package/dist/generated/services/wormholes.js +103 -0
  102. package/dist/generated/services/wormholes.js.map +1 -0
  103. package/dist/generated/services/wormholes.ts +145 -0
  104. package/dist/index.d.ts +8 -5
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +4 -3
  107. package/dist/index.js.map +1 -1
  108. package/dist/oauth/discovery.d.ts +105 -23
  109. package/dist/oauth/discovery.d.ts.map +1 -1
  110. package/dist/oauth/discovery.js +453 -61
  111. package/dist/oauth/discovery.js.map +1 -1
  112. package/dist/oauth/index.d.ts +2 -2
  113. package/dist/oauth/index.d.ts.map +1 -1
  114. package/dist/oauth/index.js +1 -1
  115. package/dist/oauth/index.js.map +1 -1
  116. package/dist/oauth/interactive-login.d.ts +20 -2
  117. package/dist/oauth/interactive-login.d.ts.map +1 -1
  118. package/dist/oauth/interactive-login.js +58 -4
  119. package/dist/oauth/interactive-login.js.map +1 -1
  120. package/dist/oauth/types.d.ts +54 -2
  121. package/dist/oauth/types.d.ts.map +1 -1
  122. package/dist/security.d.ts +22 -0
  123. package/dist/security.d.ts.map +1 -1
  124. package/dist/security.js +56 -1
  125. package/dist/security.js.map +1 -1
  126. package/dist/services/authorization.d.ts.map +1 -1
  127. package/dist/services/authorization.js +3 -0
  128. package/dist/services/authorization.js.map +1 -1
  129. package/dist/services/base.d.ts.map +1 -1
  130. package/dist/services/base.js +1 -3
  131. package/dist/services/base.js.map +1 -1
  132. package/dist/services/todos-extensions.d.ts +118 -0
  133. package/dist/services/todos-extensions.d.ts.map +1 -0
  134. package/dist/services/todos-extensions.js +113 -0
  135. package/dist/services/todos-extensions.js.map +1 -0
  136. package/dist/services/uploads-extensions.d.ts +33 -0
  137. package/dist/services/uploads-extensions.d.ts.map +1 -0
  138. package/dist/services/uploads-extensions.js +48 -0
  139. package/dist/services/uploads-extensions.js.map +1 -0
  140. package/package.json +7 -4
  141. package/src/generated/{metadata.json → metadata.ts} +141 -35
  142. package/src/generated/openapi-stripped.json +1713 -478
  143. package/src/generated/path-mapping.ts +10 -5
  144. package/src/generated/schema.d.ts +1027 -265
  145. package/src/generated/services/campfires.ts +46 -1
  146. package/src/generated/services/card-columns.ts +65 -59
  147. package/src/generated/services/checkins.ts +4 -1
  148. package/src/generated/services/documents.ts +3 -0
  149. package/src/generated/services/gauges.ts +2 -2
  150. package/src/generated/services/index.ts +3 -2
  151. package/src/generated/services/messages.ts +3 -0
  152. package/src/generated/services/people.ts +2 -2
  153. package/src/generated/services/reports.ts +1 -1
  154. package/src/generated/services/schedules.ts +3 -0
  155. package/src/generated/services/search.ts +31 -2
  156. package/src/generated/services/templates.ts +6 -9
  157. package/src/generated/services/todolists.ts +46 -0
  158. package/src/generated/services/todos.ts +12 -9
  159. package/src/generated/services/tools.ts +21 -13
  160. package/src/generated/services/uploads.ts +3 -0
  161. package/src/generated/services/webhooks.ts +2 -2
  162. package/src/generated/services/wormholes.ts +145 -0
@@ -73,6 +73,14 @@ export interface CreateLineCampfireRequest {
73
73
  contentType?: string;
74
74
  }
75
75
 
76
+ /**
77
+ * Request parameters for updateLine.
78
+ */
79
+ export interface UpdateLineCampfireRequest {
80
+ /** The new line content, interpreted as rich text (HTML) */
81
+ content: string;
82
+ }
83
+
76
84
  /**
77
85
  * Options for listUploads.
78
86
  */
@@ -420,7 +428,44 @@ export class CampfiresService extends BaseService {
420
428
  }
421
429
 
422
430
  /**
423
- * Delete a campfire line
431
+ * Update an existing campfire line; the content is always treated as rich text (HTML).
432
+ * @param campfireId - The campfire ID
433
+ * @param lineId - The line ID
434
+ * @param req - Campfire_line update parameters
435
+ * @returns void
436
+ * @throws {BasecampError} If the resource is not found or fields are invalid
437
+ *
438
+ * @example
439
+ * ```ts
440
+ * await client.campfires.updateLine(123, 123, { content: "Hello world" });
441
+ * ```
442
+ */
443
+ async updateLine(campfireId: number, lineId: number, req: UpdateLineCampfireRequest): Promise<void> {
444
+ if (!req.content) {
445
+ throw Errors.validation("Content is required");
446
+ }
447
+ await this.request(
448
+ {
449
+ service: "Campfires",
450
+ operation: "UpdateCampfireLine",
451
+ resourceType: "campfire_line",
452
+ isMutation: true,
453
+ resourceId: lineId,
454
+ },
455
+ () =>
456
+ this.client.PUT("/chats/{campfireId}/lines/{lineId}", {
457
+ params: {
458
+ path: { campfireId, lineId },
459
+ },
460
+ body: {
461
+ content: req.content,
462
+ },
463
+ })
464
+ );
465
+ }
466
+
467
+ /**
468
+ * Delete a campfire line; allowed for the line's creator or an admin.
424
469
  * @param campfireId - The campfire ID
425
470
  * @param lineId - The line ID
426
471
  * @returns void
@@ -15,6 +15,14 @@ import { Errors } from "../../errors.js";
15
15
  /** CardColumn entity from the Basecamp API. */
16
16
  export type CardColumn = components["schemas"]["CardColumn"];
17
17
 
18
+ /**
19
+ * Request parameters for setColor.
20
+ */
21
+ export interface SetColorCardColumnRequest {
22
+ /** Valid colors: white, red, orange, yellow, green, blue, aqua, purple, gray, pink, brown */
23
+ color: string;
24
+ }
25
+
18
26
  /**
19
27
  * Request parameters for update.
20
28
  */
@@ -25,14 +33,6 @@ export interface UpdateCardColumnRequest {
25
33
  description?: string;
26
34
  }
27
35
 
28
- /**
29
- * Request parameters for setColor.
30
- */
31
- export interface SetColorCardColumnRequest {
32
- /** Valid colors: white, red, orange, yellow, green, blue, aqua, purple, gray, pink, brown */
33
- color: string;
34
- }
35
-
36
36
  /**
37
37
  * Request parameters for create.
38
38
  */
@@ -66,29 +66,38 @@ export interface MoveCardColumnRequest {
66
66
  export class CardColumnsService extends BaseService {
67
67
 
68
68
  /**
69
- * Get a card column by ID
69
+ * Set the color of a column
70
+ * @param bucketId - The bucket ID
70
71
  * @param columnId - The column ID
72
+ * @param req - Card_column_color request parameters
71
73
  * @returns The CardColumn
72
- * @throws {BasecampError} If the resource is not found
74
+ * @throws {BasecampError} If the request fails
73
75
  *
74
76
  * @example
75
77
  * ```ts
76
- * const result = await client.cardColumns.get(123);
78
+ * const result = await client.cardColumns.setColor(123, 123, { color: "example" });
77
79
  * ```
78
80
  */
79
- async get(columnId: number): Promise<CardColumn> {
81
+ async setColor(bucketId: number, columnId: number, req: SetColorCardColumnRequest): Promise<CardColumn> {
82
+ if (!req.color) {
83
+ throw Errors.validation("Color is required");
84
+ }
80
85
  const response = await this.request(
81
86
  {
82
87
  service: "CardColumns",
83
- operation: "GetCardColumn",
84
- resourceType: "card_column",
85
- isMutation: false,
88
+ operation: "SetCardColumnColor",
89
+ resourceType: "card_column_color",
90
+ isMutation: true,
91
+ projectId: bucketId,
86
92
  resourceId: columnId,
87
93
  },
88
94
  () =>
89
- this.client.GET("/card_tables/columns/{columnId}", {
95
+ this.client.PUT("/buckets/{bucketId}/card_tables/columns/{columnId}/color.json", {
90
96
  params: {
91
- path: { columnId },
97
+ path: { bucketId, columnId },
98
+ },
99
+ body: {
100
+ color: req.color,
92
101
  },
93
102
  })
94
103
  );
@@ -96,34 +105,31 @@ export class CardColumnsService extends BaseService {
96
105
  }
97
106
 
98
107
  /**
99
- * Update an existing column
108
+ * Enable on-hold section in a column
109
+ * @param bucketId - The bucket ID
100
110
  * @param columnId - The column ID
101
- * @param req - Card_column update parameters
102
111
  * @returns The CardColumn
103
- * @throws {BasecampError} If the resource is not found or fields are invalid
112
+ * @throws {BasecampError} If the request fails
104
113
  *
105
114
  * @example
106
115
  * ```ts
107
- * const result = await client.cardColumns.update(123, { });
116
+ * const result = await client.cardColumns.enableOnHold(123, 123);
108
117
  * ```
109
118
  */
110
- async update(columnId: number, req: UpdateCardColumnRequest): Promise<CardColumn> {
119
+ async enableOnHold(bucketId: number, columnId: number): Promise<CardColumn> {
111
120
  const response = await this.request(
112
121
  {
113
122
  service: "CardColumns",
114
- operation: "UpdateCardColumn",
115
- resourceType: "card_column",
123
+ operation: "EnableCardColumnOnHold",
124
+ resourceType: "card_column_on_hold",
116
125
  isMutation: true,
126
+ projectId: bucketId,
117
127
  resourceId: columnId,
118
128
  },
119
129
  () =>
120
- this.client.PUT("/card_tables/columns/{columnId}", {
130
+ this.client.POST("/buckets/{bucketId}/card_tables/columns/{columnId}/on_hold.json", {
121
131
  params: {
122
- path: { columnId },
123
- },
124
- body: {
125
- title: req.title,
126
- description: req.description,
132
+ path: { bucketId, columnId },
127
133
  },
128
134
  })
129
135
  );
@@ -131,36 +137,31 @@ export class CardColumnsService extends BaseService {
131
137
  }
132
138
 
133
139
  /**
134
- * Set the color of a column
140
+ * Disable on-hold section in a column
141
+ * @param bucketId - The bucket ID
135
142
  * @param columnId - The column ID
136
- * @param req - Card_column_color request parameters
137
143
  * @returns The CardColumn
138
144
  * @throws {BasecampError} If the request fails
139
145
  *
140
146
  * @example
141
147
  * ```ts
142
- * const result = await client.cardColumns.setColor(123, { color: "example" });
148
+ * const result = await client.cardColumns.disableOnHold(123, 123);
143
149
  * ```
144
150
  */
145
- async setColor(columnId: number, req: SetColorCardColumnRequest): Promise<CardColumn> {
146
- if (!req.color) {
147
- throw Errors.validation("Color is required");
148
- }
151
+ async disableOnHold(bucketId: number, columnId: number): Promise<CardColumn> {
149
152
  const response = await this.request(
150
153
  {
151
154
  service: "CardColumns",
152
- operation: "SetCardColumnColor",
153
- resourceType: "card_column_color",
155
+ operation: "DisableCardColumnOnHold",
156
+ resourceType: "card_column_on_hold",
154
157
  isMutation: true,
158
+ projectId: bucketId,
155
159
  resourceId: columnId,
156
160
  },
157
161
  () =>
158
- this.client.PUT("/card_tables/columns/{columnId}/color.json", {
162
+ this.client.DELETE("/buckets/{bucketId}/card_tables/columns/{columnId}/on_hold.json", {
159
163
  params: {
160
- path: { columnId },
161
- },
162
- body: {
163
- color: req.color,
164
+ path: { bucketId, columnId },
164
165
  },
165
166
  })
166
167
  );
@@ -168,27 +169,27 @@ export class CardColumnsService extends BaseService {
168
169
  }
169
170
 
170
171
  /**
171
- * Enable on-hold section in a column
172
+ * Get a card column by ID
172
173
  * @param columnId - The column ID
173
174
  * @returns The CardColumn
174
- * @throws {BasecampError} If the request fails
175
+ * @throws {BasecampError} If the resource is not found
175
176
  *
176
177
  * @example
177
178
  * ```ts
178
- * const result = await client.cardColumns.enableOnHold(123);
179
+ * const result = await client.cardColumns.get(123);
179
180
  * ```
180
181
  */
181
- async enableOnHold(columnId: number): Promise<CardColumn> {
182
+ async get(columnId: number): Promise<CardColumn> {
182
183
  const response = await this.request(
183
184
  {
184
185
  service: "CardColumns",
185
- operation: "EnableCardColumnOnHold",
186
- resourceType: "card_column_on_hold",
187
- isMutation: true,
186
+ operation: "GetCardColumn",
187
+ resourceType: "card_column",
188
+ isMutation: false,
188
189
  resourceId: columnId,
189
190
  },
190
191
  () =>
191
- this.client.POST("/card_tables/columns/{columnId}/on_hold.json", {
192
+ this.client.GET("/card_tables/columns/{columnId}", {
192
193
  params: {
193
194
  path: { columnId },
194
195
  },
@@ -198,30 +199,35 @@ export class CardColumnsService extends BaseService {
198
199
  }
199
200
 
200
201
  /**
201
- * Disable on-hold section in a column
202
+ * Update an existing column
202
203
  * @param columnId - The column ID
204
+ * @param req - Card_column update parameters
203
205
  * @returns The CardColumn
204
- * @throws {BasecampError} If the request fails
206
+ * @throws {BasecampError} If the resource is not found or fields are invalid
205
207
  *
206
208
  * @example
207
209
  * ```ts
208
- * const result = await client.cardColumns.disableOnHold(123);
210
+ * const result = await client.cardColumns.update(123, { });
209
211
  * ```
210
212
  */
211
- async disableOnHold(columnId: number): Promise<CardColumn> {
213
+ async update(columnId: number, req: UpdateCardColumnRequest): Promise<CardColumn> {
212
214
  const response = await this.request(
213
215
  {
214
216
  service: "CardColumns",
215
- operation: "DisableCardColumnOnHold",
216
- resourceType: "card_column_on_hold",
217
+ operation: "UpdateCardColumn",
218
+ resourceType: "card_column",
217
219
  isMutation: true,
218
220
  resourceId: columnId,
219
221
  },
220
222
  () =>
221
- this.client.DELETE("/card_tables/columns/{columnId}/on_hold.json", {
223
+ this.client.PUT("/card_tables/columns/{columnId}", {
222
224
  params: {
223
225
  path: { columnId },
224
226
  },
227
+ body: {
228
+ title: req.title,
229
+ description: req.description,
230
+ },
225
231
  })
226
232
  );
227
233
  return response;
@@ -53,6 +53,8 @@ export interface CreateQuestionCheckinRequest {
53
53
  title: string;
54
54
  /** Schedule */
55
55
  schedule: components["schemas"]["QuestionSchedule"];
56
+ /** Visible to clients */
57
+ visibleToClients?: boolean;
56
58
  }
57
59
 
58
60
  /**
@@ -279,7 +281,7 @@ export class CheckinsService extends BaseService {
279
281
  *
280
282
  * @example
281
283
  * ```ts
282
- * const result = await client.checkins.createQuestion(123, { title: "example", schedule: "example" });
284
+ * const result = await client.checkins.createQuestion(123, { title: "example", schedule: { } });
283
285
  * ```
284
286
  */
285
287
  async createQuestion(questionnaireId: number, req: CreateQuestionCheckinRequest): Promise<Question> {
@@ -305,6 +307,7 @@ export class CheckinsService extends BaseService {
305
307
  body: {
306
308
  title: req.title,
307
309
  schedule: req.schedule,
310
+ visible_to_clients: req.visibleToClients,
308
311
  },
309
312
  })
310
313
  );
@@ -45,6 +45,8 @@ export interface CreateDocumentRequest {
45
45
  status?: "active" | "drafted";
46
46
  /** Subscriptions */
47
47
  subscriptions?: number[];
48
+ /** Visible to clients */
49
+ visibleToClients?: boolean;
48
50
  }
49
51
 
50
52
 
@@ -186,6 +188,7 @@ export class DocumentsService extends BaseService {
186
188
  content: req.content,
187
189
  status: req.status,
188
190
  subscriptions: req.subscriptions,
191
+ visible_to_clients: req.visibleToClients,
189
192
  },
190
193
  })
191
194
  );
@@ -169,7 +169,7 @@ export class GaugesService extends BaseService {
169
169
  *
170
170
  * @example
171
171
  * ```ts
172
- * await client.gauges.toggleGauge(123, { gauge: "example" });
172
+ * await client.gauges.toggleGauge(123, { gauge: { enabled: true } });
173
173
  * ```
174
174
  */
175
175
  async toggleGauge(projectId: number, req: ToggleGaugeGaugeRequest): Promise<void> {
@@ -235,7 +235,7 @@ export class GaugesService extends BaseService {
235
235
  *
236
236
  * @example
237
237
  * ```ts
238
- * const result = await client.gauges.createGaugeNeedle(123, { gaugeNeedle: "example" });
238
+ * const result = await client.gauges.createGaugeNeedle(123, { gaugeNeedle: { position: 1 } });
239
239
  * ```
240
240
  */
241
241
  async createGaugeNeedle(projectId: number, req: CreateGaugeNeedleGaugeRequest): Promise<components["schemas"]["CreateGaugeNeedleResponseContent"]> {
@@ -1,10 +1,12 @@
1
1
  export { AccountService } from "./account.js";
2
2
  export { AttachmentsService } from "./attachments.js";
3
3
  export { BoostsService } from "./boosts.js";
4
+ export { CardColumnsService } from "./card-columns.js";
5
+ export { WormholesService } from "./wormholes.js";
6
+ export { ToolsService } from "./tools.js";
4
7
  export { WebhooksService } from "./webhooks.js";
5
8
  export { CardsService } from "./cards.js";
6
9
  export { CardStepsService } from "./card-steps.js";
7
- export { CardColumnsService } from "./card-columns.js";
8
10
  export { CardTablesService } from "./card-tables.js";
9
11
  export { MessageTypesService } from "./message-types.js";
10
12
  export { CampfiresService } from "./campfires.js";
@@ -13,7 +15,6 @@ export { ClientApprovalsService } from "./client-approvals.js";
13
15
  export { ClientCorrespondencesService } from "./client-correspondences.js";
14
16
  export { ClientRepliesService } from "./client-replies.js";
15
17
  export { CommentsService } from "./comments.js";
16
- export { ToolsService } from "./tools.js";
17
18
  export { DocumentsService } from "./documents.js";
18
19
  export { GaugesService } from "./gauges.js";
19
20
  export { ForwardsService } from "./forwards.js";
@@ -41,6 +41,8 @@ export interface CreateMessageRequest {
41
41
  categoryId?: number;
42
42
  /** Subscriptions */
43
43
  subscriptions?: number[];
44
+ /** Visible to clients */
45
+ visibleToClients?: boolean;
44
46
  }
45
47
 
46
48
  /**
@@ -136,6 +138,7 @@ export class MessagesService extends BaseService {
136
138
  status: req.status,
137
139
  category_id: req.categoryId,
138
140
  subscriptions: req.subscriptions,
141
+ visible_to_clients: req.visibleToClients,
139
142
  },
140
143
  })
141
144
  );
@@ -152,7 +152,7 @@ export class PeopleService extends BaseService {
152
152
  *
153
153
  * @example
154
154
  * ```ts
155
- * const result = await client.people.updateMyPreferences({ person: "example" });
155
+ * const result = await client.people.updateMyPreferences({ person: { } });
156
156
  * ```
157
157
  */
158
158
  async updateMyPreferences(req: UpdateMyPreferencesPeopleRequest): Promise<components["schemas"]["UpdateMyPreferencesResponseContent"]> {
@@ -328,7 +328,7 @@ export class PeopleService extends BaseService {
328
328
  *
329
329
  * @example
330
330
  * ```ts
331
- * const result = await client.people.enableOutOfOffice(123, { outOfOffice: "example" });
331
+ * const result = await client.people.enableOutOfOffice(123, { outOfOffice: { start_date: "example", end_date: "example" } });
332
332
  * ```
333
333
  */
334
334
  async enableOutOfOffice(personId: number, req: EnableOutOfOfficePeopleRequest): Promise<components["schemas"]["EnableOutOfOfficeResponseContent"]> {
@@ -84,7 +84,7 @@ export class ReportsService extends BaseService {
84
84
  }
85
85
 
86
86
  /**
87
- * Get upcoming schedule entries within a date window
87
+ * Get upcoming schedule entries and assignable items within a date window.
88
88
  * @param options - Optional query parameters
89
89
  * @returns The upcoming_schedule
90
90
  *
@@ -75,6 +75,8 @@ export interface CreateEntryScheduleRequest {
75
75
  notify?: boolean;
76
76
  /** Subscriptions */
77
77
  subscriptions?: number[];
78
+ /** Visible to clients */
79
+ visibleToClients?: boolean;
78
80
  }
79
81
 
80
82
 
@@ -330,6 +332,7 @@ export class SchedulesService extends BaseService {
330
332
  all_day: req.allDay,
331
333
  notify: req.notify,
332
334
  subscriptions: req.subscriptions,
335
+ visible_to_clients: req.visibleToClients,
333
336
  },
334
337
  })
335
338
  );
@@ -18,8 +18,37 @@ import type { PaginationOptions } from "../../pagination.js";
18
18
  * Options for search.
19
19
  */
20
20
  export interface SearchSearchOptions extends PaginationOptions {
21
+ /** Recording types to include. Use `key` values from the metadata
22
+ endpoint's `recording_search_types`. Available since Basecamp 5. */
23
+ typeNames?: string[];
24
+ /** Project IDs to filter by. Available since Basecamp 5. */
25
+ bucketIds?: number[];
26
+ /** Creator person IDs to filter by. Available since Basecamp 5. */
27
+ creatorIds?: number[];
28
+ /** Filter attachments by type. Use `key` values from the metadata
29
+ endpoint's `file_search_types`. */
30
+ fileType?: string;
31
+ /** Set to true to exclude chat results. */
32
+ excludeChat?: boolean;
33
+ /** Filter by since */
34
+ since?: "last_7_days" | "last_30_days" | "last_90_days" | "last_12_months" | "forever";
21
35
  /** Filter by sort */
22
- sort?: "best_match" | "created_at";
36
+ sort?: "best_match" | "recency";
37
+ /**
38
+ * Deprecated: prefer type_names[].
39
+ * @deprecated prefer type_names[].
40
+ */
41
+ type?: string;
42
+ /**
43
+ * Deprecated: prefer bucket_ids[].
44
+ * @deprecated prefer bucket_ids[].
45
+ */
46
+ bucketId?: number;
47
+ /**
48
+ * Deprecated: prefer creator_ids[].
49
+ * @deprecated prefer creator_ids[].
50
+ */
51
+ creatorId?: number;
23
52
  }
24
53
 
25
54
 
@@ -54,7 +83,7 @@ export class SearchService extends BaseService {
54
83
  () =>
55
84
  this.client.GET("/search.json", {
56
85
  params: {
57
- query: { q: q, sort: options?.sort },
86
+ query: { q: q, "type_names[]": options?.typeNames, "bucket_ids[]": options?.bucketIds, "creator_ids[]": options?.creatorIds, "file_type": options?.fileType, "exclude_chat": options?.excludeChat, since: options?.since, sort: options?.sort, type: options?.type, "bucket_id": options?.bucketId, "creator_id": options?.creatorId },
58
87
  },
59
88
  })
60
89
  , options
@@ -49,10 +49,8 @@ export interface UpdateTemplateRequest {
49
49
  * Request parameters for createProject.
50
50
  */
51
51
  export interface CreateProjectTemplateRequest {
52
- /** Display name */
53
- name: string;
54
- /** Rich text description (HTML) */
55
- description?: string;
52
+ /** Project */
53
+ project: components["schemas"]["ProjectConstructionAttributes"];
56
54
  }
57
55
 
58
56
 
@@ -232,12 +230,12 @@ export class TemplatesService extends BaseService {
232
230
  *
233
231
  * @example
234
232
  * ```ts
235
- * const result = await client.templates.createProject(123, { name: "My example" });
233
+ * const result = await client.templates.createProject(123, { project: { name: "My example" } });
236
234
  * ```
237
235
  */
238
236
  async createProject(templateId: number, req: CreateProjectTemplateRequest): Promise<components["schemas"]["CreateProjectFromTemplateResponseContent"]> {
239
- if (!req.name) {
240
- throw Errors.validation("Name is required");
237
+ if (!req.project) {
238
+ throw Errors.validation("Project is required");
241
239
  }
242
240
  const response = await this.request(
243
241
  {
@@ -253,8 +251,7 @@ export class TemplatesService extends BaseService {
253
251
  path: { templateId },
254
252
  },
255
253
  body: {
256
- name: req.name,
257
- description: req.description,
254
+ project: req.project,
258
255
  },
259
256
  })
260
257
  );
@@ -27,6 +27,14 @@ export interface UpdateTodolistRequest {
27
27
  description?: string;
28
28
  }
29
29
 
30
+ /**
31
+ * Request parameters for reposition.
32
+ */
33
+ export interface RepositionTodolistRequest {
34
+ /** Position for ordering (1-based) */
35
+ position: number;
36
+ }
37
+
30
38
  /**
31
39
  * Options for list.
32
40
  */
@@ -43,6 +51,8 @@ export interface CreateTodolistRequest {
43
51
  name: string;
44
52
  /** Rich text description (HTML) */
45
53
  description?: string;
54
+ /** Visible to clients */
55
+ visibleToClients?: boolean;
46
56
  }
47
57
 
48
58
 
@@ -73,6 +83,7 @@ export class TodolistsService extends BaseService {
73
83
  operation: "GetTodolistOrGroup",
74
84
  resourceType: "todolist_or_group",
75
85
  isMutation: false,
86
+ resourceId: id,
76
87
  },
77
88
  () =>
78
89
  this.client.GET("/todolists/{id}", {
@@ -103,6 +114,7 @@ export class TodolistsService extends BaseService {
103
114
  operation: "UpdateTodolistOrGroup",
104
115
  resourceType: "todolist_or_group",
105
116
  isMutation: true,
117
+ resourceId: id,
106
118
  },
107
119
  () =>
108
120
  this.client.PUT("/todolists/{id}", {
@@ -118,6 +130,39 @@ export class TodolistsService extends BaseService {
118
130
  return response;
119
131
  }
120
132
 
133
+ /**
134
+ * Reposition a to-do list within its to-do set.
135
+ * @param todolistId - The todolist ID
136
+ * @param req - Todolist request parameters
137
+ * @returns void
138
+ * @throws {BasecampError} If the request fails
139
+ *
140
+ * @example
141
+ * ```ts
142
+ * await client.todolists.reposition(123, { position: 1 });
143
+ * ```
144
+ */
145
+ async reposition(todolistId: number, req: RepositionTodolistRequest): Promise<void> {
146
+ await this.request(
147
+ {
148
+ service: "Todolists",
149
+ operation: "RepositionTodolist",
150
+ resourceType: "todolist",
151
+ isMutation: true,
152
+ resourceId: todolistId,
153
+ },
154
+ () =>
155
+ this.client.PUT("/todosets/todolists/{todolistId}/position.json", {
156
+ params: {
157
+ path: { todolistId },
158
+ },
159
+ body: {
160
+ position: req.position,
161
+ },
162
+ })
163
+ );
164
+ }
165
+
121
166
  /**
122
167
  * List todolists in a todoset
123
168
  * @param todosetId - The todoset ID
@@ -184,6 +229,7 @@ export class TodolistsService extends BaseService {
184
229
  body: {
185
230
  name: req.name,
186
231
  description: req.description,
232
+ visible_to_clients: req.visibleToClients,
187
233
  },
188
234
  })
189
235
  );
@@ -48,11 +48,11 @@ export interface CreateTodoRequest {
48
48
  }
49
49
 
50
50
  /**
51
- * Request parameters for update.
51
+ * Request parameters for replace.
52
52
  */
53
- export interface UpdateTodoRequest {
53
+ export interface ReplaceTodoRequest {
54
54
  /** Text content */
55
- content?: string;
55
+ content: string;
56
56
  /** Rich text description (HTML) */
57
57
  description?: string;
58
58
  /** Person IDs to assign to */
@@ -201,18 +201,21 @@ export class TodosService extends BaseService {
201
201
  }
202
202
 
203
203
  /**
204
- * Update an existing todo
204
+ * Replace a todo with a new complete representation.
205
205
  * @param todoId - The todo ID
206
- * @param req - Todo update parameters
206
+ * @param req - Todo request parameters
207
207
  * @returns The Todo
208
- * @throws {BasecampError} If the resource is not found or fields are invalid
208
+ * @throws {BasecampError} If the request fails
209
209
  *
210
210
  * @example
211
211
  * ```ts
212
- * const result = await client.todos.update(123, { });
212
+ * const result = await client.todos.replace(123, { content: "Hello world" });
213
213
  * ```
214
214
  */
215
- async update(todoId: number, req: UpdateTodoRequest): Promise<Todo> {
215
+ async replace(todoId: number, req: ReplaceTodoRequest): Promise<Todo> {
216
+ if (!req.content) {
217
+ throw Errors.validation("Content is required");
218
+ }
216
219
  if (req.dueOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.dueOn)) {
217
220
  throw Errors.validation("Due on must be in YYYY-MM-DD format");
218
221
  }
@@ -222,7 +225,7 @@ export class TodosService extends BaseService {
222
225
  const response = await this.request(
223
226
  {
224
227
  service: "Todos",
225
- operation: "UpdateTodo",
228
+ operation: "ReplaceTodo",
226
229
  resourceType: "todo",
227
230
  isMutation: true,
228
231
  resourceId: todoId,