@37signals/basecamp 0.8.0 → 0.10.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 (147) hide show
  1. package/README.md +3 -2
  2. package/dist/client.d.ts +9 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +35 -13
  5. package/dist/client.js.map +1 -1
  6. package/dist/generated/metadata.d.ts.map +1 -1
  7. package/dist/generated/metadata.js +343 -12
  8. package/dist/generated/metadata.js.map +1 -1
  9. package/dist/generated/metadata.ts +343 -12
  10. package/dist/generated/openapi-stripped.json +7127 -3763
  11. package/dist/generated/path-mapping.d.ts.map +1 -1
  12. package/dist/generated/path-mapping.js +27 -5
  13. package/dist/generated/path-mapping.js.map +1 -1
  14. package/dist/generated/path-mapping.ts +27 -5
  15. package/dist/generated/schema.d.ts +2911 -503
  16. package/dist/generated/services/boosts.d.ts +13 -10
  17. package/dist/generated/services/boosts.d.ts.map +1 -1
  18. package/dist/generated/services/boosts.js +5 -5
  19. package/dist/generated/services/boosts.js.map +1 -1
  20. package/dist/generated/services/boosts.ts +12 -10
  21. package/dist/generated/services/card-columns.d.ts.map +1 -1
  22. package/dist/generated/services/card-columns.js +3 -0
  23. package/dist/generated/services/card-columns.js.map +1 -1
  24. package/dist/generated/services/card-columns.ts +3 -0
  25. package/dist/generated/services/cards.d.ts +4 -4
  26. package/dist/generated/services/cards.d.ts.map +1 -1
  27. package/dist/generated/services/cards.js +2 -2
  28. package/dist/generated/services/cards.js.map +1 -1
  29. package/dist/generated/services/cards.ts +4 -4
  30. package/dist/generated/services/checkins.d.ts +3 -1
  31. package/dist/generated/services/checkins.d.ts.map +1 -1
  32. package/dist/generated/services/checkins.js +2 -1
  33. package/dist/generated/services/checkins.js.map +1 -1
  34. package/dist/generated/services/checkins.ts +4 -1
  35. package/dist/generated/services/documents.d.ts +2 -0
  36. package/dist/generated/services/documents.d.ts.map +1 -1
  37. package/dist/generated/services/documents.js +1 -0
  38. package/dist/generated/services/documents.js.map +1 -1
  39. package/dist/generated/services/documents.ts +3 -0
  40. package/dist/generated/services/everything.d.ts +323 -0
  41. package/dist/generated/services/everything.d.ts.map +1 -0
  42. package/dist/generated/services/everything.js +381 -0
  43. package/dist/generated/services/everything.js.map +1 -0
  44. package/dist/generated/services/everything.ts +632 -0
  45. package/dist/generated/services/gauges.d.ts +2 -2
  46. package/dist/generated/services/gauges.js +2 -2
  47. package/dist/generated/services/gauges.ts +2 -2
  48. package/dist/generated/services/index.d.ts +3 -1
  49. package/dist/generated/services/index.d.ts.map +1 -1
  50. package/dist/generated/services/index.js +3 -1
  51. package/dist/generated/services/index.js.map +1 -1
  52. package/dist/generated/services/index.ts +3 -1
  53. package/dist/generated/services/message-types.d.ts +15 -10
  54. package/dist/generated/services/message-types.d.ts.map +1 -1
  55. package/dist/generated/services/message-types.js +35 -18
  56. package/dist/generated/services/message-types.js.map +1 -1
  57. package/dist/generated/services/message-types.ts +34 -18
  58. package/dist/generated/services/messages.d.ts +2 -0
  59. package/dist/generated/services/messages.d.ts.map +1 -1
  60. package/dist/generated/services/messages.js +1 -0
  61. package/dist/generated/services/messages.js.map +1 -1
  62. package/dist/generated/services/messages.ts +3 -0
  63. package/dist/generated/services/my-notifications.d.ts +27 -0
  64. package/dist/generated/services/my-notifications.d.ts.map +1 -1
  65. package/dist/generated/services/my-notifications.js +23 -1
  66. package/dist/generated/services/my-notifications.js.map +1 -1
  67. package/dist/generated/services/my-notifications.ts +46 -1
  68. package/dist/generated/services/people.d.ts +2 -2
  69. package/dist/generated/services/people.js +2 -2
  70. package/dist/generated/services/people.ts +2 -2
  71. package/dist/generated/services/recordings.d.ts +2 -2
  72. package/dist/generated/services/recordings.d.ts.map +1 -1
  73. package/dist/generated/services/recordings.js +1 -1
  74. package/dist/generated/services/recordings.js.map +1 -1
  75. package/dist/generated/services/recordings.ts +2 -2
  76. package/dist/generated/services/schedules.d.ts +11 -1
  77. package/dist/generated/services/schedules.d.ts.map +1 -1
  78. package/dist/generated/services/schedules.js +1 -0
  79. package/dist/generated/services/schedules.js.map +1 -1
  80. package/dist/generated/services/schedules.ts +12 -1
  81. package/dist/generated/services/search.d.ts +30 -1
  82. package/dist/generated/services/search.d.ts.map +1 -1
  83. package/dist/generated/services/search.js +1 -1
  84. package/dist/generated/services/search.js.map +1 -1
  85. package/dist/generated/services/search.ts +31 -2
  86. package/dist/generated/services/templates.d.ts +3 -5
  87. package/dist/generated/services/templates.d.ts.map +1 -1
  88. package/dist/generated/services/templates.js +4 -5
  89. package/dist/generated/services/templates.js.map +1 -1
  90. package/dist/generated/services/templates.ts +6 -9
  91. package/dist/generated/services/todolists.d.ts +22 -0
  92. package/dist/generated/services/todolists.d.ts.map +1 -1
  93. package/dist/generated/services/todolists.js +31 -0
  94. package/dist/generated/services/todolists.js.map +1 -1
  95. package/dist/generated/services/todolists.ts +46 -0
  96. package/dist/generated/services/tools.d.ts +2 -0
  97. package/dist/generated/services/tools.d.ts.map +1 -1
  98. package/dist/generated/services/tools.js +2 -1
  99. package/dist/generated/services/tools.js.map +1 -1
  100. package/dist/generated/services/tools.ts +4 -1
  101. package/dist/generated/services/uploads.d.ts +2 -0
  102. package/dist/generated/services/uploads.d.ts.map +1 -1
  103. package/dist/generated/services/uploads.js +1 -0
  104. package/dist/generated/services/uploads.js.map +1 -1
  105. package/dist/generated/services/uploads.ts +3 -0
  106. package/dist/generated/services/webhooks.js +2 -2
  107. package/dist/generated/services/webhooks.js.map +1 -1
  108. package/dist/generated/services/webhooks.ts +2 -2
  109. package/dist/generated/services/wormholes.d.ts +70 -0
  110. package/dist/generated/services/wormholes.d.ts.map +1 -0
  111. package/dist/generated/services/wormholes.js +103 -0
  112. package/dist/generated/services/wormholes.js.map +1 -0
  113. package/dist/generated/services/wormholes.ts +145 -0
  114. package/dist/index.d.ts +6 -3
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +7 -1
  117. package/dist/index.js.map +1 -1
  118. package/dist/services/cards-extensions.d.ts +76 -0
  119. package/dist/services/cards-extensions.d.ts.map +1 -0
  120. package/dist/services/cards-extensions.js +67 -0
  121. package/dist/services/cards-extensions.js.map +1 -0
  122. package/package.json +2 -2
  123. package/src/generated/metadata.ts +343 -12
  124. package/src/generated/openapi-stripped.json +7127 -3763
  125. package/src/generated/path-mapping.ts +27 -5
  126. package/src/generated/schema.d.ts +2911 -503
  127. package/src/generated/services/boosts.ts +12 -10
  128. package/src/generated/services/card-columns.ts +3 -0
  129. package/src/generated/services/cards.ts +4 -4
  130. package/src/generated/services/checkins.ts +4 -1
  131. package/src/generated/services/documents.ts +3 -0
  132. package/src/generated/services/everything.ts +632 -0
  133. package/src/generated/services/gauges.ts +2 -2
  134. package/src/generated/services/index.ts +3 -1
  135. package/src/generated/services/message-types.ts +34 -18
  136. package/src/generated/services/messages.ts +3 -0
  137. package/src/generated/services/my-notifications.ts +46 -1
  138. package/src/generated/services/people.ts +2 -2
  139. package/src/generated/services/recordings.ts +2 -2
  140. package/src/generated/services/schedules.ts +12 -1
  141. package/src/generated/services/search.ts +31 -2
  142. package/src/generated/services/templates.ts +6 -9
  143. package/src/generated/services/todolists.ts +46 -0
  144. package/src/generated/services/tools.ts +4 -1
  145. package/src/generated/services/uploads.ts +3 -0
  146. package/src/generated/services/webhooks.ts +2 -2
  147. package/src/generated/services/wormholes.ts +145 -0
@@ -55,24 +55,29 @@ export class MessageTypesService extends BaseService {
55
55
 
56
56
  /**
57
57
  * List message types in a project
58
+ * @param bucketId - The bucket ID
58
59
  * @param options - Optional query parameters
59
60
  * @returns All MessageType across all pages, with .meta.totalCount
60
61
  *
61
62
  * @example
62
63
  * ```ts
63
- * const result = await client.messageTypes.list();
64
+ * const result = await client.messageTypes.list(123);
64
65
  * ```
65
66
  */
66
- async list(options?: ListMessageTypeOptions): Promise<ListResult<MessageType>> {
67
+ async list(bucketId: number, options?: ListMessageTypeOptions): Promise<ListResult<MessageType>> {
67
68
  return this.requestPaginated(
68
69
  {
69
70
  service: "MessageTypes",
70
71
  operation: "ListMessageTypes",
71
72
  resourceType: "message_type",
72
73
  isMutation: false,
74
+ projectId: bucketId,
73
75
  },
74
76
  () =>
75
- this.client.GET("/categories.json", {
77
+ this.client.GET("/buckets/{bucketId}/categories.json", {
78
+ params: {
79
+ path: { bucketId },
80
+ },
76
81
  })
77
82
  , options
78
83
  );
@@ -80,16 +85,17 @@ export class MessageTypesService extends BaseService {
80
85
 
81
86
  /**
82
87
  * Create a new message type in a project
88
+ * @param bucketId - The bucket ID
83
89
  * @param req - Message_type creation parameters
84
90
  * @returns The MessageType
85
91
  * @throws {BasecampError} If required fields are missing or invalid
86
92
  *
87
93
  * @example
88
94
  * ```ts
89
- * const result = await client.messageTypes.create({ name: "My example", icon: "example" });
95
+ * const result = await client.messageTypes.create(123, { name: "My example", icon: "example" });
90
96
  * ```
91
97
  */
92
- async create(req: CreateMessageTypeRequest): Promise<MessageType> {
98
+ async create(bucketId: number, req: CreateMessageTypeRequest): Promise<MessageType> {
93
99
  if (!req.name) {
94
100
  throw Errors.validation("Name is required");
95
101
  }
@@ -102,9 +108,13 @@ export class MessageTypesService extends BaseService {
102
108
  operation: "CreateMessageType",
103
109
  resourceType: "message_type",
104
110
  isMutation: true,
111
+ projectId: bucketId,
105
112
  },
106
113
  () =>
107
- this.client.POST("/categories.json", {
114
+ this.client.POST("/buckets/{bucketId}/categories.json", {
115
+ params: {
116
+ path: { bucketId },
117
+ },
108
118
  body: {
109
119
  name: req.name,
110
120
  icon: req.icon,
@@ -116,28 +126,30 @@ export class MessageTypesService extends BaseService {
116
126
 
117
127
  /**
118
128
  * Get a single message type by id
129
+ * @param bucketId - The bucket ID
119
130
  * @param typeId - The type ID
120
131
  * @returns The MessageType
121
132
  * @throws {BasecampError} If the resource is not found
122
133
  *
123
134
  * @example
124
135
  * ```ts
125
- * const result = await client.messageTypes.get(123);
136
+ * const result = await client.messageTypes.get(123, 123);
126
137
  * ```
127
138
  */
128
- async get(typeId: number): Promise<MessageType> {
139
+ async get(bucketId: number, typeId: number): Promise<MessageType> {
129
140
  const response = await this.request(
130
141
  {
131
142
  service: "MessageTypes",
132
143
  operation: "GetMessageType",
133
144
  resourceType: "message_type",
134
145
  isMutation: false,
146
+ projectId: bucketId,
135
147
  resourceId: typeId,
136
148
  },
137
149
  () =>
138
- this.client.GET("/categories/{typeId}", {
150
+ this.client.GET("/buckets/{bucketId}/categories/{typeId}", {
139
151
  params: {
140
- path: { typeId },
152
+ path: { bucketId, typeId },
141
153
  },
142
154
  })
143
155
  );
@@ -146,6 +158,7 @@ export class MessageTypesService extends BaseService {
146
158
 
147
159
  /**
148
160
  * Update an existing message type
161
+ * @param bucketId - The bucket ID
149
162
  * @param typeId - The type ID
150
163
  * @param req - Message_type update parameters
151
164
  * @returns The MessageType
@@ -153,22 +166,23 @@ export class MessageTypesService extends BaseService {
153
166
  *
154
167
  * @example
155
168
  * ```ts
156
- * const result = await client.messageTypes.update(123, { });
169
+ * const result = await client.messageTypes.update(123, 123, { });
157
170
  * ```
158
171
  */
159
- async update(typeId: number, req: UpdateMessageTypeRequest): Promise<MessageType> {
172
+ async update(bucketId: number, typeId: number, req: UpdateMessageTypeRequest): Promise<MessageType> {
160
173
  const response = await this.request(
161
174
  {
162
175
  service: "MessageTypes",
163
176
  operation: "UpdateMessageType",
164
177
  resourceType: "message_type",
165
178
  isMutation: true,
179
+ projectId: bucketId,
166
180
  resourceId: typeId,
167
181
  },
168
182
  () =>
169
- this.client.PUT("/categories/{typeId}", {
183
+ this.client.PUT("/buckets/{bucketId}/categories/{typeId}", {
170
184
  params: {
171
- path: { typeId },
185
+ path: { bucketId, typeId },
172
186
  },
173
187
  body: {
174
188
  name: req.name,
@@ -181,28 +195,30 @@ export class MessageTypesService extends BaseService {
181
195
 
182
196
  /**
183
197
  * Delete a message type
198
+ * @param bucketId - The bucket ID
184
199
  * @param typeId - The type ID
185
200
  * @returns void
186
201
  * @throws {BasecampError} If the request fails
187
202
  *
188
203
  * @example
189
204
  * ```ts
190
- * await client.messageTypes.delete(123);
205
+ * await client.messageTypes.delete(123, 123);
191
206
  * ```
192
207
  */
193
- async delete(typeId: number): Promise<void> {
208
+ async delete(bucketId: number, typeId: number): Promise<void> {
194
209
  await this.request(
195
210
  {
196
211
  service: "MessageTypes",
197
212
  operation: "DeleteMessageType",
198
213
  resourceType: "message_type",
199
214
  isMutation: true,
215
+ projectId: bucketId,
200
216
  resourceId: typeId,
201
217
  },
202
218
  () =>
203
- this.client.DELETE("/categories/{typeId}", {
219
+ this.client.DELETE("/buckets/{bucketId}/categories/{typeId}", {
204
220
  params: {
205
- path: { typeId },
221
+ path: { bucketId, typeId },
206
222
  },
207
223
  })
208
224
  );
@@ -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
  );
@@ -6,12 +6,16 @@
6
6
 
7
7
  import { BaseService } from "../../services/base.js";
8
8
  import type { components } from "../schema.js";
9
+ import { ListResult } from "../../pagination.js";
10
+ import type { PaginationOptions } from "../../pagination.js";
9
11
  import { Errors } from "../../errors.js";
10
12
 
11
13
  // =============================================================================
12
14
  // Types
13
15
  // =============================================================================
14
16
 
17
+ /** Notification entity from the Basecamp API. */
18
+ export type Notification = components["schemas"]["Notification"];
15
19
 
16
20
  /**
17
21
  * Options for myNotifications.
@@ -19,6 +23,19 @@ import { Errors } from "../../errors.js";
19
23
  export interface MyNotificationsMyNotificationOptions {
20
24
  /** Page number for paginating through read items. Defaults to 1. */
21
25
  page?: number;
26
+ /** Set to true to cap `bubble_ups` at 2 current bubble-ups and omit the
27
+ `scheduled_bubble_ups` key entirely. Defaults to false. Use the dedicated
28
+ bubble-ups endpoint (GetBubbleUps) to page through all current and
29
+ scheduled bubble-ups. */
30
+ limitBubbleUps?: boolean;
31
+ }
32
+
33
+ /**
34
+ * Options for bubbleUps.
35
+ */
36
+ export interface BubbleUpsMyNotificationOptions extends PaginationOptions {
37
+ /** Page number. Defaults to 1. */
38
+ page?: number;
22
39
  }
23
40
 
24
41
  /**
@@ -60,13 +77,41 @@ export class MyNotificationsService extends BaseService {
60
77
  () =>
61
78
  this.client.GET("/my/readings.json", {
62
79
  params: {
63
- query: { page: options?.page },
80
+ query: { page: options?.page, "limit_bubble_ups": options?.limitBubbleUps },
64
81
  },
65
82
  })
66
83
  );
67
84
  return response;
68
85
  }
69
86
 
87
+ /**
88
+ * Get the current user's current and scheduled bubble-ups (paginated, 50 per page).
89
+ * @param options - Optional query parameters
90
+ * @returns All Notification across all pages, with .meta.totalCount
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * const result = await client.myNotifications.bubbleUps();
95
+ * ```
96
+ */
97
+ async bubbleUps(options?: BubbleUpsMyNotificationOptions): Promise<ListResult<Notification>> {
98
+ return this.requestPaginated(
99
+ {
100
+ service: "MyNotifications",
101
+ operation: "GetBubbleUps",
102
+ resourceType: "bubble_up",
103
+ isMutation: false,
104
+ },
105
+ () =>
106
+ this.client.GET("/my/readings/bubble_ups.json", {
107
+ params: {
108
+ query: { page: options?.page },
109
+ },
110
+ })
111
+ , options
112
+ );
113
+ }
114
+
70
115
  /**
71
116
  * Mark specified items as read
72
117
  * @param req - Resource request parameters
@@ -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"]> {
@@ -42,7 +42,7 @@ export class RecordingsService extends BaseService {
42
42
 
43
43
  /**
44
44
  * List recordings of a given type across projects
45
- * @param type - Comment|Document|Kanban::Card|Kanban::Step|Message|Question::Answer|Schedule::Entry|Todo|Todolist|Upload|Vault
45
+ * @param type - Comment|Document|Door|Kanban::Card|Kanban::Step|Message|Question::Answer|Schedule::Entry|Todo|Todolist|Upload|Vault
46
46
  * @param options - Optional query parameters
47
47
  * @returns All Recording across all pages, with .meta.totalCount
48
48
  *
@@ -54,7 +54,7 @@ export class RecordingsService extends BaseService {
54
54
  * const filtered = await client.recordings.list("type", { bucket: [123] });
55
55
  * ```
56
56
  */
57
- async list(type: "Comment" | "Document" | "Kanban::Card" | "Kanban::Step" | "Message" | "Question::Answer" | "Schedule::Entry" | "Todo" | "Todolist" | "Upload" | "Vault", options?: ListRecordingOptions): Promise<ListResult<Recording>> {
57
+ async list(type: "Comment" | "Document" | "Door" | "Kanban::Card" | "Kanban::Step" | "Message" | "Question::Answer" | "Schedule::Entry" | "Todo" | "Todolist" | "Upload" | "Vault", options?: ListRecordingOptions): Promise<ListResult<Recording>> {
58
58
  return this.requestPaginated(
59
59
  {
60
60
  service: "Recordings",
@@ -31,7 +31,15 @@ export interface UpdateEntryScheduleRequest {
31
31
  endsAt?: string;
32
32
  /** Rich text description (HTML) */
33
33
  description?: string;
34
- /** Participant ids */
34
+ /** Replaces the entry's participants.
35
+
36
+ Omitting this member preserves the current participants; sending an empty
37
+ array clears them. That guarantee is BC3-side and recent: until
38
+ basecamp/bc3#12425, `Schedules::EntriesController#update` called
39
+ `replace_participants` unconditionally, so any update omitting the key —
40
+ including the shape in BC3's own "Update a schedule entry" doc example —
41
+ silently removed every participant and notified each one. The controller
42
+ now guards on the request actually addressing participants. */
35
43
  participantIds?: number[];
36
44
  /** All day */
37
45
  allDay?: boolean;
@@ -75,6 +83,8 @@ export interface CreateEntryScheduleRequest {
75
83
  notify?: boolean;
76
84
  /** Subscriptions */
77
85
  subscriptions?: number[];
86
+ /** Visible to clients */
87
+ visibleToClients?: boolean;
78
88
  }
79
89
 
80
90
 
@@ -330,6 +340,7 @@ export class SchedulesService extends BaseService {
330
340
  all_day: req.allDay,
331
341
  notify: req.notify,
332
342
  subscriptions: req.subscriptions,
343
+ visible_to_clients: req.visibleToClients,
333
344
  },
334
345
  })
335
346
  );
@@ -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
  );
@@ -23,6 +23,8 @@ export interface CreateToolRequest {
23
23
  toolType: string;
24
24
  /** Title for the new tool. When omitted, Basecamp assigns the next available default title for the tool type. */
25
25
  title?: string;
26
+ /** Create the tool already visible to clients. Honored only for tool types that manage their own client visibility (Chat::Transcript, Kanban::Board), which otherwise start hidden; every other tool type ignores it and inherits the project default. */
27
+ visibleToClients?: boolean;
26
28
  }
27
29
 
28
30
  /**
@@ -73,7 +75,7 @@ export class ToolsService extends BaseService {
73
75
  operation: "CreateTool",
74
76
  resourceType: "tool",
75
77
  isMutation: true,
76
- resourceId: bucketId,
78
+ projectId: bucketId,
77
79
  },
78
80
  () =>
79
81
  this.client.POST("/buckets/{bucketId}/dock/tools.json", {
@@ -83,6 +85,7 @@ export class ToolsService extends BaseService {
83
85
  body: {
84
86
  tool_type: req.toolType,
85
87
  title: req.title,
88
+ visible_to_clients: req.visibleToClients,
86
89
  },
87
90
  })
88
91
  );
@@ -51,6 +51,8 @@ export interface CreateUploadRequest {
51
51
  baseName?: string;
52
52
  /** Subscriptions */
53
53
  subscriptions?: number[];
54
+ /** Visible to clients */
55
+ visibleToClients?: boolean;
54
56
  }
55
57
 
56
58
 
@@ -222,6 +224,7 @@ export class UploadsService extends BaseService {
222
224
  description: req.description,
223
225
  base_name: req.baseName,
224
226
  subscriptions: req.subscriptions,
227
+ visible_to_clients: req.visibleToClients,
225
228
  },
226
229
  })
227
230
  );
@@ -75,7 +75,7 @@ export class WebhooksService extends BaseService {
75
75
  operation: "ListWebhooks",
76
76
  resourceType: "webhook",
77
77
  isMutation: false,
78
- resourceId: bucketId,
78
+ projectId: bucketId,
79
79
  },
80
80
  () =>
81
81
  this.client.GET("/buckets/{bucketId}/webhooks.json", {
@@ -112,7 +112,7 @@ export class WebhooksService extends BaseService {
112
112
  operation: "CreateWebhook",
113
113
  resourceType: "webhook",
114
114
  isMutation: true,
115
- resourceId: bucketId,
115
+ projectId: bucketId,
116
116
  },
117
117
  () =>
118
118
  this.client.POST("/buckets/{bucketId}/webhooks.json", {