Skip to content

Commit a2c0fe5

Browse files
author
Fil Maj
authoredJun 12, 2024··
web-api: public canvas APIs (#1813)
1 parent 9f2935f commit a2c0fe5

13 files changed

+479
-1
lines changed
 

‎packages/web-api/src/methods.ts

+58
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ import type {
9999
CallsUpdateResponse,
100100
CallsParticipantsAddResponse,
101101
CallsParticipantsRemoveResponse,
102+
CanvasesAccessDeleteResponse,
103+
CanvasesAccessSetResponse,
104+
CanvasesCreateResponse,
105+
CanvasesDeleteResponse,
106+
CanvasesEditResponse,
107+
CanvasesSectionsLookupResponse,
102108
ChatDeleteResponse,
103109
ChatDeleteScheduledMessageResponse,
104110
ChatGetPermalinkResponse,
@@ -111,6 +117,7 @@ import type {
111117
ChatUpdateResponse,
112118
ConversationsAcceptSharedInviteResponse,
113119
ConversationsApproveSharedInviteResponse,
120+
ConversationsCanvasesCreateResponse,
114121
ConversationsDeclineSharedInviteResponse,
115122
ConversationsInviteSharedResponse,
116123
ConversationsListConnectInvitesResponse,
@@ -325,6 +332,7 @@ import type {
325332
ConversationsAcceptSharedInviteArguments,
326333
ConversationsApproveSharedInviteArguments,
327334
ConversationsArchiveArguments,
335+
ConversationsCanvasesCreateArguments,
328336
ConversationsCloseArguments,
329337
ConversationsCreateArguments,
330338
ConversationsDeclineSharedInviteArguments,
@@ -355,6 +363,12 @@ import type {
355363
ChatScheduledMessagesListArguments,
356364
ChatUnfurlArguments,
357365
ChatUpdateArguments,
366+
CanvasesAccessDeleteArguments,
367+
CanvasesAccessSetArguments,
368+
CanvasesCreateArguments,
369+
CanvasesDeleteArguments,
370+
CanvasesEditArguments,
371+
CanvasesSectionsLookupArguments,
358372
CallsAddArguments,
359373
CallsEndArguments,
360374
CallsInfoArguments,
@@ -1337,6 +1351,43 @@ export abstract class Methods extends EventEmitter<WebClientEvent> {
13371351
},
13381352
};
13391353

1354+
public readonly canvases = {
1355+
access: {
1356+
/**
1357+
* @description Remove access to a canvas for specified entities.
1358+
* @see {@link https://api.slack.com/methods/canvases.access.delete `canvases.access.delete` API reference}.
1359+
*/
1360+
delete: bindApiCall<CanvasesAccessDeleteArguments, CanvasesAccessDeleteResponse>(this, 'canvases.access.delete'),
1361+
/**
1362+
* @description Sets the access level to a canvas for specified entities.
1363+
* @see {@link https://api.slack.com/methods/canvases.access.set `canvases.access.set` API reference}.
1364+
*/
1365+
set: bindApiCall<CanvasesAccessSetArguments, CanvasesAccessSetResponse>(this, 'canvases.access.set'),
1366+
},
1367+
/**
1368+
* @description Create Canvas for a user.
1369+
* @see {@link https://api.slack.com/methods/canvases.create `canvases.create` API reference}.
1370+
*/
1371+
create: bindApiCall<CanvasesCreateArguments, CanvasesCreateResponse>(this, 'canvases.create'),
1372+
/**
1373+
* @description Deletes a canvas.
1374+
* @see {@link https://api.slack.com/methods/canvases.delete `canvases.delete` API reference}.
1375+
*/
1376+
delete: bindApiCall<CanvasesDeleteArguments, CanvasesDeleteResponse>(this, 'canvases.delete'),
1377+
/**
1378+
* @description Update an existing canvas.
1379+
* @see {@link https://api.slack.com/methods/canvases.edit `canvases.edit` API reference}.
1380+
*/
1381+
edit: bindApiCall<CanvasesEditArguments, CanvasesEditResponse>(this, 'canvases.edit'),
1382+
sections: {
1383+
/**
1384+
* @description Find sections matching the provided criteria.
1385+
* @see {@link https://api.slack.com/methods/canvases.sections.lookup `canvases.sections.lookup` API reference}.
1386+
*/
1387+
lookup: bindApiCall<CanvasesSectionsLookupArguments, CanvasesSectionsLookupResponse>(this, 'canvases.sections.lookup'),
1388+
},
1389+
};
1390+
13401391
public readonly chat = {
13411392
/**
13421393
* @description Deletes a message.
@@ -1423,6 +1474,13 @@ export abstract class Methods extends EventEmitter<WebClientEvent> {
14231474
* @see {@link https://api.slack.com/methods/conversations.archive `conversations.archive` API reference}.
14241475
*/
14251476
archive: bindApiCall<ConversationsArchiveArguments, ConversationsArchiveResponse>(this, 'conversations.archive'),
1477+
canvases: {
1478+
/**
1479+
* @description Create a Channel Canvas for a channel.
1480+
* @see {@link https://api.slack.com/methods/conversations.canvases.create `conversations.canvases.create` API reference}.
1481+
*/
1482+
create: bindApiCall<ConversationsCanvasesCreateArguments, ConversationsCanvasesCreateResponse>(this, 'conversations.canvases.create'),
1483+
},
14261484
/**
14271485
* @description Closes a direct message or multi-person direct message.
14281486
* @see {@link https://api.slack.com/methods/conversations.close `conversations.close` API reference}.

‎packages/web-api/src/types/request/auth.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { CursorPaginationEnabled, TokenOverridable } from './common';
2-
import { OptionalArgument } from '../helpers';
2+
import type { OptionalArgument } from '../helpers';
33

44
// https://api.slack.com/methods/auth.revoke
55
export type AuthRevokeArguments = OptionalArgument<TokenOverridable & {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import type { ChannelIDs, TokenOverridable, UserIDs } from './common';
2+
import type { OptionalArgument } from '../helpers';
3+
4+
interface CanvasID {
5+
/** @description Encoded ID of the canvas. */
6+
canvas_id: string;
7+
}
8+
interface DocumentContent {
9+
/** @description The type of content used to describe Canvas content. Always is `markdown`. */
10+
type: 'markdown';
11+
/** @description The markdown defining the Canvas content. */
12+
markdown: string;
13+
}
14+
type SectionType = 'any_header' | 'h1' | 'h2' | 'h3';
15+
interface SectionTypes {
16+
/** @description List of desired section types to filter on. Minimum of 1, maximum of 3. */
17+
section_types: [SectionType, ...SectionType[]];
18+
}
19+
interface ContainsText {
20+
/** @description Textual content that must appear in the section. */
21+
contains_text: string;
22+
}
23+
// At least one of `section_types` or `contains_text` must be defined.
24+
type Criteria = (SectionTypes & Partial<ContainsText>) | (Partial<SectionTypes> & ContainsText);
25+
type Operation = 'insert_after' | 'insert_before' | 'insert_at_start' | 'insert_at_end' | 'replace' | 'delete';
26+
interface BaseChange {
27+
/** @description The operation to perform on the canvas. */
28+
operation?: Operation;
29+
/** @description The section of the canvas to target the operation on. */
30+
section_id?: string;
31+
/** @description Structure describing the type and contents. */
32+
document_content?: DocumentContent;
33+
}
34+
type ChangeWithSectionAndContent = Required<BaseChange> & {
35+
/** @description The operation to perform on the canvas. */
36+
operation: 'insert_after' | 'insert_before'
37+
};
38+
type ChangeWithContent = Required<Pick<BaseChange, 'document_content'>> & {
39+
/** @description The operation to perform on the canvas. */
40+
operation: 'insert_at_start' | 'insert_at_end';
41+
};
42+
type ChangeWithContentAndOptionalSection = BaseChange & Required<Pick<BaseChange, 'document_content'>> & {
43+
/** @description The operation to perform on the canvas. */
44+
operation: 'replace';
45+
};
46+
type ChangeWithSection = Required<Pick<BaseChange, 'section_id'>> & {
47+
/** @description The operation to perform on the canvas. */
48+
operation: 'delete';
49+
};
50+
type Change = ChangeWithSection | ChangeWithContent | ChangeWithSectionAndContent | ChangeWithContentAndOptionalSection;
51+
52+
// https://api.slack.com/methods/canvases.access.delete
53+
export interface CanvasesAccessDeleteArguments extends CanvasID, Partial<ChannelIDs>, TokenOverridable,
54+
Partial<UserIDs> {}
55+
56+
// https://api.slack.com/methods/canvases.access.set
57+
export interface CanvasesAccessSetArguments extends CanvasID, Partial<ChannelIDs>, TokenOverridable, Partial<UserIDs> {
58+
/** @description Desired level of access. */
59+
access_level: 'read' | 'write';
60+
}
61+
62+
// https://api.slack.com/methods/canvases.create
63+
export type CanvasesCreateArguments = OptionalArgument<TokenOverridable & {
64+
/** @description Title of the newly created canvas. */
65+
title?: string;
66+
/** @description Structure describing the type and contents of the Canvas being created. */
67+
document_content?: DocumentContent;
68+
}>;
69+
70+
// https://api.slack.com/methods/canvases.sections.lookup
71+
export interface CanvasesSectionsLookupArguments extends CanvasID, TokenOverridable {
72+
/** @description Filtering criteria. */
73+
criteria: Criteria;
74+
}
75+
76+
// https://api.slack.com/methods/canvases.delete
77+
export interface CanvasesDeleteArguments extends CanvasID, TokenOverridable {}
78+
79+
// https://api.slack.com/methods/canvases.edit
80+
export interface CanvasesEditArguments extends CanvasID, TokenOverridable {
81+
/** @description List of changes to apply to the canvas. */
82+
changes: [Change, ...Change[]];
83+
}
84+
85+
// https://api.slack.com/methods/conversations.canvases.create
86+
export interface ConversationsCanvasesCreateArguments extends TokenOverridable {
87+
/** @description Channel ID of the channel to create a canvas in. */
88+
channel_id: string;
89+
/** @description Structure describing the type and contents of the Canvas being created. */
90+
document_content?: DocumentContent;
91+
}

‎packages/web-api/src/types/request/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type { DndEndDndArguments, DndEndSnoozeArguments, DndInfoArguments, DndSe
1919
export type { DialogOpenArguments } from './dialog';
2020
export type { ConversationsAcceptSharedInviteArguments, ConversationsApproveSharedInviteArguments, ConversationsArchiveArguments, ConversationsCloseArguments, ConversationsCreateArguments, ConversationsDeclineSharedInviteArguments, ConversationsHistoryArguments, ConversationsInfoArguments, ConversationsInviteArguments, ConversationsInviteSharedArguments, ConversationsJoinArguments, ConversationsKickArguments, ConversationsLeaveArguments, ConversationsListArguments, ConversationsListConnectInvitesArguments, ConversationsMarkArguments, ConversationsMembersArguments, ConversationsOpenArguments, ConversationsRenameArguments, ConversationsRepliesArguments, ConversationsSetPurposeArguments, ConversationsSetTopicArguments, ConversationsUnarchiveArguments } from './conversations';
2121
export type { ChatDeleteArguments, ChatDeleteScheduledMessageArguments, ChatGetPermalinkArguments, ChatMeMessageArguments, ChatPostEphemeralArguments, ChatPostMessageArguments, ChatScheduleMessageArguments, ChatScheduledMessagesListArguments, ChatUnfurlArguments, ChatUpdateArguments } from './chat';
22+
export type { CanvasesAccessDeleteArguments, CanvasesAccessSetArguments, CanvasesCreateArguments, CanvasesDeleteArguments, CanvasesEditArguments, CanvasesSectionsLookupArguments, ConversationsCanvasesCreateArguments } from './canvas';
2223
export type { CallsAddArguments, CallsEndArguments, CallsInfoArguments, CallsUpdateArguments, CallsParticipantsAddArguments, CallsParticipantsRemoveArguments } from './calls';
2324
export type { BotsInfoArguments } from './bots';
2425
export type { BookmarksAddArguments, BookmarksEditArguments, BookmarksListArguments, BookmarksRemoveArguments } from './bookmarks';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type CanvasesAccessDeleteResponse = WebAPICallResult & {
13+
error?: string;
14+
failed_to_update_channel_ids?: string[];
15+
failed_to_update_user_ids?: string[];
16+
ok?: boolean;
17+
response_metadata?: ResponseMetadata;
18+
};
19+
20+
export interface ResponseMetadata {
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type CanvasesAccessSetResponse = WebAPICallResult & {
13+
error?: string;
14+
failed_to_update_channel_ids?: string[];
15+
failed_to_update_user_ids?: string[];
16+
ok?: boolean;
17+
response_metadata?: ResponseMetadata;
18+
};
19+
20+
export interface ResponseMetadata {
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type CanvasesCreateResponse = WebAPICallResult & {
13+
canvas_id?: string;
14+
detail?: string;
15+
error?: string;
16+
ok?: boolean;
17+
response_metadata?: ResponseMetadata;
18+
};
19+
20+
export interface ResponseMetadata {
21+
messages?: string[];
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type CanvasesDeleteResponse = WebAPICallResult & {
13+
error?: string;
14+
ok?: boolean;
15+
response_metadata?: ResponseMetadata;
16+
};
17+
18+
export interface ResponseMetadata {
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type CanvasesEditResponse = WebAPICallResult & {
13+
detail?: string;
14+
error?: string;
15+
ok?: boolean;
16+
response_metadata?: ResponseMetadata;
17+
};
18+
19+
export interface ResponseMetadata {
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type CanvasesSectionsLookupResponse = WebAPICallResult & {
13+
error?: string;
14+
ok?: boolean;
15+
response_metadata?: ResponseMetadata;
16+
sections?: Section[];
17+
};
18+
19+
export interface ResponseMetadata {
20+
}
21+
22+
export interface Section {
23+
id?: string;
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/* eslint-disable */
2+
/////////////////////////////////////////////////////////////////////////////////////////
3+
// //
4+
// !!! DO NOT EDIT THIS FILE !!! //
5+
// //
6+
// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. //
7+
// Please refer to the script code to learn how to update the source data. //
8+
// //
9+
/////////////////////////////////////////////////////////////////////////////////////////
10+
11+
import { WebAPICallResult } from '../../WebClient';
12+
export type ConversationsCanvasesCreateResponse = WebAPICallResult & {
13+
canvas_id?: string;
14+
detail?: string;
15+
error?: string;
16+
ok?: boolean;
17+
response_metadata?: ResponseMetadata;
18+
};
19+
20+
export interface ResponseMetadata {
21+
messages?: string[];
22+
}

‎packages/web-api/src/types/response/index.ts

+7
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ export { CallsInfoResponse } from './CallsInfoResponse';
125125
export { CallsParticipantsAddResponse } from './CallsParticipantsAddResponse';
126126
export { CallsParticipantsRemoveResponse } from './CallsParticipantsRemoveResponse';
127127
export { CallsUpdateResponse } from './CallsUpdateResponse';
128+
export { CanvasesAccessDeleteResponse } from './CanvasesAccessDeleteResponse';
129+
export { CanvasesAccessSetResponse } from './CanvasesAccessSetResponse';
130+
export { CanvasesCreateResponse } from './CanvasesCreateResponse';
131+
export { CanvasesDeleteResponse } from './CanvasesDeleteResponse';
132+
export { CanvasesEditResponse } from './CanvasesEditResponse';
133+
export { CanvasesSectionsLookupResponse } from './CanvasesSectionsLookupResponse';
128134
export { ChannelsArchiveResponse } from './ChannelsArchiveResponse';
129135
export { ChannelsCreateResponse } from './ChannelsCreateResponse';
130136
export { ChannelsHistoryResponse } from './ChannelsHistoryResponse';
@@ -153,6 +159,7 @@ export { ChatUpdateResponse } from './ChatUpdateResponse';
153159
export { ConversationsAcceptSharedInviteResponse } from './ConversationsAcceptSharedInviteResponse';
154160
export { ConversationsApproveSharedInviteResponse } from './ConversationsApproveSharedInviteResponse';
155161
export { ConversationsArchiveResponse } from './ConversationsArchiveResponse';
162+
export { ConversationsCanvasesCreateResponse } from './ConversationsCanvasesCreateResponse';
156163
export { ConversationsCloseResponse } from './ConversationsCloseResponse';
157164
export { ConversationsCreateResponse } from './ConversationsCreateResponse';
158165
export { ConversationsDeclineSharedInviteResponse } from './ConversationsDeclineSharedInviteResponse';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
import { expectAssignable, expectError } from 'tsd';
2+
import { WebClient } from '../../../src/WebClient';
3+
4+
const web = new WebClient('TOKEN');
5+
6+
// canvases.access.delete
7+
// -- sad path
8+
expectError(web.canvases.access.delete()); // lacking argument
9+
expectError(web.canvases.access.delete({})); // empty argument
10+
// -- happy path
11+
expectAssignable<Parameters<typeof web.canvases.access.delete>>([{
12+
canvas_id: 'F1234',
13+
}]);
14+
15+
// canvases.access.set
16+
// -- sad path
17+
expectError(web.canvases.access.set()); // lacking argument
18+
expectError(web.canvases.access.set({})); // empty argument
19+
expectError(web.canvases.access.set({
20+
canvas_id: 'F1234', // missing access_level
21+
}));
22+
expectError(web.canvases.access.set({
23+
access_level: 'read', // missing canvas_id
24+
}));
25+
// -- happy path
26+
expectAssignable<Parameters<typeof web.canvases.access.set>>([{
27+
canvas_id: 'F1234',
28+
access_level: 'write',
29+
}]);
30+
31+
// canvases.create
32+
// -- sad path
33+
expectError(web.canvases.create({
34+
document_content: 'heyo', // invalid document_content
35+
}));
36+
expectError(web.canvases.create({
37+
document_content: { type: 'mrkdwn', markdown: 'hihi' }, // invalid document_content
38+
}));
39+
// -- happy path
40+
expectAssignable<Parameters<typeof web.canvases.create>>([]); // no arg ok
41+
expectAssignable<Parameters<typeof web.canvases.create>>([{}]); // all optional args
42+
43+
// canvases.sections.lookup
44+
// -- sad path
45+
expectError(web.canvases.sections.lookup()); // lacking argument
46+
expectError(web.canvases.sections.lookup({})); // empty argument
47+
expectError(web.canvases.sections.lookup({
48+
canvas_id: 'F1234', // missing criteria
49+
}));
50+
expectError(web.canvases.sections.lookup({
51+
criteria: { contains_text: 'hi' }, // missing canvas_id
52+
}));
53+
expectError(web.canvases.sections.lookup({
54+
canvas_id: 'F1234',
55+
criteria: {}, // empty criteria object
56+
}));
57+
expectError(web.canvases.sections.lookup({
58+
canvas_id: 'F1234',
59+
criteria: {
60+
section_types: [], // need at least one section type
61+
},
62+
}));
63+
// -- happy path
64+
expectAssignable<Parameters<typeof web.canvases.sections.lookup>>([{
65+
canvas_id: 'F1234',
66+
criteria: { contains_text: 'hi' },
67+
}]);
68+
expectAssignable<Parameters<typeof web.canvases.sections.lookup>>([{
69+
canvas_id: 'F1234',
70+
criteria: { section_types: ['any_header'] },
71+
}]);
72+
expectAssignable<Parameters<typeof web.canvases.sections.lookup>>([{
73+
canvas_id: 'F1234',
74+
criteria: {
75+
section_types: ['any_header'],
76+
contains_text: 'list',
77+
},
78+
}]);
79+
80+
// canvases.delete
81+
// -- sad path
82+
expectError(web.canvases.delete()); // lacking argument
83+
expectError(web.canvases.delete({})); // empty argument
84+
// -- happy path
85+
expectAssignable<Parameters<typeof web.canvases.delete>>([{
86+
canvas_id: 'F1234',
87+
}]);
88+
89+
// canvases.edit
90+
// -- sad path
91+
expectError(web.canvases.edit()); // lacking argument
92+
expectError(web.canvases.edit({})); // empty argument
93+
expectError(web.canvases.edit({
94+
canvas_id: 'F1234', // missing changes
95+
}));
96+
expectError(web.canvases.edit({
97+
changes: [{
98+
operation: 'delete',
99+
section_id: 'S1234',
100+
}], // missing canvas_id
101+
}));
102+
expectError(web.canvases.edit({
103+
changes: [], // minimum 1 change
104+
canvas_id: 'F1234',
105+
}));
106+
expectError(web.canvases.edit({
107+
changes: [{
108+
document_content: { type: 'markdown', markdown: 'hihi' }, // missing operation
109+
}],
110+
canvas_id: 'F1234',
111+
}));
112+
expectError(web.canvases.edit({
113+
changes: [{
114+
operation: 'insert_after',
115+
document_content: { type: 'markdown', markdown: 'hihi' }, // missing section_id for op: insert_after
116+
}],
117+
canvas_id: 'F1234',
118+
}));
119+
expectError(web.canvases.edit({
120+
changes: [{
121+
operation: 'insert_before',
122+
section_id: '1234', // missing document_content for op: insert_before
123+
}],
124+
canvas_id: 'F1234',
125+
}));
126+
expectError(web.canvases.edit({
127+
changes: [{
128+
operation: 'insert_at_end', // missing document_content for op: insert_at_end
129+
}],
130+
canvas_id: 'F1234',
131+
}));
132+
expectError(web.canvases.edit({
133+
changes: [{
134+
operation: 'replace', // missing document_content for op: replace
135+
section_id: '1234',
136+
}],
137+
canvas_id: 'F1234',
138+
}));
139+
expectError(web.canvases.edit({
140+
changes: [{
141+
operation: 'delete', // missing section_id for op: delete
142+
}],
143+
canvas_id: 'F1234',
144+
}));
145+
// -- happy path
146+
expectAssignable<Parameters<typeof web.canvases.edit>>([{
147+
canvas_id: 'F1234',
148+
changes: [{
149+
operation: 'insert_after',
150+
document_content: { type: 'markdown', markdown: 'hihi' },
151+
section_id: '1234',
152+
}, {
153+
operation: 'insert_at_start',
154+
document_content: { type: 'markdown', markdown: 'hihi' },
155+
}, {
156+
operation: 'replace',
157+
document_content: { type: 'markdown', markdown: 'hihi' },
158+
section_id: '1234',
159+
}, {
160+
operation: 'delete',
161+
section_id: '1234',
162+
}],
163+
}]);
164+
165+
// conversations.canvases.create
166+
// -- sad path
167+
expectError(web.conversations.canvases.create()); // lacking argument
168+
expectError(web.conversations.canvases.create({})); // empty argument
169+
// -- happy path
170+
expectAssignable<Parameters<typeof web.conversations.canvases.create>>([{
171+
channel_id: 'C1234',
172+
}]);

0 commit comments

Comments
 (0)
Please sign in to comment.