@37signals/basecamp 0.11.0 → 0.12.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 (80) hide show
  1. package/dist/client.d.ts +14 -2
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +200 -162
  4. package/dist/client.js.map +1 -1
  5. package/dist/errors.d.ts +1 -1
  6. package/dist/errors.js +1 -1
  7. package/dist/generated/metadata.d.ts.map +1 -1
  8. package/dist/generated/metadata.js +172 -1
  9. package/dist/generated/metadata.js.map +1 -1
  10. package/dist/generated/metadata.ts +172 -1
  11. package/dist/generated/openapi-stripped.json +2074 -134
  12. package/dist/generated/path-mapping.d.ts.map +1 -1
  13. package/dist/generated/path-mapping.js +13 -0
  14. package/dist/generated/path-mapping.js.map +1 -1
  15. package/dist/generated/path-mapping.ts +13 -0
  16. package/dist/generated/schema.d.ts +1361 -25
  17. package/dist/generated/services/bookmarks.d.ts +76 -0
  18. package/dist/generated/services/bookmarks.d.ts.map +1 -0
  19. package/dist/generated/services/bookmarks.js +114 -0
  20. package/dist/generated/services/bookmarks.js.map +1 -0
  21. package/dist/generated/services/bookmarks.ts +158 -0
  22. package/dist/generated/services/calendars.d.ts +47 -0
  23. package/dist/generated/services/calendars.d.ts.map +1 -0
  24. package/dist/generated/services/calendars.js +73 -0
  25. package/dist/generated/services/calendars.js.map +1 -0
  26. package/dist/generated/services/calendars.ts +102 -0
  27. package/dist/generated/services/drafts.d.ts +38 -0
  28. package/dist/generated/services/drafts.d.ts.map +1 -0
  29. package/dist/generated/services/drafts.js +40 -0
  30. package/dist/generated/services/drafts.js.map +1 -0
  31. package/dist/generated/services/drafts.ts +67 -0
  32. package/dist/generated/services/everything.d.ts +69 -2
  33. package/dist/generated/services/everything.d.ts.map +1 -1
  34. package/dist/generated/services/everything.js +23 -13
  35. package/dist/generated/services/everything.js.map +1 -1
  36. package/dist/generated/services/everything.ts +86 -11
  37. package/dist/generated/services/index.d.ts +5 -1
  38. package/dist/generated/services/index.d.ts.map +1 -1
  39. package/dist/generated/services/index.js +5 -1
  40. package/dist/generated/services/index.js.map +1 -1
  41. package/dist/generated/services/index.ts +5 -1
  42. package/dist/generated/services/my-assignments.d.ts +52 -0
  43. package/dist/generated/services/my-assignments.d.ts.map +1 -1
  44. package/dist/generated/services/my-assignments.js +71 -0
  45. package/dist/generated/services/my-assignments.js.map +1 -1
  46. package/dist/generated/services/my-assignments.ts +104 -0
  47. package/dist/generated/services/my-notes.d.ts +45 -0
  48. package/dist/generated/services/my-notes.d.ts.map +1 -0
  49. package/dist/generated/services/my-notes.js +62 -0
  50. package/dist/generated/services/my-notes.js.map +1 -0
  51. package/dist/generated/services/my-notes.ts +92 -0
  52. package/dist/generated/services/todos.d.ts +33 -0
  53. package/dist/generated/services/todos.d.ts.map +1 -1
  54. package/dist/generated/services/todos.js +46 -0
  55. package/dist/generated/services/todos.js.map +1 -1
  56. package/dist/generated/services/todos.ts +71 -0
  57. package/dist/hooks/otel.d.ts +1 -1
  58. package/dist/hooks/otel.js +1 -1
  59. package/dist/index.d.ts +6 -2
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +5 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/oauth/discovery.d.ts.map +1 -1
  64. package/dist/oauth/discovery.js +1 -0
  65. package/dist/oauth/discovery.js.map +1 -1
  66. package/dist/pagination.d.ts +1 -1
  67. package/dist/pagination.js +1 -1
  68. package/package.json +1 -1
  69. package/src/generated/metadata.ts +172 -1
  70. package/src/generated/openapi-stripped.json +2074 -134
  71. package/src/generated/path-mapping.ts +13 -0
  72. package/src/generated/schema.d.ts +1361 -25
  73. package/src/generated/services/bookmarks.ts +158 -0
  74. package/src/generated/services/calendars.ts +102 -0
  75. package/src/generated/services/drafts.ts +67 -0
  76. package/src/generated/services/everything.ts +86 -11
  77. package/src/generated/services/index.ts +5 -1
  78. package/src/generated/services/my-assignments.ts +104 -0
  79. package/src/generated/services/my-notes.ts +92 -0
  80. package/src/generated/services/todos.ts +71 -0
@@ -21,6 +21,24 @@ due_later_this_week, due_next_week, due_later */
21
21
  scope?: string;
22
22
  }
23
23
 
24
+ /**
25
+ * Request parameters for prioritizeAssignment.
26
+ */
27
+ export interface PrioritizeAssignmentMyAssignmentRequest {
28
+ /** The recording id to prioritize. */
29
+ id: number;
30
+ }
31
+
32
+ /**
33
+ * Request parameters for reorderUpNext.
34
+ */
35
+ export interface ReorderUpNextMyAssignmentRequest {
36
+ /** The recording id to move, chosen the same way as when prioritizing. */
37
+ sourceId: number;
38
+ /** The 1-based position to move it to. */
39
+ position: number;
40
+ }
41
+
24
42
 
25
43
  // =============================================================================
26
44
  // Service
@@ -106,4 +124,90 @@ export class MyAssignmentsService extends BaseService {
106
124
  );
107
125
  return response ?? [];
108
126
  }
127
+
128
+ /**
129
+ * Add a recording to Up Next — the current user's ordered list of prioritized
130
+ * @param req - Resource request parameters
131
+ * @returns void
132
+ * @throws {BasecampError} If the request fails
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * await client.myAssignments.prioritizeAssignment({ id: 1 });
137
+ * ```
138
+ */
139
+ async prioritizeAssignment(req: PrioritizeAssignmentMyAssignmentRequest): Promise<void> {
140
+ await this.request(
141
+ {
142
+ service: "MyAssignments",
143
+ operation: "PrioritizeAssignment",
144
+ resourceType: "resource",
145
+ isMutation: true,
146
+ },
147
+ () =>
148
+ this.client.POST("/my/priorities.json", {
149
+ body: {
150
+ id: req.id,
151
+ },
152
+ })
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Remove a recording from Up Next. Exact-target:
158
+ * @param recordingId - The recording ID
159
+ * @returns void
160
+ * @throws {BasecampError} If the request fails
161
+ *
162
+ * @example
163
+ * ```ts
164
+ * await client.myAssignments.deprioritizeAssignment(123);
165
+ * ```
166
+ */
167
+ async deprioritizeAssignment(recordingId: number): Promise<void> {
168
+ await this.request(
169
+ {
170
+ service: "MyAssignments",
171
+ operation: "DeprioritizeAssignment",
172
+ resourceType: "resource",
173
+ isMutation: true,
174
+ resourceId: recordingId,
175
+ },
176
+ () =>
177
+ this.client.DELETE("/my/priorities/{recordingId}", {
178
+ params: {
179
+ path: { recordingId },
180
+ },
181
+ })
182
+ );
183
+ }
184
+
185
+ /**
186
+ * Move an already-prioritized recording to a new 1-based position in Up Next
187
+ * @param req - Resource request parameters
188
+ * @returns void
189
+ * @throws {BasecampError} If the request fails
190
+ *
191
+ * @example
192
+ * ```ts
193
+ * await client.myAssignments.reorderUpNext({ sourceId: 1, position: 1 });
194
+ * ```
195
+ */
196
+ async reorderUpNext(req: ReorderUpNextMyAssignmentRequest): Promise<void> {
197
+ await this.request(
198
+ {
199
+ service: "MyAssignments",
200
+ operation: "ReorderUpNext",
201
+ resourceType: "resource",
202
+ isMutation: true,
203
+ },
204
+ () =>
205
+ this.client.POST("/my/priority_moves.json", {
206
+ body: {
207
+ source_id: req.sourceId,
208
+ position: req.position,
209
+ },
210
+ })
211
+ );
212
+ }
109
213
  }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * MyNotes 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
+ import { Errors } from "../../errors.js";
10
+
11
+ // =============================================================================
12
+ // Types
13
+ // =============================================================================
14
+
15
+ /** MyNote entity from the Basecamp API. */
16
+ export type MyNote = components["schemas"]["MyNote"];
17
+
18
+ /**
19
+ * Request parameters for updateMyNote.
20
+ */
21
+ export interface UpdateMyNoteMyNoteRequest {
22
+ /** Note */
23
+ note: components["schemas"]["MyNoteAttributes"];
24
+ }
25
+
26
+
27
+ // =============================================================================
28
+ // Service
29
+ // =============================================================================
30
+
31
+ /**
32
+ * Service for MyNotes operations.
33
+ */
34
+ export class MyNotesService extends BaseService {
35
+
36
+ /**
37
+ * Get the authenticated user's note — a per-person notebook singleton at
38
+ * @returns The MyNote
39
+ * @throws {BasecampError} If the resource is not found
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const result = await client.myNotes.getMyNote();
44
+ * ```
45
+ */
46
+ async getMyNote(): Promise<MyNote> {
47
+ const response = await this.request(
48
+ {
49
+ service: "MyNotes",
50
+ operation: "GetMyNote",
51
+ resourceType: "my_note",
52
+ isMutation: false,
53
+ },
54
+ () =>
55
+ this.client.GET("/my/notes.json", {
56
+ })
57
+ );
58
+ return response;
59
+ }
60
+
61
+ /**
62
+ * Replace the note's content, recording a new revision server-side. The first
63
+ * @param req - My_note update parameters
64
+ * @returns The MyNote
65
+ * @throws {BasecampError} If the resource is not found or fields are invalid
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const result = await client.myNotes.updateMyNote({ note: { content: "Hello world" } });
70
+ * ```
71
+ */
72
+ async updateMyNote(req: UpdateMyNoteMyNoteRequest): Promise<MyNote> {
73
+ if (!req.note) {
74
+ throw Errors.validation("Note is required");
75
+ }
76
+ const response = await this.request(
77
+ {
78
+ service: "MyNotes",
79
+ operation: "UpdateMyNote",
80
+ resourceType: "my_note",
81
+ isMutation: true,
82
+ },
83
+ () =>
84
+ this.client.PUT("/my/notes.json", {
85
+ body: {
86
+ note: req.note,
87
+ },
88
+ })
89
+ );
90
+ return response;
91
+ }
92
+ }
@@ -17,6 +17,26 @@ import { Errors } from "../../errors.js";
17
17
  /** Todo entity from the Basecamp API. */
18
18
  export type Todo = components["schemas"]["Todo"];
19
19
 
20
+ /**
21
+ * Request parameters for createTodosetTodo.
22
+ */
23
+ export interface CreateTodosetTodoTodoRequest {
24
+ /** Text content */
25
+ content: string;
26
+ /** Rich text description (HTML) */
27
+ description?: string;
28
+ /** Person IDs to assign to */
29
+ assigneeIds?: number[];
30
+ /** Person IDs to notify on completion */
31
+ completionSubscriberIds?: number[];
32
+ /** Whether to send notifications to relevant people */
33
+ notify?: boolean;
34
+ /** Due date (YYYY-MM-DD) */
35
+ dueOn?: string;
36
+ /** Start date (YYYY-MM-DD) */
37
+ startsOn?: string;
38
+ }
39
+
20
40
  /**
21
41
  * Options for list.
22
42
  */
@@ -87,6 +107,57 @@ export interface RepositionTodoRequest {
87
107
  */
88
108
  export class TodosService extends BaseService {
89
109
 
110
+ /**
111
+ * Create a to-do directly under a project's to-do set, outside any to-do list.
112
+ * @param bucketId - The bucket ID
113
+ * @param todosetId - The todoset ID
114
+ * @param req - Todo creation parameters
115
+ * @returns The Todo
116
+ * @throws {BasecampError} If required fields are missing or invalid
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * const result = await client.todos.createTodosetTodo(123, 123, { content: "Hello world" });
121
+ * ```
122
+ */
123
+ async createTodosetTodo(bucketId: number, todosetId: number, req: CreateTodosetTodoTodoRequest): Promise<Todo> {
124
+ if (!req.content) {
125
+ throw Errors.validation("Content is required");
126
+ }
127
+ if (req.dueOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.dueOn)) {
128
+ throw Errors.validation("Due on must be in YYYY-MM-DD format");
129
+ }
130
+ if (req.startsOn && !/^\d{4}-\d{2}-\d{2}$/.test(req.startsOn)) {
131
+ throw Errors.validation("Starts on must be in YYYY-MM-DD format");
132
+ }
133
+ const response = await this.request(
134
+ {
135
+ service: "Todos",
136
+ operation: "CreateTodosetTodo",
137
+ resourceType: "todo",
138
+ isMutation: true,
139
+ projectId: bucketId,
140
+ resourceId: todosetId,
141
+ },
142
+ () =>
143
+ this.client.POST("/buckets/{bucketId}/todosets/{todosetId}/todos.json", {
144
+ params: {
145
+ path: { bucketId, todosetId },
146
+ },
147
+ body: {
148
+ content: req.content,
149
+ description: req.description,
150
+ assignee_ids: req.assigneeIds,
151
+ completion_subscriber_ids: req.completionSubscriberIds,
152
+ notify: req.notify,
153
+ due_on: req.dueOn,
154
+ starts_on: req.startsOn,
155
+ },
156
+ })
157
+ );
158
+ return response;
159
+ }
160
+
90
161
  /**
91
162
  * List todos in a todolist
92
163
  * @param todolistId - The todolist ID