@37signals/basecamp 0.9.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 (81) hide show
  1. package/README.md +1 -1
  2. package/dist/client.d.ts +6 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +33 -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 +290 -12
  8. package/dist/generated/metadata.js.map +1 -1
  9. package/dist/generated/metadata.ts +290 -12
  10. package/dist/generated/openapi-stripped.json +6274 -3872
  11. package/dist/generated/path-mapping.d.ts.map +1 -1
  12. package/dist/generated/path-mapping.js +23 -5
  13. package/dist/generated/path-mapping.js.map +1 -1
  14. package/dist/generated/path-mapping.ts +23 -5
  15. package/dist/generated/schema.d.ts +3004 -1145
  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/cards.d.ts +4 -4
  22. package/dist/generated/services/cards.d.ts.map +1 -1
  23. package/dist/generated/services/cards.js +2 -2
  24. package/dist/generated/services/cards.js.map +1 -1
  25. package/dist/generated/services/cards.ts +4 -4
  26. package/dist/generated/services/everything.d.ts +323 -0
  27. package/dist/generated/services/everything.d.ts.map +1 -0
  28. package/dist/generated/services/everything.js +381 -0
  29. package/dist/generated/services/everything.js.map +1 -0
  30. package/dist/generated/services/everything.ts +632 -0
  31. package/dist/generated/services/index.d.ts +2 -1
  32. package/dist/generated/services/index.d.ts.map +1 -1
  33. package/dist/generated/services/index.js +2 -1
  34. package/dist/generated/services/index.js.map +1 -1
  35. package/dist/generated/services/index.ts +2 -1
  36. package/dist/generated/services/message-types.d.ts +15 -10
  37. package/dist/generated/services/message-types.d.ts.map +1 -1
  38. package/dist/generated/services/message-types.js +35 -18
  39. package/dist/generated/services/message-types.js.map +1 -1
  40. package/dist/generated/services/message-types.ts +34 -18
  41. package/dist/generated/services/my-notifications.d.ts +27 -0
  42. package/dist/generated/services/my-notifications.d.ts.map +1 -1
  43. package/dist/generated/services/my-notifications.js +23 -1
  44. package/dist/generated/services/my-notifications.js.map +1 -1
  45. package/dist/generated/services/my-notifications.ts +46 -1
  46. package/dist/generated/services/recordings.d.ts +2 -2
  47. package/dist/generated/services/recordings.d.ts.map +1 -1
  48. package/dist/generated/services/recordings.js +1 -1
  49. package/dist/generated/services/recordings.js.map +1 -1
  50. package/dist/generated/services/recordings.ts +2 -2
  51. package/dist/generated/services/schedules.d.ts +9 -1
  52. package/dist/generated/services/schedules.d.ts.map +1 -1
  53. package/dist/generated/services/schedules.js.map +1 -1
  54. package/dist/generated/services/schedules.ts +9 -1
  55. package/dist/generated/services/tools.d.ts +2 -0
  56. package/dist/generated/services/tools.d.ts.map +1 -1
  57. package/dist/generated/services/tools.js +1 -0
  58. package/dist/generated/services/tools.js.map +1 -1
  59. package/dist/generated/services/tools.ts +3 -0
  60. package/dist/index.d.ts +4 -2
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +6 -1
  63. package/dist/index.js.map +1 -1
  64. package/dist/services/cards-extensions.d.ts +76 -0
  65. package/dist/services/cards-extensions.d.ts.map +1 -0
  66. package/dist/services/cards-extensions.js +67 -0
  67. package/dist/services/cards-extensions.js.map +1 -0
  68. package/package.json +2 -2
  69. package/src/generated/metadata.ts +290 -12
  70. package/src/generated/openapi-stripped.json +6274 -3872
  71. package/src/generated/path-mapping.ts +23 -5
  72. package/src/generated/schema.d.ts +3004 -1145
  73. package/src/generated/services/boosts.ts +12 -10
  74. package/src/generated/services/cards.ts +4 -4
  75. package/src/generated/services/everything.ts +632 -0
  76. package/src/generated/services/index.ts +2 -1
  77. package/src/generated/services/message-types.ts +34 -18
  78. package/src/generated/services/my-notifications.ts +46 -1
  79. package/src/generated/services/recordings.ts +2 -2
  80. package/src/generated/services/schedules.ts +9 -1
  81. package/src/generated/services/tools.ts +3 -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
  );
@@ -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
@@ -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;
@@ -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
  /**
@@ -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
  );