diff --git a/.changeset/web-api-blocks-validate.md b/.changeset/web-api-blocks-validate.md new file mode 100644 index 000000000..b33cde63d --- /dev/null +++ b/.changeset/web-api-blocks-validate.md @@ -0,0 +1,5 @@ +--- +"@slack/web-api": minor +--- + +feat(web-api): add [`blocks.validate`](https://docs.slack.dev/reference/methods/blocks.validate) method diff --git a/packages/web-api/src/methods.ts b/packages/web-api/src/methods.ts index c7d2bc5b0..f307dff90 100644 --- a/packages/web-api/src/methods.ts +++ b/packages/web-api/src/methods.ts @@ -116,6 +116,7 @@ import type { AuthRevokeArguments, AuthTeamsListArguments, AuthTestArguments, + BlocksValidateArguments, BookmarksAddArguments, BookmarksEditArguments, BookmarksListArguments, @@ -388,6 +389,7 @@ import type { AuthRevokeResponse, AuthTeamsListResponse, AuthTestResponse, + BlocksValidateResponse, BookmarksAddResponse, BookmarksEditResponse, BookmarksListResponse, @@ -1546,6 +1548,14 @@ export abstract class Methods extends EventEmitter { remove: bindApiCall(this, 'bookmarks.remove'), }; + public readonly blocks = { + /** + * @description Validates blocks, messages, and views Block Kit JSON payloads. + * @see {@link https://docs.slack.dev/reference/methods/blocks.validate `blocks.validate` API reference}. + */ + validate: bindApiCallWithOptionalArgument(this, 'blocks.validate'), + }; + public readonly bots = { /** * @description Gets information about a bot user. diff --git a/packages/web-api/src/types/request/blocks.ts b/packages/web-api/src/types/request/blocks.ts new file mode 100644 index 000000000..eb99078d8 --- /dev/null +++ b/packages/web-api/src/types/request/blocks.ts @@ -0,0 +1,16 @@ +import type { Block, KnownBlock, MessageAttachment, View } from '@slack/types'; + +import type { OptionalArgument } from '../helpers'; + +// https://docs.slack.dev/reference/methods/blocks.validate +export type BlocksValidateArguments = OptionalArgument<{ + /** @description An array of blocks to validate. */ + blocks?: (KnownBlock | Block)[]; + /** @description A message payload to validate. */ + message?: { + blocks?: (KnownBlock | Block)[]; + attachments?: MessageAttachment[]; + }; + /** @description A view payload to validate. */ + view?: View; +}>; diff --git a/packages/web-api/src/types/request/index.ts b/packages/web-api/src/types/request/index.ts index 0c0f1eab9..ef9239bfa 100644 --- a/packages/web-api/src/types/request/index.ts +++ b/packages/web-api/src/types/request/index.ts @@ -141,6 +141,7 @@ export type { AuthTeamsListArguments, AuthTestArguments, } from './auth'; +export type { BlocksValidateArguments } from './blocks'; export type { BookmarksAddArguments, BookmarksEditArguments, diff --git a/packages/web-api/src/types/response/BlocksValidateResponse.ts b/packages/web-api/src/types/response/BlocksValidateResponse.ts new file mode 100644 index 000000000..98ac25f84 --- /dev/null +++ b/packages/web-api/src/types/response/BlocksValidateResponse.ts @@ -0,0 +1,37 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; + +export type BlocksValidateResponse = WebAPICallResult & { + error?: string; + errors?: Error[]; + needed?: string; + ok?: boolean; + provided?: string; + response_metadata?: ResponseMetadata; + warning?: string; +}; + +export interface Error { + code?: string; + constraint?: Constraint; + message?: string; + pointer?: string; +} + +export interface Constraint { + expected?: string[]; + got?: string; + type?: string; +} + +export interface ResponseMetadata { + messages?: string[]; +} diff --git a/packages/web-api/src/types/response/index.ts b/packages/web-api/src/types/response/index.ts index d9fadef37..2e1937f7e 100644 --- a/packages/web-api/src/types/response/index.ts +++ b/packages/web-api/src/types/response/index.ts @@ -126,6 +126,7 @@ export { AssistantThreadsSetTitleResponse } from './AssistantThreadsSetTitleResp export { AuthRevokeResponse } from './AuthRevokeResponse'; export { AuthTeamsListResponse } from './AuthTeamsListResponse'; export { AuthTestResponse } from './AuthTestResponse'; +export { BlocksValidateResponse } from './BlocksValidateResponse'; export { BookmarksAddResponse } from './BookmarksAddResponse'; export { BookmarksEditResponse } from './BookmarksEditResponse'; export { BookmarksListResponse } from './BookmarksListResponse'; diff --git a/packages/web-api/test/types/methods/blocks.test-d.ts b/packages/web-api/test/types/methods/blocks.test-d.ts new file mode 100644 index 000000000..3d709e779 --- /dev/null +++ b/packages/web-api/test/types/methods/blocks.test-d.ts @@ -0,0 +1,20 @@ +import { expectAssignable, expectError } from 'tsd'; +import { WebClient } from '../../../src/WebClient'; + +const web = new WebClient(); + +// blocks.validate +// -- happy path +expectAssignable>([{}]); // all optional args +expectAssignable>([]); // no arg is fine +expectAssignable>([ + { blocks: [{ type: 'section', text: { type: 'plain_text', text: 'Hello world' } }] }, +]); +expectAssignable>([ + { message: { blocks: [{ type: 'section', text: { type: 'mrkdwn', text: 'Hello' } }] } }, +]); +expectAssignable>([ + { view: { type: 'modal', title: { type: 'plain_text', text: 'Title' }, blocks: [] } }, +]); +// -- sad path +expectError>([{ blocks: '[]' }]); // must be typed blocks, not a string