@37signals/basecamp 0.7.3 → 0.8.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 (96) hide show
  1. package/README.md +80 -1
  2. package/dist/client.d.ts +4 -4
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +30 -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 +2670 -0
  14. package/dist/generated/metadata.js.map +1 -0
  15. package/dist/generated/{metadata.json → metadata.ts} +98 -45
  16. package/dist/generated/openapi-stripped.json +713 -440
  17. package/dist/generated/path-mapping.d.ts.map +1 -1
  18. package/dist/generated/path-mapping.js +6 -5
  19. package/dist/generated/path-mapping.js.map +1 -1
  20. package/dist/generated/path-mapping.ts +6 -5
  21. package/dist/generated/schema.d.ts +510 -297
  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 +54 -51
  30. package/dist/generated/services/card-columns.js.map +1 -1
  31. package/dist/generated/services/card-columns.ts +62 -59
  32. package/dist/generated/services/index.d.ts +2 -2
  33. package/dist/generated/services/index.d.ts.map +1 -1
  34. package/dist/generated/services/index.js +2 -2
  35. package/dist/generated/services/index.js.map +1 -1
  36. package/dist/generated/services/index.ts +2 -2
  37. package/dist/generated/services/reports.d.ts +1 -1
  38. package/dist/generated/services/reports.js +1 -1
  39. package/dist/generated/services/reports.ts +1 -1
  40. package/dist/generated/services/todos.d.ts +8 -8
  41. package/dist/generated/services/todos.d.ts.map +1 -1
  42. package/dist/generated/services/todos.js +9 -6
  43. package/dist/generated/services/todos.js.map +1 -1
  44. package/dist/generated/services/todos.ts +12 -9
  45. package/dist/generated/services/tools.d.ts +11 -10
  46. package/dist/generated/services/tools.d.ts.map +1 -1
  47. package/dist/generated/services/tools.js +16 -8
  48. package/dist/generated/services/tools.js.map +1 -1
  49. package/dist/generated/services/tools.ts +21 -13
  50. package/dist/index.d.ts +6 -4
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +3 -3
  53. package/dist/index.js.map +1 -1
  54. package/dist/oauth/discovery.d.ts +105 -23
  55. package/dist/oauth/discovery.d.ts.map +1 -1
  56. package/dist/oauth/discovery.js +453 -61
  57. package/dist/oauth/discovery.js.map +1 -1
  58. package/dist/oauth/index.d.ts +2 -2
  59. package/dist/oauth/index.d.ts.map +1 -1
  60. package/dist/oauth/index.js +1 -1
  61. package/dist/oauth/index.js.map +1 -1
  62. package/dist/oauth/interactive-login.d.ts +20 -2
  63. package/dist/oauth/interactive-login.d.ts.map +1 -1
  64. package/dist/oauth/interactive-login.js +58 -4
  65. package/dist/oauth/interactive-login.js.map +1 -1
  66. package/dist/oauth/types.d.ts +54 -2
  67. package/dist/oauth/types.d.ts.map +1 -1
  68. package/dist/security.d.ts +22 -0
  69. package/dist/security.d.ts.map +1 -1
  70. package/dist/security.js +56 -1
  71. package/dist/security.js.map +1 -1
  72. package/dist/services/authorization.d.ts.map +1 -1
  73. package/dist/services/authorization.js +3 -0
  74. package/dist/services/authorization.js.map +1 -1
  75. package/dist/services/base.d.ts.map +1 -1
  76. package/dist/services/base.js +1 -3
  77. package/dist/services/base.js.map +1 -1
  78. package/dist/services/todos-extensions.d.ts +118 -0
  79. package/dist/services/todos-extensions.d.ts.map +1 -0
  80. package/dist/services/todos-extensions.js +113 -0
  81. package/dist/services/todos-extensions.js.map +1 -0
  82. package/dist/services/uploads-extensions.d.ts +33 -0
  83. package/dist/services/uploads-extensions.d.ts.map +1 -0
  84. package/dist/services/uploads-extensions.js +48 -0
  85. package/dist/services/uploads-extensions.js.map +1 -0
  86. package/package.json +7 -4
  87. package/src/generated/{metadata.json → metadata.ts} +98 -45
  88. package/src/generated/openapi-stripped.json +713 -440
  89. package/src/generated/path-mapping.ts +6 -5
  90. package/src/generated/schema.d.ts +510 -297
  91. package/src/generated/services/campfires.ts +46 -1
  92. package/src/generated/services/card-columns.ts +62 -59
  93. package/src/generated/services/index.ts +2 -2
  94. package/src/generated/services/reports.ts +1 -1
  95. package/src/generated/services/todos.ts +12 -9
  96. package/src/generated/services/tools.ts +21 -13
@@ -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,37 @@ 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,
86
91
  resourceId: columnId,
87
92
  },
88
93
  () =>
89
- this.client.GET("/card_tables/columns/{columnId}", {
94
+ this.client.PUT("/buckets/{bucketId}/card_tables/columns/{columnId}/color.json", {
90
95
  params: {
91
- path: { columnId },
96
+ path: { bucketId, columnId },
97
+ },
98
+ body: {
99
+ color: req.color,
92
100
  },
93
101
  })
94
102
  );
@@ -96,34 +104,30 @@ export class CardColumnsService extends BaseService {
96
104
  }
97
105
 
98
106
  /**
99
- * Update an existing column
107
+ * Enable on-hold section in a column
108
+ * @param bucketId - The bucket ID
100
109
  * @param columnId - The column ID
101
- * @param req - Card_column update parameters
102
110
  * @returns The CardColumn
103
- * @throws {BasecampError} If the resource is not found or fields are invalid
111
+ * @throws {BasecampError} If the request fails
104
112
  *
105
113
  * @example
106
114
  * ```ts
107
- * const result = await client.cardColumns.update(123, { });
115
+ * const result = await client.cardColumns.enableOnHold(123, 123);
108
116
  * ```
109
117
  */
110
- async update(columnId: number, req: UpdateCardColumnRequest): Promise<CardColumn> {
118
+ async enableOnHold(bucketId: number, columnId: number): Promise<CardColumn> {
111
119
  const response = await this.request(
112
120
  {
113
121
  service: "CardColumns",
114
- operation: "UpdateCardColumn",
115
- resourceType: "card_column",
122
+ operation: "EnableCardColumnOnHold",
123
+ resourceType: "card_column_on_hold",
116
124
  isMutation: true,
117
125
  resourceId: columnId,
118
126
  },
119
127
  () =>
120
- this.client.PUT("/card_tables/columns/{columnId}", {
128
+ this.client.POST("/buckets/{bucketId}/card_tables/columns/{columnId}/on_hold.json", {
121
129
  params: {
122
- path: { columnId },
123
- },
124
- body: {
125
- title: req.title,
126
- description: req.description,
130
+ path: { bucketId, columnId },
127
131
  },
128
132
  })
129
133
  );
@@ -131,36 +135,30 @@ export class CardColumnsService extends BaseService {
131
135
  }
132
136
 
133
137
  /**
134
- * Set the color of a column
138
+ * Disable on-hold section in a column
139
+ * @param bucketId - The bucket ID
135
140
  * @param columnId - The column ID
136
- * @param req - Card_column_color request parameters
137
141
  * @returns The CardColumn
138
142
  * @throws {BasecampError} If the request fails
139
143
  *
140
144
  * @example
141
145
  * ```ts
142
- * const result = await client.cardColumns.setColor(123, { color: "example" });
146
+ * const result = await client.cardColumns.disableOnHold(123, 123);
143
147
  * ```
144
148
  */
145
- async setColor(columnId: number, req: SetColorCardColumnRequest): Promise<CardColumn> {
146
- if (!req.color) {
147
- throw Errors.validation("Color is required");
148
- }
149
+ async disableOnHold(bucketId: number, columnId: number): Promise<CardColumn> {
149
150
  const response = await this.request(
150
151
  {
151
152
  service: "CardColumns",
152
- operation: "SetCardColumnColor",
153
- resourceType: "card_column_color",
153
+ operation: "DisableCardColumnOnHold",
154
+ resourceType: "card_column_on_hold",
154
155
  isMutation: true,
155
156
  resourceId: columnId,
156
157
  },
157
158
  () =>
158
- this.client.PUT("/card_tables/columns/{columnId}/color.json", {
159
+ this.client.DELETE("/buckets/{bucketId}/card_tables/columns/{columnId}/on_hold.json", {
159
160
  params: {
160
- path: { columnId },
161
- },
162
- body: {
163
- color: req.color,
161
+ path: { bucketId, columnId },
164
162
  },
165
163
  })
166
164
  );
@@ -168,27 +166,27 @@ export class CardColumnsService extends BaseService {
168
166
  }
169
167
 
170
168
  /**
171
- * Enable on-hold section in a column
169
+ * Get a card column by ID
172
170
  * @param columnId - The column ID
173
171
  * @returns The CardColumn
174
- * @throws {BasecampError} If the request fails
172
+ * @throws {BasecampError} If the resource is not found
175
173
  *
176
174
  * @example
177
175
  * ```ts
178
- * const result = await client.cardColumns.enableOnHold(123);
176
+ * const result = await client.cardColumns.get(123);
179
177
  * ```
180
178
  */
181
- async enableOnHold(columnId: number): Promise<CardColumn> {
179
+ async get(columnId: number): Promise<CardColumn> {
182
180
  const response = await this.request(
183
181
  {
184
182
  service: "CardColumns",
185
- operation: "EnableCardColumnOnHold",
186
- resourceType: "card_column_on_hold",
187
- isMutation: true,
183
+ operation: "GetCardColumn",
184
+ resourceType: "card_column",
185
+ isMutation: false,
188
186
  resourceId: columnId,
189
187
  },
190
188
  () =>
191
- this.client.POST("/card_tables/columns/{columnId}/on_hold.json", {
189
+ this.client.GET("/card_tables/columns/{columnId}", {
192
190
  params: {
193
191
  path: { columnId },
194
192
  },
@@ -198,30 +196,35 @@ export class CardColumnsService extends BaseService {
198
196
  }
199
197
 
200
198
  /**
201
- * Disable on-hold section in a column
199
+ * Update an existing column
202
200
  * @param columnId - The column ID
201
+ * @param req - Card_column update parameters
203
202
  * @returns The CardColumn
204
- * @throws {BasecampError} If the request fails
203
+ * @throws {BasecampError} If the resource is not found or fields are invalid
205
204
  *
206
205
  * @example
207
206
  * ```ts
208
- * const result = await client.cardColumns.disableOnHold(123);
207
+ * const result = await client.cardColumns.update(123, { });
209
208
  * ```
210
209
  */
211
- async disableOnHold(columnId: number): Promise<CardColumn> {
210
+ async update(columnId: number, req: UpdateCardColumnRequest): Promise<CardColumn> {
212
211
  const response = await this.request(
213
212
  {
214
213
  service: "CardColumns",
215
- operation: "DisableCardColumnOnHold",
216
- resourceType: "card_column_on_hold",
214
+ operation: "UpdateCardColumn",
215
+ resourceType: "card_column",
217
216
  isMutation: true,
218
217
  resourceId: columnId,
219
218
  },
220
219
  () =>
221
- this.client.DELETE("/card_tables/columns/{columnId}/on_hold.json", {
220
+ this.client.PUT("/card_tables/columns/{columnId}", {
222
221
  params: {
223
222
  path: { columnId },
224
223
  },
224
+ body: {
225
+ title: req.title,
226
+ description: req.description,
227
+ },
225
228
  })
226
229
  );
227
230
  return response;
@@ -1,10 +1,11 @@
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 { ToolsService } from "./tools.js";
4
6
  export { WebhooksService } from "./webhooks.js";
5
7
  export { CardsService } from "./cards.js";
6
8
  export { CardStepsService } from "./card-steps.js";
7
- export { CardColumnsService } from "./card-columns.js";
8
9
  export { CardTablesService } from "./card-tables.js";
9
10
  export { MessageTypesService } from "./message-types.js";
10
11
  export { CampfiresService } from "./campfires.js";
@@ -13,7 +14,6 @@ export { ClientApprovalsService } from "./client-approvals.js";
13
14
  export { ClientCorrespondencesService } from "./client-correspondences.js";
14
15
  export { ClientRepliesService } from "./client-replies.js";
15
16
  export { CommentsService } from "./comments.js";
16
- export { ToolsService } from "./tools.js";
17
17
  export { DocumentsService } from "./documents.js";
18
18
  export { GaugesService } from "./gauges.js";
19
19
  export { ForwardsService } from "./forwards.js";
@@ -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
  *
@@ -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,
@@ -16,12 +16,12 @@ import { Errors } from "../../errors.js";
16
16
  export type Tool = components["schemas"]["Tool"];
17
17
 
18
18
  /**
19
- * Request parameters for clone.
19
+ * Request parameters for create.
20
20
  */
21
- export interface CloneToolRequest {
22
- /** Source recording id */
23
- sourceRecordingId: number;
24
- /** Title */
21
+ export interface CreateToolRequest {
22
+ /** Tool type to add to the project dock. Values: Chat::Transcript|Inbox|Kanban::Board|Message::Board|Questionnaire|Schedule|Todoset|Vault. */
23
+ toolType: string;
24
+ /** Title for the new tool. When omitted, Basecamp assigns the next available default title for the tool type. */
25
25
  title?: string;
26
26
  }
27
27
 
@@ -52,28 +52,36 @@ export interface RepositionToolRequest {
52
52
  export class ToolsService extends BaseService {
53
53
 
54
54
  /**
55
- * Clone an existing tool to create a new one
56
- * @param req - Tool request parameters
55
+ * Create a tool in a project dock
56
+ * @param bucketId - The bucket ID
57
+ * @param req - Tool creation parameters
57
58
  * @returns The Tool
58
- * @throws {BasecampError} If the request fails
59
+ * @throws {BasecampError} If required fields are missing or invalid
59
60
  *
60
61
  * @example
61
62
  * ```ts
62
- * const result = await client.tools.clone({ sourceRecordingId: 1 });
63
+ * const result = await client.tools.create(123, { toolType: "example" });
63
64
  * ```
64
65
  */
65
- async clone(req: CloneToolRequest): Promise<Tool> {
66
+ async create(bucketId: number, req: CreateToolRequest): Promise<Tool> {
67
+ if (!req.toolType) {
68
+ throw Errors.validation("Tool type is required");
69
+ }
66
70
  const response = await this.request(
67
71
  {
68
72
  service: "Tools",
69
- operation: "CloneTool",
73
+ operation: "CreateTool",
70
74
  resourceType: "tool",
71
75
  isMutation: true,
76
+ resourceId: bucketId,
72
77
  },
73
78
  () =>
74
- this.client.POST("/dock/tools.json", {
79
+ this.client.POST("/buckets/{bucketId}/dock/tools.json", {
80
+ params: {
81
+ path: { bucketId },
82
+ },
75
83
  body: {
76
- source_recording_id: req.sourceRecordingId,
84
+ tool_type: req.toolType,
77
85
  title: req.title,
78
86
  },
79
87
  })