slackblock 2.0.0-beta.3 → 3.0.0-beta.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.
- package/CHANGELOG.md +77 -57
- package/README.md +72 -31
- package/dist/block.cjs.map +1 -1
- package/dist/block.d.cts +7 -4
- package/dist/block.d.ts +7 -4
- package/dist/block.mjs.map +1 -1
- package/dist/index.cjs +268 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -9
- package/dist/index.d.ts +24 -9
- package/dist/index.mjs +268 -102
- package/dist/index.mjs.map +1 -1
- package/dist/{types-DhAVIy-s.d.cts → types-DfyTK0D6.d.cts} +2 -1
- package/dist/{types-DhAVIy-s.d.ts → types-DfyTK0D6.d.ts} +2 -1
- package/package.json +4 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/utils/validation-context.ts","../src/utils/validation.ts","../src/transformers/block/text.ts","../src/utils/get-type.ts","../src/transformers/registry.ts","../src/transformers/transform.ts","../src/components/block/text.tsx","../src/constants/limits.ts","../src/jsx-runtime.ts","../src/transformers/block/confirmation.tsx","../src/transformers/block/button.tsx","../src/transformers/block/image.ts","../src/utils/normalize-children.ts","../src/transformers/layout/container.ts","../src/transformers/layout/section.ts","../src/transformers/layout/actions.ts","../src/transformers/layout/context.ts","../src/transformers/layout/divider.ts","../src/transformers/layout/file.ts","../src/transformers/layout/header.tsx","../src/transformers/layout/image.tsx","../src/transformers/layout/input.tsx","../src/transformers/rich-text/utils.ts","../src/transformers/layout/rich-text.ts","../src/transformers/layout/video.tsx","../src/transformers/input/text.tsx","../src/transformers/input/date-time-picker.ts","../src/transformers/input/date-picker.tsx","../src/transformers/input/checkboxes.ts","../src/components/input/select.tsx","../src/transformers/input/select.tsx","../src/transformers/input/option.tsx","../src/transformers/input/option-group.tsx","../src/transformers/input/overflow.ts","../src/transformers/input/radio-group.ts","../src/transformers/input/time-picker.tsx","../src/transformers/rich-text/section.ts","../src/transformers/rich-text/list.ts","../src/transformers/rich-text/quote.ts","../src/transformers/rich-text/preformatted.ts","../src/transformers/rich-text/text.ts","../src/transformers/rich-text/link.ts","../src/transformers/rich-text/user.ts","../src/transformers/rich-text/channel.ts","../src/transformers/rich-text/emoji.ts","../src/transformers/rich-text/date.ts","../src/transformers/rich-text/broadcast.ts","../src/transformers/rich-text/user-group.ts","../src/transformers/index.ts","../src/parser/index.ts","../src/renderer/index.ts","../src/utils/escape-mrkdwn.ts","../src/utils/block-kit-builder.ts"],"sourcesContent":["/**\n * Error thrown by `render()` / `renderToBlocks()` when `validate: 'strict'`\n * is set and a validation rule is violated.\n *\n * @example\n * ```ts\n * import { SlackblockValidationError } from 'slackblock';\n *\n * try {\n * render(<Message>...</Message>, { validate: 'strict' });\n * } catch (err) {\n * if (err instanceof SlackblockValidationError) {\n * console.error(err.message); // \"Message > Header: Header text exceeds 150 characters.\"\n * console.error(err.path); // \"Message > Header\"\n * console.error(err.rule); // \"too-long\"\n * }\n * }\n * ```\n */\nexport class SlackblockValidationError extends Error {\n readonly path: string;\n readonly rule: string;\n constructor(message: string, path: string, rule: string) {\n super(`${path}: ${message}`);\n this.name = 'SlackblockValidationError';\n this.path = path;\n this.rule = rule;\n }\n}\n","import {SlackblockValidationError} from '../errors';\n\n/**\n * Controls how SlackBlock handles validation violations during rendering.\n *\n * - `'warn'` — emit `console.warn` messages (default)\n * - `'strict'` — throw `SlackblockValidationError`\n * - `'off'` — suppress all validation\n */\nexport type ValidationMode = 'off' | 'warn' | 'strict';\n\ntype ValidationContext = {\n mode: ValidationMode;\n path: string[];\n};\n\nconst context: ValidationContext = {\n mode: 'warn',\n path: [],\n};\n\nexport const initContext = (mode: ValidationMode): void => {\n context.mode = mode;\n context.path = [];\n};\n\nexport const pushPath = (segment: string): void => {\n context.path.push(segment);\n};\n\nexport const popPath = (): void => {\n context.path.pop();\n};\n\nconst getPath = (): string => context.path.join(' > ');\n\nexport const report = (message: string, rule: string): void => {\n if (context.mode === 'off') {\n return;\n }\n\n const path = getPath();\n\n if (context.mode === 'warn') {\n console.warn(`[slackblock] ${path}: ${message}`);\n return;\n }\n\n throw new SlackblockValidationError(message, path, rule);\n};\n","import {report} from './validation-context';\n\nconst toKebab = (name: string): string => name.replaceAll(/([A-Z])/g, '-$1').toLowerCase();\n\nexport const warnIfTooLong = (name: string, value: string | undefined, max: number): void => {\n if (!value) {\n return;\n }\n\n if (value.length > max) {\n report(`${name} exceeds ${max} characters.`, 'value-too-long');\n }\n};\n\nexport const warnIfTooMany = (name: string, values: unknown[] | undefined, max: number): void => {\n if (!values) {\n return;\n }\n\n if (values.length > max) {\n report(`${name} exceeds ${max} items.`, 'too-many-items');\n }\n};\n\nexport const requireField = (fieldName: string, value: unknown): void => {\n if (value === undefined || value === null || value === '') {\n report(`${fieldName} is required.`, `${toKebab(fieldName)}-required`);\n }\n};\n","import {type Element} from '../../constants/types';\nimport {type Props as TextProps} from '../../components/block/text';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type TextType = {\n type: 'plain_text' | 'mrkdwn';\n text: string;\n emoji?: boolean;\n verbatim?: boolean;\n};\n\nconst transformText = (element: Element): TextType => {\n const {plainText, children, emoji, verbatim} = element.props as TextProps;\n\n const res: TextType = {\n type: plainText ? 'plain_text' : 'mrkdwn',\n text: children,\n };\n\n if (typeof children === 'string') {\n warnIfTooLong('Text', children, 3000);\n }\n\n if (emoji) {\n res.emoji = true;\n }\n\n if (verbatim) {\n res.verbatim = true;\n }\n\n return res;\n};\n\nexport default transformText;\n","import {type Child} from '../constants/types';\n\nconst getType = (element: Child): string => {\n if (typeof element === 'string') {\n return 'string';\n }\n\n if (element === null || element === undefined || typeof element === 'boolean') {\n return 'null';\n }\n\n if (Array.isArray(element)) {\n throw new TypeError('Cannot type arrays');\n }\n\n const {type} = element;\n\n if (typeof type === 'string') {\n return type;\n }\n\n const {slackType, displayName, name} = type as {\n slackType?: string;\n displayName?: string;\n name?: string;\n };\n\n return slackType ?? displayName ?? name ?? (type as unknown as string);\n};\n\nexport default getType;\n","import {type Child} from '../constants/types';\n\ntype TransformersType = Record<string, (child: Child) => unknown>;\n\n// Mutable registry populated by index.ts at module init time.\n// transform.ts imports this directly to avoid a circular dependency.\nconst Transformers: TransformersType = {};\n\nexport default Transformers;\n","import {type Element} from '../constants/types';\nimport getType from '../utils/get-type';\nimport {pushPath, popPath, report} from '../utils/validation-context';\n\nimport Transformers from './registry';\n\nexport const transform = (element: Element): unknown => {\n const type = getType(element);\n\n if (!Transformers[type]) {\n report(`No transformer for component type '${type}'.`, 'unknown-type');\n return {};\n }\n\n pushPath(type);\n try {\n return Transformers[type](element);\n } finally {\n popPath();\n }\n};\n","\nexport type Props = {\n children: string;\n plainText?: boolean;\n emoji?: boolean;\n verbatim?: boolean;\n};\n\n/**\n * A text object — renders as `mrkdwn` (default) or `plain_text`.\n *\n * Used as the `text` prop on `<Section>`, `<Header>`, inside `<Context>`,\n * and as a child of `<Section>` for fields.\n *\n * @example\n * ```tsx\n * <Text>Hello *world*</Text>\n * <Text plainText emoji>Hello :wave:</Text>\n * ```\n */\nexport default class Text {\n static slackType = 'Text';\n declare props: Props;\n}\n","export const MAX_BLOCKS = 50;\nexport const MAX_HEADER_TEXT = 150;\nexport const MAX_SECTION_FIELDS = 10;\nexport const MAX_SECTION_FIELD_TEXT = 2000;\nexport const MAX_ACTIONS_ELEMENTS = 25;\nexport const MAX_CONTEXT_ELEMENTS = 10;\nexport const MAX_CONFIRM_TITLE = 100;\nexport const MAX_CONFIRM_TEXT = 300;\nexport const MAX_BUTTON_TEXT = 75;\nexport const MAX_BUTTON_VALUE = 2000;\nexport const MAX_OPTION_TEXT = 75;\nexport const MAX_OPTION_VALUE = 150;\nexport const MAX_OPTION_DESCRIPTION = 75;\nexport const MAX_OPTION_URL = 3000;\nexport const MAX_OPTION_GROUP_LABEL = 75;\nexport const MAX_OPTION_GROUP_OPTIONS = 100;\nexport const MAX_IMAGE_URL = 3000;\nexport const MAX_IMAGE_ALT_TEXT = 2000;\nexport const MAX_IMAGE_TITLE = 2000;\nexport const MAX_VIDEO_DESCRIPTION = 200;\nexport const MAX_BLOCK_ID_LENGTH = 255;\nexport const MAX_MESSAGE_TEXT = 40_000;\nexport const RECOMMENDED_MESSAGE_TEXT = 4000;\nexport const MAX_ACTION_ID_LENGTH = 255;\nexport const MAX_PLACEHOLDER_LENGTH = 150;\n","type ComponentType = string | ((...parameters: unknown[]) => unknown) | (new (...parameters: unknown[]) => unknown);\n\nexport function jsx(type: ComponentType, props: Record<string, unknown>): JSX.Element {\n const {children} = props;\n\n return {\n type,\n props,\n children: Array.isArray(children) ? children as unknown[] : (children === undefined ? [] : [children]),\n };\n}\n\nexport function jsxs(type: ComponentType, props: Record<string, unknown>): JSX.Element {\n return jsx(type, props);\n}\n\nexport const Fragment = 'fragment';\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace JSX {\n export type Element = {type: ComponentType; props: Record<string, unknown>; children: unknown[]};\n export type IntrinsicElements = Record<string, Record<string, unknown>>;\n export type ElementClass = {props: Record<string, unknown>};\n export type ElementAttributesProperty = {props: Record<string, unknown>};\n}\n","\nimport {type Element} from '../../constants/types';\nimport {transform} from '../transform';\nimport {type ConfirmationProps} from '../../components/block/confirmation';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong} from '../../utils/validation';\nimport {MAX_CONFIRM_TITLE, MAX_CONFIRM_TEXT} from '../../constants/limits';\n\nimport {type TextType} from './text';\n\nexport type ConfirmationType = {\n title: TextType;\n text: TextType;\n confirm: TextType;\n deny: TextType;\n};\n\nconst transformConfirmation = (child: Element): ConfirmationType => {\n const {title, confirm, deny, children} = child.props as ConfirmationProps;\n\n warnIfTooLong('Confirm title', title, MAX_CONFIRM_TITLE);\n\n const text = transform(children) as TextType;\n warnIfTooLong('Confirm text', text.text, MAX_CONFIRM_TEXT);\n\n const res: ConfirmationType = {\n title: transform(<Text plainText>{title}</Text>) as TextType,\n text,\n confirm: transform(<Text plainText>{confirm}</Text>) as TextType,\n deny: transform(<Text plainText>{deny}</Text>) as TextType,\n };\n\n return res;\n};\n\nexport default transformConfirmation;\n","\nimport {type Element} from '../../constants/types';\nimport {type ButtonProps} from '../../components/block/button';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH, MAX_BUTTON_TEXT, MAX_BUTTON_VALUE} from '../../constants/limits';\n\nimport {type ConfirmationType} from './confirmation';\nimport {type TextType} from './text';\n\nexport type ButtonType = {\n type: 'button';\n text: TextType;\n action_id: string;\n url?: string;\n value?: string;\n style?: 'primary' | 'danger';\n confirm?: ConfirmationType;\n accessibility_label?: string;\n};\n\nconst transformButton = (child: Element): ButtonType => {\n const {actionId, children, url, value, style, confirm, accessibilityLabel} = child.props as ButtonProps;\n\n requireField('actionId', actionId);\n warnIfTooLong('Button action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (typeof children === 'string') {\n warnIfTooLong('Button text', children, MAX_BUTTON_TEXT);\n }\n\n warnIfTooLong('Button value', value, MAX_BUTTON_VALUE);\n\n const res: ButtonType = {\n type: 'button',\n text: transform(<Text plainText>{children}</Text>) as TextType,\n action_id: actionId,\n };\n\n if (url) {\n res.url = url;\n }\n\n if (value) {\n res.value = value;\n }\n\n if (style) {\n res.style = style;\n }\n\n if (confirm) {\n res.confirm = transform(confirm) as ConfirmationType;\n }\n\n if (accessibilityLabel) {\n res.accessibility_label = accessibilityLabel;\n }\n\n return res;\n};\n\nexport default transformButton;\n","import {type Element} from '../../constants/types';\nimport {type Props as ImageProperties} from '../../components/block/image';\n\nexport type ImageType = {\n type: 'image';\n image_url: string;\n alt_text: string;\n};\n\nconst transformImage = (child: Element): ImageType => {\n const {url, alt} = child.props as ImageProperties;\n\n return {\n type: 'image',\n image_url: url,\n alt_text: alt,\n };\n};\n\nexport default transformImage;\n","import {type Child} from '../constants/types';\n\nconst normalizeChildren = (children: Child): Child[] => {\n const result: Child[] = [];\n const stack = Array.isArray(children) ? [...children] : [children];\n\n while (stack.length > 0) {\n const child = stack.shift();\n\n if (child === null || child === undefined || typeof child === 'boolean') {\n continue;\n }\n\n if (Array.isArray(child)) {\n stack.unshift(...child);\n continue;\n }\n\n result.push(child);\n }\n\n return result;\n};\n\nexport default normalizeChildren;\n","import {type Props as ContainerProperties} from '../../components/layout/container';\nimport {type Element, type Child} from '../../constants/types';\nimport {transform} from '../transform';\nimport normalizeChildren from '../../utils/normalize-children';\n\ntype ContainerType = Child[];\n\nconst transformContainer = (child: Element): ContainerType => {\n const {children} = child.props as ContainerProperties;\n const elements = normalizeChildren(children);\n\n return (elements as Element[]).map(element => transform(element)) as Child[];\n};\n\nexport default transformContainer;\n","import {type Element, type SerializedBlockElement} from '../../constants/types';\nimport {type Props as SectionComponentProps} from '../../components/layout/section';\nimport {type TextType as Text} from '../block/text';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_SECTION_FIELD_TEXT, MAX_SECTION_FIELDS} from '../../constants/limits';\n\nexport type SectionType = {\n type: 'section';\n text: Text;\n block_id?: string;\n fields?: Text[];\n accessory?: SerializedBlockElement;\n};\n\nconst transformSection = (element: Element): SectionType => {\n const {text, blockId, children, accessory} = element.props as SectionComponentProps;\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: SectionType = {\n type: 'section',\n text: transform(text as Element) as Text,\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n if (accessory) {\n res.accessory = transform(accessory) as SerializedBlockElement;\n }\n\n if (children) {\n res.fields = [];\n let fields = children;\n if (!Array.isArray(fields)) {\n fields = [fields];\n }\n\n for (const field of fields) {\n if (field) {\n const t = transform(field as Element) as Text;\n warnIfTooLong('Section field text', t.text, MAX_SECTION_FIELD_TEXT);\n res.fields.push(t);\n }\n }\n\n warnIfTooMany('Section fields', res.fields, MAX_SECTION_FIELDS);\n }\n\n return res;\n};\n\nexport default transformSection;\n","import {type Element, type SerializedInteractiveBlockElement, type InteractiveBlockElement} from '../../constants/types';\nimport {type Props as ActionProperties} from '../../components/layout/actions';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_ACTIONS_ELEMENTS} from '../../constants/limits';\n\nexport type ActionType = {\n type: 'actions';\n elements: SerializedInteractiveBlockElement[];\n block_id?: string;\n};\n\nconst transformActions = (child: Element): ActionType => {\n const {children, blockId} = child.props as ActionProperties;\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n let elements = children;\n if (!Array.isArray(elements)) {\n elements = [elements] as InteractiveBlockElement[];\n }\n\n const res: ActionType = {\n type: 'actions',\n elements: elements.map(element => transform(element as Element) as SerializedInteractiveBlockElement),\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n warnIfTooMany('Actions elements', res.elements, MAX_ACTIONS_ELEMENTS);\n\n return res;\n};\n\nexport default transformActions;\n","import {type Element} from '../../constants/types';\nimport {type Props as ContextProperties, type ImageOrText as ImageOrTextElement} from '../../components/layout/context';\nimport {type TextType} from '../block/text';\nimport {type ImageType} from '../block/image';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_CONTEXT_ELEMENTS} from '../../constants/limits';\n\ntype ImageOrText = ImageType | TextType;\ntype ImageOrTextElementSet = ImageOrTextElement | ImageOrTextElement[];\n\nexport type ContextType = {\n type: 'context';\n elements: ImageOrText | ImageOrText[];\n block_id?: string;\n};\n\nconst transformContext = (child: Element): ContextType => {\n const {children, blockId} = child.props as ContextProperties;\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n let elements = children as ImageOrTextElementSet;\n if (!Array.isArray(elements)) {\n elements = [elements] as ImageOrTextElement[];\n }\n\n const res: ContextType = {\n type: 'context',\n elements: elements.map(element => transform(element as Element)) as ImageOrText[],\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n warnIfTooMany('Context elements', res.elements as ImageOrText[], MAX_CONTEXT_ELEMENTS);\n\n return res;\n};\n\nexport default transformContext;\n","import {type Element} from '../../constants/types';\nimport {type Props as DividerProperties} from '../../components/layout/divider';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type DividerType = {\n type: 'divider';\n block_id?: string;\n};\n\nconst transformDivider = (child: Element): DividerType => {\n const {blockId} = child.props as DividerProperties;\n\n warnIfTooLong('block_id', blockId, 255);\n\n const res: DividerType = {type: 'divider'};\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformDivider;\n","import {type Element} from '../../constants/types';\nimport {type Props as FileProperties} from '../../components/layout/file';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type FileType = {\n type: 'file';\n source: 'remote';\n external_id: string;\n block_id?: string;\n};\n\nconst transformFile = (child: Element): FileType => {\n const {externalId, blockId} = child.props as FileProperties;\n warnIfTooLong('block_id', blockId, 255);\n const res: FileType = {\n type: 'file',\n source: 'remote',\n external_id: externalId,\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformFile;\n","\nimport {type Element} from '../../constants/types';\nimport {type Props as HeaderProperties} from '../../components/layout/header';\nimport {type TextType} from '../block/text';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_HEADER_TEXT, MAX_BLOCK_ID_LENGTH} from '../../constants/limits';\n\nexport type HeaderType = {\n type: 'header';\n text: TextType;\n block_id?: string;\n};\n\nconst transformHeader = (child: Element): HeaderType => {\n const {text, blockId, emoji} = child.props as HeaderProperties;\n\n requireField('text', text);\n warnIfTooLong('Header text', text, MAX_HEADER_TEXT);\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: HeaderType = {\n type: 'header',\n text: transform(<Text plainText emoji={emoji}>{text}</Text>) as TextType,\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformHeader;\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type Props as ImageProperties} from '../../components/layout/image';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong} from '../../utils/validation';\nimport {\n MAX_IMAGE_URL, MAX_IMAGE_ALT_TEXT, MAX_IMAGE_TITLE, MAX_BLOCK_ID_LENGTH,\n} from '../../constants/limits';\n\nexport type ImageType = {\n type: 'image';\n image_url: string;\n alt_text: string;\n title?: TextType;\n block_id?: string;\n};\n\nconst transformImageLayout = (child: Element): ImageType => {\n const {url, alt, title, blockId} = child.props as ImageProperties;\n\n warnIfTooLong('Image image_url', url, MAX_IMAGE_URL);\n warnIfTooLong('Image alt_text', alt, MAX_IMAGE_ALT_TEXT);\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: ImageType = {\n type: 'image',\n image_url: url,\n alt_text: alt,\n };\n\n if (title) {\n warnIfTooLong('Image title', title, MAX_IMAGE_TITLE);\n res.title = transform(<Text plainText>{title}</Text>) as TextType;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformImageLayout;\n","\nimport {type Element, type SerializedInputBlockElement} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type Props as InputProperties} from '../../components/layout/input';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type InputType = {\n type: 'input';\n label: TextType;\n element: SerializedInputBlockElement;\n hint?: TextType;\n optional?: boolean;\n block_id?: string;\n};\n\nconst transformInput = (child: Element): InputType => {\n const {label, element, hint, optional, blockId} = child.props as InputProperties;\n\n warnIfTooLong('block_id', blockId, 255);\n\n const res: InputType = {\n type: 'input',\n label: transform(<Text plainText>{label}</Text>) as TextType,\n element: transform(element as Element) as SerializedInputBlockElement,\n };\n\n if (hint) {\n res.hint = transform(<Text plainText>{hint}</Text>) as TextType;\n }\n\n if (optional) {\n res.optional = true;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformInput;\n","import {type Element} from '../../constants/types';\nimport {transform} from '../transform';\n\ntype RichTextChild = Element | string;\n\nconst normalizeRichTextChildren = (children: unknown): RichTextChild[] => {\n const result: RichTextChild[] = [];\n const stack = Array.isArray(children) ? [...children] : [children];\n\n while (stack.length > 0) {\n const child = stack.shift();\n\n if (child === null || child === undefined || typeof child === 'boolean') {\n continue;\n }\n\n if (Array.isArray(child)) {\n stack.unshift(...child);\n continue;\n }\n\n result.push(child as RichTextChild);\n }\n\n return result;\n};\n\nexport const toInlineElements = (children: unknown): Array<Record<string, unknown>> => {\n const items = normalizeRichTextChildren(children);\n\n return items.map(item => {\n if (typeof item === 'string') {\n return {type: 'text', text: item};\n }\n\n return transform(item) as Record<string, unknown>;\n });\n};\n\nexport const toBlockElements = (children: unknown): Array<Record<string, unknown>> => {\n const items = normalizeRichTextChildren(children);\n\n return items.map(item => {\n if (typeof item === 'string') {\n return {\n type: 'rich_text_section',\n elements: [{type: 'text', text: item}],\n };\n }\n\n return transform(item) as Record<string, unknown>;\n });\n};\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextProperties} from '../../components/layout/rich-text';\nimport {toBlockElements} from '../rich-text/utils';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type RichTextType = {\n type: 'rich_text';\n elements: Array<Record<string, unknown>>;\n block_id?: string;\n};\n\nconst transformRichText = (child: Element): RichTextType => {\n const {elements, children, blockId} = child.props as RichTextProperties;\n\n warnIfTooLong('block_id', blockId, 255);\n\n const res: RichTextType = {\n type: 'rich_text',\n elements: elements ?? toBlockElements(children),\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformRichText;\n","\nimport {type Element} from '../../constants/types';\nimport {type Props as VideoProperties} from '../../components/layout/video';\nimport {type TextType} from '../block/text';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_VIDEO_DESCRIPTION} from '../../constants/limits';\n\nexport type VideoType = {\n type: 'video';\n title: TextType;\n video_url: string;\n thumbnail_url: string;\n alt_text: string;\n title_url?: string;\n description?: TextType;\n author_name?: string;\n provider_name?: string;\n provider_icon_url?: string;\n block_id?: string;\n};\n\nconst transformVideo = (child: Element): VideoType => {\n const {\n title,\n videoUrl,\n thumbnailUrl,\n altText,\n titleUrl,\n description,\n authorName,\n providerName,\n providerIconUrl,\n blockId,\n } = child.props as VideoProperties;\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: VideoType = {\n type: 'video',\n title: transform(<Text plainText>{title}</Text>) as TextType,\n video_url: videoUrl,\n thumbnail_url: thumbnailUrl,\n alt_text: altText,\n };\n\n if (titleUrl) {\n res.title_url = titleUrl;\n }\n\n if (description) {\n warnIfTooLong('Video description', description, MAX_VIDEO_DESCRIPTION);\n res.description = transform(<Text plainText>{description}</Text>) as TextType;\n }\n\n if (authorName) {\n res.author_name = authorName;\n }\n\n if (providerName) {\n res.provider_name = providerName;\n }\n\n if (providerIconUrl) {\n res.provider_icon_url = providerIconUrl;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformVideo;\n","\nimport Text from '../../components/block/text';\nimport {type Props as TextInputProperties} from '../../components/input/text';\nimport {type TextType as TextProperties} from '../block/text';\nimport {type Element} from '../../constants/types';\nimport {transform} from '../transform';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type TextType = {\n type: 'plain_text_input';\n action_id: string;\n placeholder?: TextProperties;\n initial_value?: string;\n multiline?: boolean;\n min_length?: number;\n max_length?: number;\n focus_on_load?: boolean;\n dispatch_action_config?: {\n trigger_actions_on: Array<'on_enter_pressed' | 'on_character_entered'>;\n };\n};\n\nconst transformTextInput = (child: Element): TextType => {\n const {\n actionId,\n placeholder,\n initial,\n multiline,\n minLength,\n maxLength,\n focusOnLoad,\n dispatchActionConfig,\n } = child.props as TextInputProperties;\n\n warnIfTooLong('TextInput action_id', actionId, 255);\n if (placeholder) {\n warnIfTooLong('TextInput placeholder', placeholder, 150);\n }\n\n const res: TextType = {\n type: 'plain_text_input',\n action_id: actionId,\n };\n\n if (placeholder) {\n res.placeholder = transform(<Text plainText>{placeholder}</Text>) as TextProperties;\n }\n\n if (initial) {\n res.initial_value = initial;\n }\n\n if (multiline) {\n res.multiline = true;\n }\n\n if (minLength) {\n res.min_length = minLength;\n }\n\n if (maxLength) {\n res.max_length = maxLength;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n if (dispatchActionConfig && dispatchActionConfig.triggerActionsOn.length > 0) {\n res.dispatch_action_config = {\n trigger_actions_on: dispatchActionConfig.triggerActionsOn,\n };\n }\n\n return res;\n};\n\nexport default transformTextInput;\n","import {type Element} from '../../constants/types';\nimport {type Props as DateTimePickerProperties} from '../../components/input/date-time-picker';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH} from '../../constants/limits';\n\nexport type DateTimePickerType = {\n type: 'datetimepicker';\n action_id: string;\n initial_date_time?: number;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst transformDateTimePicker = (child: Element): DateTimePickerType => {\n const {actionId, initialDateTime, confirm, focusOnLoad} = child.props as DateTimePickerProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('DateTimePicker action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n const res: DateTimePickerType = {\n type: 'datetimepicker',\n action_id: actionId,\n };\n\n if (initialDateTime !== undefined) {\n if (!Number.isInteger(initialDateTime)) {\n throw new TypeError('DateTime must be a unix timestamp in seconds.');\n }\n\n res.initial_date_time = initialDateTime;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformDateTimePicker;\n","\nimport {type Props as DatePickerProperties} from '../../components/input/date-picker';\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {report} from '../../utils/validation-context';\nimport {MAX_ACTION_ID_LENGTH, MAX_PLACEHOLDER_LENGTH} from '../../constants/limits';\n\nexport type DatePickerType = {\n type: 'datepicker';\n action_id: string;\n placeholder?: TextType;\n initial_date?: string;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst isValidDateString = (value: string): boolean => {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (!match) {\n return false;\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n\n if (month < 1 || month > 12) {\n return false;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n return date.getUTCFullYear() === year\n && date.getUTCMonth() === month - 1\n && date.getUTCDate() === day;\n};\n\nconst transformDatePicker = (child: Element): DatePickerType => {\n const {actionId, placeholder, initialDate, confirm, focusOnLoad} = child.props as DatePickerProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('DatePicker action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (placeholder) {\n warnIfTooLong('DatePicker placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n }\n\n const res: DatePickerType = {\n type: 'datepicker',\n action_id: actionId,\n };\n\n if (placeholder) {\n res.placeholder = transform(<Text plainText>{placeholder}</Text>) as TextType;\n }\n\n if (initialDate) {\n if (!isValidDateString(initialDate)) {\n report('Date must be valid and in format YYYY-MM-DD.', 'invalid-date-format');\n }\n\n res.initial_date = initialDate;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformDatePicker;\n","import {type Element} from '../../constants/types';\nimport {type Props as CheckboxesProperties} from '../../components/input/checkboxes';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type CheckboxesType = {\n type: 'checkboxes';\n action_id: string;\n options: OptionType[];\n initial_options?: OptionType[];\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst transformCheckboxes = (child: Element): CheckboxesType => {\n const {actionId, children, initialOptions, confirm, focusOnLoad} = child.props as CheckboxesProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('Checkboxes action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n let elements = children;\n if (!Array.isArray(elements)) {\n elements = [elements];\n }\n\n const res: CheckboxesType = {\n type: 'checkboxes',\n action_id: actionId,\n options: elements.map(element => transform(element as Element)) as OptionType[],\n };\n\n if (initialOptions && initialOptions.length > 0) {\n res.initial_options = initialOptions.map(option => transform(option as Element)) as OptionType[];\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformCheckboxes;\n","\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nexport const selectTypes = {\n STATIC: 'static',\n EXTERNAL: 'external',\n USER: 'user',\n CONVERSATION: 'conversation',\n CHANNEL: 'channel',\n} as const;\n\ntype SelectType = typeof selectTypes[keyof typeof selectTypes];\n\ntype ConversationFilter = {\n include?: Array<'im' | 'mpim' | 'private' | 'public'>;\n excludeExternalSharedChannels?: boolean;\n excludeBotUsers?: boolean;\n};\n\nexport type Props = {\n placeholder: string;\n actionId: string;\n type?: SelectType;\n multi?: boolean;\n children?: SingleOrArray<JSX.Element>;\n initialOptions?: JSX.Element[];\n confirm?: JSX.Element;\n maxSelectedItems?: number;\n minQueryLength?: number;\n focusOnLoad?: boolean;\n initialUsers?: string[];\n initialConversations?: string[];\n initialChannels?: string[];\n defaultToCurrentConversation?: boolean;\n responseUrlEnabled?: boolean;\n filter?: ConversationFilter;\n};\n\n/**\n * A select menu — supports static options, external data sources, and user /\n * channel / conversation lists. Can be single or multi-select.\n *\n * Use the `type` prop to switch data sources (default: `'static'`).\n * Pass `<Option>` or `<OptionGroup>` children for static selects.\n *\n * @example\n * ```tsx\n * // Static single-select\n * <Select placeholder=\"Pick one\" actionId=\"color\">\n * <Option value=\"red\">Red</Option>\n * <Option value=\"blue\">Blue</Option>\n * </Select>\n *\n * // User multi-select\n * <Select type=\"user\" multi placeholder=\"Pick users\" actionId=\"mentions\" />\n * ```\n */\nexport default class Select {\n static slackType = 'Select';\n declare props: Props;\n}\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {type Props as SelectProperties, selectTypes} from '../../components/input/select';\nimport Text from '../../components/block/text';\nimport {transform} from '../transform';\nimport getType from '../../utils/get-type';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH, MAX_PLACEHOLDER_LENGTH} from '../../constants/limits';\n\nimport {type OptionGroupType} from './option-group';\nimport {type OptionType} from './option';\n\ntype ValidSelectType =\n 'static_select' |\n 'multi_static_select' |\n 'external_select' |\n 'multi_external_select' |\n 'users_select' |\n 'multi_users_select' |\n 'conversations_select' |\n 'multi_conversations_select' |\n 'channels_select' |\n 'multi_channels_select';\n\ntype SelectionType = NonNullable<SelectProperties['type']>;\n\nexport type SelectType = {\n type: ValidSelectType;\n placeholder: TextType;\n action_id: string;\n options?: OptionType[];\n option_groups?: OptionGroupType[];\n initial_option?: OptionType;\n initial_options?: OptionType[];\n confirm?: ConfirmationType;\n max_selected_items?: number;\n min_query_length?: number;\n focus_on_load?: boolean;\n initial_user?: string;\n initial_users?: string[];\n initial_conversation?: string;\n initial_conversations?: string[];\n initial_channel?: string;\n initial_channels?: string[];\n default_to_current_conversation?: boolean;\n response_url_enabled?: boolean;\n filter?: {\n include?: Array<'im' | 'mpim' | 'private' | 'public'>;\n exclude_external_shared_channels?: boolean;\n exclude_bot_users?: boolean;\n };\n};\n\nconst OPTION = 'Option';\nconst OPTION_GROUP = 'OptionGroup';\n\nconst types = {\n [selectTypes.STATIC]: 'static_select',\n [selectTypes.EXTERNAL]: 'external_select',\n [selectTypes.USER]: 'users_select',\n [selectTypes.CONVERSATION]: 'conversations_select',\n [selectTypes.CHANNEL]: 'channels_select',\n};\nconst MULTI_PREFIX = 'multi_';\n\nconst normalizeElements = (elements?: SelectProperties['children']): JSX.Element[] => {\n if (!elements) {\n return [];\n }\n\n return Array.isArray(elements) ? elements : [elements];\n};\n\nconst assignStaticOptions = (elements: JSX.Element[], result: SelectType): void => {\n const elementType = getType(elements[0] as Element);\n if (elements.some(element => getType(element as Element) !== elementType)) {\n if (elementType === OPTION && elements.some(element => getType(element as Element) !== OPTION_GROUP)) {\n throw new TypeError('You cannot mix OptionGroup types with Option types in a Select block.');\n } else if (elementType === OPTION_GROUP && elements.some(element => getType(element as Element) !== OPTION)) {\n throw new TypeError('You cannot mix OptionGroup types with Option types in a Select block.');\n }\n\n throw new TypeError('Only allowed types are Option OR OptionGroup');\n }\n\n if (elementType === OPTION) {\n result.options = elements.map(element => transform(element as Element)) as OptionType[];\n } else if (elementType === OPTION_GROUP) {\n result.option_groups = elements.map(element => transform(element as Element)) as OptionGroupType[];\n }\n};\n\nconst applyInitialSelections = (\n type: SelectionType,\n isMulti: boolean,\n result: SelectType,\n initialValues: {\n initialOptions?: JSX.Element[];\n initialUsers?: string[];\n initialConversations?: string[];\n initialChannels?: string[];\n },\n): void => {\n const {initialOptions, initialUsers, initialConversations, initialChannels} = initialValues;\n\n switch (type) {\n case selectTypes.USER: {\n if (initialUsers && initialUsers.length > 0) {\n if (isMulti) {\n result.initial_users = initialUsers;\n } else {\n result.initial_user = initialUsers[0];\n }\n }\n\n break;\n }\n\n case selectTypes.CONVERSATION: {\n if (initialConversations && initialConversations.length > 0) {\n if (isMulti) {\n result.initial_conversations = initialConversations;\n } else {\n result.initial_conversation = initialConversations[0];\n }\n }\n\n break;\n }\n\n case selectTypes.CHANNEL: {\n if (initialChannels && initialChannels.length > 0) {\n if (isMulti) {\n result.initial_channels = initialChannels;\n } else {\n result.initial_channel = initialChannels[0];\n }\n }\n\n break;\n }\n\n case selectTypes.STATIC:\n case selectTypes.EXTERNAL: {\n if (initialOptions && initialOptions.length > 0) {\n const transformedOptions = initialOptions.map(element => transform(element as Element)) as OptionType[];\n\n if (isMulti) {\n result.initial_options = transformedOptions;\n } else {\n result.initial_option = transformedOptions[0];\n }\n }\n\n break;\n }\n }\n};\n\nconst transformSelect = (child: Element): SelectType => {\n const {\n placeholder,\n actionId,\n multi,\n children,\n initialOptions,\n confirm,\n maxSelectedItems,\n type: typeProperty,\n initialUsers,\n initialConversations,\n initialChannels,\n minQueryLength,\n focusOnLoad,\n defaultToCurrentConversation,\n responseUrlEnabled,\n filter,\n } = child.props as SelectProperties;\n\n const type: SelectionType = typeProperty ?? selectTypes.STATIC;\n const typeString = `${multi ? MULTI_PREFIX : ''}${types[type]}` as ValidSelectType;\n\n requireField('actionId', actionId);\n requireField('placeholder', placeholder);\n warnIfTooLong('Select action_id', actionId, MAX_ACTION_ID_LENGTH);\n warnIfTooLong('Select placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n\n const result: SelectType = {\n type: typeString,\n placeholder: transform(<Text plainText>{placeholder}</Text>) as TextType,\n action_id: actionId,\n };\n\n const elements = normalizeElements(children);\n\n if (type === selectTypes.STATIC) {\n assignStaticOptions(elements, result);\n }\n\n if (confirm) {\n result.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n applyInitialSelections(type, Boolean(multi), result, {\n initialOptions,\n initialUsers,\n initialConversations,\n initialChannels,\n });\n\n if (maxSelectedItems) {\n result.max_selected_items = maxSelectedItems;\n }\n\n if (focusOnLoad !== undefined) {\n result.focus_on_load = focusOnLoad;\n }\n\n if (type === selectTypes.EXTERNAL && minQueryLength !== undefined) {\n result.min_query_length = minQueryLength;\n }\n\n if (type === selectTypes.CONVERSATION) {\n if (defaultToCurrentConversation !== undefined) {\n result.default_to_current_conversation = defaultToCurrentConversation;\n }\n\n if (responseUrlEnabled !== undefined) {\n result.response_url_enabled = responseUrlEnabled;\n }\n\n if (filter) {\n const filterValue: SelectType['filter'] = {};\n\n if (filter.include && filter.include.length > 0) {\n filterValue.include = filter.include;\n }\n\n if (filter.excludeExternalSharedChannels !== undefined) {\n filterValue.exclude_external_shared_channels = filter.excludeExternalSharedChannels;\n }\n\n if (filter.excludeBotUsers !== undefined) {\n filterValue.exclude_bot_users = filter.excludeBotUsers;\n }\n\n if (Object.keys(filterValue).length > 0) {\n result.filter = filterValue;\n }\n }\n }\n\n return result;\n};\n\nexport default transformSelect;\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport Text from '../../components/block/text';\nimport {type Props as OptionProperties} from '../../components/input/option';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {\n MAX_OPTION_TEXT, MAX_OPTION_VALUE, MAX_OPTION_DESCRIPTION, MAX_OPTION_URL,\n} from '../../constants/limits';\n\nexport type OptionType = {\n text: TextType;\n value: string;\n description?: TextType;\n url?: string;\n};\n\nconst transformOption = (child: Element): OptionType => {\n const {children: text, value, url, description} = child.props as OptionProperties;\n\n requireField('value', value);\n warnIfTooLong('Option text', text, MAX_OPTION_TEXT);\n warnIfTooLong('Option value', value, MAX_OPTION_VALUE);\n warnIfTooLong('Option description', description, MAX_OPTION_DESCRIPTION);\n warnIfTooLong('Option url', url, MAX_OPTION_URL);\n\n const res: OptionType = {\n text: transform(<Text plainText>{text}</Text>) as TextType,\n value,\n };\n\n if (description) {\n res.description = transform(<Text plainText>{description}</Text>) as TextType;\n }\n\n if (url) {\n res.url = url;\n }\n\n return res;\n};\n\nexport default transformOption;\n","\nimport Text from '../../components/block/text';\nimport {type Props as OptionGroupProperties} from '../../components/input/option-group';\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany} from '../../utils/validation';\nimport {MAX_OPTION_GROUP_LABEL, MAX_OPTION_GROUP_OPTIONS} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type OptionGroupType = {\n label: TextType;\n options: OptionType[];\n};\n\nconst transformOptionGroup = (child: Element): OptionGroupType => {\n const {label, children} = child.props as OptionGroupProperties;\n\n warnIfTooLong('OptionGroup label', label, MAX_OPTION_GROUP_LABEL);\n\n let options = children;\n if (!Array.isArray(options)) {\n options = [options];\n }\n\n warnIfTooMany('OptionGroup options', options, MAX_OPTION_GROUP_OPTIONS);\n\n return {\n label: transform(<Text plainText>{label}</Text>) as TextType,\n options: options.map(option => transform(option as Element)) as OptionType[],\n };\n};\n\nexport default transformOptionGroup;\n","import {type Element} from '../../constants/types';\nimport {type Props as OverflowProperties} from '../../components/input/overflow';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong} from '../../utils/validation';\n\nimport {type OptionType} from './option';\n\nexport type OverflowType = {\n type: 'overflow';\n action_id: string;\n options: OptionType[];\n confirm?: ConfirmationType;\n};\n\nconst transformOverflow = (child: Element): OverflowType => {\n const {actionId, children, confirm} = child.props as OverflowProperties;\n\n warnIfTooLong('Overflow action_id', actionId, 255);\n\n let elements = children;\n if (!Array.isArray(elements)) {\n elements = [elements];\n }\n\n const res: OverflowType = {\n type: 'overflow',\n action_id: actionId,\n options: elements.map(element => transform(element as Element)) as OptionType[],\n };\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n return res;\n};\n\nexport default transformOverflow;\n","import {type Element} from '../../constants/types';\nimport {type Props as RadioGroupProperties} from '../../components/input/radio-group';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type RadioGroupType = {\n type: 'radio_buttons';\n action_id: string;\n options: OptionType[];\n initial_option?: OptionType;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst transformRadioGroup = (child: Element): RadioGroupType => {\n const {actionId, children, initialOption, confirm, focusOnLoad} = child.props as RadioGroupProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('RadioGroup action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n let elements = children;\n if (!Array.isArray(elements)) {\n elements = [elements];\n }\n\n const res: RadioGroupType = {\n type: 'radio_buttons',\n action_id: actionId,\n options: elements.map(element => transform(element as Element)) as OptionType[],\n };\n\n if (initialOption) {\n res.initial_option = transform(initialOption as Element) as OptionType;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformRadioGroup;\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {type Props as TimePickerProperties} from '../../components/input/time-picker';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {report} from '../../utils/validation-context';\nimport {MAX_ACTION_ID_LENGTH, MAX_PLACEHOLDER_LENGTH} from '../../constants/limits';\n\nexport type TimePickerType = {\n type: 'timepicker';\n action_id: string;\n placeholder?: TextType;\n initial_time?: string;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst isValidTimeString = (value: string): boolean => {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value);\n if (!match) {\n return false;\n }\n\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n\n return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59;\n};\n\nconst transformTimePicker = (child: Element): TimePickerType => {\n const {actionId, placeholder, initialTime, confirm, focusOnLoad} = child.props as TimePickerProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('TimePicker action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (placeholder) {\n warnIfTooLong('TimePicker placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n }\n\n const res: TimePickerType = {\n type: 'timepicker',\n action_id: actionId,\n };\n\n if (placeholder) {\n res.placeholder = transform(<Text plainText>{placeholder}</Text>) as TextType;\n }\n\n if (initialTime) {\n if (!isValidTimeString(initialTime)) {\n report('Time must be valid and in format HH:MM.', 'invalid-time-format');\n }\n\n res.initial_time = initialTime;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformTimePicker;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextSectionProperties} from '../../components/rich-text/section';\n\nimport {toInlineElements} from './utils';\n\ntype RichTextSectionType = {\n type: 'rich_text_section';\n elements: Array<Record<string, unknown>>;\n};\n\nconst transformRichTextSection = (child: Element): RichTextSectionType => {\n const {children} = child.props as RichTextSectionProperties;\n\n return {\n type: 'rich_text_section',\n elements: toInlineElements(children),\n };\n};\n\nexport default transformRichTextSection;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextListProperties} from '../../components/rich-text/list';\nimport {type RichTextListStyle} from '../../components/rich-text/types';\n\nimport {toBlockElements} from './utils';\n\ntype RichTextListType = {\n type: 'rich_text_list';\n style: RichTextListStyle;\n elements: Array<Record<string, unknown>>;\n indent?: number;\n border?: number;\n};\n\nconst transformRichTextList = (child: Element): RichTextListType => {\n const {style, children, indent, border} = child.props as RichTextListProperties;\n\n const res: RichTextListType = {\n type: 'rich_text_list',\n style,\n elements: toBlockElements(children),\n };\n\n if (indent !== undefined) {\n res.indent = indent;\n }\n\n if (border !== undefined) {\n res.border = border;\n }\n\n return res;\n};\n\nexport default transformRichTextList;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextQuoteProperties} from '../../components/rich-text/quote';\n\nimport {toInlineElements} from './utils';\n\ntype RichTextQuoteType = {\n type: 'rich_text_quote';\n elements: Array<Record<string, unknown>>;\n};\n\nconst transformRichTextQuote = (child: Element): RichTextQuoteType => {\n const {children} = child.props as RichTextQuoteProperties;\n\n return {\n type: 'rich_text_quote',\n elements: toInlineElements(children),\n };\n};\n\nexport default transformRichTextQuote;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextPreformattedProperties} from '../../components/rich-text/preformatted';\n\nimport {toInlineElements} from './utils';\n\ntype RichTextPreformattedType = {\n type: 'rich_text_preformatted';\n elements: Array<Record<string, unknown>>;\n};\n\nconst transformRichTextPreformatted = (child: Element): RichTextPreformattedType => {\n const {children} = child.props as RichTextPreformattedProperties;\n\n return {\n type: 'rich_text_preformatted',\n elements: toInlineElements(children),\n };\n};\n\nexport default transformRichTextPreformatted;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextTextProperties} from '../../components/rich-text/text';\nimport {type RichTextStyle} from '../../components/rich-text/types';\n\ntype RichTextTextType = {\n type: 'text';\n text: string;\n style?: RichTextStyle;\n};\n\nconst transformRichTextText = (child: Element): RichTextTextType => {\n const {children, style} = child.props as RichTextTextProperties;\n\n const res: RichTextTextType = {\n type: 'text',\n text: children,\n };\n\n if (style) {\n res.style = style;\n }\n\n return res;\n};\n\nexport default transformRichTextText;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextLinkProperties} from '../../components/rich-text/link';\nimport {type RichTextStyle} from '../../components/rich-text/types';\n\ntype RichTextLinkType = {\n type: 'link';\n url: string;\n text?: string;\n style?: RichTextStyle;\n};\n\nconst transformRichTextLink = (child: Element): RichTextLinkType => {\n const {url, children, style} = child.props as RichTextLinkProperties;\n\n const res: RichTextLinkType = {\n type: 'link',\n url,\n };\n\n if (children) {\n res.text = children;\n }\n\n if (style) {\n res.style = style;\n }\n\n return res;\n};\n\nexport default transformRichTextLink;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextUserProperties} from '../../components/rich-text/user';\n\ntype RichTextUserType = {\n type: 'user';\n user_id: string;\n};\n\nconst transformRichTextUser = (child: Element): RichTextUserType => {\n const {userId} = child.props as RichTextUserProperties;\n\n return {\n type: 'user',\n user_id: userId,\n };\n};\n\nexport default transformRichTextUser;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextChannelProperties} from '../../components/rich-text/channel';\n\ntype RichTextChannelType = {\n type: 'channel';\n channel_id: string;\n};\n\nconst transformRichTextChannel = (child: Element): RichTextChannelType => {\n const {channelId} = child.props as RichTextChannelProperties;\n\n return {\n type: 'channel',\n channel_id: channelId,\n };\n};\n\nexport default transformRichTextChannel;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextEmojiProperties} from '../../components/rich-text/emoji';\n\ntype RichTextEmojiType = {\n type: 'emoji';\n name: string;\n};\n\nconst transformRichTextEmoji = (child: Element): RichTextEmojiType => {\n const {name} = child.props as RichTextEmojiProperties;\n\n return {\n type: 'emoji',\n name,\n };\n};\n\nexport default transformRichTextEmoji;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextDateProperties} from '../../components/rich-text/date';\n\ntype RichTextDateType = {\n type: 'date';\n timestamp: number;\n format: string;\n fallback: string;\n};\n\nconst transformRichTextDate = (child: Element): RichTextDateType => {\n const {timestamp, format, fallback} = child.props as RichTextDateProperties;\n\n return {\n type: 'date',\n timestamp,\n format,\n fallback,\n };\n};\n\nexport default transformRichTextDate;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextBroadcastProperties} from '../../components/rich-text/broadcast';\nimport {type RichTextBroadcastRange} from '../../components/rich-text/types';\n\ntype RichTextBroadcastType = {\n type: 'broadcast';\n range: RichTextBroadcastRange;\n};\n\nconst transformRichTextBroadcast = (child: Element): RichTextBroadcastType => {\n const {range} = child.props as RichTextBroadcastProperties;\n\n return {\n type: 'broadcast',\n range,\n };\n};\n\nexport default transformRichTextBroadcast;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextUserGroupProperties} from '../../components/rich-text/user-group';\n\ntype RichTextUserGroupType = {\n type: 'usergroup';\n usergroup_id: string;\n};\n\nconst transformRichTextUserGroup = (child: Element): RichTextUserGroupType => {\n const {usergroupId} = child.props as RichTextUserGroupProperties;\n\n return {\n type: 'usergroup',\n usergroup_id: usergroupId,\n };\n};\n\nexport default transformRichTextUserGroup;\n","import Text from './block/text';\nimport Confirmation from './block/confirmation';\nimport Button from './block/button';\nimport Image from './block/image';\nimport Container from './layout/container';\nimport Section from './layout/section';\nimport Actions from './layout/actions';\nimport Context from './layout/context';\nimport Divider from './layout/divider';\nimport File from './layout/file';\nimport Header from './layout/header';\nimport ImageLayout from './layout/image';\nimport Input from './layout/input';\nimport RichText from './layout/rich-text';\nimport Video from './layout/video';\nimport TextInput from './input/text';\nimport DateTimePicker from './input/date-time-picker';\nimport DatePicker from './input/date-picker';\nimport Checkboxes from './input/checkboxes';\nimport Select from './input/select';\nimport Option from './input/option';\nimport OptionGroup from './input/option-group';\nimport Overflow from './input/overflow';\nimport RadioGroup from './input/radio-group';\nimport TimePicker from './input/time-picker';\nimport RichTextSection from './rich-text/section';\nimport RichTextList from './rich-text/list';\nimport RichTextQuote from './rich-text/quote';\nimport RichTextPreformatted from './rich-text/preformatted';\nimport RichTextText from './rich-text/text';\nimport RichTextLink from './rich-text/link';\nimport RichTextUser from './rich-text/user';\nimport RichTextChannel from './rich-text/channel';\nimport RichTextEmoji from './rich-text/emoji';\nimport RichTextDate from './rich-text/date';\nimport RichTextBroadcast from './rich-text/broadcast';\nimport RichTextUserGroup from './rich-text/user-group';\nimport Transformers from './registry';\n\nObject.assign(Transformers, {\n Container,\n Section,\n Actions,\n Context,\n Divider,\n File,\n Header,\n ImageLayout,\n Input,\n RichText,\n Video,\n Text,\n Confirmation,\n Button,\n Image,\n TextInput,\n DateTimePicker,\n DatePicker,\n Checkboxes,\n Select,\n Overflow,\n RadioGroup,\n TimePicker,\n Option,\n OptionGroup,\n RichTextSection,\n RichTextList,\n RichTextQuote,\n RichTextPreformatted,\n RichTextText,\n RichTextLink,\n RichTextUser,\n RichTextChannel,\n RichTextEmoji,\n RichTextDate,\n RichTextBroadcast,\n RichTextUserGroup,\n});\n\nexport {default} from './registry';\n","import {type Child, type Block} from '../constants/types';\nimport transformers from '../transformers';\nimport getType from '../utils/get-type';\nimport normalizeChildren from '../utils/normalize-children';\nimport {pushPath, popPath, report} from '../utils/validation-context';\n\n/** Internal parser output — partial message assembled by the renderer. */\ntype ParsedMessage = {text?: string; blocks?: Block[]};\n\nconst appendTransformed = (value: unknown, blocks: Block[]): void => {\n if (value === null || value === undefined || typeof value === 'boolean') {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n appendTransformed(item, blocks);\n }\n\n return;\n }\n\n blocks.push(value as Block);\n};\n\nconst parseChildren = (children: Child): ParsedMessage => {\n if (typeof children === 'string') {\n return {text: children};\n }\n\n const normalizedChildren = normalizeChildren(children);\n\n const transformedBlocks: Block[] = [];\n for (const child of normalizedChildren) {\n const type = getType(child);\n const transformer = transformers[type];\n\n if (transformer) {\n pushPath(type);\n try {\n appendTransformed(transformer(child), transformedBlocks);\n } finally {\n popPath();\n }\n } else if (type !== 'null') {\n report(`No transformer for component type '${type}'.`, 'unknown-type');\n }\n }\n\n if (transformedBlocks.length === 0) {\n return {blocks: []};\n }\n\n return {blocks: transformedBlocks};\n};\n\nexport default parseChildren;\n","import {\n type SlackMessageDraft, type Element, type Block, type Child,\n type SlackPostMessagePayload, type SlackPostEphemeralPayload, type BoltCompatiblePayload,\n} from '../constants/types';\nimport {type Properties as MessageProperties} from '../components/message';\nimport parser from '../parser';\nimport getType from '../utils/get-type';\nimport {warnIfTooMany, warnIfTooLong} from '../utils/validation';\nimport {\n initContext, pushPath, popPath, type ValidationMode,\n} from '../utils/validation-context';\nimport {MAX_BLOCKS, MAX_MESSAGE_TEXT, RECOMMENDED_MESSAGE_TEXT} from '../constants/limits';\n\n/**\n * Options passed to `render()`, `renderToMessage()`, and `renderToBlocks()`.\n *\n * @property validate - Validation mode. Defaults to `'warn'`.\n * - `'warn'` — log warnings via `console.warn` (default)\n * - `'strict'` — throw `SlackblockValidationError` on any violation\n * - `'off'` — disable validation entirely\n * @property channel - When provided, the result includes `channel` and is typed\n * as `SlackPostMessagePayload` (directly usable with `chat.postMessage`).\n * @property user - When provided alongside `channel`, the result is typed as\n * `SlackPostEphemeralPayload` (directly usable with `chat.postEphemeral`).\n * Has no effect without `channel`.\n */\nexport type RenderOptions = {validate?: ValidationMode; channel?: string; user?: string};\n\n/**\n * Renders JSX children directly to a `Block[]` array, without requiring a\n * `<Message>` wrapper. Useful for modals, home tabs, and other surfaces that\n * accept a blocks array rather than a full message payload.\n */\nexport const renderToBlocks = (element: Child, options?: RenderOptions): Block[] => {\n initContext(options?.validate ?? 'warn');\n // Unwrap top-level fragments so the parser receives their children directly.\n const child: Child\n = typeof element === 'object'\n && element !== null\n && !Array.isArray(element)\n && (element).type === 'fragment'\n ? (element).props.children as Child\n : element;\n const result = parser(child);\n return result.blocks ?? [];\n};\n\nconst applyMessageMetadata = (json: SlackMessageDraft, properties: MessageProperties): void => {\n if (properties.iconEmoji) {\n json.icon_emoji = properties.iconEmoji;\n }\n\n if (properties.iconUrl) {\n json.icon_url = properties.iconUrl;\n }\n\n if (properties.parse) {\n json.parse = properties.parse;\n }\n\n if (properties.username) {\n json.username = properties.username;\n }\n\n if (properties.asUser) {\n json.as_user = properties.asUser;\n }\n\n if (properties.replyBroadcast) {\n json.reply_broadcast = properties.replyBroadcast;\n }\n\n if (properties.unfurlLinks) {\n json.unfurl_links = properties.unfurlLinks;\n }\n\n if (properties.unfurlMedia !== undefined) {\n json.unfurl_media = properties.unfurlMedia;\n }\n};\n\n/**\n * Renders a `<Message>` JSX tree to a full Slack message payload.\n *\n * Pass `channel` (and optionally `user`) in the `options` argument to get a\n * fully-typed payload that can be passed directly to the Slack SDK without any\n * cast:\n *\n * @example\n * ```tsx\n * // say / respond — no options needed\n * await say(render(<Message text=\"Hello\"><Header text=\"Hi\" /></Message>));\n *\n * // chat.postMessage — channel in options → SlackPostMessagePayload, no cast\n * const msg = render(<Message text=\"Hello\">...</Message>, {channel: '#general'});\n * await client.chat.postMessage(msg);\n *\n * // chat.postEphemeral — channel + user in options → SlackPostEphemeralPayload, no cast\n * const msg = render(<Message text=\"Hello\" />, {channel: '#general', user: userId});\n * await client.chat.postEphemeral(msg);\n * ```\n */\nfunction render(element: Element, options: RenderOptions & {channel: string; user: string}): SlackPostEphemeralPayload;\nfunction render(element: Element, options: RenderOptions & {channel: string}): SlackPostMessagePayload;\nfunction render(element: Element, options?: RenderOptions): BoltCompatiblePayload;\nfunction render(element: Element, options?: RenderOptions): SlackMessageDraft {\n initContext(options?.validate ?? 'warn');\n\n const properties = element.props as MessageProperties;\n\n const typeName = getType(element);\n if (typeName !== 'Message') {\n throw new TypeError('Provided top-level element must be a Message type.');\n }\n\n if (!properties.children && !properties.text) {\n throw new Error('Cannot render a Message with no children or text.');\n }\n\n pushPath('Message');\n let json: SlackMessageDraft;\n try {\n // Parser returns a partial message (no required `text`); renderer sets it below.\n // eslint-disable-next-line prefer-object-spread -- Object.assign avoids object-literal type assertion lint conflict\n json = Object.assign({}, parser(properties.children)) as SlackMessageDraft;\n\n if (properties.replyTo) {\n json.thread_ts = properties.replyTo;\n }\n\n if (properties.markdown !== undefined) {\n json.mrkdwn = properties.markdown;\n }\n\n // String children produce {text} from the parser; fall back to that if no explicit text prop.\n json.text = properties.text ?? json.text ?? '';\n\n if (properties.text && properties.text.length > MAX_MESSAGE_TEXT) {\n warnIfTooLong(`Message text (Slack will truncate beyond ${MAX_MESSAGE_TEXT} chars)`, properties.text, MAX_MESSAGE_TEXT);\n } else if (properties.text) {\n warnIfTooLong('Message text (recommended max for best results)', properties.text, RECOMMENDED_MESSAGE_TEXT);\n }\n\n // Options.channel / options.user take precedence over the Message JSX props.\n const channel = options?.channel ?? properties.channel;\n const user = options?.user ?? properties.user;\n\n if (channel) {\n json.channel = channel;\n }\n\n if (user) {\n json.user = user;\n }\n\n applyMessageMetadata(json, properties);\n\n if (properties.color && json.blocks) {\n json.attachments = [\n {\n fallback: json.text,\n color: properties.color,\n blocks: json.blocks,\n },\n ];\n\n delete json.blocks;\n }\n\n if (json.blocks) {\n warnIfTooMany('Message blocks', json.blocks, MAX_BLOCKS);\n }\n } finally {\n popPath();\n }\n\n return json;\n}\n\nexport default render;\n\n/**\n * Named alias for {@link render}. Produces a full Slack message payload\n * (including `text`, `blocks`, and optional `attachments` when `color` is set).\n */\nexport {render as renderToMessage};\n","/**\n * Escapes Slack mrkdwn special characters in a string to prevent unintended\n * formatting. Use this when inserting untrusted user content into mrkdwn fields.\n *\n * Escapes: `&` `<` `>` `*` `_` `~` `` ` ``\n *\n * @example\n * ```ts\n * import { escapeMrkdwn } from 'slackblock';\n *\n * const safe = escapeMrkdwn('Hello *world* <script>');\n * // → \"Hello \\u200B*world\\u200B* <script>\"\n * ```\n */\nexport const escapeMrkdwn = (text: string): string =>\n text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll(/[*_~`]/g, '\\u200B$&');\n","import {type Block} from '../constants/types';\n\n/**\n * Returns a Slack Block Kit Builder URL for previewing the given blocks.\n * Open the URL in a browser to inspect layout and interactivity.\n */\nexport const blockKitBuilderUrl = (blocks: Block[]): string =>\n `https://app.slack.com/block-kit-builder#${JSON.stringify({blocks})}`;\n"],"mappings":"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","names":["image_default","text_default","section_default","text_default","image_default","text_default","section_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/utils/validation-context.ts","../src/utils/validation.ts","../src/transformers/block/text.ts","../src/utils/get-type.ts","../src/transformers/registry.ts","../src/transformers/transform.ts","../src/components/block/text.tsx","../src/constants/limits.ts","../src/jsx-runtime.ts","../src/transformers/block/confirmation.tsx","../src/transformers/block/button.tsx","../src/transformers/block/image.ts","../src/utils/normalize-children.ts","../src/transformers/layout/container.ts","../src/transformers/layout/section.ts","../src/transformers/layout/actions.ts","../src/transformers/layout/context.ts","../src/transformers/layout/divider.ts","../src/transformers/layout/file.ts","../src/transformers/layout/header.tsx","../src/transformers/layout/image.tsx","../src/transformers/layout/input.tsx","../src/transformers/rich-text/utils.ts","../src/transformers/layout/rich-text.ts","../src/transformers/layout/video.tsx","../src/transformers/input/text.tsx","../src/transformers/input/date-time-picker.ts","../src/transformers/input/date-picker.tsx","../src/transformers/input/checkboxes.ts","../src/components/input/select.tsx","../src/transformers/input/select.tsx","../src/transformers/input/option.tsx","../src/transformers/input/option-group.tsx","../src/transformers/input/overflow.ts","../src/transformers/input/radio-group.ts","../src/transformers/input/time-picker.tsx","../src/transformers/rich-text/section.ts","../src/transformers/rich-text/list.ts","../src/transformers/rich-text/quote.ts","../src/transformers/rich-text/preformatted.ts","../src/transformers/rich-text/text.ts","../src/transformers/rich-text/link.ts","../src/transformers/rich-text/user.ts","../src/transformers/rich-text/channel.ts","../src/transformers/rich-text/emoji.ts","../src/transformers/rich-text/date.ts","../src/transformers/rich-text/broadcast.ts","../src/transformers/rich-text/user-group.ts","../src/transformers/index.ts","../src/parser/index.ts","../src/renderer/index.ts","../src/utils/escape-mrkdwn.ts","../src/utils/block-kit-builder.ts"],"sourcesContent":["export type ValidationRule =\n | 'required-field'\n | 'too-long'\n | 'too-many'\n | 'invalid-format'\n | 'invalid-value'\n | 'invalid-structure'\n | 'unsupported-prop'\n | 'unsupported-child';\n\nexport type ValidationIssue = {\n rule: ValidationRule;\n subcode?: string;\n message: string;\n path: string;\n component?: string;\n field?: string;\n};\n\n/**\n * Error thrown by `render()` / `renderToBlocks()` when `validate: 'strict'`\n * is set and a validation rule is violated.\n *\n * @example\n * ```ts\n * import { SlackblockValidationError } from 'slackblock';\n *\n * try {\n * render(<Message>...</Message>, { validate: 'strict' });\n * } catch (err) {\n * if (err instanceof SlackblockValidationError) {\n * console.error(err.message); // \"Message > Header: Header text exceeds 150 characters.\"\n * console.error(err.path); // \"Message > Header\"\n * console.error(err.rule); // \"too-long\"\n * console.error(err.subcode); // \"value-too-long\"\n * }\n * }\n * ```\n */\nexport class SlackblockValidationError extends Error {\n readonly path: string;\n readonly rule: ValidationRule;\n readonly subcode?: string;\n readonly component?: string;\n readonly field?: string;\n readonly issue: ValidationIssue;\n\n constructor(issue: ValidationIssue) {\n super(`${issue.path}: ${issue.message}`);\n this.name = 'SlackblockValidationError';\n this.path = issue.path;\n this.rule = issue.rule;\n this.subcode = issue.subcode;\n this.component = issue.component;\n this.field = issue.field;\n this.issue = issue;\n }\n}\n","import {SlackblockValidationError, type ValidationIssue, type ValidationRule} from '../errors';\n\n/**\n * Controls how SlackBlock handles validation violations during rendering.\n *\n * - `'warn'` — emit `console.warn` messages (default)\n * - `'strict'` — throw `SlackblockValidationError`\n * - `'off'` — suppress all validation\n */\nexport type ValidationMode = 'off' | 'warn' | 'strict';\nexport type ValidationReporter = (issue: ValidationIssue) => void;\n\ntype ValidationContext = {\n mode: ValidationMode;\n path: string[];\n reporter?: ValidationReporter;\n};\n\nconst context: ValidationContext = {\n mode: 'warn',\n path: [],\n reporter: undefined,\n};\n\nexport const initContext = (mode: ValidationMode, reporter?: ValidationReporter): void => {\n context.mode = mode;\n context.path = [];\n context.reporter = reporter;\n};\n\nexport const pushPath = (segment: string): void => {\n context.path.push(segment);\n};\n\nexport const popPath = (): void => {\n context.path.pop();\n};\n\nconst getPath = (): string => context.path.join(' > ');\n\ntype ReportInput = {\n message: string;\n rule: ValidationRule;\n subcode?: string;\n component?: string;\n field?: string;\n};\n\nconst getCurrentComponent = (): string | undefined => {\n for (let index = context.path.length - 1; index >= 0; index--) {\n const segment = context.path[index];\n\n if (segment !== 'Message') {\n return segment;\n }\n }\n\n return context.path.at(-1);\n};\n\nconst toIssue = (input: ReportInput): ValidationIssue => ({\n ...input,\n path: getPath(),\n component: input.component ?? getCurrentComponent(),\n});\n\nexport const report = (input: ReportInput): void => {\n if (context.mode === 'off') {\n return;\n }\n\n const issue = toIssue(input);\n\n if (context.mode === 'warn') {\n if (context.reporter) {\n context.reporter(issue);\n } else {\n console.warn(`[slackblock] ${issue.path}: ${issue.message}`);\n }\n\n return;\n }\n\n throw new SlackblockValidationError(issue);\n};\n","import {report} from './validation-context';\n\nconst toKebab = (name: string): string => name.replaceAll(/([A-Z])/g, '-$1').toLowerCase();\nconst isMissing = (value: unknown): boolean => {\n if (value === undefined || value === null) {\n return true;\n }\n\n if (typeof value === 'string') {\n return value === '';\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n return false;\n};\n\nexport const warnIfTooLong = (name: string, value: string | undefined, max: number): void => {\n if (!value) {\n return;\n }\n\n if (value.length > max) {\n report({\n message: `${name} exceeds ${max} characters.`,\n rule: 'too-long',\n subcode: 'value-too-long',\n });\n }\n};\n\nexport const warnIfTooMany = (name: string, values: unknown[] | undefined, max: number): void => {\n if (!values) {\n return;\n }\n\n if (values.length > max) {\n report({\n message: `${name} exceeds ${max} items.`,\n rule: 'too-many',\n subcode: 'too-many-items',\n });\n }\n};\n\nexport const requireField = (fieldName: string, value: unknown): void => {\n if (isMissing(value)) {\n report({\n message: `${fieldName} is required.`,\n rule: 'required-field',\n subcode: `${toKebab(fieldName)}-required`,\n field: fieldName,\n });\n }\n};\n\nexport const requireOneOf = (fieldNames: string[], values: unknown[]): void => {\n if (values.some(value => !isMissing(value))) {\n return;\n }\n\n report({\n message: `At least one of ${fieldNames.join(' or ')} is required.`,\n rule: 'invalid-structure',\n subcode: `${fieldNames.map(fieldName => toKebab(fieldName)).join('-or-')}-required`,\n });\n};\n","import {type Element} from '../../constants/types';\nimport {type Props as TextProps} from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\n\nexport type TextType = {\n type: 'plain_text' | 'mrkdwn';\n text: string;\n emoji?: boolean;\n verbatim?: boolean;\n};\n\nconst transformText = (element: Element): TextType => {\n const {plainText, children, emoji, verbatim} = element.props as TextProps;\n\n const res: TextType = {\n type: plainText ? 'plain_text' : 'mrkdwn',\n text: children ?? '',\n };\n\n requireField('text', children);\n if (typeof children === 'string') {\n warnIfTooLong('Text', children, 3000);\n }\n\n if (emoji) {\n res.emoji = true;\n }\n\n if (verbatim) {\n res.verbatim = true;\n }\n\n return res;\n};\n\nexport default transformText;\n","import {type Child} from '../constants/types';\n\nconst getType = (element: Child): string => {\n if (typeof element === 'string') {\n return 'string';\n }\n\n if (element === null || element === undefined || typeof element === 'boolean') {\n return 'null';\n }\n\n if (Array.isArray(element)) {\n throw new TypeError('Cannot type arrays');\n }\n\n const {type} = element;\n\n if (typeof type === 'string') {\n return type;\n }\n\n const {slackType, displayName, name} = type as {\n slackType?: string;\n displayName?: string;\n name?: string;\n };\n\n return slackType ?? displayName ?? name ?? (type as unknown as string);\n};\n\nexport default getType;\n","import {type Child} from '../constants/types';\n\ntype TransformersType = Record<string, (child: Child) => unknown>;\n\n// Mutable registry populated by index.ts at module init time.\n// transform.ts imports this directly to avoid a circular dependency.\nconst Transformers: TransformersType = {};\n\nexport default Transformers;\n","import {type Element} from '../constants/types';\nimport getType from '../utils/get-type';\nimport {pushPath, popPath, report} from '../utils/validation-context';\n\nimport Transformers from './registry';\n\nexport const transform = (element: Element): unknown => {\n const type = getType(element);\n\n if (!Transformers[type]) {\n report({\n message: `No transformer for component type '${type}'.`,\n rule: 'unsupported-child',\n subcode: 'unknown-type',\n component: type,\n });\n return {};\n }\n\n pushPath(type);\n try {\n return Transformers[type](element);\n } finally {\n popPath();\n }\n};\n","\nexport type Props = {\n children: string;\n plainText?: boolean;\n emoji?: boolean;\n verbatim?: boolean;\n};\n\n/**\n * A text object — renders as `mrkdwn` (default) or `plain_text`.\n *\n * Used as the `text` prop on `<Section>`, `<Header>`, inside `<Context>`,\n * and as a child of `<Section>` for fields.\n *\n * @example\n * ```tsx\n * <Text>Hello *world*</Text>\n * <Text plainText emoji>Hello :wave:</Text>\n * ```\n */\nexport default class Text {\n static slackType = 'Text';\n declare props: Props;\n}\n","export const MAX_BLOCKS = 50;\nexport const MAX_HEADER_TEXT = 150;\nexport const MAX_SECTION_FIELDS = 10;\nexport const MAX_SECTION_FIELD_TEXT = 2000;\nexport const MAX_ACTIONS_ELEMENTS = 25;\nexport const MAX_CONTEXT_ELEMENTS = 10;\nexport const MAX_CONFIRM_TITLE = 100;\nexport const MAX_CONFIRM_TEXT = 300;\nexport const MAX_CONFIRM_BUTTON_TEXT = 30;\nexport const MAX_BUTTON_TEXT = 75;\nexport const MAX_BUTTON_ACCESSIBILITY_LABEL = 75;\nexport const MAX_BUTTON_URL = 3000;\nexport const MAX_BUTTON_VALUE = 2000;\nexport const MAX_OPTION_TEXT = 75;\nexport const MAX_OPTION_VALUE = 150;\nexport const MAX_OPTION_DESCRIPTION = 75;\nexport const MAX_OPTION_URL = 3000;\nexport const MAX_OPTION_GROUP_LABEL = 75;\nexport const MAX_OPTION_GROUP_OPTIONS = 100;\nexport const MAX_SELECT_OPTIONS = 100;\nexport const MAX_SELECT_OPTION_GROUPS = 100;\nexport const MAX_IMAGE_URL = 3000;\nexport const MAX_IMAGE_ALT_TEXT = 2000;\nexport const MAX_IMAGE_TITLE = 2000;\nexport const MAX_INPUT_LABEL = 2000;\nexport const MAX_INPUT_HINT = 2000;\nexport const MAX_CHECKBOX_OPTIONS = 10;\nexport const MAX_RADIO_OPTIONS = 10;\nexport const MAX_OVERFLOW_OPTIONS = 5;\nexport const MAX_VIDEO_DESCRIPTION = 200;\nexport const MAX_VIDEO_TITLE = 200;\nexport const MAX_VIDEO_AUTHOR_NAME = 50;\nexport const MAX_BLOCK_ID_LENGTH = 255;\nexport const MAX_MESSAGE_TEXT = 40_000;\nexport const RECOMMENDED_MESSAGE_TEXT = 4000;\nexport const MAX_ACTION_ID_LENGTH = 255;\nexport const MAX_PLACEHOLDER_LENGTH = 150;\n","type ComponentType = string | ((...parameters: unknown[]) => unknown) | (new (...parameters: unknown[]) => unknown);\n\nexport function jsx(type: ComponentType, props: Record<string, unknown>): JSX.Element {\n const {children} = props;\n\n return {\n type,\n props,\n children: Array.isArray(children) ? children as unknown[] : (children === undefined ? [] : [children]),\n };\n}\n\nexport function jsxs(type: ComponentType, props: Record<string, unknown>): JSX.Element {\n return jsx(type, props);\n}\n\nexport const Fragment = 'fragment';\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace JSX {\n export type Element = {type: ComponentType; props: Record<string, unknown>; children: unknown[]};\n export type IntrinsicElements = Record<string, Record<string, unknown>>;\n export type ElementClass = {props: Record<string, unknown>};\n export type ElementAttributesProperty = {props: Record<string, unknown>};\n}\n","\nimport {type Element} from '../../constants/types';\nimport {transform} from '../transform';\nimport {type ConfirmationProps} from '../../components/block/confirmation';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_CONFIRM_BUTTON_TEXT, MAX_CONFIRM_TITLE, MAX_CONFIRM_TEXT} from '../../constants/limits';\n\nimport {type TextType} from './text';\n\nexport type ConfirmationType = {\n title: TextType;\n text: TextType;\n confirm: TextType;\n deny: TextType;\n};\n\nconst transformConfirmation = (child: Element): ConfirmationType => {\n const {title, confirm, deny, children} = child.props as ConfirmationProps;\n requireField('title', title);\n requireField('confirm', confirm);\n requireField('deny', deny);\n requireField('text', children);\n\n warnIfTooLong('Confirm title', title, MAX_CONFIRM_TITLE);\n warnIfTooLong('Confirm confirm', confirm, MAX_CONFIRM_BUTTON_TEXT);\n warnIfTooLong('Confirm deny', deny, MAX_CONFIRM_BUTTON_TEXT);\n const text = transform(children ?? <Text plainText>{''}</Text>) as TextType;\n warnIfTooLong('Confirm text', text.text, MAX_CONFIRM_TEXT);\n\n const res: ConfirmationType = {\n title: transform(<Text plainText>{title ?? ''}</Text>) as TextType,\n text,\n confirm: transform(<Text plainText>{confirm ?? ''}</Text>) as TextType,\n deny: transform(<Text plainText>{deny ?? ''}</Text>) as TextType,\n };\n\n return res;\n};\n\nexport default transformConfirmation;\n","\nimport {type Element} from '../../constants/types';\nimport {type ButtonProps} from '../../components/block/button';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {\n MAX_ACTION_ID_LENGTH,\n MAX_BUTTON_ACCESSIBILITY_LABEL,\n MAX_BUTTON_TEXT,\n MAX_BUTTON_URL,\n MAX_BUTTON_VALUE,\n} from '../../constants/limits';\n\nimport {type ConfirmationType} from './confirmation';\nimport {type TextType} from './text';\n\nexport type ButtonType = {\n type: 'button';\n text: TextType;\n action_id: string;\n url?: string;\n value?: string;\n style?: 'primary' | 'danger';\n confirm?: ConfirmationType;\n accessibility_label?: string;\n};\n\nconst transformButton = (child: Element): ButtonType => {\n const {actionId, children, url, value, style, confirm, accessibilityLabel} = child.props as ButtonProps;\n\n requireField('actionId', actionId);\n requireField('text', children);\n warnIfTooLong('Button action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (typeof children === 'string') {\n warnIfTooLong('Button text', children, MAX_BUTTON_TEXT);\n }\n\n warnIfTooLong('Button url', url, MAX_BUTTON_URL);\n warnIfTooLong('Button value', value, MAX_BUTTON_VALUE);\n warnIfTooLong('Button accessibility_label', accessibilityLabel, MAX_BUTTON_ACCESSIBILITY_LABEL);\n\n const res: ButtonType = {\n type: 'button',\n text: transform(<Text plainText>{children ?? ''}</Text>) as TextType,\n action_id: actionId,\n };\n\n if (url) {\n res.url = url;\n }\n\n if (value) {\n res.value = value;\n }\n\n if (style) {\n res.style = style;\n }\n\n if (confirm) {\n res.confirm = transform(confirm) as ConfirmationType;\n }\n\n if (accessibilityLabel) {\n res.accessibility_label = accessibilityLabel;\n }\n\n return res;\n};\n\nexport default transformButton;\n","import {type Element} from '../../constants/types';\nimport {type Props as ImageProperties} from '../../components/block/image';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_IMAGE_ALT_TEXT, MAX_IMAGE_URL} from '../../constants/limits';\n\nexport type ImageType = {\n type: 'image';\n image_url: string;\n alt_text: string;\n};\n\nconst transformImage = (child: Element): ImageType => {\n const {url, alt} = child.props as ImageProperties;\n requireField('url', url);\n requireField('alt', alt);\n warnIfTooLong('Image image_url', url, MAX_IMAGE_URL);\n warnIfTooLong('Image alt_text', alt, MAX_IMAGE_ALT_TEXT);\n\n return {\n type: 'image',\n image_url: url ?? '',\n alt_text: alt ?? '',\n };\n};\n\nexport default transformImage;\n","import {type Child} from '../constants/types';\n\nconst normalizeChildren = (children: Child): Child[] => {\n const result: Child[] = [];\n const stack = Array.isArray(children) ? [...children] : [children];\n\n while (stack.length > 0) {\n const child = stack.shift();\n\n if (child === null || child === undefined || typeof child === 'boolean') {\n continue;\n }\n\n if (Array.isArray(child)) {\n stack.unshift(...child);\n continue;\n }\n\n result.push(child);\n }\n\n return result;\n};\n\nexport default normalizeChildren;\n","import {type Props as ContainerProperties} from '../../components/layout/container';\nimport {type Element, type Child} from '../../constants/types';\nimport {transform} from '../transform';\nimport normalizeChildren from '../../utils/normalize-children';\n\ntype ContainerType = Child[];\n\nconst transformContainer = (child: Element): ContainerType => {\n const {children} = child.props as ContainerProperties;\n const elements = normalizeChildren(children);\n\n return (elements as Element[]).map(element => transform(element)) as Child[];\n};\n\nexport default transformContainer;\n","import {type Element, type SerializedBlockElement} from '../../constants/types';\nimport {type Props as SectionComponentProps} from '../../components/layout/section';\nimport {type TextType as Text} from '../block/text';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireOneOf} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_SECTION_FIELD_TEXT, MAX_SECTION_FIELDS} from '../../constants/limits';\nimport TextComponent from '../../components/block/text';\n\nexport type SectionType = {\n type: 'section';\n text?: Text;\n block_id?: string;\n fields?: Text[];\n accessory?: SerializedBlockElement;\n expand?: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-restricted-types -- Section fields intentionally allow nullish children.\ntype SectionFieldValue = string | JSX.Element | null | undefined | false;\n\nconst toTextElement = (value: string | JSX.Element): Element => {\n if (typeof value === 'string') {\n return {\n children: [],\n type: TextComponent,\n props: {children: value},\n } as unknown as Element;\n }\n\n return value as Element;\n};\n\nconst normalizeFields = (values?: SectionComponentProps['fields']): SectionFieldValue[] => {\n if (!values) {\n return [];\n }\n\n return Array.isArray(values) ? values : [values];\n};\n\nconst transformSection = (element: Element): SectionType => {\n const {\n text,\n fields,\n blockId,\n children,\n accessory,\n expand,\n } = element.props as SectionComponentProps;\n const normalizedFields = [...normalizeFields(fields), ...normalizeFields(children)];\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: SectionType = {\n type: 'section',\n };\n\n if (text !== undefined) {\n res.text = transform(toTextElement(text)) as Text;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n if (accessory) {\n res.accessory = transform(accessory) as SerializedBlockElement;\n }\n\n if (expand !== undefined) {\n res.expand = expand;\n }\n\n if (normalizedFields.length > 0) {\n res.fields = [];\n for (const field of normalizedFields) {\n if (field) {\n const t = transform(toTextElement(field)) as Text;\n warnIfTooLong('Section field text', t.text, MAX_SECTION_FIELD_TEXT);\n res.fields.push(t);\n }\n }\n\n warnIfTooMany('Section fields', res.fields, MAX_SECTION_FIELDS);\n\n if (res.fields.length === 0) {\n delete res.fields;\n }\n }\n\n requireOneOf(['text', 'fields'], [res.text, res.fields]);\n\n return res;\n};\n\nexport default transformSection;\n","import {type Element, type SerializedInteractiveBlockElement, type InteractiveBlockElement} from '../../constants/types';\nimport {type Props as ActionProperties} from '../../components/layout/actions';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_ACTIONS_ELEMENTS} from '../../constants/limits';\n\nexport type ActionType = {\n type: 'actions';\n elements: SerializedInteractiveBlockElement[];\n block_id?: string;\n};\n\nconst transformActions = (child: Element): ActionType => {\n const {children, blockId} = child.props as ActionProperties;\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const elements: InteractiveBlockElement[] = children ? (Array.isArray(children) ? children : [children]) : [];\n requireField('elements', elements);\n\n const res: ActionType = {\n type: 'actions',\n elements: elements.map(element => transform(element as Element) as SerializedInteractiveBlockElement),\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n warnIfTooMany('Actions elements', res.elements, MAX_ACTIONS_ELEMENTS);\n\n return res;\n};\n\nexport default transformActions;\n","import {type Element} from '../../constants/types';\nimport {type Props as ContextProperties, type ImageOrText as ImageOrTextElement} from '../../components/layout/context';\nimport {type TextType} from '../block/text';\nimport {type ImageType} from '../block/image';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_CONTEXT_ELEMENTS} from '../../constants/limits';\n\ntype ImageOrText = ImageType | TextType;\n\nexport type ContextType = {\n type: 'context';\n elements: ImageOrText | ImageOrText[];\n block_id?: string;\n};\n\nconst transformContext = (child: Element): ContextType => {\n const {children, blockId} = child.props as ContextProperties;\n\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const elements: ImageOrTextElement[] = children ? (Array.isArray(children) ? children : [children]) : [];\n requireField('elements', elements);\n\n const res: ContextType = {\n type: 'context',\n elements: elements.map(element => transform(element as Element)) as ImageOrText[],\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n warnIfTooMany('Context elements', res.elements as ImageOrText[], MAX_CONTEXT_ELEMENTS);\n\n return res;\n};\n\nexport default transformContext;\n","import {type Element} from '../../constants/types';\nimport {type Props as DividerProperties} from '../../components/layout/divider';\nimport {warnIfTooLong} from '../../utils/validation';\n\nexport type DividerType = {\n type: 'divider';\n block_id?: string;\n};\n\nconst transformDivider = (child: Element): DividerType => {\n const {blockId} = child.props as DividerProperties;\n\n warnIfTooLong('block_id', blockId, 255);\n\n const res: DividerType = {type: 'divider'};\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformDivider;\n","import {type Element} from '../../constants/types';\nimport {type Props as FileProperties} from '../../components/layout/file';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\n\nexport type FileType = {\n type: 'file';\n source: 'remote';\n external_id: string;\n block_id?: string;\n};\n\nconst transformFile = (child: Element): FileType => {\n const {externalId, blockId} = child.props as FileProperties;\n requireField('externalId', externalId);\n warnIfTooLong('block_id', blockId, 255);\n const res: FileType = {\n type: 'file',\n source: 'remote',\n external_id: externalId ?? '',\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformFile;\n","\nimport {type Element} from '../../constants/types';\nimport {type Props as HeaderProperties} from '../../components/layout/header';\nimport {type TextType} from '../block/text';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_HEADER_TEXT, MAX_BLOCK_ID_LENGTH} from '../../constants/limits';\n\nexport type HeaderType = {\n type: 'header';\n text: TextType;\n block_id?: string;\n};\n\nconst transformHeader = (child: Element): HeaderType => {\n const {text, blockId, emoji} = child.props as HeaderProperties;\n\n requireField('text', text);\n warnIfTooLong('Header text', text, MAX_HEADER_TEXT);\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: HeaderType = {\n type: 'header',\n text: transform(<Text plainText emoji={emoji}>{text ?? ''}</Text>) as TextType,\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformHeader;\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type Props as ImageProperties} from '../../components/layout/image';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {\n MAX_IMAGE_URL, MAX_IMAGE_ALT_TEXT, MAX_IMAGE_TITLE, MAX_BLOCK_ID_LENGTH,\n} from '../../constants/limits';\n\nexport type ImageType = {\n type: 'image';\n image_url: string;\n alt_text: string;\n title?: TextType;\n block_id?: string;\n};\n\nconst transformImageLayout = (child: Element): ImageType => {\n const {url, alt, title, blockId} = child.props as ImageProperties;\n\n requireField('url', url);\n requireField('alt', alt);\n warnIfTooLong('Image image_url', url, MAX_IMAGE_URL);\n warnIfTooLong('Image alt_text', alt, MAX_IMAGE_ALT_TEXT);\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: ImageType = {\n type: 'image',\n image_url: url ?? '',\n alt_text: alt ?? '',\n };\n\n if (title) {\n warnIfTooLong('Image title', title, MAX_IMAGE_TITLE);\n res.title = transform(<Text plainText>{title}</Text>) as TextType;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformImageLayout;\n","\nimport {type Element, type SerializedInputBlockElement} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type Props as InputProperties} from '../../components/layout/input';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_BLOCK_ID_LENGTH, MAX_INPUT_HINT, MAX_INPUT_LABEL} from '../../constants/limits';\n\nexport type InputType = {\n type: 'input';\n label: TextType;\n element: SerializedInputBlockElement;\n hint?: TextType;\n optional?: boolean;\n block_id?: string;\n};\n\nconst transformInput = (child: Element): InputType => {\n const {label, element, hint, optional, blockId} = child.props as InputProperties;\n const resolvedElement: SerializedInputBlockElement = element\n ? transform(element as Element) as SerializedInputBlockElement\n : {type: 'plain_text_input', action_id: ''};\n\n requireField('label', label);\n requireField('element', element);\n warnIfTooLong('Input label', label, MAX_INPUT_LABEL);\n warnIfTooLong('Input hint', hint, MAX_INPUT_HINT);\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: InputType = {\n type: 'input',\n label: transform(<Text plainText>{label ?? ''}</Text>) as TextType,\n element: resolvedElement,\n };\n\n if (hint) {\n res.hint = transform(<Text plainText>{hint}</Text>) as TextType;\n }\n\n if (optional) {\n res.optional = true;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformInput;\n","import {type Element} from '../../constants/types';\nimport {transform} from '../transform';\n\ntype RichTextChild = Element | string;\n\nconst normalizeRichTextChildren = (children: unknown): RichTextChild[] => {\n const result: RichTextChild[] = [];\n const stack = Array.isArray(children) ? [...children] : [children];\n\n while (stack.length > 0) {\n const child = stack.shift();\n\n if (child === null || child === undefined || typeof child === 'boolean') {\n continue;\n }\n\n if (Array.isArray(child)) {\n stack.unshift(...child);\n continue;\n }\n\n result.push(child as RichTextChild);\n }\n\n return result;\n};\n\nexport const toInlineElements = (children: unknown): Array<Record<string, unknown>> => {\n const items = normalizeRichTextChildren(children);\n\n return items.map(item => {\n if (typeof item === 'string') {\n return {type: 'text', text: item};\n }\n\n return transform(item) as Record<string, unknown>;\n });\n};\n\nexport const toBlockElements = (children: unknown): Array<Record<string, unknown>> => {\n const items = normalizeRichTextChildren(children);\n\n return items.map(item => {\n if (typeof item === 'string') {\n return {\n type: 'rich_text_section',\n elements: [{type: 'text', text: item}],\n };\n }\n\n return transform(item) as Record<string, unknown>;\n });\n};\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextProperties} from '../../components/layout/rich-text';\nimport {toBlockElements} from '../rich-text/utils';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\n\nexport type RichTextType = {\n type: 'rich_text';\n elements: Array<Record<string, unknown>>;\n block_id?: string;\n};\n\nconst transformRichText = (child: Element): RichTextType => {\n const {elements, children, blockId} = child.props as RichTextProperties;\n const richTextElements = elements ?? toBlockElements(children);\n\n warnIfTooLong('block_id', blockId, 255);\n requireField('elements', richTextElements);\n\n const res: RichTextType = {\n type: 'rich_text',\n elements: richTextElements,\n };\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformRichText;\n","\nimport {type Element} from '../../constants/types';\nimport {type Props as VideoProperties} from '../../components/layout/video';\nimport {type TextType} from '../block/text';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {\n MAX_BLOCK_ID_LENGTH,\n MAX_VIDEO_AUTHOR_NAME,\n MAX_VIDEO_DESCRIPTION,\n MAX_VIDEO_TITLE,\n} from '../../constants/limits';\n\nexport type VideoType = {\n type: 'video';\n title: TextType;\n video_url: string;\n thumbnail_url: string;\n alt_text: string;\n title_url?: string;\n description?: TextType;\n author_name?: string;\n provider_name?: string;\n provider_icon_url?: string;\n block_id?: string;\n};\n\nconst transformVideo = (child: Element): VideoType => {\n const {\n title,\n videoUrl,\n thumbnailUrl,\n altText,\n titleUrl,\n description,\n authorName,\n providerName,\n providerIconUrl,\n blockId,\n } = child.props as VideoProperties;\n\n requireField('title', title);\n requireField('videoUrl', videoUrl);\n requireField('thumbnailUrl', thumbnailUrl);\n requireField('altText', altText);\n warnIfTooLong('Video title', title, MAX_VIDEO_TITLE);\n warnIfTooLong('Video author_name', authorName, MAX_VIDEO_AUTHOR_NAME);\n warnIfTooLong('block_id', blockId, MAX_BLOCK_ID_LENGTH);\n\n const res: VideoType = {\n type: 'video',\n title: transform(<Text plainText>{title ?? ''}</Text>) as TextType,\n video_url: videoUrl ?? '',\n thumbnail_url: thumbnailUrl ?? '',\n alt_text: altText ?? '',\n };\n\n if (titleUrl) {\n res.title_url = titleUrl;\n }\n\n if (description) {\n warnIfTooLong('Video description', description, MAX_VIDEO_DESCRIPTION);\n res.description = transform(<Text plainText>{description}</Text>) as TextType;\n }\n\n if (authorName) {\n res.author_name = authorName;\n }\n\n if (providerName) {\n res.provider_name = providerName;\n }\n\n if (providerIconUrl) {\n res.provider_icon_url = providerIconUrl;\n }\n\n if (blockId) {\n res.block_id = blockId;\n }\n\n return res;\n};\n\nexport default transformVideo;\n","\nimport Text from '../../components/block/text';\nimport {type Props as TextInputProperties} from '../../components/input/text';\nimport {type TextType as TextProperties} from '../block/text';\nimport {type Element} from '../../constants/types';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH, MAX_PLACEHOLDER_LENGTH} from '../../constants/limits';\n\nexport type TextType = {\n type: 'plain_text_input';\n action_id: string;\n placeholder?: TextProperties;\n initial_value?: string;\n multiline?: boolean;\n min_length?: number;\n max_length?: number;\n focus_on_load?: boolean;\n dispatch_action_config?: {\n trigger_actions_on: Array<'on_enter_pressed' | 'on_character_entered'>;\n };\n};\n\nconst transformTextInput = (child: Element): TextType => {\n const {\n actionId,\n placeholder,\n initial,\n multiline,\n minLength,\n maxLength,\n focusOnLoad,\n dispatchActionConfig,\n } = child.props as TextInputProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('TextInput action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (placeholder) {\n warnIfTooLong('TextInput placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n }\n\n const res: TextType = {\n type: 'plain_text_input',\n action_id: actionId,\n };\n\n if (placeholder) {\n res.placeholder = transform(<Text plainText>{placeholder}</Text>) as TextProperties;\n }\n\n if (initial) {\n res.initial_value = initial;\n }\n\n if (multiline) {\n res.multiline = true;\n }\n\n if (minLength) {\n res.min_length = minLength;\n }\n\n if (maxLength) {\n res.max_length = maxLength;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n if (dispatchActionConfig && dispatchActionConfig.triggerActionsOn.length > 0) {\n res.dispatch_action_config = {\n trigger_actions_on: dispatchActionConfig.triggerActionsOn,\n };\n }\n\n return res;\n};\n\nexport default transformTextInput;\n","import {type Element} from '../../constants/types';\nimport {type Props as DateTimePickerProperties} from '../../components/input/date-time-picker';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH} from '../../constants/limits';\n\nexport type DateTimePickerType = {\n type: 'datetimepicker';\n action_id: string;\n initial_date_time?: number;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst transformDateTimePicker = (child: Element): DateTimePickerType => {\n const {actionId, initialDateTime, confirm, focusOnLoad} = child.props as DateTimePickerProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('DateTimePicker action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n const res: DateTimePickerType = {\n type: 'datetimepicker',\n action_id: actionId,\n };\n\n if (initialDateTime !== undefined) {\n if (!Number.isInteger(initialDateTime)) {\n throw new TypeError('DateTime must be a unix timestamp in seconds.');\n }\n\n res.initial_date_time = initialDateTime;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformDateTimePicker;\n","\nimport {type Props as DatePickerProperties} from '../../components/input/date-picker';\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {report} from '../../utils/validation-context';\nimport {MAX_ACTION_ID_LENGTH, MAX_PLACEHOLDER_LENGTH} from '../../constants/limits';\n\nexport type DatePickerType = {\n type: 'datepicker';\n action_id: string;\n placeholder?: TextType;\n initial_date?: string;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst isValidDateString = (value: string): boolean => {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(value);\n if (!match) {\n return false;\n }\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n\n if (month < 1 || month > 12) {\n return false;\n }\n\n const date = new Date(Date.UTC(year, month - 1, day));\n return date.getUTCFullYear() === year\n && date.getUTCMonth() === month - 1\n && date.getUTCDate() === day;\n};\n\nconst transformDatePicker = (child: Element): DatePickerType => {\n const {actionId, placeholder, initialDate, confirm, focusOnLoad} = child.props as DatePickerProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('DatePicker action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (placeholder) {\n warnIfTooLong('DatePicker placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n }\n\n const res: DatePickerType = {\n type: 'datepicker',\n action_id: actionId,\n };\n\n if (placeholder) {\n res.placeholder = transform(<Text plainText>{placeholder}</Text>) as TextType;\n }\n\n if (initialDate) {\n if (!isValidDateString(initialDate)) {\n report({\n message: 'Date must be valid and in format YYYY-MM-DD.',\n rule: 'invalid-format',\n subcode: 'invalid-date-format',\n field: 'initialDate',\n });\n }\n\n res.initial_date = initialDate;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformDatePicker;\n","import {type Element} from '../../constants/types';\nimport {type Props as CheckboxesProperties} from '../../components/input/checkboxes';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH, MAX_CHECKBOX_OPTIONS} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type CheckboxesType = {\n type: 'checkboxes';\n action_id: string;\n options: OptionType[];\n initial_options?: OptionType[];\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst transformCheckboxes = (child: Element): CheckboxesType => {\n const {actionId, children, initialOptions, confirm, focusOnLoad} = child.props as CheckboxesProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('Checkboxes action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n const elements = Array.isArray(children) ? children : [children];\n requireField('options', elements);\n\n const res: CheckboxesType = {\n type: 'checkboxes',\n action_id: actionId,\n options: elements.map(element => transform(element as Element)) as OptionType[],\n };\n\n warnIfTooMany('Checkboxes options', res.options, MAX_CHECKBOX_OPTIONS);\n\n if (initialOptions && initialOptions.length > 0) {\n res.initial_options = initialOptions.map(option => transform(option as Element)) as OptionType[];\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformCheckboxes;\n","\nimport {type SingleOrArray} from '../../utils/type-helpers';\n\nexport const selectTypes = {\n STATIC: 'static',\n EXTERNAL: 'external',\n USER: 'user',\n CONVERSATION: 'conversation',\n CHANNEL: 'channel',\n} as const;\n\ntype SelectType = typeof selectTypes[keyof typeof selectTypes];\n\ntype ConversationFilter = {\n include?: Array<'im' | 'mpim' | 'private' | 'public'>;\n excludeExternalSharedChannels?: boolean;\n excludeBotUsers?: boolean;\n};\n\nexport type Props = {\n placeholder: string;\n actionId: string;\n type?: SelectType;\n multi?: boolean;\n children?: SingleOrArray<JSX.Element>;\n initialOptions?: JSX.Element[];\n confirm?: JSX.Element;\n maxSelectedItems?: number;\n minQueryLength?: number;\n focusOnLoad?: boolean;\n initialUsers?: string[];\n initialConversations?: string[];\n initialChannels?: string[];\n defaultToCurrentConversation?: boolean;\n responseUrlEnabled?: boolean;\n filter?: ConversationFilter;\n};\n\n/**\n * A select menu — supports static options, external data sources, and user /\n * channel / conversation lists. Can be single or multi-select.\n *\n * Use the `type` prop to switch data sources (default: `'static'`).\n * Pass `<Option>` or `<OptionGroup>` children for static selects.\n *\n * @example\n * ```tsx\n * // Static single-select\n * <Select placeholder=\"Pick one\" actionId=\"color\">\n * <Option value=\"red\">Red</Option>\n * <Option value=\"blue\">Blue</Option>\n * </Select>\n *\n * // User multi-select\n * <Select type=\"user\" multi placeholder=\"Pick users\" actionId=\"mentions\" />\n * ```\n */\nexport default class Select {\n static slackType = 'Select';\n declare props: Props;\n}\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {type Props as SelectProperties, selectTypes} from '../../components/input/select';\nimport Text from '../../components/block/text';\nimport {transform} from '../transform';\nimport getType from '../../utils/get-type';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {\n MAX_ACTION_ID_LENGTH,\n MAX_PLACEHOLDER_LENGTH,\n MAX_SELECT_OPTIONS,\n MAX_SELECT_OPTION_GROUPS,\n} from '../../constants/limits';\n\nimport {type OptionGroupType} from './option-group';\nimport {type OptionType} from './option';\n\ntype ValidSelectType =\n 'static_select' |\n 'multi_static_select' |\n 'external_select' |\n 'multi_external_select' |\n 'users_select' |\n 'multi_users_select' |\n 'conversations_select' |\n 'multi_conversations_select' |\n 'channels_select' |\n 'multi_channels_select';\n\ntype SelectionType = NonNullable<SelectProperties['type']>;\n\nexport type SelectType = {\n type: ValidSelectType;\n placeholder: TextType;\n action_id: string;\n options?: OptionType[];\n option_groups?: OptionGroupType[];\n initial_option?: OptionType;\n initial_options?: OptionType[];\n confirm?: ConfirmationType;\n max_selected_items?: number;\n min_query_length?: number;\n focus_on_load?: boolean;\n initial_user?: string;\n initial_users?: string[];\n initial_conversation?: string;\n initial_conversations?: string[];\n initial_channel?: string;\n initial_channels?: string[];\n default_to_current_conversation?: boolean;\n response_url_enabled?: boolean;\n filter?: {\n include?: Array<'im' | 'mpim' | 'private' | 'public'>;\n exclude_external_shared_channels?: boolean;\n exclude_bot_users?: boolean;\n };\n};\n\nconst OPTION = 'Option';\nconst OPTION_GROUP = 'OptionGroup';\n\nconst types = {\n [selectTypes.STATIC]: 'static_select',\n [selectTypes.EXTERNAL]: 'external_select',\n [selectTypes.USER]: 'users_select',\n [selectTypes.CONVERSATION]: 'conversations_select',\n [selectTypes.CHANNEL]: 'channels_select',\n};\nconst MULTI_PREFIX = 'multi_';\n\nconst normalizeElements = (elements?: SelectProperties['children']): JSX.Element[] => {\n if (!elements) {\n return [];\n }\n\n return Array.isArray(elements) ? elements : [elements];\n};\n\nconst assignStaticOptions = (elements: JSX.Element[], result: SelectType): void => {\n const elementType = getType(elements[0] as Element);\n if (elements.some(element => getType(element as Element) !== elementType)) {\n if (elementType === OPTION && elements.some(element => getType(element as Element) !== OPTION_GROUP)) {\n throw new TypeError('You cannot mix OptionGroup types with Option types in a Select block.');\n } else if (elementType === OPTION_GROUP && elements.some(element => getType(element as Element) !== OPTION)) {\n throw new TypeError('You cannot mix OptionGroup types with Option types in a Select block.');\n }\n\n throw new TypeError('Only allowed types are Option OR OptionGroup');\n }\n\n if (elementType === OPTION) {\n result.options = elements.map(element => transform(element as Element)) as OptionType[];\n } else if (elementType === OPTION_GROUP) {\n result.option_groups = elements.map(element => transform(element as Element)) as OptionGroupType[];\n }\n};\n\nconst applyConversationSettings = (\n result: SelectType,\n settings: Pick<SelectProperties, 'defaultToCurrentConversation' | 'responseUrlEnabled' | 'filter'>,\n): void => {\n const {defaultToCurrentConversation, responseUrlEnabled, filter} = settings;\n\n if (defaultToCurrentConversation !== undefined) {\n result.default_to_current_conversation = defaultToCurrentConversation;\n }\n\n if (responseUrlEnabled !== undefined) {\n result.response_url_enabled = responseUrlEnabled;\n }\n\n if (!filter) {\n return;\n }\n\n const filterValue: SelectType['filter'] = {};\n\n if (filter.include && filter.include.length > 0) {\n filterValue.include = filter.include;\n }\n\n if (filter.excludeExternalSharedChannels !== undefined) {\n filterValue.exclude_external_shared_channels = filter.excludeExternalSharedChannels;\n }\n\n if (filter.excludeBotUsers !== undefined) {\n filterValue.exclude_bot_users = filter.excludeBotUsers;\n }\n\n if (Object.keys(filterValue).length > 0) {\n result.filter = filterValue;\n }\n};\n\nconst applyInitialSelections = (\n type: SelectionType,\n isMulti: boolean,\n result: SelectType,\n initialValues: {\n initialOptions?: JSX.Element[];\n initialUsers?: string[];\n initialConversations?: string[];\n initialChannels?: string[];\n },\n): void => {\n const {initialOptions, initialUsers, initialConversations, initialChannels} = initialValues;\n\n switch (type) {\n case selectTypes.USER: {\n if (initialUsers && initialUsers.length > 0) {\n if (isMulti) {\n result.initial_users = initialUsers;\n } else {\n result.initial_user = initialUsers[0];\n }\n }\n\n break;\n }\n\n case selectTypes.CONVERSATION: {\n if (initialConversations && initialConversations.length > 0) {\n if (isMulti) {\n result.initial_conversations = initialConversations;\n } else {\n result.initial_conversation = initialConversations[0];\n }\n }\n\n break;\n }\n\n case selectTypes.CHANNEL: {\n if (initialChannels && initialChannels.length > 0) {\n if (isMulti) {\n result.initial_channels = initialChannels;\n } else {\n result.initial_channel = initialChannels[0];\n }\n }\n\n break;\n }\n\n case selectTypes.STATIC:\n case selectTypes.EXTERNAL: {\n if (initialOptions && initialOptions.length > 0) {\n const transformedOptions = initialOptions.map(element => transform(element as Element)) as OptionType[];\n\n if (isMulti) {\n result.initial_options = transformedOptions;\n } else {\n result.initial_option = transformedOptions[0];\n }\n }\n\n break;\n }\n }\n};\n\nconst transformSelect = (child: Element): SelectType => {\n const {\n placeholder,\n actionId,\n multi,\n children,\n initialOptions,\n confirm,\n maxSelectedItems,\n type: typeProperty,\n initialUsers,\n initialConversations,\n initialChannels,\n minQueryLength,\n focusOnLoad,\n defaultToCurrentConversation,\n responseUrlEnabled,\n filter,\n } = child.props as SelectProperties;\n\n const type: SelectionType = typeProperty ?? selectTypes.STATIC;\n const typeString = `${multi ? MULTI_PREFIX : ''}${types[type]}` as ValidSelectType;\n\n requireField('actionId', actionId);\n requireField('placeholder', placeholder);\n warnIfTooLong('Select action_id', actionId, MAX_ACTION_ID_LENGTH);\n warnIfTooLong('Select placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n\n const result: SelectType = {\n type: typeString,\n placeholder: transform(<Text plainText>{placeholder ?? ''}</Text>) as TextType,\n action_id: actionId,\n };\n\n const elements = normalizeElements(children);\n\n if (type === selectTypes.STATIC) {\n requireField('options', elements);\n\n if (elements.length > 0) {\n assignStaticOptions(elements, result);\n }\n }\n\n if (confirm) {\n result.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n applyInitialSelections(type, Boolean(multi), result, {\n initialOptions,\n initialUsers,\n initialConversations,\n initialChannels,\n });\n\n if (maxSelectedItems) {\n result.max_selected_items = maxSelectedItems;\n }\n\n if (focusOnLoad !== undefined) {\n result.focus_on_load = focusOnLoad;\n }\n\n if (type === selectTypes.EXTERNAL && minQueryLength !== undefined) {\n result.min_query_length = minQueryLength;\n }\n\n if (type === selectTypes.CONVERSATION) {\n applyConversationSettings(result, {defaultToCurrentConversation, responseUrlEnabled, filter});\n }\n\n if (result.options) {\n warnIfTooMany('Select options', result.options, MAX_SELECT_OPTIONS);\n }\n\n if (result.option_groups) {\n warnIfTooMany('Select option_groups', result.option_groups, MAX_SELECT_OPTION_GROUPS);\n }\n\n return result;\n};\n\nexport default transformSelect;\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport Text from '../../components/block/text';\nimport {type Props as OptionProperties} from '../../components/input/option';\nimport {transform} from '../transform';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {\n MAX_OPTION_TEXT, MAX_OPTION_VALUE, MAX_OPTION_DESCRIPTION, MAX_OPTION_URL,\n} from '../../constants/limits';\n\nexport type OptionType = {\n text: TextType;\n value: string;\n description?: TextType;\n url?: string;\n};\n\nconst transformOption = (child: Element): OptionType => {\n const {children: text, value, url, description} = child.props as OptionProperties;\n\n requireField('text', text);\n requireField('value', value);\n warnIfTooLong('Option text', text, MAX_OPTION_TEXT);\n warnIfTooLong('Option value', value, MAX_OPTION_VALUE);\n warnIfTooLong('Option description', description, MAX_OPTION_DESCRIPTION);\n warnIfTooLong('Option url', url, MAX_OPTION_URL);\n\n const res: OptionType = {\n text: transform(<Text plainText>{text ?? ''}</Text>) as TextType,\n value,\n };\n\n if (description) {\n res.description = transform(<Text plainText>{description}</Text>) as TextType;\n }\n\n if (url) {\n res.url = url;\n }\n\n return res;\n};\n\nexport default transformOption;\n","\nimport Text from '../../components/block/text';\nimport {type Props as OptionGroupProperties} from '../../components/input/option-group';\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {MAX_OPTION_GROUP_LABEL, MAX_OPTION_GROUP_OPTIONS} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type OptionGroupType = {\n label: TextType;\n options: OptionType[];\n};\n\nconst transformOptionGroup = (child: Element): OptionGroupType => {\n const {label, children} = child.props as OptionGroupProperties;\n const options = Array.isArray(children) ? children : [children];\n\n requireField('label', label);\n requireField('options', options);\n warnIfTooLong('OptionGroup label', label, MAX_OPTION_GROUP_LABEL);\n\n warnIfTooMany('OptionGroup options', options, MAX_OPTION_GROUP_OPTIONS);\n\n return {\n label: transform(<Text plainText>{label ?? ''}</Text>) as TextType,\n options: options.map(option => transform(option as Element)) as OptionType[],\n };\n};\n\nexport default transformOptionGroup;\n","import {type Element} from '../../constants/types';\nimport {type Props as OverflowProperties} from '../../components/input/overflow';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH, MAX_OVERFLOW_OPTIONS} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type OverflowType = {\n type: 'overflow';\n action_id: string;\n options: OptionType[];\n confirm?: ConfirmationType;\n};\n\nconst transformOverflow = (child: Element): OverflowType => {\n const {actionId, children, confirm} = child.props as OverflowProperties;\n\n const elements = Array.isArray(children) ? children : [children];\n requireField('actionId', actionId);\n requireField('options', elements);\n warnIfTooLong('Overflow action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n const res: OverflowType = {\n type: 'overflow',\n action_id: actionId,\n options: elements.map(element => transform(element as Element)) as OptionType[],\n };\n\n warnIfTooMany('Overflow options', res.options, MAX_OVERFLOW_OPTIONS);\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n return res;\n};\n\nexport default transformOverflow;\n","import {type Element} from '../../constants/types';\nimport {type Props as RadioGroupProperties} from '../../components/input/radio-group';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {transform} from '../transform';\nimport {warnIfTooLong, warnIfTooMany, requireField} from '../../utils/validation';\nimport {MAX_ACTION_ID_LENGTH, MAX_RADIO_OPTIONS} from '../../constants/limits';\n\nimport {type OptionType} from './option';\n\nexport type RadioGroupType = {\n type: 'radio_buttons';\n action_id: string;\n options: OptionType[];\n initial_option?: OptionType;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst transformRadioGroup = (child: Element): RadioGroupType => {\n const {actionId, children, initialOption, confirm, focusOnLoad} = child.props as RadioGroupProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('RadioGroup action_id', actionId, MAX_ACTION_ID_LENGTH);\n\n const elements = Array.isArray(children) ? children : [children];\n requireField('options', elements);\n\n const res: RadioGroupType = {\n type: 'radio_buttons',\n action_id: actionId,\n options: elements.map(element => transform(element as Element)) as OptionType[],\n };\n\n warnIfTooMany('RadioGroup options', res.options, MAX_RADIO_OPTIONS);\n\n if (initialOption) {\n res.initial_option = transform(initialOption as Element) as OptionType;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformRadioGroup;\n","\nimport {type Element} from '../../constants/types';\nimport {type TextType} from '../block/text';\nimport {type ConfirmationType} from '../block/confirmation';\nimport {type Props as TimePickerProperties} from '../../components/input/time-picker';\nimport {transform} from '../transform';\nimport Text from '../../components/block/text';\nimport {warnIfTooLong, requireField} from '../../utils/validation';\nimport {report} from '../../utils/validation-context';\nimport {MAX_ACTION_ID_LENGTH, MAX_PLACEHOLDER_LENGTH} from '../../constants/limits';\n\nexport type TimePickerType = {\n type: 'timepicker';\n action_id: string;\n placeholder?: TextType;\n initial_time?: string;\n confirm?: ConfirmationType;\n focus_on_load?: boolean;\n};\n\nconst isValidTimeString = (value: string): boolean => {\n const match = /^(\\d{2}):(\\d{2})$/.exec(value);\n if (!match) {\n return false;\n }\n\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n\n return hours >= 0 && hours <= 23 && minutes >= 0 && minutes <= 59;\n};\n\nconst transformTimePicker = (child: Element): TimePickerType => {\n const {actionId, placeholder, initialTime, confirm, focusOnLoad} = child.props as TimePickerProperties;\n\n requireField('actionId', actionId);\n warnIfTooLong('TimePicker action_id', actionId, MAX_ACTION_ID_LENGTH);\n if (placeholder) {\n warnIfTooLong('TimePicker placeholder', placeholder, MAX_PLACEHOLDER_LENGTH);\n }\n\n const res: TimePickerType = {\n type: 'timepicker',\n action_id: actionId,\n };\n\n if (placeholder) {\n res.placeholder = transform(<Text plainText>{placeholder}</Text>) as TextType;\n }\n\n if (initialTime) {\n if (!isValidTimeString(initialTime)) {\n report({\n message: 'Time must be valid and in format HH:MM.',\n rule: 'invalid-format',\n subcode: 'invalid-time-format',\n field: 'initialTime',\n });\n }\n\n res.initial_time = initialTime;\n }\n\n if (confirm) {\n res.confirm = transform(confirm as Element) as ConfirmationType;\n }\n\n if (focusOnLoad !== undefined) {\n res.focus_on_load = focusOnLoad;\n }\n\n return res;\n};\n\nexport default transformTimePicker;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextSectionProperties} from '../../components/rich-text/section';\n\nimport {toInlineElements} from './utils';\n\ntype RichTextSectionType = {\n type: 'rich_text_section';\n elements: Array<Record<string, unknown>>;\n};\n\nconst transformRichTextSection = (child: Element): RichTextSectionType => {\n const {children} = child.props as RichTextSectionProperties;\n\n return {\n type: 'rich_text_section',\n elements: toInlineElements(children),\n };\n};\n\nexport default transformRichTextSection;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextListProperties} from '../../components/rich-text/list';\nimport {type RichTextListStyle} from '../../components/rich-text/types';\n\nimport {toBlockElements} from './utils';\n\ntype RichTextListType = {\n type: 'rich_text_list';\n style: RichTextListStyle;\n elements: Array<Record<string, unknown>>;\n indent?: number;\n border?: number;\n};\n\nconst transformRichTextList = (child: Element): RichTextListType => {\n const {style, children, indent, border} = child.props as RichTextListProperties;\n\n const res: RichTextListType = {\n type: 'rich_text_list',\n style,\n elements: toBlockElements(children),\n };\n\n if (indent !== undefined) {\n res.indent = indent;\n }\n\n if (border !== undefined) {\n res.border = border;\n }\n\n return res;\n};\n\nexport default transformRichTextList;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextQuoteProperties} from '../../components/rich-text/quote';\n\nimport {toInlineElements} from './utils';\n\ntype RichTextQuoteType = {\n type: 'rich_text_quote';\n elements: Array<Record<string, unknown>>;\n};\n\nconst transformRichTextQuote = (child: Element): RichTextQuoteType => {\n const {children} = child.props as RichTextQuoteProperties;\n\n return {\n type: 'rich_text_quote',\n elements: toInlineElements(children),\n };\n};\n\nexport default transformRichTextQuote;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextPreformattedProperties} from '../../components/rich-text/preformatted';\n\nimport {toInlineElements} from './utils';\n\ntype RichTextPreformattedType = {\n type: 'rich_text_preformatted';\n elements: Array<Record<string, unknown>>;\n};\n\nconst transformRichTextPreformatted = (child: Element): RichTextPreformattedType => {\n const {children} = child.props as RichTextPreformattedProperties;\n\n return {\n type: 'rich_text_preformatted',\n elements: toInlineElements(children),\n };\n};\n\nexport default transformRichTextPreformatted;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextTextProperties} from '../../components/rich-text/text';\nimport {type RichTextStyle} from '../../components/rich-text/types';\n\ntype RichTextTextType = {\n type: 'text';\n text: string;\n style?: RichTextStyle;\n};\n\nconst transformRichTextText = (child: Element): RichTextTextType => {\n const {children, style} = child.props as RichTextTextProperties;\n\n const res: RichTextTextType = {\n type: 'text',\n text: children,\n };\n\n if (style) {\n res.style = style;\n }\n\n return res;\n};\n\nexport default transformRichTextText;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextLinkProperties} from '../../components/rich-text/link';\nimport {type RichTextStyle} from '../../components/rich-text/types';\n\ntype RichTextLinkType = {\n type: 'link';\n url: string;\n text?: string;\n style?: RichTextStyle;\n};\n\nconst transformRichTextLink = (child: Element): RichTextLinkType => {\n const {url, children, style} = child.props as RichTextLinkProperties;\n\n const res: RichTextLinkType = {\n type: 'link',\n url,\n };\n\n if (children) {\n res.text = children;\n }\n\n if (style) {\n res.style = style;\n }\n\n return res;\n};\n\nexport default transformRichTextLink;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextUserProperties} from '../../components/rich-text/user';\n\ntype RichTextUserType = {\n type: 'user';\n user_id: string;\n};\n\nconst transformRichTextUser = (child: Element): RichTextUserType => {\n const {userId} = child.props as RichTextUserProperties;\n\n return {\n type: 'user',\n user_id: userId,\n };\n};\n\nexport default transformRichTextUser;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextChannelProperties} from '../../components/rich-text/channel';\n\ntype RichTextChannelType = {\n type: 'channel';\n channel_id: string;\n};\n\nconst transformRichTextChannel = (child: Element): RichTextChannelType => {\n const {channelId} = child.props as RichTextChannelProperties;\n\n return {\n type: 'channel',\n channel_id: channelId,\n };\n};\n\nexport default transformRichTextChannel;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextEmojiProperties} from '../../components/rich-text/emoji';\n\ntype RichTextEmojiType = {\n type: 'emoji';\n name: string;\n};\n\nconst transformRichTextEmoji = (child: Element): RichTextEmojiType => {\n const {name} = child.props as RichTextEmojiProperties;\n\n return {\n type: 'emoji',\n name,\n };\n};\n\nexport default transformRichTextEmoji;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextDateProperties} from '../../components/rich-text/date';\n\ntype RichTextDateType = {\n type: 'date';\n timestamp: number;\n format: string;\n fallback: string;\n};\n\nconst transformRichTextDate = (child: Element): RichTextDateType => {\n const {timestamp, format, fallback} = child.props as RichTextDateProperties;\n\n return {\n type: 'date',\n timestamp,\n format,\n fallback,\n };\n};\n\nexport default transformRichTextDate;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextBroadcastProperties} from '../../components/rich-text/broadcast';\nimport {type RichTextBroadcastRange} from '../../components/rich-text/types';\n\ntype RichTextBroadcastType = {\n type: 'broadcast';\n range: RichTextBroadcastRange;\n};\n\nconst transformRichTextBroadcast = (child: Element): RichTextBroadcastType => {\n const {range} = child.props as RichTextBroadcastProperties;\n\n return {\n type: 'broadcast',\n range,\n };\n};\n\nexport default transformRichTextBroadcast;\n","import {type Element} from '../../constants/types';\nimport {type Props as RichTextUserGroupProperties} from '../../components/rich-text/user-group';\n\ntype RichTextUserGroupType = {\n type: 'usergroup';\n usergroup_id: string;\n};\n\nconst transformRichTextUserGroup = (child: Element): RichTextUserGroupType => {\n const {usergroupId} = child.props as RichTextUserGroupProperties;\n\n return {\n type: 'usergroup',\n usergroup_id: usergroupId,\n };\n};\n\nexport default transformRichTextUserGroup;\n","import Text from './block/text';\nimport Confirmation from './block/confirmation';\nimport Button from './block/button';\nimport Image from './block/image';\nimport Container from './layout/container';\nimport Section from './layout/section';\nimport Actions from './layout/actions';\nimport Context from './layout/context';\nimport Divider from './layout/divider';\nimport File from './layout/file';\nimport Header from './layout/header';\nimport ImageLayout from './layout/image';\nimport Input from './layout/input';\nimport RichText from './layout/rich-text';\nimport Video from './layout/video';\nimport TextInput from './input/text';\nimport DateTimePicker from './input/date-time-picker';\nimport DatePicker from './input/date-picker';\nimport Checkboxes from './input/checkboxes';\nimport Select from './input/select';\nimport Option from './input/option';\nimport OptionGroup from './input/option-group';\nimport Overflow from './input/overflow';\nimport RadioGroup from './input/radio-group';\nimport TimePicker from './input/time-picker';\nimport RichTextSection from './rich-text/section';\nimport RichTextList from './rich-text/list';\nimport RichTextQuote from './rich-text/quote';\nimport RichTextPreformatted from './rich-text/preformatted';\nimport RichTextText from './rich-text/text';\nimport RichTextLink from './rich-text/link';\nimport RichTextUser from './rich-text/user';\nimport RichTextChannel from './rich-text/channel';\nimport RichTextEmoji from './rich-text/emoji';\nimport RichTextDate from './rich-text/date';\nimport RichTextBroadcast from './rich-text/broadcast';\nimport RichTextUserGroup from './rich-text/user-group';\nimport Transformers from './registry';\n\nObject.assign(Transformers, {\n Container,\n Section,\n Actions,\n Context,\n Divider,\n File,\n Header,\n ImageLayout,\n Input,\n RichText,\n Video,\n Text,\n Confirmation,\n Button,\n Image,\n TextInput,\n DateTimePicker,\n DatePicker,\n Checkboxes,\n Select,\n Overflow,\n RadioGroup,\n TimePicker,\n Option,\n OptionGroup,\n RichTextSection,\n RichTextList,\n RichTextQuote,\n RichTextPreformatted,\n RichTextText,\n RichTextLink,\n RichTextUser,\n RichTextChannel,\n RichTextEmoji,\n RichTextDate,\n RichTextBroadcast,\n RichTextUserGroup,\n});\n\nexport {default} from './registry';\n","import {type Child, type Block} from '../constants/types';\nimport transformers from '../transformers';\nimport getType from '../utils/get-type';\nimport normalizeChildren from '../utils/normalize-children';\nimport {pushPath, popPath, report} from '../utils/validation-context';\n\n/** Internal parser output — partial message assembled by the renderer. */\ntype ParsedMessage = {text?: string; blocks?: Block[]};\n\nconst appendTransformed = (value: unknown, blocks: Block[]): void => {\n if (value === null || value === undefined || typeof value === 'boolean') {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n appendTransformed(item, blocks);\n }\n\n return;\n }\n\n blocks.push(value as Block);\n};\n\nconst parseChildren = (children: Child): ParsedMessage => {\n if (typeof children === 'string') {\n return {text: children};\n }\n\n const normalizedChildren = normalizeChildren(children);\n\n const transformedBlocks: Block[] = [];\n for (const child of normalizedChildren) {\n const type = getType(child);\n const transformer = transformers[type];\n\n if (transformer) {\n pushPath(type);\n try {\n appendTransformed(transformer(child), transformedBlocks);\n } finally {\n popPath();\n }\n } else if (type !== 'null') {\n report({\n message: `No transformer for component type '${type}'.`,\n rule: 'unsupported-child',\n subcode: 'unknown-type',\n component: type,\n });\n }\n }\n\n if (transformedBlocks.length === 0) {\n return {blocks: []};\n }\n\n return {blocks: transformedBlocks};\n};\n\nexport default parseChildren;\n","import {\n type SlackMessageDraft, type Element, type Block, type Child,\n type SlackPostMessagePayload, type SlackPostEphemeralPayload, type BoltCompatiblePayload,\n} from '../constants/types';\nimport {type Properties as MessageProperties} from '../components/message';\nimport parser from '../parser';\nimport getType from '../utils/get-type';\nimport {warnIfTooMany, warnIfTooLong} from '../utils/validation';\nimport {\n initContext, pushPath, popPath, type ValidationMode, type ValidationReporter,\n} from '../utils/validation-context';\nimport {MAX_BLOCKS, MAX_MESSAGE_TEXT, RECOMMENDED_MESSAGE_TEXT} from '../constants/limits';\n\n/**\n * Options passed to `render()`, `renderToMessage()`, and `renderToBlocks()`.\n *\n * @property validate - Validation mode. Defaults to `'warn'`.\n * - `'warn'` — log warnings via `console.warn` (default)\n * - `'strict'` — throw `SlackblockValidationError` on any violation\n * - `'off'` — disable validation entirely\n * @property onValidation - Optional warn-mode hook. When provided alongside\n * warn mode, SlackBlock calls this reporter with the normalized issue\n * instead of writing to `console.warn`.\n * @property channel - When provided, the result includes `channel` and is typed\n * as `SlackPostMessagePayload` (directly usable with `chat.postMessage`).\n * @property user - When provided alongside `channel`, the result is typed as\n * `SlackPostEphemeralPayload` (directly usable with `chat.postEphemeral`).\n * Has no effect without `channel`.\n */\nexport type RenderOptions = {\n validate?: ValidationMode;\n onValidation?: ValidationReporter;\n channel?: string;\n user?: string;\n};\n\n/**\n * Renders JSX children directly to a `Block[]` array, without requiring a\n * `<Message>` wrapper. Useful for modals, home tabs, and other surfaces that\n * accept a blocks array rather than a full message payload.\n */\nexport const renderToBlocks = (element: Child, options?: RenderOptions): Block[] => {\n initContext(options?.validate ?? 'warn', options?.onValidation);\n // Unwrap top-level fragments so the parser receives their children directly.\n const child: Child\n = typeof element === 'object'\n && element !== null\n && !Array.isArray(element)\n && (element).type === 'fragment'\n ? (element).props.children as Child\n : element;\n const result = parser(child);\n return result.blocks ?? [];\n};\n\nconst applyMessageMetadata = (json: SlackMessageDraft, properties: MessageProperties): void => {\n if (properties.iconEmoji) {\n json.icon_emoji = properties.iconEmoji;\n }\n\n if (properties.iconUrl) {\n json.icon_url = properties.iconUrl;\n }\n\n if (properties.parse) {\n json.parse = properties.parse;\n }\n\n if (properties.username) {\n json.username = properties.username;\n }\n\n if (properties.asUser) {\n json.as_user = properties.asUser;\n }\n\n if (properties.replyBroadcast) {\n json.reply_broadcast = properties.replyBroadcast;\n }\n\n if (properties.unfurlLinks) {\n json.unfurl_links = properties.unfurlLinks;\n }\n\n if (properties.unfurlMedia !== undefined) {\n json.unfurl_media = properties.unfurlMedia;\n }\n};\n\n/**\n * Renders a `<Message>` JSX tree to a full Slack message payload.\n *\n * Pass `channel` (and optionally `user`) in the `options` argument to get a\n * fully-typed payload that can be passed directly to the Slack SDK without any\n * cast:\n *\n * @example\n * ```tsx\n * // say / respond — no options needed\n * await say(render(<Message text=\"Hello\"><Header text=\"Hi\" /></Message>));\n *\n * // chat.postMessage — channel in options → SlackPostMessagePayload, no cast\n * const msg = render(<Message text=\"Hello\">...</Message>, {channel: '#general'});\n * await client.chat.postMessage(msg);\n *\n * // chat.postEphemeral — channel + user in options → SlackPostEphemeralPayload, no cast\n * const msg = render(<Message text=\"Hello\" />, {channel: '#general', user: userId});\n * await client.chat.postEphemeral(msg);\n * ```\n */\nfunction render(element: Element, options: RenderOptions & {channel: string; user: string}): SlackPostEphemeralPayload;\nfunction render(element: Element, options: RenderOptions & {channel: string}): SlackPostMessagePayload;\nfunction render(element: Element, options?: RenderOptions): BoltCompatiblePayload;\nfunction render(element: Element, options?: RenderOptions): SlackMessageDraft {\n initContext(options?.validate ?? 'warn', options?.onValidation);\n\n const properties = element.props as MessageProperties;\n\n const typeName = getType(element);\n if (typeName !== 'Message') {\n throw new TypeError('Provided top-level element must be a Message type.');\n }\n\n if (!properties.children && !properties.text) {\n throw new Error('Cannot render a Message with no children or text.');\n }\n\n pushPath('Message');\n let json: SlackMessageDraft;\n try {\n // Parser returns a partial message (no required `text`); renderer sets it below.\n // eslint-disable-next-line prefer-object-spread -- Object.assign avoids object-literal type assertion lint conflict\n json = Object.assign({}, parser(properties.children)) as SlackMessageDraft;\n\n if (properties.replyTo) {\n json.thread_ts = properties.replyTo;\n }\n\n if (properties.markdown !== undefined) {\n json.mrkdwn = properties.markdown;\n }\n\n // String children produce {text} from the parser; fall back to that if no explicit text prop.\n json.text = properties.text ?? json.text ?? '';\n\n if (properties.text && properties.text.length > MAX_MESSAGE_TEXT) {\n warnIfTooLong(`Message text (Slack will truncate beyond ${MAX_MESSAGE_TEXT} chars)`, properties.text, MAX_MESSAGE_TEXT);\n } else if (properties.text) {\n warnIfTooLong('Message text (recommended max for best results)', properties.text, RECOMMENDED_MESSAGE_TEXT);\n }\n\n // Options.channel / options.user take precedence over the Message JSX props.\n const channel = options?.channel ?? properties.channel;\n const user = options?.user ?? properties.user;\n\n if (channel) {\n json.channel = channel;\n }\n\n if (user) {\n json.user = user;\n }\n\n applyMessageMetadata(json, properties);\n\n if (properties.color && json.blocks) {\n json.attachments = [\n {\n fallback: json.text,\n color: properties.color,\n blocks: json.blocks,\n },\n ];\n\n delete json.blocks;\n }\n\n if (json.blocks) {\n warnIfTooMany('Message blocks', json.blocks, MAX_BLOCKS);\n }\n } finally {\n popPath();\n }\n\n return json;\n}\n\nexport default render;\n\n/**\n * Named alias for {@link render}. Produces a full Slack message payload\n * (including `text`, `blocks`, and optional `attachments` when `color` is set).\n */\nexport {render as renderToMessage};\n","/**\n * Escapes Slack mrkdwn special characters in a string to prevent unintended\n * formatting. Use this for untrusted content that will be inserted into mrkdwn\n * fields. SlackBlock does not automatically escape every string for you.\n *\n * Escapes: `&` `<` `>` `*` `_` `~` `` ` ``\n *\n * @example\n * ```ts\n * import { escapeMrkdwn } from 'slackblock';\n *\n * const safe = escapeMrkdwn('Hello *world* <script>');\n * // → \"Hello \\u200B*world\\u200B* <script>\"\n * ```\n */\nexport const escapeMrkdwn = (text: string): string =>\n text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll(/[*_~`]/g, '\\u200B$&');\n","import {type Block} from '../constants/types';\n\n/**\n * Development helper that returns a Slack Block Kit Builder URL for previewing\n * the given blocks. The full payload is encoded into the URL fragment, so very\n * large payloads can produce impractically long URLs.\n */\nexport const blockKitBuilderUrl = (blocks: Block[]): string =>\n `https://app.slack.com/block-kit-builder#${JSON.stringify({blocks})}`;\n"],"mappings":"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","names":["image_default","text_default","section_default","text_default","image_default","text_default","section_default"]}
|
|
@@ -192,10 +192,11 @@ type RichTextType = {
|
|
|
192
192
|
|
|
193
193
|
type SectionType = {
|
|
194
194
|
type: 'section';
|
|
195
|
-
text
|
|
195
|
+
text?: TextType$1;
|
|
196
196
|
block_id?: string;
|
|
197
197
|
fields?: TextType$1[];
|
|
198
198
|
accessory?: SerializedBlockElement;
|
|
199
|
+
expand?: boolean;
|
|
199
200
|
};
|
|
200
201
|
|
|
201
202
|
type VideoType = {
|
|
@@ -192,10 +192,11 @@ type RichTextType = {
|
|
|
192
192
|
|
|
193
193
|
type SectionType = {
|
|
194
194
|
type: 'section';
|
|
195
|
-
text
|
|
195
|
+
text?: TextType$1;
|
|
196
196
|
block_id?: string;
|
|
197
197
|
fields?: TextType$1[];
|
|
198
198
|
accessory?: SerializedBlockElement;
|
|
199
|
+
expand?: boolean;
|
|
199
200
|
};
|
|
200
201
|
|
|
201
202
|
type VideoType = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slackblock",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-beta.0",
|
|
4
4
|
"description": "JSX-based Slack message renderer",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20"
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"homepage": "https://github.com/kolyaventuri/block#readme",
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@changesets/cli": "^2.30.0",
|
|
78
|
-
"@types/node": "25.3.
|
|
78
|
+
"@types/node": "25.3.5",
|
|
79
79
|
"@typescript-eslint/eslint-plugin": "^8.56.1",
|
|
80
80
|
"@typescript-eslint/parser": "^8.56.1",
|
|
81
81
|
"@vitest/coverage-v8": "^4.0.18",
|
|
@@ -105,6 +105,8 @@
|
|
|
105
105
|
"test:lint": "xo --fix",
|
|
106
106
|
"test:knip": "knip",
|
|
107
107
|
"test:unit": "vitest run",
|
|
108
|
+
"test:coverage": "vitest run --coverage",
|
|
109
|
+
"test:smoke": "pnpm run build && node ./test/smoke/packed-artifact.mjs",
|
|
108
110
|
"prebuild": "pnpm run clean",
|
|
109
111
|
"clean": "rimraf ./dist",
|
|
110
112
|
"build": "tsup",
|