{"version":3,"sources":["../src/errors.ts","../src/validation.ts","../src/slack.ts","../src/parser/internal.ts","../src/index.ts"],"names":["header","_a"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Custom error types for Mack parser\n */\n\nexport class MackError extends Error {\n  constructor(message: string, public readonly code: string) {\n    super(message);\n    this.name = 'MackError';\n    Object.setPrototypeOf(this, MackError.prototype);\n  }\n}\n\nexport class ValidationError extends MackError {\n  constructor(message: string) {\n    super(message, 'VALIDATION_ERROR');\n    this.name = 'ValidationError';\n    Object.setPrototypeOf(this, ValidationError.prototype);\n  }\n}\n\nexport class ParseError extends MackError {\n  constructor(message: string, public readonly tokenType?: string) {\n    super(message, 'PARSE_ERROR');\n    this.name = 'ParseError';\n    Object.setPrototypeOf(this, ParseError.prototype);\n  }\n}\n\nexport class BlockLimitError extends MackError {\n  constructor(\n    public readonly blockCount: number,\n    public readonly maxBlocks: number\n  ) {\n    super(\n      `Block limit exceeded: ${blockCount} blocks exceeds maximum of ${maxBlocks}`,\n      'BLOCK_LIMIT_EXCEEDED'\n    );\n    this.name = 'BlockLimitError';\n    Object.setPrototypeOf(this, BlockLimitError.prototype);\n  }\n}\n\nexport class SecurityError extends MackError {\n  constructor(message: string) {\n    super(message, 'SECURITY_ERROR');\n    this.name = 'SecurityError';\n    Object.setPrototypeOf(this, SecurityError.prototype);\n  }\n}\n","/**\n * Input validation and sanitization utilities\n */\n\nimport {ValidationError} from './errors';\n\nconst MAX_INPUT_SIZE = 1_000_000; // 1MB limit\nconst MAX_RECURSION_DEPTH = 50;\nconst BLOCK_LIMIT = 50;\n\n/**\n * Validates markdown input before parsing\n */\nexport function validateInput(input: string | null | undefined): void {\n  if (input === null || input === undefined) {\n    throw new ValidationError('Input cannot be null or undefined');\n  }\n\n  if (typeof input !== 'string') {\n    throw new ValidationError(\n      `Expected string input, received ${typeof input}`\n    );\n  }\n\n  if (input.length === 0) {\n    throw new ValidationError('Input cannot be empty');\n  }\n\n  if (input.length > MAX_INPUT_SIZE) {\n    throw new ValidationError(\n      `Input size ${input.length} exceeds maximum of ${MAX_INPUT_SIZE} bytes`\n    );\n  }\n}\n\n/**\n * Validates a URL is safe to use\n */\nexport function validateUrl(url: string | null | undefined): boolean {\n  if (!url || typeof url !== 'string' || url.length === 0) {\n    return false;\n  }\n\n  // Check for common protocols or absolute/relative paths\n  // Allow data: URLs only if they're images\n  if (url.startsWith('data:')) {\n    return url.startsWith('data:image/');\n  }\n\n  // Allow relative URLs\n  if (url.startsWith('/') || url.startsWith('.')) {\n    return true;\n  }\n\n  // Validate absolute URLs using regex to avoid Node version issues\n  // Must have valid host part (at least one character after //)\n  const httpRegex = /^https?:\\/\\/[a-zA-Z0-9-._~:/?#[\\]@!$&'()*+,;=]+$/;\n  if (!httpRegex.test(url)) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Validates block count against Slack's limits\n */\nexport function validateBlockCount(\n  blockCount: number,\n  maxBlocks: number = BLOCK_LIMIT\n): void {\n  if (blockCount > maxBlocks) {\n    throw new ValidationError(\n      `Block count ${blockCount} exceeds maximum of ${maxBlocks} blocks`\n    );\n  }\n}\n\n/**\n * Checks recursion depth to prevent stack overflow\n */\nexport function validateRecursionDepth(depth: number): void {\n  if (depth > MAX_RECURSION_DEPTH) {\n    throw new ValidationError(\n      `Recursion depth ${depth} exceeds maximum of ${MAX_RECURSION_DEPTH}`\n    );\n  }\n}\n\n/**\n * Safely truncates text while respecting character boundaries\n */\nexport function safeTruncate(text: string, maxLength: number): string {\n  if (text.length <= maxLength) {\n    return text;\n  }\n\n  // Truncate at max length\n  let truncated = text.slice(0, maxLength);\n\n  // Check if we're in the middle of a multi-byte character (UTF-16 surrogate pair)\n  // This is a safety measure for emoji and other multi-byte characters\n  const lastChar = truncated.charCodeAt(truncated.length - 1);\n  if (lastChar >= 0xd800 && lastChar <= 0xdbff) {\n    // High surrogate without low surrogate - remove it\n    truncated = truncated.slice(0, -1);\n  }\n\n  return truncated;\n}\n\n/**\n * Validates mrkdwn formatting to ensure it won't break Slack rendering\n */\nexport function validateMrkdwn(text: string): void {\n  // Check for unmatched formatting markers\n  const markers = ['*', '_', '~', '`'];\n\n  for (const marker of markers) {\n    const count = (text.match(new RegExp(`\\\\${marker}`, 'g')) || []).length;\n    // Count should be even (matched pairs), except for single backticks which can be single\n    if (marker !== '`' && count % 2 !== 0) {\n      // Warn but don't throw - Slack may handle it gracefully\n      console.warn(\n        `Potential unmatched formatting marker \"${marker}\" in: ${text.slice(\n          0,\n          50\n        )}`\n      );\n    }\n  }\n}\n\n/**\n * Configuration for secure XML parsing\n */\nexport const SECURE_XML_CONFIG = {\n  ignoreAttributes: false,\n  attributeNamePrefix: '@_',\n  parseTagValue: false,\n  // Security settings to prevent XXE and other attacks\n  isArray: () => false,\n  processEntities: false,\n  htmlEntities: true,\n  ignoreDeclaration: true,\n  ignoreNameSpace: true,\n  parseAttributeValue: false,\n  cdataTagName: false,\n  cdataValue: false,\n};\n\nexport const MAX_BLOCKS = BLOCK_LIMIT;\nexport const MAX_INPUT_SIZE_BYTES = MAX_INPUT_SIZE;\nexport const MAX_RECURSION = MAX_RECURSION_DEPTH;\n","import type {\n  DividerBlock,\n  HeaderBlock,\n  ImageBlock,\n  SectionBlock,\n} from '@slack/types';\nimport {safeTruncate, validateUrl} from './validation';\nimport {ValidationError} from './errors';\n\n// Video block type (not yet in @slack/types)\nexport interface VideoBlock {\n  type: 'video';\n  alt_text: string;\n  title: {\n    type: 'plain_text';\n    text: string;\n    emoji?: boolean;\n  };\n  thumbnail_url: string;\n  video_url: string;\n  author_name?: string;\n  block_id?: string;\n  description?: {\n    type: 'plain_text';\n    text: string;\n    emoji?: boolean;\n  };\n  provider_icon_url?: string;\n  provider_name?: string;\n  title_url?: string;\n}\n\n// File block type (not yet in @slack/types)\nexport interface FileBlock {\n  type: 'file';\n  external_id: string;\n  source: 'remote';\n  block_id?: string;\n}\n\n// Table block types (not yet in @slack/types)\nexport interface TableBlock {\n  type: 'table';\n  block_id?: string;\n  rows: TableRow[];\n  column_settings?: ColumnSetting[];\n}\n\nexport type TableRow = TableCell[];\n\nexport interface TableCell {\n  type: 'raw_text' | 'rich_text';\n  text?: string; // for raw_text\n  elements?: RichTextElement[]; // for rich_text\n}\n\nexport interface ColumnSetting {\n  align?: 'left' | 'center' | 'right';\n  is_wrapped?: boolean;\n}\n\nexport interface RichTextElement {\n  type: 'rich_text_section';\n  elements: RichTextSectionElement[];\n}\n\nexport interface RichTextSectionElement {\n  type: 'text' | 'link' | 'emoji';\n  text: string;\n  style?: {\n    bold?: boolean;\n    italic?: boolean;\n    strike?: boolean;\n    code?: boolean;\n  };\n  url?: string; // for links\n  name?: string; // for emoji\n}\n\n// Rich text block (container for rich text elements)\nexport interface RichTextBlock {\n  type: 'rich_text';\n  block_id?: string;\n  elements: (\n    | RichTextListElement\n    | RichTextElement\n    | RichTextPreformattedElement\n    | RichTextQuoteElement\n  )[];\n}\n\n// Rich text list element (for bullet and numbered lists)\nexport interface RichTextListElement {\n  type: 'rich_text_list';\n  style: 'bullet' | 'ordered';\n  indent?: number;\n  offset?: number; // Starting number for ordered lists\n  border?: number;\n  elements: RichTextElement[];\n}\n\n// Rich text preformatted element (for code blocks)\nexport interface RichTextPreformattedElement {\n  type: 'rich_text_preformatted';\n  elements: RichTextSectionElement[];\n  border?: number;\n}\n\n// Rich text quote element (for blockquotes)\nexport interface RichTextQuoteElement {\n  type: 'rich_text_quote';\n  elements: RichTextSectionElement[];\n  border?: number;\n}\n\nconst MAX_TEXT_LENGTH = 3000;\nconst MAX_HEADER_LENGTH = 150;\nconst MAX_IMAGE_TITLE_LENGTH = 2000;\nconst MAX_IMAGE_ALT_TEXT_LENGTH = 2000;\nconst MAX_VIDEO_TITLE_LENGTH = 200;\nconst MAX_VIDEO_DESCRIPTION_LENGTH = 200;\nconst MAX_VIDEO_AUTHOR_NAME_LENGTH = 50;\n\nexport function section(text: string): SectionBlock {\n  if (typeof text !== 'string') {\n    throw new ValidationError(\n      `Section text must be a string, received ${typeof text}`\n    );\n  }\n\n  return {\n    type: 'section',\n    text: {\n      type: 'mrkdwn',\n      text: safeTruncate(text, MAX_TEXT_LENGTH),\n    },\n  };\n}\n\nexport function divider(): DividerBlock {\n  return {\n    type: 'divider',\n  };\n}\n\nexport function header(text: string): HeaderBlock {\n  if (typeof text !== 'string') {\n    throw new ValidationError(\n      `Header text must be a string, received ${typeof text}`\n    );\n  }\n\n  return {\n    type: 'header',\n    text: {\n      type: 'plain_text',\n      text: safeTruncate(text, MAX_HEADER_LENGTH),\n    },\n  };\n}\n\nexport function image(\n  url: string,\n  altText: string,\n  title?: string\n): ImageBlock {\n  if (typeof url !== 'string' || !url) {\n    throw new ValidationError('Image URL must be a non-empty string');\n  }\n\n  // Validate URL - for backward compatibility, allow relative URLs and strings that don't look like URLs\n  // but validate that absolute URLs follow proper format\n  const isAbsoluteUrl =\n    url.startsWith('http://') ||\n    url.startsWith('https://') ||\n    url.startsWith('data:');\n  if (isAbsoluteUrl && !validateUrl(url)) {\n    throw new ValidationError(`Invalid image URL: ${url}`);\n  }\n\n  if (typeof altText !== 'string') {\n    throw new ValidationError(\n      `Image alt text must be a string, received ${typeof altText}`\n    );\n  }\n\n  return {\n    type: 'image',\n    image_url: url,\n    alt_text: safeTruncate(altText, MAX_IMAGE_ALT_TEXT_LENGTH),\n    title: title\n      ? {\n          type: 'plain_text',\n          text: safeTruncate(title, MAX_IMAGE_TITLE_LENGTH),\n        }\n      : undefined,\n  };\n}\n\nexport interface VideoBlockOptions {\n  altText: string;\n  title: string;\n  thumbnailUrl: string;\n  videoUrl: string;\n  authorName?: string;\n  description?: string;\n  providerIconUrl?: string;\n  providerName?: string;\n  titleUrl?: string;\n}\n\nexport function video(options: VideoBlockOptions): VideoBlock {\n  // Validate required fields\n  if (typeof options.altText !== 'string' || !options.altText) {\n    throw new ValidationError('Video alt text must be a non-empty string');\n  }\n\n  if (typeof options.title !== 'string' || !options.title) {\n    throw new ValidationError('Video title must be a non-empty string');\n  }\n\n  if (typeof options.thumbnailUrl !== 'string' || !options.thumbnailUrl) {\n    throw new ValidationError('Video thumbnail URL must be a non-empty string');\n  }\n\n  if (typeof options.videoUrl !== 'string' || !options.videoUrl) {\n    throw new ValidationError('Video URL must be a non-empty string');\n  }\n\n  // Validate URLs\n  const isValidUrl = (url: string): boolean => {\n    const isAbsoluteUrl =\n      url.startsWith('http://') ||\n      url.startsWith('https://') ||\n      url.startsWith('data:');\n    return !isAbsoluteUrl || validateUrl(url);\n  };\n\n  if (!isValidUrl(options.thumbnailUrl)) {\n    throw new ValidationError(`Invalid thumbnail URL: ${options.thumbnailUrl}`);\n  }\n\n  if (!isValidUrl(options.videoUrl)) {\n    throw new ValidationError(`Invalid video URL: ${options.videoUrl}`);\n  }\n\n  // Validate title URL if provided\n  if (options.titleUrl && !isValidUrl(options.titleUrl)) {\n    throw new ValidationError(`Invalid title URL: ${options.titleUrl}`);\n  }\n\n  // Validate provider icon URL if provided\n  if (options.providerIconUrl && !isValidUrl(options.providerIconUrl)) {\n    throw new ValidationError(\n      `Invalid provider icon URL: ${options.providerIconUrl}`\n    );\n  }\n\n  return {\n    type: 'video',\n    alt_text: safeTruncate(options.altText, MAX_IMAGE_ALT_TEXT_LENGTH),\n    title: {\n      type: 'plain_text',\n      text: safeTruncate(options.title, MAX_VIDEO_TITLE_LENGTH),\n      emoji: true,\n    },\n    thumbnail_url: options.thumbnailUrl,\n    video_url: options.videoUrl,\n    author_name: options.authorName\n      ? safeTruncate(options.authorName, MAX_VIDEO_AUTHOR_NAME_LENGTH)\n      : undefined,\n    description: options.description\n      ? {\n          type: 'plain_text',\n          text: safeTruncate(options.description, MAX_VIDEO_DESCRIPTION_LENGTH),\n          emoji: true,\n        }\n      : undefined,\n    provider_icon_url: options.providerIconUrl,\n    provider_name: options.providerName,\n    title_url: options.titleUrl,\n  };\n}\n\nexport function file(externalId: string): FileBlock {\n  if (typeof externalId !== 'string' || !externalId) {\n    throw new ValidationError('File external_id must be a non-empty string');\n  }\n\n  return {\n    type: 'file',\n    external_id: externalId,\n    source: 'remote',\n  };\n}\n\nexport function richTextList(\n  items: RichTextElement[],\n  style: 'bullet' | 'ordered' = 'bullet',\n  indent = 0\n): RichTextBlock {\n  if (!Array.isArray(items) || items.length === 0) {\n    throw new ValidationError('Rich text list must have at least one item');\n  }\n\n  return {\n    type: 'rich_text',\n    elements: [\n      {\n        type: 'rich_text_list',\n        style,\n        indent,\n        elements: items,\n      },\n    ],\n  };\n}\n\nexport function richTextCode(code: string): RichTextBlock {\n  if (typeof code !== 'string') {\n    throw new ValidationError(\n      `Code text must be a string, received ${typeof code}`\n    );\n  }\n\n  return {\n    type: 'rich_text',\n    elements: [\n      {\n        type: 'rich_text_preformatted',\n        elements: [\n          {\n            type: 'text',\n            text: code,\n          },\n        ],\n      },\n    ],\n  };\n}\n\nexport function richTextQuote(\n  elements: RichTextSectionElement[]\n): RichTextBlock {\n  if (!Array.isArray(elements) || elements.length === 0) {\n    throw new ValidationError('Rich text quote must have at least one element');\n  }\n\n  return {\n    type: 'rich_text',\n    elements: [\n      {\n        type: 'rich_text_quote',\n        elements,\n      },\n    ],\n  };\n}\n\nconst MAX_TABLE_ROWS = 100;\nconst MAX_TABLE_CELLS_PER_ROW = 20;\nconst MAX_COLUMN_SETTINGS = 20;\n\nexport function table(\n  rows: TableRow[],\n  columnSettings?: ColumnSetting[]\n): TableBlock {\n  if (!Array.isArray(rows)) {\n    throw new ValidationError('Table rows must be an array');\n  }\n\n  if (rows.length === 0) {\n    throw new ValidationError('Table must have at least one row');\n  }\n\n  if (rows.length > MAX_TABLE_ROWS) {\n    throw new ValidationError(\n      `Table cannot have more than ${MAX_TABLE_ROWS} rows`\n    );\n  }\n\n  // Validate each row\n  for (let i = 0; i < rows.length; i++) {\n    const row = rows[i];\n    if (!Array.isArray(row)) {\n      throw new ValidationError(`Table row ${i} must be an array`);\n    }\n    if (row.length > MAX_TABLE_CELLS_PER_ROW) {\n      throw new ValidationError(\n        `Table row ${i} cannot have more than ${MAX_TABLE_CELLS_PER_ROW} cells`\n      );\n    }\n    // Validate each cell\n    for (let j = 0; j < row.length; j++) {\n      const cell = row[j];\n      if (!cell || typeof cell !== 'object') {\n        throw new ValidationError(\n          `Table cell at row ${i}, column ${j} must be an object`\n        );\n      }\n      if (cell.type !== 'raw_text' && cell.type !== 'rich_text') {\n        throw new ValidationError(\n          `Table cell at row ${i}, column ${j} must have type 'raw_text' or 'rich_text'`\n        );\n      }\n      if (cell.type === 'raw_text' && typeof cell.text !== 'string') {\n        throw new ValidationError(\n          `Table cell at row ${i}, column ${j} with type 'raw_text' must have a text property`\n        );\n      }\n      if (cell.type === 'rich_text' && !Array.isArray(cell.elements)) {\n        throw new ValidationError(\n          `Table cell at row ${i}, column ${j} with type 'rich_text' must have an elements array`\n        );\n      }\n    }\n  }\n\n  // Validate column settings if provided\n  if (columnSettings) {\n    if (!Array.isArray(columnSettings)) {\n      throw new ValidationError('Column settings must be an array');\n    }\n    if (columnSettings.length > MAX_COLUMN_SETTINGS) {\n      throw new ValidationError(\n        `Cannot have more than ${MAX_COLUMN_SETTINGS} column settings`\n      );\n    }\n    for (const setting of columnSettings) {\n      if (\n        setting &&\n        setting.align &&\n        !['left', 'center', 'right'].includes(setting.align)\n      ) {\n        throw new ValidationError(\n          'Column alignment must be left, center, or right'\n        );\n      }\n    }\n  }\n\n  return {\n    type: 'table',\n    rows,\n    column_settings: columnSettings,\n  };\n}\n","import {\n  DividerBlock,\n  HeaderBlock,\n  ImageBlock,\n  KnownBlock,\n  SectionBlock,\n} from '@slack/types';\nimport {ParsingOptions, ListOptions} from '../types';\nimport {\n  section,\n  divider,\n  header,\n  image,\n  video,\n  table,\n  file,\n  richTextList,\n  richTextCode,\n  richTextQuote,\n  VideoBlock,\n  FileBlock,\n  TableBlock,\n  RichTextBlock,\n  TableRow,\n  TableCell,\n  ColumnSetting,\n  RichTextSectionElement,\n  RichTextElement,\n} from '../slack';\nimport {marked} from 'marked';\nimport {XMLParser} from 'fast-xml-parser';\nimport {\n  validateUrl,\n  validateRecursionDepth,\n  SECURE_XML_CONFIG,\n} from '../validation';\n\ntype PhrasingToken =\n  | marked.Tokens.Link\n  | marked.Tokens.Em\n  | marked.Tokens.Strong\n  | marked.Tokens.Del\n  | marked.Tokens.Br\n  | marked.Tokens.Image\n  | marked.Tokens.Codespan\n  | marked.Tokens.Text\n  | marked.Tokens.HTML;\n\n// Recursion depth context for tracking nested content\nlet recursionDepth = 0;\n\n// File extensions that should be converted to file blocks\nconst FILE_EXTENSIONS = new Set([\n  'pdf',\n  'doc',\n  'docx',\n  'xls',\n  'xlsx',\n  'ppt',\n  'pptx',\n  'zip',\n  'rar',\n  '7z',\n  'tar',\n  'gz',\n  'txt',\n  'csv',\n  'json',\n  'xml',\n  'jpg',\n  'jpeg',\n  'png',\n  'gif',\n  'bmp',\n  'svg',\n]);\n\nfunction detectFileExtension(href: string): string | null {\n  // Extract the path part (before query string or hash)\n  const pathname = href.split('?')[0].split('#')[0];\n  const match = pathname.match(/\\.([a-zA-Z0-9]+)$/);\n  return match ? match[1].toLowerCase() : null;\n}\n\nfunction isFileType(extension: string | null): boolean {\n  return extension !== null && FILE_EXTENSIONS.has(extension);\n}\n\nfunction extractFileName(href: string): string {\n  // Extract the path part (before query string or hash)\n  const pathname = href.split('?')[0].split('#')[0];\n  return pathname.split('/').pop() || 'Document';\n}\n\nfunction parsePlainText(element: PhrasingToken): string[] {\n  switch (element.type) {\n    case 'link':\n    case 'em':\n    case 'strong':\n    case 'del':\n      return element.tokens.flatMap((child: marked.Token) =>\n        parsePlainText(child as PhrasingToken)\n      );\n\n    case 'br':\n      return [];\n\n    case 'image':\n      return [element.title ?? element.href];\n\n    case 'codespan':\n    case 'text':\n    case 'html':\n      return [element.raw];\n  }\n}\n\nfunction isSectionBlock(block: KnownBlock): block is SectionBlock {\n  return block.type === 'section';\n}\n\nfunction parseMrkdwn(\n  element: Exclude<PhrasingToken, marked.Tokens.Image>\n): string {\n  recursionDepth++;\n  try {\n    validateRecursionDepth(recursionDepth);\n\n    switch (element.type) {\n      case 'link': {\n        // Validate URL before including it\n        const href =\n          element.href && validateUrl(element.href) ? element.href : '';\n        if (!href) {\n          // URL is invalid, just return the link text without formatting\n          return element.tokens\n            .flatMap((child: marked.Token) =>\n              parseMrkdwn(child as Exclude<PhrasingToken, marked.Tokens.Image>)\n            )\n            .join('');\n        }\n        return `<${href}|${element.tokens\n          .flatMap((child: marked.Token) =>\n            parseMrkdwn(child as Exclude<PhrasingToken, marked.Tokens.Image>)\n          )\n          .join('')}> `;\n      }\n\n      case 'em': {\n        return `_${element.tokens\n          .flatMap((child: marked.Token) =>\n            parseMrkdwn(child as Exclude<PhrasingToken, marked.Tokens.Image>)\n          )\n          .join('')}_`;\n      }\n\n      case 'codespan':\n        return `\\`${element.text}\\``;\n\n      case 'strong': {\n        return `*${element.tokens\n          .flatMap((child: marked.Token) =>\n            parseMrkdwn(child as Exclude<PhrasingToken, marked.Tokens.Image>)\n          )\n          .join('')}*`;\n      }\n\n      case 'text':\n        return element.text;\n\n      case 'del': {\n        return `~${element.tokens\n          .flatMap((child: marked.Token) =>\n            parseMrkdwn(child as Exclude<PhrasingToken, marked.Tokens.Image>)\n          )\n          .join('')}~`;\n      }\n\n      default:\n        return '';\n    }\n  } finally {\n    recursionDepth--;\n  }\n}\n\nfunction addMrkdwn(\n  content: string,\n  accumulator: (SectionBlock | ImageBlock | FileBlock)[]\n) {\n  const last = accumulator[accumulator.length - 1];\n\n  if (last && isSectionBlock(last) && last.text) {\n    last.text.text += content;\n  } else {\n    accumulator.push(section(content));\n  }\n}\n\nfunction parsePhrasingContent(\n  element: PhrasingToken,\n  accumulator: (SectionBlock | ImageBlock | FileBlock)[]\n) {\n  if (element.type === 'image') {\n    try {\n      const imageBlock: ImageBlock = image(\n        element.href,\n        element.text || element.title || element.href,\n        element.title\n      );\n      accumulator.push(imageBlock);\n    } catch (error) {\n      // Skip images with invalid URLs instead of throwing\n      // This allows graceful degradation - silently skip\n    }\n  } else if (element.type === 'link') {\n    // Check if this is a file link - check both URL and link text\n    const linkText = element.tokens\n      .flatMap((child: marked.Token) => parsePlainText(child as PhrasingToken))\n      .join('');\n    const urlExtension = detectFileExtension(element.href);\n    const textExtension = detectFileExtension(linkText);\n    const fileExtension = urlExtension || textExtension;\n\n    if (isFileType(fileExtension)) {\n      try {\n        // Prefer text filename, fall back to URL filename\n        const fileName = textExtension\n          ? extractFileName(linkText)\n          : extractFileName(element.href);\n        const fileBlock: FileBlock = file(fileName);\n        accumulator.push(fileBlock);\n      } catch (error) {\n        // If file block creation fails, treat as regular link\n        const text = parseMrkdwn(element);\n        addMrkdwn(text, accumulator);\n      }\n    } else {\n      const text = parseMrkdwn(element);\n      addMrkdwn(text, accumulator);\n    }\n  } else {\n    const text = parseMrkdwn(element);\n    addMrkdwn(text, accumulator);\n  }\n}\n\nfunction parseParagraph(\n  element: marked.Tokens.Paragraph\n): (KnownBlock | FileBlock)[] {\n  return element.tokens.reduce<(SectionBlock | ImageBlock | FileBlock)[]>(\n    (\n      accumulator: (SectionBlock | ImageBlock | FileBlock)[],\n      child: marked.Token\n    ) => {\n      parsePhrasingContent(child as PhrasingToken, accumulator);\n      return accumulator;\n    },\n    []\n  );\n}\n\nfunction parseHeading(element: marked.Tokens.Heading): HeaderBlock {\n  return header(\n    element.tokens\n      .flatMap((child: marked.Token) => parsePlainText(child as PhrasingToken))\n      .join('')\n  );\n}\n\nfunction parseCode(element: marked.Tokens.Code): RichTextBlock {\n  return richTextCode(element.text);\n}\n\nfunction parseList(\n  element: marked.Tokens.List,\n  options: ListOptions = {},\n  indent = 0\n): RichTextBlock {\n  const items: RichTextElement[] = [];\n\n  // Default checkbox prefix function\n  const defaultCheckboxPrefix = (checked: boolean): string => {\n    return checked ? '✅ ' : '☐ ';\n  };\n\n  const checkboxPrefix = options.checkboxPrefix || defaultCheckboxPrefix;\n\n  for (const item of element.items) {\n    const itemElements: RichTextSectionElement[] = [];\n\n    // Handle checkbox items by adding prefix\n    if (item.task) {\n      const prefix = checkboxPrefix(item.checked || false);\n      itemElements.push({\n        type: 'text',\n        text: prefix,\n      });\n    }\n\n    for (const token of item.tokens) {\n      if (token.type === 'text' || token.type === 'paragraph') {\n        const textToken = token as marked.Tokens.Text | marked.Tokens.Paragraph;\n        if (!textToken.tokens?.length) {\n          continue;\n        }\n\n        // Convert tokens to rich text elements\n        const richElements = tokensToRichTextElements(\n          textToken.tokens as PhrasingToken[]\n        );\n        itemElements.push(...richElements);\n      } else if (token.type === 'code') {\n        // Include code blocks as code-styled text within list items\n        const codeToken = token as marked.Tokens.Code;\n        itemElements.push({\n          type: 'text',\n          text: `\\n${codeToken.text}\\n`,\n          style: {code: true},\n        });\n      }\n      // Note: Nested lists are not yet supported in rich_text_list format\n      // They would need to be separate blocks with increased indent\n    }\n\n    items.push({\n      type: 'rich_text_section',\n      elements: itemElements,\n    });\n  }\n\n  // Determine list style - checkbox lists use bullet style\n  let style: 'bullet' | 'ordered' = 'bullet';\n  if (element.ordered) {\n    style = 'ordered';\n  }\n\n  return richTextList(items, style, indent);\n}\n\n// Helper function to convert marked tokens to rich text elements\nfunction tokensToRichTextElements(\n  tokens: PhrasingToken[]\n): RichTextSectionElement[] {\n  const elements: RichTextSectionElement[] = [];\n\n  for (const token of tokens) {\n    switch (token.type) {\n      case 'text':\n        elements.push({\n          type: 'text',\n          text: token.text,\n        });\n        break;\n\n      case 'strong': {\n        const strongText = token.tokens\n          .map((t: marked.Token) => (t as marked.Tokens.Text).text || '')\n          .join('');\n        elements.push({\n          type: 'text',\n          text: strongText,\n          style: {bold: true},\n        });\n        break;\n      }\n\n      case 'em': {\n        const emText = token.tokens\n          .map((t: marked.Token) => (t as marked.Tokens.Text).text || '')\n          .join('');\n        elements.push({\n          type: 'text',\n          text: emText,\n          style: {italic: true},\n        });\n        break;\n      }\n\n      case 'del': {\n        const delText = token.tokens\n          .map((t: marked.Token) => (t as marked.Tokens.Text).text || '')\n          .join('');\n        elements.push({\n          type: 'text',\n          text: delText,\n          style: {strike: true},\n        });\n        break;\n      }\n\n      case 'codespan':\n        elements.push({\n          type: 'text',\n          text: token.text,\n          style: {code: true},\n        });\n        break;\n\n      case 'link': {\n        const linkText = token.tokens\n          .map((t: marked.Token) => (t as marked.Tokens.Text).text || '')\n          .join('');\n        if (validateUrl(token.href)) {\n          elements.push({\n            type: 'link',\n            text: linkText,\n            url: token.href,\n          });\n        } else {\n          // Fallback to plain text if URL is invalid\n          elements.push({\n            type: 'text',\n            text: linkText,\n          });\n        }\n        break;\n      }\n\n      case 'image':\n        // Images can't be inline in table cells, use text fallback\n        elements.push({\n          type: 'text',\n          text: token.text || token.title || '[image]',\n        });\n        break;\n\n      default:\n        // Fallback for unsupported token types\n        if (\n          'text' in token &&\n          typeof (token as {text?: string}).text === 'string'\n        ) {\n          elements.push({\n            type: 'text',\n            text: (token as {text: string}).text,\n          });\n        }\n    }\n  }\n\n  return elements;\n}\n\n// Parse a table cell to a TableCell object\nfunction parseTableCellToBlock(cell: marked.Tokens.TableCell): TableCell {\n  // Check if cell contains complex formatting\n  const hasComplexFormatting = cell.tokens.some((token: marked.Token) => {\n    const tokenType = (token as PhrasingToken).type;\n    return ['strong', 'em', 'del', 'link', 'codespan'].includes(tokenType);\n  });\n\n  if (hasComplexFormatting) {\n    // Use rich_text for complex formatting\n    const elements = tokensToRichTextElements(cell.tokens as PhrasingToken[]);\n    return {\n      type: 'rich_text',\n      elements: [\n        {\n          type: 'rich_text_section',\n          elements,\n        },\n      ],\n    };\n  } else {\n    // Use raw_text for simple text\n    const text = cell.tokens\n      .map((token: marked.Token) => {\n        if ('text' in token) {\n          return (token as marked.Tokens.Text).text;\n        }\n        return '';\n      })\n      .join('');\n    return {\n      type: 'raw_text',\n      text,\n    };\n  }\n}\n\n// Parse table rows to TableRow array\nfunction parseTableRowsToBlocks(\n  header: marked.Tokens.TableCell[],\n  rows: marked.Tokens.TableCell[][],\n  align: Array<'left' | 'center' | 'right' | null>\n): {tableRows: TableRow[]; columnSettings: ColumnSetting[]} {\n  const tableRows: TableRow[] = [];\n\n  // Parse header row\n  const headerRow: TableCell[] = header.map((cell: marked.Tokens.TableCell) =>\n    parseTableCellToBlock(cell)\n  );\n  tableRows.push(headerRow);\n\n  // Parse data rows\n  for (const row of rows) {\n    const tableRow: TableCell[] = row.map((cell: marked.Tokens.TableCell) =>\n      parseTableCellToBlock(cell)\n    );\n    tableRows.push(tableRow);\n  }\n\n  // Generate column settings from alignment\n  const columnSettings: ColumnSetting[] = [];\n  for (let i = 0; i < align.length && i < 20; i++) {\n    if (align[i] && align[i] !== 'left') {\n      // Only add settings for non-default alignment\n      columnSettings.push({\n        align: align[i] as 'center' | 'right',\n      });\n    } else if (columnSettings.length > 0) {\n      // Add null to maintain column index\n      columnSettings.push({});\n    }\n  }\n\n  return {tableRows, columnSettings};\n}\n\nfunction parseTable(element: marked.Tokens.Table): TableBlock {\n  const {tableRows, columnSettings} = parseTableRowsToBlocks(\n    element.header,\n    element.rows,\n    element.align\n  );\n\n  return table(\n    tableRows,\n    columnSettings.length > 0 ? columnSettings : undefined\n  );\n}\n\nfunction parseBlockquote(\n  element: marked.Tokens.Blockquote\n): (KnownBlock | TableBlock | VideoBlock | FileBlock | RichTextBlock)[] {\n  // Check if blockquote contains only paragraph tokens (simple quote)\n  const onlyParagraphs = element.tokens.every(\n    (token: marked.Token) => token.type === 'paragraph' || token.type === 'text'\n  );\n\n  if (onlyParagraphs) {\n    // First check if paragraphs contain file links by parsing them normally\n    const testBlocks = element.tokens.flatMap((token: marked.Token) => {\n      if (token.type === 'paragraph') {\n        return parseParagraph(token as marked.Tokens.Paragraph);\n      }\n      return [];\n    });\n\n    // If any file blocks were generated, use the old approach\n    const hasFileBlocks = testBlocks.some(\n      (\n        block: KnownBlock | TableBlock | VideoBlock | FileBlock | RichTextBlock\n      ) => block.type === 'file'\n    );\n    if (hasFileBlocks) {\n      // Fall through to the complex blockquote handling below\n    } else {\n      // Convert to rich_text_quote for simple quotes\n      const quoteElements: RichTextSectionElement[] = [];\n\n      for (const token of element.tokens) {\n        if (token.type === 'paragraph') {\n          const paragraphToken = token as marked.Tokens.Paragraph;\n          if (paragraphToken.tokens?.length) {\n            const richElements = tokensToRichTextElements(\n              paragraphToken.tokens as PhrasingToken[]\n            );\n            quoteElements.push(...richElements);\n            // Add newline between paragraphs\n            if (element.tokens.indexOf(token) < element.tokens.length - 1) {\n              quoteElements.push({type: 'text', text: '\\n'});\n            }\n          }\n        } else if (token.type === 'text') {\n          const textToken = token as marked.Tokens.Text;\n          if (textToken.tokens?.length) {\n            const richElements = tokensToRichTextElements(\n              textToken.tokens as PhrasingToken[]\n            );\n            quoteElements.push(...richElements);\n          } else {\n            quoteElements.push({type: 'text', text: textToken.text});\n          }\n        }\n      }\n\n      if (quoteElements.length > 0) {\n        return [richTextQuote(quoteElements)];\n      }\n      return [];\n    }\n  }\n\n  // For complex blockquotes (with lists, code, etc.), use the old approach\n  const blocks = element.tokens.flatMap((token: marked.Token) => {\n    if (token.type === 'paragraph') {\n      return parseParagraph(token);\n    } else if (token.type === 'list') {\n      return [parseList(token)];\n    } else if (token.type === 'code') {\n      return [parseCode(token)];\n    } else if (token.type === 'blockquote') {\n      // Handle nested blockquotes\n      return parseBlockquote(token);\n    } else if (token.type === 'heading') {\n      return [parseHeading(token)];\n    } else if (token.type === 'html') {\n      return parseHTML(token);\n    }\n    // Skip unsupported token types in blockquotes\n    return [];\n  });\n\n  // Add blockquote formatting to section blocks only\n  return blocks.map(\n    (\n      block: KnownBlock | TableBlock | VideoBlock | FileBlock | RichTextBlock\n    ) => {\n      if ('type' in block && block.type === 'section' && block.text?.text) {\n        block.text.text = '> ' + block.text.text.replace(/\\n/g, '\\n> ');\n      }\n      return block;\n    }\n  );\n}\n\nfunction parseThematicBreak(): DividerBlock {\n  return divider();\n}\n\n// Type for parsed XML/HTML elements\ninterface XmlElement {\n  '#text'?: string;\n  _?: string;\n  '@_align'?: string;\n  '@_style'?: string;\n  [key: string]: unknown;\n}\n\n// Helper function to extract text content from HTML element\nfunction extractTextFromHtmlElement(\n  element: XmlElement | string | XmlElement[]\n): string {\n  if (typeof element === 'string') {\n    return element;\n  }\n  if (Array.isArray(element)) {\n    return element\n      .map((e: XmlElement | string) => extractTextFromHtmlElement(e))\n      .join('');\n  }\n  if (element && element['#text']) {\n    return element['#text'];\n  }\n  if (element && typeof element === 'object') {\n    // Handle nested elements (like <b>, <i>, etc.)\n    const keys = Object.keys(element);\n    for (const key of keys) {\n      if (key !== '@_align' && !key.startsWith('@_')) {\n        const value = element[key];\n        if (typeof value === 'string') {\n          return value;\n        }\n        if (\n          value &&\n          typeof value === 'object' &&\n          (value as XmlElement)['#text']\n        ) {\n          return (value as XmlElement)['#text'] as string;\n        }\n        // Recursively extract from nested elements\n        const extracted = extractTextFromHtmlElement(value as XmlElement);\n        if (extracted) {\n          return extracted;\n        }\n      }\n    }\n  }\n  return '';\n}\n\n// Type for HTML table structure from XML parser\ninterface HtmlTableElement {\n  colgroup?: {\n    col?: XmlElement | XmlElement[];\n  };\n  thead?: {\n    tr?: XmlElement | XmlElement[];\n  };\n  tbody?: {\n    tr?: XmlElement | XmlElement[];\n  };\n  tr?: XmlElement | XmlElement[];\n  [key: string]: unknown;\n}\n\n// Helper function to parse HTML table to TableBlock\nfunction parseHtmlTable(tableElement: HtmlTableElement): TableBlock | null {\n  try {\n    const rows: TableRow[] = [];\n    const columnSettings: ColumnSetting[] = [];\n\n    // Extract alignment from col or colgroup elements if present\n    if (tableElement.colgroup && tableElement.colgroup.col) {\n      const cols = Array.isArray(tableElement.colgroup.col)\n        ? tableElement.colgroup.col\n        : [tableElement.colgroup.col];\n\n      cols.forEach((col: XmlElement, index: number) => {\n        if (col['@_align']) {\n          const align = (col['@_align'] as string).toLowerCase();\n          if (['center', 'right'].includes(align)) {\n            columnSettings[index] = {align: align as 'center' | 'right'};\n          }\n        }\n      });\n    }\n\n    // Process thead if present\n    if (tableElement.thead && tableElement.thead.tr) {\n      const headerRow = Array.isArray(tableElement.thead.tr)\n        ? tableElement.thead.tr[0]\n        : tableElement.thead.tr;\n\n      if (headerRow && (headerRow as XmlElement).th) {\n        const headers = Array.isArray((headerRow as XmlElement).th)\n          ? ((headerRow as XmlElement).th as XmlElement[])\n          : [(headerRow as XmlElement).th as XmlElement];\n        const headerCells: TableCell[] = headers.map(\n          (th: XmlElement, index: number) => {\n            const text = extractTextFromHtmlElement(th);\n            // Check for alignment attribute\n            if (th['@_align'] && !columnSettings[index]) {\n              const align = (th['@_align'] as string).toLowerCase();\n              if (['center', 'right'].includes(align)) {\n                columnSettings[index] = {align: align as 'center' | 'right'};\n              }\n            }\n            return {type: 'raw_text', text};\n          }\n        );\n        rows.push(headerCells);\n      }\n    }\n\n    // Process tbody or direct tr elements\n    const bodyElement = tableElement.tbody || tableElement;\n    if (bodyElement.tr) {\n      const dataRows = Array.isArray(bodyElement.tr)\n        ? bodyElement.tr\n        : [bodyElement.tr];\n\n      for (const tr of dataRows) {\n        // Skip if this was already processed as header\n        if (tableElement.thead && tableElement.thead.tr === tr) {\n          continue;\n        }\n\n        const cells: TableCell[] = [];\n\n        // Handle both td and th elements in body\n        const cellElements = (tr as XmlElement).td || (tr as XmlElement).th;\n        if (cellElements) {\n          const cellArray = Array.isArray(cellElements)\n            ? cellElements\n            : [cellElements];\n          cellArray.forEach((cell: XmlElement, index: number) => {\n            const text = extractTextFromHtmlElement(cell);\n            // Check for alignment attribute\n            if (cell['@_align'] && !columnSettings[index]) {\n              const align = (cell['@_align'] as string).toLowerCase();\n              if (['center', 'right'].includes(align)) {\n                columnSettings[index] = {align: align as 'center' | 'right'};\n              }\n            }\n            cells.push({type: 'raw_text', text});\n          });\n\n          if (cells.length > 0) {\n            rows.push(cells);\n          }\n        }\n      }\n    }\n\n    // Only create table if we have rows\n    if (rows.length > 0) {\n      // Clean up column settings - remove empty entries at the end\n      const cleanedSettings = columnSettings.filter(\n        (setting: ColumnSetting, index: number) => {\n          // Keep settings if they have values or if there are values after them\n          return (\n            setting.align ||\n            columnSettings\n              .slice(index + 1)\n              .some((futureSetting: ColumnSetting) => futureSetting.align)\n          );\n        }\n      );\n\n      return table(\n        rows,\n        cleanedSettings.length > 0 ? cleanedSettings : undefined\n      );\n    }\n\n    return null;\n  } catch (error) {\n    console.warn(\n      `Failed to parse HTML table: ${\n        error instanceof Error ? error.message : 'Unknown error'\n      }`\n    );\n    return null;\n  }\n}\n\nfunction parseHTML(\n  element: marked.Tokens.HTML | marked.Tokens.Tag\n): (KnownBlock | TableBlock | VideoBlock | FileBlock)[] {\n  try {\n    const parser = new XMLParser(SECURE_XML_CONFIG);\n    const res = parser.parse(element.raw);\n    const blocks: (KnownBlock | TableBlock | VideoBlock | FileBlock)[] = [];\n\n    // Handle tables\n    if (res.table) {\n      const tableBlock = parseHtmlTable(res.table);\n      if (tableBlock) {\n        blocks.push(tableBlock);\n      }\n    }\n\n    // Handle images\n    if (res.img) {\n      const tags = res.img instanceof Array ? res.img : [res.img];\n\n      const imageBlocks = tags\n        .map((img: Record<string, string>) => {\n          const url: string = img['@_src'];\n          // Validate URL before creating image block\n          if (!validateUrl(url)) {\n            return null;\n          }\n          return image(url, img['@_alt'] || url);\n        })\n        .filter((e: ImageBlock | null) => e !== null) as ImageBlock[];\n\n      blocks.push(...imageBlocks);\n    }\n\n    // Handle videos\n    if (res.video) {\n      const tags = res.video instanceof Array ? res.video : [res.video];\n\n      const videoBlocks = tags\n        .map((vid: Record<string, unknown>) => {\n          const videoUrl = String(vid['@_src'] || '');\n          const posterUrl = String(vid['@_poster'] || '');\n          const title = String(vid['@_title'] || 'Video');\n          const altText = String(vid['@_alt'] || title);\n\n          // Validate URLs before creating video block\n          if (!videoUrl || !validateUrl(videoUrl)) {\n            return null;\n          }\n          if (posterUrl && !validateUrl(posterUrl)) {\n            return null;\n          }\n\n          try {\n            return video({\n              videoUrl,\n              thumbnailUrl: posterUrl || videoUrl,\n              title,\n              altText,\n              description: undefined,\n            });\n          } catch {\n            return null;\n          }\n        })\n        .filter((e: VideoBlock | null) => e !== null) as VideoBlock[];\n\n      blocks.push(...videoBlocks);\n    }\n\n    return blocks;\n  } catch (error) {\n    // Log parsing error but don't crash - just skip this HTML block\n    const errorMessage =\n      error instanceof Error ? error.message : 'Unknown error';\n    console.warn(`Failed to parse HTML block: ${errorMessage}`);\n    return [];\n  }\n}\n\nfunction parseToken(\n  token: marked.Token,\n  options: ParsingOptions\n): (KnownBlock | TableBlock | VideoBlock | FileBlock | RichTextBlock)[] {\n  switch (token.type) {\n    case 'heading':\n      return [parseHeading(token)];\n\n    case 'paragraph':\n      return parseParagraph(token);\n\n    case 'code':\n      return [parseCode(token)];\n\n    case 'blockquote':\n      return parseBlockquote(token);\n\n    case 'list':\n      return [parseList(token, options.lists)];\n\n    case 'table':\n      return [parseTable(token)];\n\n    case 'hr':\n      return [parseThematicBreak()];\n\n    case 'html':\n      return parseHTML(token);\n\n    default:\n      return [];\n  }\n}\n\nexport function parseBlocks(\n  tokens: marked.TokensList,\n  options: ParsingOptions = {}\n): (KnownBlock | TableBlock | VideoBlock | FileBlock | RichTextBlock)[] {\n  return tokens.flatMap((token: marked.Token) => parseToken(token, options));\n}\n","import type {KnownBlock} from '@slack/types';\nimport {parseBlocks} from './parser/internal';\nimport type {ParsingOptions} from './types';\nimport {marked} from 'marked';\nimport {validateInput, validateBlockCount, MAX_BLOCKS} from './validation';\nimport type {TableBlock, VideoBlock, FileBlock, RichTextBlock} from './slack';\n\n/**\n * Parses Markdown content into Slack BlockKit Blocks.\n * - Supports headings (all Markdown heading levels are treated as the single Slack header block)\n * - Supports numbered lists, bulleted lists, to-do lists\n * - Supports italics, bold, strikethrough, inline code, hyperlinks\n * - Supports images\n * - Supports thematic breaks / dividers\n * - Supports nested lists and blockquotes with rich content\n * - Supports native table blocks with rich text formatting and column alignment\n *\n * Supports GitHub-flavoured Markdown.\n *\n * Enforces Slack API limits:\n * - Maximum 50 blocks per message\n * - Maximum 3000 characters per section block\n * - Maximum 150 characters per header block\n * - Text truncation handles multi-byte characters safely\n *\n * @param body any Markdown or GFM content\n * @param options options to configure the parser\n * @throws {ValidationError} if input is invalid or exceeds limits\n * @throws {BlockLimitError} if block count exceeds maximum\n * @throws {ParseError} if parsing fails\n */\nexport async function markdownToBlocks(\n  body: string,\n  options: ParsingOptions = {}\n): Promise<\n  (KnownBlock | TableBlock | VideoBlock | FileBlock | RichTextBlock)[]\n> {\n  // Validate input\n  validateInput(body);\n\n  // Slack only wants &, <, and > escaped\n  // https://api.slack.com/reference/surfaces/formatting#escaping\n  const replacements: Record<string, string> = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n  };\n\n  const lexer = new marked.Lexer();\n  lexer.options.tokenizer = new marked.Tokenizer();\n  lexer.options.tokenizer.inlineText = (src: string): marked.Tokens.Text => {\n    const text = src.replace(/[&<>]/g, (char: string): string => {\n      return replacements[char];\n    });\n\n    return {\n      type: 'text',\n      raw: src,\n      text: text,\n    };\n  };\n\n  const tokens = lexer.lex(body);\n\n  const blocks = parseBlocks(tokens, options);\n\n  // Validate block count\n  validateBlockCount(blocks.length, MAX_BLOCKS);\n\n  return blocks;\n}\n"]}