@37signals/basecamp 0.8.0 → 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 (105) hide show
  1. package/README.md +2 -1
  2. package/dist/client.d.ts +5 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +4 -2
  5. package/dist/client.js.map +1 -1
  6. package/dist/generated/metadata.d.ts.map +1 -1
  7. package/dist/generated/metadata.js +54 -1
  8. package/dist/generated/metadata.js.map +1 -1
  9. package/dist/generated/metadata.ts +54 -1
  10. package/dist/generated/openapi-stripped.json +987 -25
  11. package/dist/generated/path-mapping.d.ts.map +1 -1
  12. package/dist/generated/path-mapping.js +4 -0
  13. package/dist/generated/path-mapping.js.map +1 -1
  14. package/dist/generated/path-mapping.ts +4 -0
  15. package/dist/generated/schema.d.ts +558 -9
  16. package/dist/generated/services/card-columns.d.ts.map +1 -1
  17. package/dist/generated/services/card-columns.js +3 -0
  18. package/dist/generated/services/card-columns.js.map +1 -1
  19. package/dist/generated/services/card-columns.ts +3 -0
  20. package/dist/generated/services/checkins.d.ts +3 -1
  21. package/dist/generated/services/checkins.d.ts.map +1 -1
  22. package/dist/generated/services/checkins.js +2 -1
  23. package/dist/generated/services/checkins.js.map +1 -1
  24. package/dist/generated/services/checkins.ts +4 -1
  25. package/dist/generated/services/documents.d.ts +2 -0
  26. package/dist/generated/services/documents.d.ts.map +1 -1
  27. package/dist/generated/services/documents.js +1 -0
  28. package/dist/generated/services/documents.js.map +1 -1
  29. package/dist/generated/services/documents.ts +3 -0
  30. package/dist/generated/services/gauges.d.ts +2 -2
  31. package/dist/generated/services/gauges.js +2 -2
  32. package/dist/generated/services/gauges.ts +2 -2
  33. package/dist/generated/services/index.d.ts +1 -0
  34. package/dist/generated/services/index.d.ts.map +1 -1
  35. package/dist/generated/services/index.js +1 -0
  36. package/dist/generated/services/index.js.map +1 -1
  37. package/dist/generated/services/index.ts +1 -0
  38. package/dist/generated/services/messages.d.ts +2 -0
  39. package/dist/generated/services/messages.d.ts.map +1 -1
  40. package/dist/generated/services/messages.js +1 -0
  41. package/dist/generated/services/messages.js.map +1 -1
  42. package/dist/generated/services/messages.ts +3 -0
  43. package/dist/generated/services/people.d.ts +2 -2
  44. package/dist/generated/services/people.js +2 -2
  45. package/dist/generated/services/people.ts +2 -2
  46. package/dist/generated/services/schedules.d.ts +2 -0
  47. package/dist/generated/services/schedules.d.ts.map +1 -1
  48. package/dist/generated/services/schedules.js +1 -0
  49. package/dist/generated/services/schedules.js.map +1 -1
  50. package/dist/generated/services/schedules.ts +3 -0
  51. package/dist/generated/services/search.d.ts +30 -1
  52. package/dist/generated/services/search.d.ts.map +1 -1
  53. package/dist/generated/services/search.js +1 -1
  54. package/dist/generated/services/search.js.map +1 -1
  55. package/dist/generated/services/search.ts +31 -2
  56. package/dist/generated/services/templates.d.ts +3 -5
  57. package/dist/generated/services/templates.d.ts.map +1 -1
  58. package/dist/generated/services/templates.js +4 -5
  59. package/dist/generated/services/templates.js.map +1 -1
  60. package/dist/generated/services/templates.ts +6 -9
  61. package/dist/generated/services/todolists.d.ts +22 -0
  62. package/dist/generated/services/todolists.d.ts.map +1 -1
  63. package/dist/generated/services/todolists.js +31 -0
  64. package/dist/generated/services/todolists.js.map +1 -1
  65. package/dist/generated/services/todolists.ts +46 -0
  66. package/dist/generated/services/tools.js +1 -1
  67. package/dist/generated/services/tools.js.map +1 -1
  68. package/dist/generated/services/tools.ts +1 -1
  69. package/dist/generated/services/uploads.d.ts +2 -0
  70. package/dist/generated/services/uploads.d.ts.map +1 -1
  71. package/dist/generated/services/uploads.js +1 -0
  72. package/dist/generated/services/uploads.js.map +1 -1
  73. package/dist/generated/services/uploads.ts +3 -0
  74. package/dist/generated/services/webhooks.js +2 -2
  75. package/dist/generated/services/webhooks.js.map +1 -1
  76. package/dist/generated/services/webhooks.ts +2 -2
  77. package/dist/generated/services/wormholes.d.ts +70 -0
  78. package/dist/generated/services/wormholes.d.ts.map +1 -0
  79. package/dist/generated/services/wormholes.js +103 -0
  80. package/dist/generated/services/wormholes.js.map +1 -0
  81. package/dist/generated/services/wormholes.ts +145 -0
  82. package/dist/index.d.ts +2 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +1 -0
  85. package/dist/index.js.map +1 -1
  86. package/package.json +1 -1
  87. package/src/generated/metadata.ts +54 -1
  88. package/src/generated/openapi-stripped.json +987 -25
  89. package/src/generated/path-mapping.ts +4 -0
  90. package/src/generated/schema.d.ts +558 -9
  91. package/src/generated/services/card-columns.ts +3 -0
  92. package/src/generated/services/checkins.ts +4 -1
  93. package/src/generated/services/documents.ts +3 -0
  94. package/src/generated/services/gauges.ts +2 -2
  95. package/src/generated/services/index.ts +1 -0
  96. package/src/generated/services/messages.ts +3 -0
  97. package/src/generated/services/people.ts +2 -2
  98. package/src/generated/services/schedules.ts +3 -0
  99. package/src/generated/services/search.ts +31 -2
  100. package/src/generated/services/templates.ts +6 -9
  101. package/src/generated/services/todolists.ts +46 -0
  102. package/src/generated/services/tools.ts +1 -1
  103. package/src/generated/services/uploads.ts +3 -0
  104. package/src/generated/services/webhooks.ts +2 -2
  105. package/src/generated/services/wormholes.ts +145 -0
@@ -88,6 +88,7 @@ export class CardColumnsService extends BaseService {
88
88
  operation: "SetCardColumnColor",
89
89
  resourceType: "card_column_color",
90
90
  isMutation: true,
91
+ projectId: bucketId,
91
92
  resourceId: columnId,
92
93
  },
93
94
  () =>
@@ -122,6 +123,7 @@ export class CardColumnsService extends BaseService {
122
123
  operation: "EnableCardColumnOnHold",
123
124
  resourceType: "card_column_on_hold",
124
125
  isMutation: true,
126
+ projectId: bucketId,
125
127
  resourceId: columnId,
126
128
  },
127
129
  () =>
@@ -153,6 +155,7 @@ export class CardColumnsService extends BaseService {
153
155
  operation: "DisableCardColumnOnHold",
154
156
  resourceType: "card_column_on_hold",
155
157
  isMutation: true,
158
+ projectId: bucketId,
156
159
  resourceId: columnId,
157
160
  },
158
161
  () =>
@@ -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"]> {
@@ -2,6 +2,7 @@ export { AccountService } from "./account.js";
2
2
  export { AttachmentsService } from "./attachments.js";
3
3
  export { BoostsService } from "./boosts.js";
4
4
  export { CardColumnsService } from "./card-columns.js";
5
+ export { WormholesService } from "./wormholes.js";
5
6
  export { ToolsService } from "./tools.js";
6
7
  export { WebhooksService } from "./webhooks.js";
7
8
  export { CardsService } from "./cards.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"]> {
@@ -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
  );
@@ -73,7 +73,7 @@ export class ToolsService extends BaseService {
73
73
  operation: "CreateTool",
74
74
  resourceType: "tool",
75
75
  isMutation: true,
76
- resourceId: bucketId,
76
+ projectId: bucketId,
77
77
  },
78
78
  () =>
79
79
  this.client.POST("/buckets/{bucketId}/dock/tools.json", {
@@ -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", {
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Wormholes service for the Basecamp API.
3
+ *
4
+ * @generated from OpenAPI spec - do not edit directly
5
+ */
6
+
7
+ import { BaseService } from "../../services/base.js";
8
+ import type { components } from "../schema.js";
9
+
10
+ // =============================================================================
11
+ // Types
12
+ // =============================================================================
13
+
14
+ /** Wormhole entity from the Basecamp API. */
15
+ export type Wormhole = components["schemas"]["Wormhole"];
16
+
17
+ /**
18
+ * Request parameters for update.
19
+ */
20
+ export interface UpdateWormholeRequest {
21
+ /** Id of the new destination column (on another accessible card table). */
22
+ destinationRecordingId: number;
23
+ }
24
+
25
+ /**
26
+ * Request parameters for create.
27
+ */
28
+ export interface CreateWormholeRequest {
29
+ /** Id of the destination column (on another accessible card table) to link to. */
30
+ destinationRecordingId: number;
31
+ }
32
+
33
+
34
+ // =============================================================================
35
+ // Service
36
+ // =============================================================================
37
+
38
+ /**
39
+ * Service for Wormholes operations.
40
+ */
41
+ export class WormholesService extends BaseService {
42
+
43
+ /**
44
+ * Update a wormhole's destination column
45
+ * @param bucketId - The bucket ID
46
+ * @param wormholeId - The wormhole ID
47
+ * @param req - Wormhole update parameters
48
+ * @returns The Wormhole
49
+ * @throws {BasecampError} If the resource is not found or fields are invalid
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const result = await client.wormholes.update(123, 123, { destinationRecordingId: 1 });
54
+ * ```
55
+ */
56
+ async update(bucketId: number, wormholeId: number, req: UpdateWormholeRequest): Promise<Wormhole> {
57
+ const response = await this.request(
58
+ {
59
+ service: "Wormholes",
60
+ operation: "UpdateWormhole",
61
+ resourceType: "wormhole",
62
+ isMutation: true,
63
+ projectId: bucketId,
64
+ resourceId: wormholeId,
65
+ },
66
+ () =>
67
+ this.client.PUT("/buckets/{bucketId}/card_tables/wormholes/{wormholeId}", {
68
+ params: {
69
+ path: { bucketId, wormholeId },
70
+ },
71
+ body: {
72
+ destination_recording_id: req.destinationRecordingId,
73
+ },
74
+ })
75
+ );
76
+ return response;
77
+ }
78
+
79
+ /**
80
+ * Delete a wormhole
81
+ * @param bucketId - The bucket ID
82
+ * @param wormholeId - The wormhole ID
83
+ * @returns void
84
+ * @throws {BasecampError} If the request fails
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * await client.wormholes.delete(123, 123);
89
+ * ```
90
+ */
91
+ async delete(bucketId: number, wormholeId: number): Promise<void> {
92
+ await this.request(
93
+ {
94
+ service: "Wormholes",
95
+ operation: "DeleteWormhole",
96
+ resourceType: "wormhole",
97
+ isMutation: true,
98
+ projectId: bucketId,
99
+ resourceId: wormholeId,
100
+ },
101
+ () =>
102
+ this.client.DELETE("/buckets/{bucketId}/card_tables/wormholes/{wormholeId}", {
103
+ params: {
104
+ path: { bucketId, wormholeId },
105
+ },
106
+ })
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Create a wormhole linking this card table to a column on another card table.
112
+ * @param bucketId - The bucket ID
113
+ * @param cardTableId - The card table ID
114
+ * @param req - Wormhole creation parameters
115
+ * @returns The Wormhole
116
+ * @throws {BasecampError} If required fields are missing or invalid
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * const result = await client.wormholes.create(123, 123, { destinationRecordingId: 1 });
121
+ * ```
122
+ */
123
+ async create(bucketId: number, cardTableId: number, req: CreateWormholeRequest): Promise<Wormhole> {
124
+ const response = await this.request(
125
+ {
126
+ service: "Wormholes",
127
+ operation: "CreateWormhole",
128
+ resourceType: "wormhole",
129
+ isMutation: true,
130
+ projectId: bucketId,
131
+ resourceId: cardTableId,
132
+ },
133
+ () =>
134
+ this.client.POST("/buckets/{bucketId}/card_tables/{cardTableId}/wormholes.json", {
135
+ params: {
136
+ path: { bucketId, cardTableId },
137
+ },
138
+ body: {
139
+ destination_recording_id: req.destinationRecordingId,
140
+ },
141
+ })
142
+ );
143
+ return response;
144
+ }
145
+ }