@elastic/isomer-sdk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/NOTICE.txt +0 -286
  2. package/README.md +13 -2
  3. package/THIRD_PARTY_LICENSES.md +1 -885
  4. package/dist/author/authored_fields.d.ts +93 -18
  5. package/dist/author/authored_fields.d.ts.map +1 -1
  6. package/dist/author/authored_fields.js +63 -43
  7. package/dist/author/authored_fields.js.map +1 -1
  8. package/dist/author/authoring_input.d.ts +7 -0
  9. package/dist/author/authoring_input.d.ts.map +1 -0
  10. package/dist/author/authoring_input.js +66 -0
  11. package/dist/author/authoring_input.js.map +1 -0
  12. package/dist/author/authoring_model.d.ts +33 -0
  13. package/dist/author/authoring_model.d.ts.map +1 -0
  14. package/dist/author/authoring_model.js +142 -0
  15. package/dist/author/authoring_model.js.map +1 -0
  16. package/dist/author/declarations.d.ts +13 -0
  17. package/dist/author/declarations.d.ts.map +1 -0
  18. package/dist/author/declarations.js +288 -0
  19. package/dist/author/declarations.js.map +1 -0
  20. package/dist/author/index.d.ts +4 -1
  21. package/dist/author/index.d.ts.map +1 -1
  22. package/dist/author/index.js +4 -1
  23. package/dist/author/index.js.map +1 -1
  24. package/dist/author/jsx_shim.d.ts +50 -30
  25. package/dist/author/jsx_shim.d.ts.map +1 -1
  26. package/dist/author/jsx_shim.js +146 -138
  27. package/dist/author/jsx_shim.js.map +1 -1
  28. package/dist/author/print_jsx.d.ts +19 -0
  29. package/dist/author/print_jsx.d.ts.map +1 -0
  30. package/dist/author/print_jsx.js +372 -0
  31. package/dist/author/print_jsx.js.map +1 -0
  32. package/dist/author/prompt.d.ts +2 -2
  33. package/dist/author/prompt.d.ts.map +1 -1
  34. package/dist/author/prompt.js +7 -2
  35. package/dist/author/prompt.js.map +1 -1
  36. package/dist/author/schema_to_typescript.d.ts +37 -0
  37. package/dist/author/schema_to_typescript.d.ts.map +1 -0
  38. package/dist/author/schema_to_typescript.js +289 -0
  39. package/dist/author/schema_to_typescript.js.map +1 -0
  40. package/dist/cjs/author/authored_fields.js +68 -47
  41. package/dist/cjs/author/authored_fields.js.map +1 -1
  42. package/dist/cjs/author/authoring_input.js +70 -0
  43. package/dist/cjs/author/authoring_input.js.map +1 -0
  44. package/dist/cjs/author/authoring_model.js +149 -0
  45. package/dist/cjs/author/authoring_model.js.map +1 -0
  46. package/dist/cjs/author/declarations.js +292 -0
  47. package/dist/cjs/author/declarations.js.map +1 -0
  48. package/dist/cjs/author/index.js +10 -1
  49. package/dist/cjs/author/index.js.map +1 -1
  50. package/dist/cjs/author/jsx_shim.js +148 -140
  51. package/dist/cjs/author/jsx_shim.js.map +1 -1
  52. package/dist/cjs/author/print_jsx.js +378 -0
  53. package/dist/cjs/author/print_jsx.js.map +1 -0
  54. package/dist/cjs/author/prompt.js +7 -2
  55. package/dist/cjs/author/prompt.js.map +1 -1
  56. package/dist/cjs/author/schema_to_typescript.js +298 -0
  57. package/dist/cjs/author/schema_to_typescript.js.map +1 -0
  58. package/dist/cjs/composition/body_node_base.js +11 -4
  59. package/dist/cjs/composition/body_node_base.js.map +1 -1
  60. package/dist/cjs/composition/error.js +2 -0
  61. package/dist/cjs/composition/error.js.map +1 -1
  62. package/dist/cjs/composition/index.js +2 -1
  63. package/dist/cjs/composition/index.js.map +1 -1
  64. package/dist/cjs/composition/structured_value.js.map +1 -1
  65. package/dist/cjs/define/frame.js +2 -3
  66. package/dist/cjs/define/frame.js.map +1 -1
  67. package/dist/cjs/define/index.js +7 -1
  68. package/dist/cjs/define/index.js.map +1 -1
  69. package/dist/cjs/define/primitive_example.js +26 -0
  70. package/dist/cjs/define/primitive_example.js.map +1 -0
  71. package/dist/cjs/define/primitive_icon.js +17 -0
  72. package/dist/cjs/define/primitive_icon.js.map +1 -0
  73. package/dist/cjs/define/primitive_module.js +24 -7
  74. package/dist/cjs/define/primitive_module.js.map +1 -1
  75. package/dist/cjs/define/slack_assets.js.map +1 -1
  76. package/dist/cjs/entries/index.js +8 -2
  77. package/dist/cjs/entries/index.js.map +1 -1
  78. package/dist/cjs/entries/markdown.js +2 -1
  79. package/dist/cjs/entries/markdown.js.map +1 -1
  80. package/dist/cjs/entries/slack.js +1 -2
  81. package/dist/cjs/entries/slack.js.map +1 -1
  82. package/dist/cjs/pack/capabilities.js +17 -11
  83. package/dist/cjs/pack/capabilities.js.map +1 -1
  84. package/dist/cjs/pack/compose.js +4 -1
  85. package/dist/cjs/pack/compose.js.map +1 -1
  86. package/dist/cjs/pack/index.js +2 -1
  87. package/dist/cjs/pack/index.js.map +1 -1
  88. package/dist/cjs/pack/primitive_pack.js +27 -5
  89. package/dist/cjs/pack/primitive_pack.js.map +1 -1
  90. package/dist/cjs/render/anchors.js +1 -1
  91. package/dist/cjs/render/anchors.js.map +1 -1
  92. package/dist/cjs/render/format_number.js +2 -1
  93. package/dist/cjs/render/format_number.js.map +1 -1
  94. package/dist/cjs/render/html/envelope.js +12 -6
  95. package/dist/cjs/render/html/envelope.js.map +1 -1
  96. package/dist/cjs/render/layout_check.js.map +1 -1
  97. package/dist/cjs/render/markdown/builder.js +18 -8
  98. package/dist/cjs/render/markdown/builder.js.map +1 -1
  99. package/dist/cjs/render/markdown/format.js +70 -30
  100. package/dist/cjs/render/markdown/format.js.map +1 -1
  101. package/dist/cjs/render/markdown/host_tags.js +67 -0
  102. package/dist/cjs/render/markdown/host_tags.js.map +1 -0
  103. package/dist/cjs/render/markdown/index.js +3 -1
  104. package/dist/cjs/render/markdown/index.js.map +1 -1
  105. package/dist/cjs/render/markdown/split.js +325 -0
  106. package/dist/cjs/render/markdown/split.js.map +1 -0
  107. package/dist/cjs/render/primitive_dispatch.js +11 -25
  108. package/dist/cjs/render/primitive_dispatch.js.map +1 -1
  109. package/dist/cjs/render/react/content.js +3 -1
  110. package/dist/cjs/render/react/content.js.map +1 -1
  111. package/dist/cjs/render/slack/format.js +1 -601
  112. package/dist/cjs/render/slack/format.js.map +1 -1
  113. package/dist/cjs/render/slack/index.js +1 -2
  114. package/dist/cjs/render/slack/index.js.map +1 -1
  115. package/dist/cjs/render/slack/markdown_content.js +172 -115
  116. package/dist/cjs/render/slack/markdown_content.js.map +1 -1
  117. package/dist/cjs/testing/conformance.js +40 -24
  118. package/dist/cjs/testing/conformance.js.map +1 -1
  119. package/dist/cjs/testing/icon.js +248 -0
  120. package/dist/cjs/testing/icon.js.map +1 -0
  121. package/dist/cjs/testing/index.js +3 -1
  122. package/dist/cjs/testing/index.js.map +1 -1
  123. package/dist/cjs/testing/registration.js +5 -3
  124. package/dist/cjs/testing/registration.js.map +1 -1
  125. package/dist/cjs/validate/authoring_schema.js +17 -1
  126. package/dist/cjs/validate/authoring_schema.js.map +1 -1
  127. package/dist/cjs/validate/index.js +2 -1
  128. package/dist/cjs/validate/index.js.map +1 -1
  129. package/dist/cjs/validate/json_schema.js +10 -3
  130. package/dist/cjs/validate/json_schema.js.map +1 -1
  131. package/dist/cjs/validate/url.js +2 -1
  132. package/dist/cjs/validate/url.js.map +1 -1
  133. package/dist/cjs/validate/validation.js +2 -45
  134. package/dist/cjs/validate/validation.js.map +1 -1
  135. package/dist/composition/body_node_base.d.ts +7 -6
  136. package/dist/composition/body_node_base.d.ts.map +1 -1
  137. package/dist/composition/body_node_base.js +10 -3
  138. package/dist/composition/body_node_base.js.map +1 -1
  139. package/dist/composition/error.d.ts +2 -0
  140. package/dist/composition/error.d.ts.map +1 -1
  141. package/dist/composition/error.js +2 -0
  142. package/dist/composition/error.js.map +1 -1
  143. package/dist/composition/index.d.ts +1 -1
  144. package/dist/composition/index.d.ts.map +1 -1
  145. package/dist/composition/index.js +1 -1
  146. package/dist/composition/index.js.map +1 -1
  147. package/dist/composition/structured_value.d.ts +3 -3
  148. package/dist/composition/structured_value.d.ts.map +1 -1
  149. package/dist/composition/structured_value.js.map +1 -1
  150. package/dist/define/frame.d.ts +9 -20
  151. package/dist/define/frame.d.ts.map +1 -1
  152. package/dist/define/frame.js +2 -3
  153. package/dist/define/frame.js.map +1 -1
  154. package/dist/define/index.d.ts +3 -1
  155. package/dist/define/index.d.ts.map +1 -1
  156. package/dist/define/index.js +3 -1
  157. package/dist/define/index.js.map +1 -1
  158. package/dist/define/primitive_example.d.ts +30 -0
  159. package/dist/define/primitive_example.d.ts.map +1 -0
  160. package/dist/define/primitive_example.js +21 -0
  161. package/dist/define/primitive_example.js.map +1 -0
  162. package/dist/define/primitive_icon.d.ts +11 -0
  163. package/dist/define/primitive_icon.d.ts.map +1 -0
  164. package/dist/define/primitive_icon.js +14 -0
  165. package/dist/define/primitive_icon.js.map +1 -0
  166. package/dist/define/primitive_module.d.ts +45 -24
  167. package/dist/define/primitive_module.d.ts.map +1 -1
  168. package/dist/define/primitive_module.js +24 -7
  169. package/dist/define/primitive_module.js.map +1 -1
  170. package/dist/define/slack_assets.d.ts +1 -1
  171. package/dist/define/slack_assets.d.ts.map +1 -1
  172. package/dist/define/slack_assets.js.map +1 -1
  173. package/dist/entries/index.d.ts +3 -3
  174. package/dist/entries/index.d.ts.map +1 -1
  175. package/dist/entries/index.js +3 -3
  176. package/dist/entries/index.js.map +1 -1
  177. package/dist/entries/markdown.d.ts +1 -1
  178. package/dist/entries/markdown.d.ts.map +1 -1
  179. package/dist/entries/markdown.js +1 -1
  180. package/dist/entries/markdown.js.map +1 -1
  181. package/dist/entries/slack.d.ts +1 -1
  182. package/dist/entries/slack.d.ts.map +1 -1
  183. package/dist/entries/slack.js +1 -1
  184. package/dist/entries/slack.js.map +1 -1
  185. package/dist/pack/capabilities.d.ts +24 -10
  186. package/dist/pack/capabilities.d.ts.map +1 -1
  187. package/dist/pack/capabilities.js +17 -11
  188. package/dist/pack/capabilities.js.map +1 -1
  189. package/dist/pack/compose.d.ts +4 -1
  190. package/dist/pack/compose.d.ts.map +1 -1
  191. package/dist/pack/compose.js +4 -1
  192. package/dist/pack/compose.js.map +1 -1
  193. package/dist/pack/index.d.ts +2 -2
  194. package/dist/pack/index.d.ts.map +1 -1
  195. package/dist/pack/index.js +2 -2
  196. package/dist/pack/index.js.map +1 -1
  197. package/dist/pack/primitive_pack.d.ts +14 -3
  198. package/dist/pack/primitive_pack.d.ts.map +1 -1
  199. package/dist/pack/primitive_pack.js +25 -4
  200. package/dist/pack/primitive_pack.js.map +1 -1
  201. package/dist/render/anchors.d.ts +2 -2
  202. package/dist/render/anchors.d.ts.map +1 -1
  203. package/dist/render/anchors.js +1 -1
  204. package/dist/render/anchors.js.map +1 -1
  205. package/dist/render/format_number.d.ts.map +1 -1
  206. package/dist/render/format_number.js +2 -1
  207. package/dist/render/format_number.js.map +1 -1
  208. package/dist/render/html/envelope.d.ts +3 -3
  209. package/dist/render/html/envelope.js +12 -6
  210. package/dist/render/html/envelope.js.map +1 -1
  211. package/dist/render/layout_check.d.ts +1 -1
  212. package/dist/render/layout_check.d.ts.map +1 -1
  213. package/dist/render/layout_check.js.map +1 -1
  214. package/dist/render/markdown/builder.d.ts +5 -4
  215. package/dist/render/markdown/builder.d.ts.map +1 -1
  216. package/dist/render/markdown/builder.js +16 -7
  217. package/dist/render/markdown/builder.js.map +1 -1
  218. package/dist/render/markdown/format.d.ts +9 -0
  219. package/dist/render/markdown/format.d.ts.map +1 -1
  220. package/dist/render/markdown/format.js +67 -31
  221. package/dist/render/markdown/format.js.map +1 -1
  222. package/dist/render/markdown/host_tags.d.ts +14 -0
  223. package/dist/render/markdown/host_tags.d.ts.map +1 -0
  224. package/dist/render/markdown/host_tags.js +63 -0
  225. package/dist/render/markdown/host_tags.js.map +1 -0
  226. package/dist/render/markdown/index.d.ts +1 -0
  227. package/dist/render/markdown/index.d.ts.map +1 -1
  228. package/dist/render/markdown/index.js +1 -0
  229. package/dist/render/markdown/index.js.map +1 -1
  230. package/dist/render/markdown/split.d.ts +32 -0
  231. package/dist/render/markdown/split.d.ts.map +1 -0
  232. package/dist/render/markdown/split.js +321 -0
  233. package/dist/render/markdown/split.js.map +1 -0
  234. package/dist/render/primitive_dispatch.d.ts +6 -6
  235. package/dist/render/primitive_dispatch.d.ts.map +1 -1
  236. package/dist/render/primitive_dispatch.js +12 -26
  237. package/dist/render/primitive_dispatch.js.map +1 -1
  238. package/dist/render/react/content.d.ts +1 -1
  239. package/dist/render/react/content.d.ts.map +1 -1
  240. package/dist/render/react/content.js +3 -1
  241. package/dist/render/react/content.js.map +1 -1
  242. package/dist/render/slack/format.d.ts +0 -25
  243. package/dist/render/slack/format.d.ts.map +1 -1
  244. package/dist/render/slack/format.js +1 -599
  245. package/dist/render/slack/format.js.map +1 -1
  246. package/dist/render/slack/index.d.ts +1 -1
  247. package/dist/render/slack/index.d.ts.map +1 -1
  248. package/dist/render/slack/index.js +1 -1
  249. package/dist/render/slack/index.js.map +1 -1
  250. package/dist/render/slack/markdown_content.d.ts +10 -4
  251. package/dist/render/slack/markdown_content.d.ts.map +1 -1
  252. package/dist/render/slack/markdown_content.js +169 -113
  253. package/dist/render/slack/markdown_content.js.map +1 -1
  254. package/dist/testing/conformance.d.ts +19 -14
  255. package/dist/testing/conformance.d.ts.map +1 -1
  256. package/dist/testing/conformance.js +40 -24
  257. package/dist/testing/conformance.js.map +1 -1
  258. package/dist/testing/icon.d.ts +11 -0
  259. package/dist/testing/icon.d.ts.map +1 -0
  260. package/dist/testing/icon.js +244 -0
  261. package/dist/testing/icon.js.map +1 -0
  262. package/dist/testing/index.d.ts +2 -1
  263. package/dist/testing/index.d.ts.map +1 -1
  264. package/dist/testing/index.js +1 -0
  265. package/dist/testing/index.js.map +1 -1
  266. package/dist/testing/registration.d.ts +1 -1
  267. package/dist/testing/registration.d.ts.map +1 -1
  268. package/dist/testing/registration.js +6 -4
  269. package/dist/testing/registration.js.map +1 -1
  270. package/dist/validate/authoring_schema.d.ts +6 -0
  271. package/dist/validate/authoring_schema.d.ts.map +1 -1
  272. package/dist/validate/authoring_schema.js +15 -0
  273. package/dist/validate/authoring_schema.js.map +1 -1
  274. package/dist/validate/index.d.ts +1 -1
  275. package/dist/validate/index.d.ts.map +1 -1
  276. package/dist/validate/index.js +1 -1
  277. package/dist/validate/index.js.map +1 -1
  278. package/dist/validate/json_schema.d.ts.map +1 -1
  279. package/dist/validate/json_schema.js +10 -3
  280. package/dist/validate/json_schema.js.map +1 -1
  281. package/dist/validate/url.d.ts.map +1 -1
  282. package/dist/validate/url.js +2 -1
  283. package/dist/validate/url.js.map +1 -1
  284. package/dist/validate/validation.d.ts +1 -11
  285. package/dist/validate/validation.d.ts.map +1 -1
  286. package/dist/validate/validation.js +3 -46
  287. package/dist/validate/validation.js.map +1 -1
  288. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/render/slack/format.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n// Slack mrkdwn helpers.\n//\n// Slack uses a flavour of Markdown called \"mrkdwn\" that differs from CommonMark\n// in subtle ways: links are `<url|label>`, code uses single backticks (or\n// fenced ```` ``` ```` blocks), and `&`, `<`, `>` must be HTML-escaped inside\n// any text element. These helpers centralize the escaping so primitive\n// renderers cannot accidentally emit a literal `<https://...>` that Slack\n// would parse as auto-link with no label.\n//\n// See https://api.slack.com/reference/surfaces/formatting\n\nimport { sanitizeNavigationHref } from '../../validate/url';\n\nimport {\n SLACK_LIMITS,\n type SlackBlock,\n type SlackRawTextElement,\n type SlackRichTextBlock,\n type SlackTableBlock,\n type SlackTableColumnSetting,\n} from './blocks';\n\nconst MRKDWN_ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n};\n\n/**\n * Escapes the three characters Slack treats as HTML in `mrkdwn` text.\n *\n * The formatting markers (`*`, `_`, `~`, `` ` ``) are left intact so callers\n * can compose markdown with them. Wrap text in {@link code} when literal\n * asterisks are needed.\n */\nexport const escapeMrkdwn = (value: string): string =>\n value.replace(/[&<>]/g, (match) => MRKDWN_ESCAPES[match] ?? match);\n\n/** `text` escaped and wrapped in mrkdwn bold markers. */\nexport const bold = (text: string): string => `*${escapeMrkdwn(text)}*`;\n/** `text` escaped and wrapped in mrkdwn italic markers. */\nexport const italic = (text: string): string => `_${escapeMrkdwn(text)}_`;\n/** `text` escaped and wrapped in mrkdwn strikethrough markers. */\nexport const strike = (text: string): string => `~${escapeMrkdwn(text)}~`;\n\n/**\n * Inline code span. Contents are not mrkdwn-escaped, since `<` and friends are\n * literal inside a code span; only embedded backticks are demoted, to a\n * modifier letter that cannot close the span.\n */\nexport const code = (text: string): string =>\n `\\`${text.replace(/`/g, '\\u02CB')}\\``;\n\n/**\n * Fenced code block. Slack honours the triple-backtick fence but not a language\n * hint. Embedded triple-backticks are demoted with a zero-width joiner so they\n * cannot terminate the block early.\n */\nexport const codeBlock = (text: string): string =>\n `\\`\\`\\`\\n${text.replace(/```/g, '``\\u200d`')}\\n\\`\\`\\``;\n\nconst URL_PARTS_RE = /^([a-z][a-z0-9+.-]*:(?:\\/\\/[^/?#]*)?)(.*)$/is;\n// Letter, digit, and hyphen labels, with an optional DNS root dot.\nconst DNS_NAME_RE =\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\\.?$/i;\nconst IPV6_HOST_RE = /^\\[[0-9a-f:.]+\\]$/i;\n\nconst MALFORMED_ESCAPE_RE = /%(?![0-9a-f]{2})/i;\n\n// `url` parsed, when its escapes are well formed and `URL` prints it as\n// written up to the case of its scheme and authority and a `/` for an empty\n// path.\nconst parsedAsWritten = (url: string): URL | null => {\n if (MALFORMED_ESCAPE_RE.test(url)) {\n return null;\n }\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const [, prefix, rest] = URL_PARTS_RE.exec(url) ?? [];\n const [, printedPrefix, printedRest] = URL_PARTS_RE.exec(parsed.href) ?? [];\n return prefix !== undefined &&\n prefix.toLowerCase() === printedPrefix?.toLowerCase() &&\n (printedRest === rest || printedRest === `/${rest}`)\n ? parsed\n : null;\n};\n\n/**\n * Whether `url` is an `http:` or `https:` URL with a DNS or IPv6 host that\n * `URL` prints as written, so nothing it repairs or encodes, such as a\n * backslash, whitespace, or non-ASCII, passes.\n */\nexport const isAbsoluteHttpUrl = (url: string): boolean => {\n const parsed = parsedAsWritten(url);\n return (\n (parsed?.protocol === 'http:' || parsed?.protocol === 'https:') &&\n (DNS_NAME_RE.test(parsed.hostname) || IPV6_HOST_RE.test(parsed.hostname))\n );\n};\n\n// RFC 5322 dot-atom text, less `/`, `?`, `#`, and `%`.\nconst LOCAL_PART_RE =\n /^[a-z0-9!$&'*+=^_`{|}~-]+(?:\\.[a-z0-9!$&'*+=^_`{|}~-]+)*$/i;\n\nconst isMailbox = (recipient: string): boolean => {\n const at = recipient.lastIndexOf('@');\n return (\n at > 0 &&\n LOCAL_PART_RE.test(recipient.slice(0, at)) &&\n DNS_NAME_RE.test(recipient.slice(at + 1))\n );\n};\n\nconst decoded = (value: string): string | null => {\n try {\n return decodeURIComponent(value);\n } catch {\n return null;\n }\n};\n\n// Every comma-separated recipient before the query or fragment is a mailbox.\nconst isMailtoUrl = (url: string): boolean => {\n const [, recipients] = /^mailto:([^?#]*)/i.exec(url) ?? [];\n return (\n recipients !== undefined &&\n parsedAsWritten(url) !== null &&\n recipients\n .split(',')\n .every((recipient) => isMailbox(decoded(recipient) ?? ''))\n );\n};\n\n/**\n * `href` when {@link sanitizeNavigationHref} passes it and it is an `http:` or\n * `https:` URL with a host, or a `mailto:` of well-formed mailboxes; `null`\n * otherwise. Slack has no page to resolve a relative URL against.\n */\nexport const slackLinkUrl = (href: string): string | null => {\n const url = sanitizeNavigationHref(href);\n if (url === null) {\n return null;\n }\n return isAbsoluteHttpUrl(url) || isMailtoUrl(url) ? url : null;\n};\n\n/**\n * Slack mrkdwn link, `<url|label>`, or a bare `<url>` when `label` is omitted.\n *\n * URL and label are both escaped so `&` and `>` cannot break Slack's link\n * parser, and a `|` in the URL is percent-encoded so it cannot end the URL\n * early. A URL {@link slackLinkUrl} rejects degrades to plain escaped text\n * with no link.\n */\nexport const link = (url: string, label?: string): string => {\n const sanitized = slackLinkUrl(url);\n if (!sanitized) {\n return escapeMrkdwn(label ?? url);\n }\n const safeUrl = escapeMrkdwn(sanitized).replaceAll('|', '%7C');\n if (!label) {\n return `<${safeUrl}>`;\n }\n return `<${safeUrl}|${escapeMrkdwn(label)}>`;\n};\n\n/**\n * Truncates `value` to `max` UTF-16 code units at a grapheme boundary,\n * appending an ellipsis when it had to cut. Pass a `SLACK_LIMITS` constant as\n * the budget.\n */\nexport const clampSlackText = (value: string, max: number): string => {\n if (value.length <= max) {\n return value;\n }\n const budget = max <= 1 ? max : max - 1;\n let end = 0;\n for (const { index, segment } of new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n }).segment(value)) {\n if (index + segment.length > budget) {\n break;\n }\n end = index + segment.length;\n }\n const head = value.slice(0, end);\n return max <= 1 ? head : `${head.trimEnd()}…`;\n};\n\n// A `<…>` link or mention and an entity, each matched where it starts.\nconst LINK_TOKEN_RE = /<[^<>\\n]*>/y;\nconst ENTITY_TOKEN_RE = /&(?:amp|lt|gt);/y;\n\n// The end of the token `re` matches at `index`, or `undefined`.\nconst tokenEnd = (\n value: string,\n re: RegExp,\n index: number\n): number | undefined => {\n re.lastIndex = index;\n return re.test(value) ? re.lastIndex : undefined;\n};\n\n/**\n * {@link clampSlackText} for `mrkdwn`: never cuts inside a `<…>` link or\n * mention or an entity. Formatting marks are left as they fall; Slack prints an\n * unclosed one as written.\n */\nexport const clampMrkdwn = (value: string, max: number): string => {\n const clamped = clampSlackText(value, max);\n if (clamped === value || max <= 1) {\n return clamped;\n }\n // Entity first: a link holds no `<` of its own, so stepping back to its\n // start cannot land inside an entity, while the reverse could.\n let cut = clamped.length - 1;\n const entity = value.lastIndexOf('&', cut - 1);\n if (entity !== -1 && (tokenEnd(value, ENTITY_TOKEN_RE, entity) ?? 0) > cut) {\n cut = entity;\n }\n const link = value.lastIndexOf('<', cut - 1);\n if (link !== -1 && (tokenEnd(value, LINK_TOKEN_RE, link) ?? 0) > cut) {\n cut = link;\n }\n return `${value.slice(0, cut).trimEnd()}…`;\n};\n\n/**\n * `value` cut to `max` UTF-16 code units, never through a surrogate pair. For\n * opaque values a host reads back, which an ellipsis would change.\n */\nexport const cutSlackValue = (value: string, max: number): string => {\n const cut = value.slice(0, max);\n return /[\\ud800-\\udbff]$/.test(cut) ? cut.slice(0, -1) : cut;\n};\n\n/**\n * Collapses whitespace and clamps to `SLACK_LIMITS.headerTextChars`. Header\n * text is `plain_text`, so no markdown survives — do not pre-format it.\n */\nexport const formatHeaderText = (value: string): string =>\n clampSlackText(\n value.replace(/\\s+/g, ' ').trim(),\n SLACK_LIMITS.headerTextChars\n );\n\n// ---------------------------------------------------------------------------\n// GitHub-flavored markdown -> Slack mrkdwn translation.\n//\n// Per-primitive `renderMarkdown(node)` implementations emit GFM. The Slack\n// dispatcher runs it through here to fill a `section` block when a primitive\n// has no stronger Block Kit override.\n\ninterface InlineSegment {\n kind: 'text' | 'code' | 'bold' | 'italic' | 'link';\n text: string;\n url?: string;\n}\n\ninterface InlineMatch {\n index: number;\n end: number;\n segment: InlineSegment;\n}\n\n// The closer of a code-span opener ending at `end`: the start of the next\n// maximal backtick run exactly `length` long.\ntype CodeSpanCloser = (end: number, length: number) => number | undefined;\n\nconst ASCII_PUNCTUATION_RE = /[!-/:-@[-`{-~]/;\nconst NUMERIC_REFERENCE_RE = /&#(?:[xX]([0-9a-fA-F]{1,6})|(\\d{1,7}));/y;\n\n// micromark's rule: controls other than tab and line breaks, surrogates,\n// noncharacters, and out-of-range values become U+FFFD.\nconst decodeCodePoint = (codePoint: number): string =>\n codePoint < 9 ||\n codePoint === 11 ||\n (codePoint > 13 && codePoint < 32) ||\n (codePoint > 126 && codePoint < 160) ||\n (codePoint > 55_295 && codePoint < 57_344) ||\n (codePoint > 64_975 && codePoint < 65_008) ||\n codePoint % 65_536 >= 65_534 ||\n codePoint > 1_114_111\n ? '�'\n : String.fromCodePoint(codePoint);\n\nconst backtickRunEnd = (text: string, start: number): number => {\n let end = start;\n while (text[end] === '`') {\n end += 1;\n }\n return end;\n};\n\n// Every maximal backtick run's start, keyed by the run's length, in order.\nconst backtickRuns = (text: string): Map<number, number[]> => {\n const runs = new Map<number, number[]>();\n let start = text.indexOf('`');\n while (start !== -1) {\n const end = backtickRunEnd(text, start);\n const starts = runs.get(end - start);\n if (starts) {\n starts.push(start);\n } else {\n runs.set(end - start, [start]);\n }\n start = text.indexOf('`', end);\n }\n return runs;\n};\n\nconst firstAtOrAfter = (\n sorted: readonly number[],\n from: number\n): number | undefined => {\n let low = 0;\n let high = sorted.length;\n while (low < high) {\n const middle = Math.floor((low + high) / 2);\n if (sorted[middle]! < from) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n return sorted[low];\n};\n\n// Indexes `text`'s backtick runs once, on the first query.\nconst codeSpanCloser = (text: string): CodeSpanCloser => {\n let runs: Map<number, number[]> | undefined;\n return (end, length) => {\n runs ??= backtickRuns(text);\n return firstAtOrAfter(runs.get(length) ?? [], end);\n };\n};\n\n// CommonMark strips one space from each side of a span that is not all spaces.\nconst codeSpanText = (content: string): string =>\n /[^ ]/.test(content) && content.startsWith(' ') && content.endsWith(' ')\n ? content.slice(1, -1)\n : content;\n\n// Resolves the backslash escapes and numeric character references a GFM\n// serializer writes, which Slack would otherwise show literally, and leaves\n// code spans as written.\nconst unescapeGfm = (text: string): string => {\n const closer = codeSpanCloser(text);\n let out = '';\n let index = 0;\n while (index < text.length) {\n const char = text[index]!;\n const next = text[index + 1];\n if (\n char === '\\\\' &&\n next !== undefined &&\n ASCII_PUNCTUATION_RE.test(next)\n ) {\n out += next;\n index += 2;\n continue;\n }\n if (char === '`') {\n const fenceEnd = backtickRunEnd(text, index);\n const close = closer(fenceEnd, fenceEnd - index);\n const end = close === undefined ? fenceEnd : close + fenceEnd - index;\n out += text.slice(index, end);\n index = end;\n continue;\n }\n if (char === '&') {\n NUMERIC_REFERENCE_RE.lastIndex = index;\n const reference = NUMERIC_REFERENCE_RE.exec(text);\n if (reference) {\n const [match, hex, decimal] = reference;\n out += decodeCodePoint(\n hex === undefined ? Number(decimal) : parseInt(hex, 16)\n );\n index += match.length;\n continue;\n }\n }\n out += char;\n index += 1;\n }\n return out;\n};\n\n// A link destination may be wrapped in angle brackets (`[x](<dest>)`).\nconst linkDestination = (dest: string): string =>\n unescapeGfm(dest.replace(/^<([^<>]*)>$/, '$1'));\n\n// The code span whose opener starts at `open`, or `undefined`.\nconst codeSpanAt = (\n line: string,\n open: number,\n closer: CodeSpanCloser\n): InlineMatch | undefined => {\n const fenceEnd = backtickRunEnd(line, open);\n const close = closer(fenceEnd, fenceEnd - open);\n return close === undefined\n ? undefined\n : {\n index: open,\n end: close + fenceEnd - open,\n segment: {\n kind: 'code',\n text: codeSpanText(line.slice(fenceEnd, close)),\n },\n };\n};\n\ntype InlineFinder = (\n line: string,\n from: number,\n closer: CodeSpanCloser\n) => InlineMatch | null;\n\nconst regexFinder =\n (\n pattern: RegExp,\n toSegment: (match: RegExpExecArray) => InlineSegment\n ): InlineFinder =>\n (line, from) => {\n pattern.lastIndex = from;\n const match = pattern.exec(line);\n return (\n match && {\n index: match.index,\n end: match.index + match[0].length,\n segment: toSegment(match),\n }\n );\n };\n\nconst findCodeSpan: InlineFinder = (line, from, closer) => {\n let open = line.indexOf('`', from);\n while (open !== -1) {\n const span = codeSpanAt(line, open, closer);\n if (span) {\n return span;\n }\n open = line.indexOf('`', backtickRunEnd(line, open));\n }\n return null;\n};\n\nconst WHITESPACE_RE = /\\s/u;\nconst PUNCTUATION_RE = /[\\p{P}\\p{S}]/u;\n\n// The line's edges count as whitespace.\nconst isSpace = (char: string | undefined): boolean =>\n char === undefined || WHITESPACE_RE.test(char);\n\nconst isPunctuation = (char: string | undefined): boolean =>\n char !== undefined && PUNCTUATION_RE.test(char);\n\n// An odd run of backslashes escapes the character at `index`.\nconst isEscaped = (line: string, index: number): boolean => {\n let run = 0;\n while (line[index - 1 - run] === '\\\\') {\n run += 1;\n }\n return run % 2 === 1;\n};\n\n// GFM's flanking rules for a lone delimiter; `_` also cannot open or close\n// inside a word.\nconst flanking = (\n line: string,\n index: number,\n delimiter: '*' | '_'\n): { opens: boolean; closes: boolean } => {\n // Whole code points, so an astral symbol such as an emoji is classified as one.\n const trailing = line.charCodeAt(index - 1);\n const before =\n index === 0\n ? undefined\n : trailing >= 0xdc00 && trailing <= 0xdfff && index >= 2\n ? String.fromCodePoint(line.codePointAt(index - 2) ?? trailing)\n : line[index - 1];\n const next = line.codePointAt(index + 1);\n const after = next === undefined ? undefined : String.fromCodePoint(next);\n if (before === delimiter || after === delimiter) {\n return { opens: false, closes: false };\n }\n const left =\n !isSpace(after) &&\n (!isPunctuation(after) || isSpace(before) || isPunctuation(before));\n const right =\n !isSpace(before) &&\n (!isPunctuation(before) || isSpace(after) || isPunctuation(after));\n return delimiter === '*'\n ? { opens: left, closes: right }\n : {\n opens: left && (!right || isPunctuation(before)),\n closes: right && (!left || isPunctuation(after)),\n };\n};\n\n// The index past what starts at `index` when it is an escape or a code span,\n// whose characters are never delimiters, or past one character otherwise.\nconst stepOver = (\n line: string,\n index: number,\n closer: CodeSpanCloser\n): number => {\n if (line[index] === '\\\\') {\n return index + 2;\n }\n if (line[index] === '`') {\n return codeSpanAt(line, index, closer)?.end ?? backtickRunEnd(line, index);\n }\n return index + 1;\n};\n\nconst LINK_DESTINATION_RE = /\\((<[^<>\\n]*>|(?:\\\\.|[^\\s()\\\\]|\\([^()\\s]*\\))+)\\)/y;\n\n// A link, or an image, which degrades to a link to its source labelled with\n// its alt text. The label may hold escapes and code spans but no bare bracket.\nconst findLink: InlineFinder = (line, from, closer) => {\n let open = line.indexOf('[', from);\n while (open !== -1) {\n let index = open + 1;\n while (index < line.length && line[index] !== '[' && line[index] !== ']') {\n index = stepOver(line, index, closer);\n }\n if (line[index] === ']') {\n LINK_DESTINATION_RE.lastIndex = index + 1;\n const destination = LINK_DESTINATION_RE.exec(line);\n if (destination) {\n const bang = line[open - 1] === '!' && !isEscaped(line, open - 1);\n return {\n index: bang ? open - 1 : open,\n end: LINK_DESTINATION_RE.lastIndex,\n segment: {\n kind: 'link',\n text: line.slice(open + 1, index),\n url: destination[1] ?? '',\n },\n };\n }\n }\n open = line.indexOf('[', index);\n }\n return null;\n};\n\n// Strong between `**` pairs whose body holds no `*` outside escapes and code.\nconst findBold: InlineFinder = (line, from, closer) => {\n let open = line.indexOf('**', from);\n while (open !== -1) {\n let index = open + 2;\n while (index < line.length && line[index] !== '*') {\n index = stepOver(line, index, closer);\n }\n if (index > open + 2 && line.startsWith('**', index)) {\n return {\n index: open,\n end: index + 2,\n segment: { kind: 'bold', text: line.slice(open + 2, index) },\n };\n }\n open = line.indexOf('**', index > open + 2 ? index : open + 1);\n }\n return null;\n};\n\n// Emphasis between two lone `delimiter`s, in one forward pass: the first\n// closer pairs with the nearest opener before it, and a delimiter that can\n// do neither is text.\nconst emphasisFinder =\n (delimiter: '*' | '_'): InlineFinder =>\n (line, from, closer) => {\n let open = -1;\n let index = from;\n while (index < line.length) {\n if (line[index] === '\\\\' || line[index] === '`') {\n index = stepOver(line, index, closer);\n continue;\n }\n if (line[index] === delimiter && !isEscaped(line, index)) {\n const { opens, closes } = flanking(line, index, delimiter);\n if (open !== -1 && closes) {\n return {\n index: open,\n end: index + 1,\n segment: { kind: 'italic', text: line.slice(open + 1, index) },\n };\n }\n if (opens) {\n open = index;\n }\n }\n index += 1;\n }\n return null;\n };\n\n// In tie order. Each label, destination, or body stops at the first character\n// that cannot continue it, so one search from a position is linear.\nconst INLINE_FINDERS: readonly InlineFinder[] = [\n // A CommonMark backslash escape: any ASCII punctuation character.\n regexFinder(/\\\\([!-/:-@[-`{-~])/g, ([, text = '']) => ({\n kind: 'text',\n text,\n })),\n findCodeSpan,\n findLink,\n findBold,\n emphasisFinder('_'),\n emphasisFinder('*'),\n];\n\n// Tokenizes a single line of GFM into ordered inline segments. The earliest\n// match wins; on a tie, the order of `INLINE_FINDERS` does. An escaped\n// character is text and never a delimiter. Each finder's next match is reused\n// until the cursor passes it, so a line is not rescanned per segment.\nconst tokenizeInline = (line: string): InlineSegment[] => {\n const segments: InlineSegment[] = [];\n const closer = codeSpanCloser(line);\n const found = new Map<InlineFinder, InlineMatch | null>();\n const nextMatch = (\n finder: InlineFinder,\n cursor: number\n ): InlineMatch | null => {\n const cached = found.get(finder);\n if (cached === null || (cached !== undefined && cached.index >= cursor)) {\n return cached;\n }\n const match = finder(line, cursor, closer);\n found.set(finder, match);\n return match;\n };\n let cursor = 0;\n while (cursor < line.length) {\n let first: InlineMatch | undefined;\n for (const finder of INLINE_FINDERS) {\n const match = nextMatch(finder, cursor);\n if (match && (first === undefined || match.index < first.index)) {\n first = match;\n }\n }\n if (first === undefined) {\n segments.push({ kind: 'text', text: line.slice(cursor) });\n break;\n }\n if (first.index > cursor) {\n segments.push({ kind: 'text', text: line.slice(cursor, first.index) });\n }\n segments.push(first.segment);\n cursor = first.end;\n // Backticks after an escaped one open a shorter run of their own.\n if (line[cursor - 1] === '`' && line[cursor] === '`') {\n const span = codeSpanAt(line, cursor, closer);\n const end = span?.end ?? backtickRunEnd(line, cursor);\n segments.push(\n span?.segment ?? { kind: 'text', text: line.slice(cursor, end) }\n );\n cursor = end;\n }\n }\n return segments;\n};\n\nconst renderInline = (line: string): string => {\n const segments = tokenizeInline(line);\n return segments\n .map((segment) => {\n switch (segment.kind) {\n case 'text':\n return escapeMrkdwn(unescapeGfm(segment.text));\n case 'code':\n // Code spans pass through with mrkdwn's single-backtick syntax, but\n // we still need to neutralize any embedded backticks.\n return code(segment.text);\n // The inner text is translated too, so `**a _b_**` nests.\n case 'bold':\n return `*${renderInline(segment.text)}*`;\n case 'italic':\n return `_${renderInline(segment.text)}_`;\n case 'link':\n return link(\n linkDestination(segment.url ?? ''),\n plainInline(segment.text)\n );\n default: {\n const unexpected: never = segment.kind;\n return unexpected;\n }\n }\n })\n .join('');\n};\n\n// Inline GFM as its text alone, for a link label or a table cell, where\n// mrkdwn formatting would show its markers.\nconst plainInline = (line: string): string =>\n tokenizeInline(line)\n .map(({ kind, text }) =>\n kind === 'text'\n ? unescapeGfm(text)\n : kind === 'code'\n ? text\n : plainInline(text)\n )\n .join('');\n\n// GFM: up to three spaces of indent, and no backtick in the opener's info.\nconst FENCE_RE = /^ {0,3}(`{3,})[^`]*$/;\n// Spaces and tabs only after it, plus the `\\r` a CRLF line keeps.\nconst CLOSING_FENCE_RE = /^ {0,3}(`{3,})[ \\t]*\\r?$/;\n\n// A closing fence is backticks alone, at least as long as the opening run.\nconst closesFence = (line: string, opening: string): boolean =>\n (CLOSING_FENCE_RE.exec(line)?.[1]?.length ?? 0) >= opening.length;\n// At least one pipe, so a single-column table counts and a thematic break does not.\nconst TABLE_SEPARATOR_RE =\n /^(?=[^|]*\\|)\\s*(?!\\s)\\|?\\s*:?-+:?\\s*(?!\\s)(\\|\\s*:?-+:?\\s*(?!\\s))*\\|?\\s*$/;\nconst TABLE_ROW_RE = /^\\s*\\|.*\\|\\s*$/;\nconst BLOCKQUOTE_RE = /^(>\\s?)(.*)$/;\n\n// An ATX heading's text without its closing `#` run, or `undefined`. An\n// escaped `\\#` is text, not part of the closing run.\nconst headingText = (line: string): string | undefined => {\n const text = /^#{1,6}[ \\t]+(.*)$/.exec(line)?.[1]?.trimEnd();\n if (text === undefined) {\n return undefined;\n }\n const closing = /(?:^|[ \\t])#+$/.exec(text);\n const content = closing ? text.slice(0, closing.index).trimEnd() : text;\n return content.length > 0 ? content : undefined;\n};\n\n// Splits a `| a | b |` row on its unescaped pipes into cell text, dropping the\n// optional leading/trailing pipes. GFM unescapes `\\|` before reading a cell,\n// code spans included.\nconst splitPipeRow = (line: string): string[] => {\n const row = line.trim();\n const cells: string[] = [];\n let cell = '';\n let endsWithPipe = false;\n for (let index = 0; index < row.length; index += 1) {\n const char = row[index]!;\n const next = row[index + 1];\n endsWithPipe = false;\n if (char === '\\\\' && next !== undefined) {\n cell += next === '|' ? '|' : `\\\\${next}`;\n index += 1;\n } else if (char === '|') {\n cells.push(cell);\n cell = '';\n endsWithPipe = true;\n } else {\n cell += char;\n }\n }\n if (!endsWithPipe) {\n cells.push(cell);\n }\n if (row.startsWith('|')) {\n cells.shift();\n }\n return cells.map((value) => plainInline(value.trim()));\n};\n\n/**\n * Translates GFM into one Slack `mrkdwn` string:\n *\n * - Bold `**X**` to `*X*`, links `[L](U)` to `<U|L>`.\n * - ATX headings to bold, since Slack renders no headings.\n * - Pipe tables into a fenced code block, mrkdwn having no table syntax — the\n * monospace alignment is all that survives. Prefer\n * {@link gfmToSlackBlocks} when a native `table` block is acceptable.\n *\n * Free text is HTML-escaped (`&` `<` `>`) per Slack's rules; code spans and\n * fenced blocks pass through untouched.\n */\nexport const gfmToSlackMrkdwn = (gfm: string): string => {\n const lines = gfm.split('\\n');\n const out: string[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n const opening = FENCE_RE.exec(line)?.[1];\n if (opening !== undefined) {\n // Fenced code block: copy the body verbatim. Slack honours the\n // triple-backtick fence but ignores the language hint, so we strip it\n // for cleanliness.\n const body: string[] = [];\n i += 1;\n while (i < lines.length && !closesFence(lines[i]!, opening)) {\n body.push(lines[i]!);\n i += 1;\n }\n out.push(codeBlock(body.join('\\n')));\n i += 1;\n continue;\n }\n if (\n TABLE_ROW_RE.test(line) &&\n i + 1 < lines.length &&\n TABLE_SEPARATOR_RE.test(lines[i + 1]!)\n ) {\n // GFM pipe table: Slack mrkdwn cannot render tables, so we wrap the\n // entire block in a code fence to preserve the column alignment that\n // the markdown renderer worked hard to produce.\n const tableLines: string[] = [];\n while (i < lines.length && TABLE_ROW_RE.test(lines[i]!)) {\n tableLines.push(lines[i]!);\n i += 1;\n }\n out.push(\n codeBlock(\n tableLines\n .map((row) =>\n TABLE_SEPARATOR_RE.test(row)\n ? row\n : `| ${splitPipeRow(row).join(' | ')} |`\n )\n .join('\\n')\n )\n );\n continue;\n }\n const heading = headingText(line);\n if (heading !== undefined) {\n // Headings have no first-class mrkdwn equivalent. Bolding the text keeps\n // the visual hierarchy without inventing markup Slack would render as\n // a literal `#`.\n out.push(bold(unescapeGfm(heading)));\n i += 1;\n continue;\n }\n const blockquoteMatch = line.match(BLOCKQUOTE_RE);\n if (blockquoteMatch) {\n // Slack mrkdwn supports `>` blockquotes. Preserve the prefix verbatim\n // and run only the body through inline transformation so that bold,\n // italic, links, and emoji glyphs inside the quote still translate.\n out.push(\n `${blockquoteMatch[1]}${renderInline(blockquoteMatch[2] ?? '')}`\n );\n i += 1;\n continue;\n }\n out.push(renderInline(line));\n i += 1;\n }\n return out.join('\\n');\n};\n\n// ---------------------------------------------------------------------------\n// GFM -> Slack *block* translation.\n\nconst slackPreformattedBlock = (code: string): SlackRichTextBlock => ({\n type: 'rich_text',\n elements: [\n {\n type: 'rich_text_preformatted',\n elements: [\n {\n type: 'text',\n text: clampSlackText(code, SLACK_LIMITS.sectionTextChars),\n },\n ],\n },\n ],\n});\n\n// Reads a GFM alignment marker (`:---`, `---:`, `:---:`) into a column align.\nconst parseColumnAlign = (marker: string): 'left' | 'center' | 'right' => {\n const left = marker.startsWith(':');\n const right = marker.endsWith(':');\n if (left && right) {\n return 'center';\n }\n return right ? 'right' : 'left';\n};\n\nconst pipeTableToTableBlock = (lines: readonly string[]): SlackTableBlock => {\n const [headerLine, separatorLine, ...bodyLines] = lines;\n const aligns = splitPipeRow(separatorLine ?? '').map(parseColumnAlign);\n const rows = [splitPipeRow(headerLine ?? ''), ...bodyLines.map(splitPipeRow)]\n .slice(0, SLACK_LIMITS.tableRows)\n .map((cells) =>\n cells\n .slice(0, SLACK_LIMITS.tableColumns)\n .map((value): SlackRawTextElement => ({\n type: 'raw_text',\n text: value,\n }))\n );\n return {\n type: 'table',\n rows,\n column_settings: aligns\n .slice(0, SLACK_LIMITS.tableColumns)\n .map((align): SlackTableColumnSetting => ({ align, is_wrapped: true })),\n };\n};\n\n/**\n * Translates GFM into structural Block Kit: prose runs as `section`, fenced\n * code as `rich_text_preformatted`, pipe tables as a native `table` block.\n *\n * The markdown fallback for a primitive without a `slack` renderer whose\n * markdown is a string; builder content goes through\n * `markdownContentToSlackBlocks`. Preferred over {@link gfmToSlackMrkdwn},\n * which collapses code and tables into\n * a section-level fence that Slack and pixel-faithful previews render poorly.\n */\nexport const gfmToSlackBlocks = (gfm: string): SlackBlock[] => {\n const lines = gfm.split('\\n');\n const blocks: SlackBlock[] = [];\n let prose: string[] = [];\n\n const flushProse = (): void => {\n while (prose.length > 0 && prose[0]!.trim() === '') {\n prose.shift();\n }\n while (prose.length > 0 && prose[prose.length - 1]!.trim() === '') {\n prose.pop();\n }\n if (prose.length === 0) {\n return;\n }\n const text = clampMrkdwn(\n gfmToSlackMrkdwn(prose.join('\\n')),\n SLACK_LIMITS.sectionTextChars\n );\n prose = [];\n if (text.length > 0) {\n blocks.push({ type: 'section', text: { type: 'mrkdwn', text } });\n }\n };\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n const opening = FENCE_RE.exec(line)?.[1];\n if (opening !== undefined) {\n flushProse();\n i += 1;\n const code: string[] = [];\n while (i < lines.length && !closesFence(lines[i]!, opening)) {\n code.push(lines[i]!);\n i += 1;\n }\n i += 1; // Consume the closing fence.\n blocks.push(slackPreformattedBlock(code.join('\\n')));\n continue;\n }\n if (\n TABLE_ROW_RE.test(line) &&\n i + 1 < lines.length &&\n TABLE_SEPARATOR_RE.test(lines[i + 1]!)\n ) {\n flushProse();\n const tableLines: string[] = [];\n while (i < lines.length && TABLE_ROW_RE.test(lines[i]!)) {\n tableLines.push(lines[i]!);\n i += 1;\n }\n blocks.push(pipeTableToTableBlock(tableLines));\n continue;\n }\n prose.push(line);\n i += 1;\n }\n flushProse();\n return blocks;\n};\n"]}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/render/slack/format.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n// Slack mrkdwn helpers.\n//\n// Slack uses a flavour of Markdown called \"mrkdwn\" that differs from CommonMark\n// in subtle ways: links are `<url|label>`, code uses single backticks (or\n// fenced ```` ``` ```` blocks), and `&`, `<`, `>` must be HTML-escaped inside\n// any text element. These helpers centralize the escaping so primitive\n// renderers cannot accidentally emit a literal `<https://...>` that Slack\n// would parse as auto-link with no label.\n//\n// See https://api.slack.com/reference/surfaces/formatting\n\nimport { sanitizeNavigationHref } from '../../validate/url';\n\nimport { SLACK_LIMITS } from './blocks';\n\nconst MRKDWN_ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n};\n\n/**\n * Escapes the three characters Slack treats as HTML in `mrkdwn` text.\n *\n * The formatting markers (`*`, `_`, `~`, `` ` ``) are left intact so callers\n * can compose markdown with them. Wrap text in {@link code} when literal\n * asterisks are needed.\n */\nexport const escapeMrkdwn = (value: string): string =>\n value.replace(/[&<>]/g, (match) => MRKDWN_ESCAPES[match] ?? match);\n\n/** `text` escaped and wrapped in mrkdwn bold markers. */\nexport const bold = (text: string): string => `*${escapeMrkdwn(text)}*`;\n/** `text` escaped and wrapped in mrkdwn italic markers. */\nexport const italic = (text: string): string => `_${escapeMrkdwn(text)}_`;\n/** `text` escaped and wrapped in mrkdwn strikethrough markers. */\nexport const strike = (text: string): string => `~${escapeMrkdwn(text)}~`;\n\n/**\n * Inline code span. Contents are not mrkdwn-escaped, since `<` and friends are\n * literal inside a code span; only embedded backticks are demoted, to a\n * modifier letter that cannot close the span.\n */\nexport const code = (text: string): string =>\n `\\`${text.replace(/`/g, '\\u02CB')}\\``;\n\n/**\n * Fenced code block. Slack honours the triple-backtick fence but not a language\n * hint. Embedded triple-backticks are demoted with a zero-width joiner so they\n * cannot terminate the block early.\n */\nexport const codeBlock = (text: string): string =>\n `\\`\\`\\`\\n${text.replace(/```/g, '``\\u200d`')}\\n\\`\\`\\``;\n\nconst URL_PARTS_RE = /^([a-z][a-z0-9+.-]*:(?:\\/\\/[^/?#]*)?)(.*)$/is;\n// Letter, digit, and hyphen labels, with an optional DNS root dot.\nconst DNS_NAME_RE =\n /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\\.?$/i;\nconst IPV6_HOST_RE = /^\\[[0-9a-f:.]+\\]$/i;\n\nconst MALFORMED_ESCAPE_RE = /%(?![0-9a-f]{2})/i;\n\n// `url` parsed, when its escapes are well formed and `URL` prints it as\n// written up to the case of its scheme and authority and a `/` for an empty\n// path.\nconst parsedAsWritten = (url: string): URL | null => {\n if (MALFORMED_ESCAPE_RE.test(url)) {\n return null;\n }\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n const [, prefix, rest] = URL_PARTS_RE.exec(url) ?? [];\n const [, printedPrefix, printedRest] = URL_PARTS_RE.exec(parsed.href) ?? [];\n return prefix !== undefined &&\n prefix.toLowerCase() === printedPrefix?.toLowerCase() &&\n (printedRest === rest || printedRest === `/${rest}`)\n ? parsed\n : null;\n};\n\n/**\n * Whether `url` is an `http:` or `https:` URL with a DNS or IPv6 host that\n * `URL` prints as written, so nothing it repairs or encodes, such as a\n * backslash, whitespace, or non-ASCII, passes.\n */\nexport const isAbsoluteHttpUrl = (url: string): boolean => {\n const parsed = parsedAsWritten(url);\n return (\n (parsed?.protocol === 'http:' || parsed?.protocol === 'https:') &&\n (DNS_NAME_RE.test(parsed.hostname) || IPV6_HOST_RE.test(parsed.hostname))\n );\n};\n\n// RFC 5322 dot-atom text, less `/`, `?`, `#`, and `%`.\nconst LOCAL_PART_RE =\n /^[a-z0-9!$&'*+=^_`{|}~-]+(?:\\.[a-z0-9!$&'*+=^_`{|}~-]+)*$/i;\n\nconst isMailbox = (recipient: string): boolean => {\n const at = recipient.lastIndexOf('@');\n return (\n at > 0 &&\n LOCAL_PART_RE.test(recipient.slice(0, at)) &&\n DNS_NAME_RE.test(recipient.slice(at + 1))\n );\n};\n\nconst decoded = (value: string): string | null => {\n try {\n return decodeURIComponent(value);\n } catch {\n return null;\n }\n};\n\n// Every comma-separated recipient before the query or fragment is a mailbox.\nconst isMailtoUrl = (url: string): boolean => {\n const [, recipients] = /^mailto:([^?#]*)/i.exec(url) ?? [];\n return (\n recipients !== undefined &&\n parsedAsWritten(url) !== null &&\n recipients\n .split(',')\n .every((recipient) => isMailbox(decoded(recipient) ?? ''))\n );\n};\n\n/**\n * `href` when {@link sanitizeNavigationHref} passes it and it is an `http:` or\n * `https:` URL with a host, or a `mailto:` of well-formed mailboxes; `null`\n * otherwise. Slack has no page to resolve a relative URL against.\n */\nexport const slackLinkUrl = (href: string): string | null => {\n const url = sanitizeNavigationHref(href);\n if (url === null) {\n return null;\n }\n return isAbsoluteHttpUrl(url) || isMailtoUrl(url) ? url : null;\n};\n\n/**\n * Slack mrkdwn link, `<url|label>`, or a bare `<url>` when `label` is omitted.\n *\n * URL and label are both escaped so `&` and `>` cannot break Slack's link\n * parser, and a `|` in the URL is percent-encoded so it cannot end the URL\n * early. A URL {@link slackLinkUrl} rejects degrades to plain escaped text\n * with no link.\n */\nexport const link = (url: string, label?: string): string => {\n const sanitized = slackLinkUrl(url);\n if (!sanitized) {\n return escapeMrkdwn(label ?? url);\n }\n const safeUrl = escapeMrkdwn(sanitized).replaceAll('|', '%7C');\n if (!label) {\n return `<${safeUrl}>`;\n }\n return `<${safeUrl}|${escapeMrkdwn(label)}>`;\n};\n\n/**\n * Truncates `value` to `max` UTF-16 code units at a grapheme boundary,\n * appending an ellipsis when it had to cut. Pass a `SLACK_LIMITS` constant as\n * the budget.\n */\nexport const clampSlackText = (value: string, max: number): string => {\n if (value.length <= max) {\n return value;\n }\n const budget = max <= 1 ? max : max - 1;\n let end = 0;\n for (const { index, segment } of new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n }).segment(value)) {\n if (index + segment.length > budget) {\n break;\n }\n end = index + segment.length;\n }\n const head = value.slice(0, end);\n return max <= 1 ? head : `${head.trimEnd()}…`;\n};\n\n// A `<…>` link or mention and an entity, each matched where it starts.\nconst LINK_TOKEN_RE = /<[^<>\\n]*>/y;\nconst ENTITY_TOKEN_RE = /&(?:amp|lt|gt);/y;\n\n// The end of the token `re` matches at `index`, or `undefined`.\nconst tokenEnd = (\n value: string,\n re: RegExp,\n index: number\n): number | undefined => {\n re.lastIndex = index;\n return re.test(value) ? re.lastIndex : undefined;\n};\n\n/**\n * {@link clampSlackText} for `mrkdwn`: never cuts inside a `<…>` link or\n * mention or an entity. Formatting marks are left as they fall; Slack prints an\n * unclosed one as written.\n */\nexport const clampMrkdwn = (value: string, max: number): string => {\n const clamped = clampSlackText(value, max);\n if (clamped === value || max <= 1) {\n return clamped;\n }\n // Entity first: a link holds no `<` of its own, so stepping back to its\n // start cannot land inside an entity, while the reverse could.\n let cut = clamped.length - 1;\n const entity = value.lastIndexOf('&', cut - 1);\n if (entity !== -1 && (tokenEnd(value, ENTITY_TOKEN_RE, entity) ?? 0) > cut) {\n cut = entity;\n }\n const link = value.lastIndexOf('<', cut - 1);\n if (link !== -1 && (tokenEnd(value, LINK_TOKEN_RE, link) ?? 0) > cut) {\n cut = link;\n }\n return `${value.slice(0, cut).trimEnd()}…`;\n};\n\n/**\n * `value` cut to `max` UTF-16 code units, never through a surrogate pair. For\n * opaque values a host reads back, which an ellipsis would change.\n */\nexport const cutSlackValue = (value: string, max: number): string => {\n const cut = value.slice(0, max);\n return /[\\ud800-\\udbff]$/.test(cut) ? cut.slice(0, -1) : cut;\n};\n\n/**\n * Collapses whitespace and clamps to `SLACK_LIMITS.headerTextChars`. Header\n * text is `plain_text`, so no markdown survives — do not pre-format it.\n */\nexport const formatHeaderText = (value: string): string =>\n clampSlackText(\n value.replace(/\\s+/g, ' ').trim(),\n SLACK_LIMITS.headerTextChars\n );\n"]}
@@ -1,6 +1,6 @@
1
1
  export { type SlackAssetCollector, type SlackAssetRequest, createSlackAssetCollector, isSlackReachableImageUrl, } from './assets.js';
2
2
  export { type SlackActionElement, type SlackActionsBlock, type SlackBlock, type SlackButtonElement, type SlackCheckboxesElement, type SlackContextBlock, type SlackDividerBlock, type SlackFileReference, type SlackHeaderBlock, type SlackHeaderLevel, type SlackImageBlock, type SlackImageElement, type SlackMrkdwnTextObject, type SlackMultiStaticSelectElement, type SlackOptionGroup, type SlackOptionObject, type SlackOverflowElement, type SlackPlainTextObject, type SlackRadioButtonsElement, type SlackRawTextElement, type SlackRichTextBlock, type SlackRichTextBlockElement, type SlackRichTextInline, type SlackRichTextLink, type SlackRichTextList, type SlackRichTextPreformatted, type SlackRichTextQuote, type SlackRichTextSection, type SlackRichTextStyle, type SlackRichTextTag, type SlackRichTextText, type SlackSectionAccessory, type SlackSectionBlock, type SlackStaticSelectElement, type SlackTableBlock, type SlackTableCell, type SlackTableColumnSetting, type SlackTagColor, type SlackTextObject, type SlackVideoBlock, SLACK_LIMITS, } from './blocks.js';
3
3
  export { type SlackEnvelopeDispatcher, type SlackEnvelopeOptions, type SlackEnvelopeResult, renderSlackEnvelope, } from './envelope.js';
4
- export { bold, clampSlackText, code, codeBlock, escapeMrkdwn, gfmToSlackBlocks, isAbsoluteHttpUrl, italic, link, slackLinkUrl, strike, } from './format.js';
4
+ export { bold, clampSlackText, code, codeBlock, escapeMrkdwn, isAbsoluteHttpUrl, italic, link, slackLinkUrl, strike, } from './format.js';
5
5
  export { markdownContentToSlackBlocks } from './markdown_content.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/slack/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,GACP,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/slack/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,GACP,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -7,6 +7,6 @@
7
7
  export { createSlackAssetCollector, isSlackReachableImageUrl, } from './assets.js';
8
8
  export { SLACK_LIMITS, } from './blocks.js';
9
9
  export { renderSlackEnvelope, } from './envelope.js';
10
- export { bold, clampSlackText, code, codeBlock, escapeMrkdwn, gfmToSlackBlocks, isAbsoluteHttpUrl, italic, link, slackLinkUrl, strike, } from './format.js';
10
+ export { bold, clampSlackText, code, codeBlock, escapeMrkdwn, isAbsoluteHttpUrl, italic, link, slackLinkUrl, strike, } from './format.js';
11
11
  export { markdownContentToSlackBlocks } from './markdown_content.js';
12
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/slack/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAyCL,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAIL,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,GACP,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type SlackAssetCollector,\n type SlackAssetRequest,\n createSlackAssetCollector,\n isSlackReachableImageUrl,\n} from './assets';\nexport {\n type SlackActionElement,\n type SlackActionsBlock,\n type SlackBlock,\n type SlackButtonElement,\n type SlackCheckboxesElement,\n type SlackContextBlock,\n type SlackDividerBlock,\n type SlackFileReference,\n type SlackHeaderBlock,\n type SlackHeaderLevel,\n type SlackImageBlock,\n type SlackImageElement,\n type SlackMrkdwnTextObject,\n type SlackMultiStaticSelectElement,\n type SlackOptionGroup,\n type SlackOptionObject,\n type SlackOverflowElement,\n type SlackPlainTextObject,\n type SlackRadioButtonsElement,\n type SlackRawTextElement,\n type SlackRichTextBlock,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextLink,\n type SlackRichTextList,\n type SlackRichTextPreformatted,\n type SlackRichTextQuote,\n type SlackRichTextSection,\n type SlackRichTextStyle,\n type SlackRichTextTag,\n type SlackRichTextText,\n type SlackSectionAccessory,\n type SlackSectionBlock,\n type SlackStaticSelectElement,\n type SlackTableBlock,\n type SlackTableCell,\n type SlackTableColumnSetting,\n type SlackTagColor,\n type SlackTextObject,\n type SlackVideoBlock,\n SLACK_LIMITS,\n} from './blocks';\nexport {\n type SlackEnvelopeDispatcher,\n type SlackEnvelopeOptions,\n type SlackEnvelopeResult,\n renderSlackEnvelope,\n} from './envelope';\n\nexport {\n bold,\n clampSlackText,\n code,\n codeBlock,\n escapeMrkdwn,\n gfmToSlackBlocks,\n isAbsoluteHttpUrl,\n italic,\n link,\n slackLinkUrl,\n strike,\n} from './format';\n\nexport { markdownContentToSlackBlocks } from './markdown_content';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/slack/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,UAAU,CAAC;AAClB,OAAO,EAyCL,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EAIL,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,IAAI,EACJ,cAAc,EACd,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,GACP,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n type SlackAssetCollector,\n type SlackAssetRequest,\n createSlackAssetCollector,\n isSlackReachableImageUrl,\n} from './assets';\nexport {\n type SlackActionElement,\n type SlackActionsBlock,\n type SlackBlock,\n type SlackButtonElement,\n type SlackCheckboxesElement,\n type SlackContextBlock,\n type SlackDividerBlock,\n type SlackFileReference,\n type SlackHeaderBlock,\n type SlackHeaderLevel,\n type SlackImageBlock,\n type SlackImageElement,\n type SlackMrkdwnTextObject,\n type SlackMultiStaticSelectElement,\n type SlackOptionGroup,\n type SlackOptionObject,\n type SlackOverflowElement,\n type SlackPlainTextObject,\n type SlackRadioButtonsElement,\n type SlackRawTextElement,\n type SlackRichTextBlock,\n type SlackRichTextBlockElement,\n type SlackRichTextInline,\n type SlackRichTextLink,\n type SlackRichTextList,\n type SlackRichTextPreformatted,\n type SlackRichTextQuote,\n type SlackRichTextSection,\n type SlackRichTextStyle,\n type SlackRichTextTag,\n type SlackRichTextText,\n type SlackSectionAccessory,\n type SlackSectionBlock,\n type SlackStaticSelectElement,\n type SlackTableBlock,\n type SlackTableCell,\n type SlackTableColumnSetting,\n type SlackTagColor,\n type SlackTextObject,\n type SlackVideoBlock,\n SLACK_LIMITS,\n} from './blocks';\nexport {\n type SlackEnvelopeDispatcher,\n type SlackEnvelopeOptions,\n type SlackEnvelopeResult,\n renderSlackEnvelope,\n} from './envelope';\n\nexport {\n bold,\n clampSlackText,\n code,\n codeBlock,\n escapeMrkdwn,\n isAbsoluteHttpUrl,\n italic,\n link,\n slackLinkUrl,\n strike,\n} from './format';\n\nexport { markdownContentToSlackBlocks } from './markdown_content';\n"]}
@@ -2,10 +2,16 @@ import type { MarkdownContent } from '../../define/markdown_content.js';
2
2
  import { type SlackBlock } from './blocks.js';
3
3
  /**
4
4
  * Builder content as Block Kit: paragraphs, headings, lists, quotes, and code
5
- * as `rich_text`, tables as `table` blocks. A quote is one level, and inside a
6
- * list item its blocks are the item's. A run of rich-text blocks shares one
7
- * `rich_text` block. Markdown printed as written, any block holding it, and a
8
- * list holding a table go through {@link gfmToSlackBlocks}.
5
+ * as `rich_text`, tables as `table` blocks, and thematic breaks as `divider`
6
+ * blocks. A quote is one level, and inside a list item its blocks are the
7
+ * item's. A run of rich-text blocks shares one `rich_text` block. Source from
8
+ * `md.authored` is parsed as GFM and translated the same way.
9
9
  */
10
10
  export declare const markdownContentToSlackBlocks: (content: MarkdownContent) => SlackBlock[];
11
+ /**
12
+ * GFM as Block Kit, parsed as CommonMark with GFM and translated as
13
+ * {@link markdownContentToSlackBlocks} translates builder content. Source past
14
+ * the parse budget that `md.authored` applies prints as literal paragraphs.
15
+ */
16
+ export declare const gfmToSlackBlocks: (gfm: string) => SlackBlock[];
11
17
  //# sourceMappingURL=markdown_content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown_content.d.ts","sourceRoot":"","sources":["../../../src/render/slack/markdown_content.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAOrE,OAAO,EAEL,KAAK,UAAU,EAOhB,MAAM,UAAU,CAAC;AAwYlB;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GACvC,SAAS,eAAe,KACvB,UAAU,EAwCZ,CAAC"}
1
+ {"version":3,"file":"markdown_content.d.ts","sourceRoot":"","sources":["../../../src/render/slack/markdown_content.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIrE,OAAO,EAEL,KAAK,UAAU,EAOhB,MAAM,UAAU,CAAC;AAoelB;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GACvC,SAAS,eAAe,KACvB,UAAU,EAKV,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,UAAU,EAC1B,CAAC"}
@@ -4,9 +4,11 @@
4
4
  * 2.0; you may not use this file except in compliance with the Elastic License
5
5
  * 2.0.
6
6
  */
7
- import { markdownBlocks, serializeMarkdown, VERBATIM_TYPE, } from '../markdown/builder.js';
7
+ import { markdownBlocks, VERBATIM_TYPE } from '../markdown/builder.js';
8
+ import { parseGfmBlocks } from '../markdown/format.js';
8
9
  import { SLACK_LIMITS, } from './blocks.js';
9
- import { clampSlackText, gfmToSlackBlocks, slackLinkUrl } from './format.js';
10
+ import { clampSlackText, slackLinkUrl } from './format.js';
11
+ const footnoteLabel = ({ identifier, label, }) => `[^${label ?? identifier}]`;
10
12
  const plainText = (node) => {
11
13
  if ('value' in node) {
12
14
  return node.value;
@@ -14,6 +16,9 @@ const plainText = (node) => {
14
16
  if (node.type === 'image') {
15
17
  return node.alt ?? '';
16
18
  }
19
+ if (node.type === 'footnoteReference') {
20
+ return footnoteLabel(node);
21
+ }
17
22
  return 'children' in node ? node.children.map(plainText).join('') : '';
18
23
  };
19
24
  const styled = (style) => Object.keys(style).length === 0 ? undefined : style;
@@ -58,8 +63,8 @@ const inline = (nodes, style = {}) => nodes.flatMap((node) => {
58
63
  }
59
64
  });
60
65
  const inlineText = (element) => element.type === 'link' ? (element.text ?? element.url) : element.text;
61
- // The envelope leaves rich text alone, so a section keeps to the budget the
62
- // string path gives a section's text.
66
+ // The envelope leaves rich text alone, so a section keeps to the budget of a
67
+ // `section` block's text.
63
68
  const clampInline = (elements, budget = SLACK_LIMITS.sectionTextChars) => {
64
69
  const kept = [];
65
70
  let spent = 0;
@@ -85,16 +90,26 @@ const section = (elements) => {
85
90
  ? []
86
91
  : [{ type: 'rich_text_section', elements: clamped }];
87
92
  };
93
+ const isElement = (piece) => piece.type.startsWith('rich_text_');
94
+ // Blocks a rich-text list item holds as lines of its text.
95
+ const ITEM_LINES = new Set([
96
+ 'paragraph',
97
+ 'heading',
98
+ 'code',
99
+ 'html',
100
+ ]);
88
101
  const childInline = (child) => 'children' in child
89
102
  ? inline(child.children, child.type === 'heading' ? { bold: true } : {})
90
103
  : textElement(plainText(child), child.type === 'code' ? { code: true } : {});
91
- // An item's children are read in order. Its paragraphs share one bullet; a
92
- // nested list follows at the next indent; what the item holds after a nested
93
- // list follows unbulleted, since a Slack list item cannot resume; and the
94
- // outer list resumes at its next number.
95
104
  // A quote holds its blocks at one level.
96
105
  const unquoted = (node) => node.type === 'blockquote' ? node.children.flatMap(unquoted) : [node];
97
- const listElements = (list, indent) => {
106
+ // An item's children are read in order. Its lines of text share one bullet; a
107
+ // nested list follows at the next indent; any other block, such as a table,
108
+ // follows on its own; what the item holds after either follows unbulleted,
109
+ // since a Slack list item cannot resume; and the list resumes at its next
110
+ // number. An empty item keeps its number, so the list resumes past it. A task
111
+ // item's first line leads with its box.
112
+ const listPieces = (list, indent) => {
98
113
  const style = list.ordered ? 'ordered' : 'bullet';
99
114
  const out = [];
100
115
  let current = [];
@@ -118,6 +133,9 @@ const listElements = (list, indent) => {
118
133
  for (const item of list.children) {
119
134
  let runs = [];
120
135
  let numbered = false;
136
+ let box = typeof item.checked === 'boolean'
137
+ ? textElement(item.checked ? '☑ ' : '☐ ', {})
138
+ : [];
121
139
  const emit = () => {
122
140
  const sections = section(runs);
123
141
  runs = [];
@@ -135,41 +153,30 @@ const listElements = (list, indent) => {
135
153
  }
136
154
  };
137
155
  for (const child of item.children.flatMap(unquoted)) {
138
- if (child.type === 'list') {
156
+ if (ITEM_LINES.has(child.type)) {
157
+ runs.push(...(runs.length > 0 ? textElement('\n', {}) : box), ...childInline(child));
158
+ box = [];
159
+ continue;
160
+ }
161
+ const pieces = child.type === 'list'
162
+ ? listPieces(child, Math.min(indent + 1, SLACK_LIMITS.richTextListMaxIndent))
163
+ : blockPieces(child);
164
+ if (pieces.length > 0) {
139
165
  emit();
140
166
  flush();
141
- out.push(...listElements(child, Math.min(indent + 1, SLACK_LIMITS.richTextListMaxIndent)));
142
- }
143
- else {
144
- runs.push(...(runs.length > 0 ? textElement('\n', {}) : []), ...childInline(child));
167
+ out.push(...pieces);
145
168
  }
146
169
  }
147
170
  emit();
171
+ if (item.children.length === 0) {
172
+ flush();
173
+ number += 1;
174
+ offset = number - 1;
175
+ }
148
176
  }
149
177
  flush();
150
178
  return out;
151
179
  };
152
- const richTextElements = (node) => {
153
- switch (node.type) {
154
- case 'paragraph':
155
- return section(inline(node.children));
156
- case 'heading':
157
- return section(inline(node.children, { bold: true }));
158
- case 'list':
159
- return listElements(node, 0);
160
- case 'code':
161
- return node.value === ''
162
- ? []
163
- : [
164
- {
165
- type: 'rich_text_preformatted',
166
- elements: textElement(clampSlackText(node.value, SLACK_LIMITS.sectionTextChars), {}),
167
- },
168
- ];
169
- default:
170
- return [];
171
- }
172
- };
173
180
  const tableCell = (cell) => {
174
181
  const elements = inline(cell);
175
182
  const plain = elements.every((element) => element.type === 'text' && element.style === undefined);
@@ -203,35 +210,19 @@ const tableBlock = (table) => {
203
210
  },
204
211
  ];
205
212
  };
206
- const containsVerbatim = (node) => node.type === VERBATIM_TYPE ||
207
- ('children' in node && node.children.some(containsVerbatim));
208
- const LIST_ITEM_CONTENT = new Set([
209
- 'paragraph',
210
- 'heading',
211
- 'code',
212
- 'list',
213
- ]);
214
- // A rich-text list item holds lines of text, so a list holding any other
215
- // block, such as a table, goes through the string translator whole.
216
- const fitsRichTextList = (list) => list.children.every((item) => item.children
217
- .flatMap(unquoted)
218
- .every((child) => LIST_ITEM_CONTENT.has(child.type) &&
219
- (child.type !== 'list' || fitsRichTextList(child))));
220
- // The string translator reads a line at a time, so a hard break reaches it as
221
- // a line ending and a quote as its blocks.
222
- const forStringPath = (node) => {
223
- if (node.type === 'break') {
224
- return [{ type: 'text', value: '\n' }];
225
- }
226
- if (node.type === 'blockquote') {
227
- return node.children.flatMap(forStringPath);
228
- }
229
- return 'children' in node
230
- ? [{ ...node, children: node.children.flatMap(forStringPath) }]
231
- : [node];
213
+ // A footnote's label leads its first paragraph.
214
+ const footnotePieces = ({ children, ...footnote }) => {
215
+ const [first, ...rest] = children;
216
+ const label = {
217
+ type: 'text',
218
+ value: `${footnoteLabel(footnote)}: `,
219
+ };
220
+ const lead = {
221
+ type: 'paragraph',
222
+ children: [label, ...(first?.type === 'paragraph' ? first.children : [])],
223
+ };
224
+ return [lead, ...(first?.type === 'paragraph' ? rest : children)].flatMap(blockPieces);
232
225
  };
233
- const viaStringPath = (node) => gfmToSlackBlocks(serializeMarkdown(forStringPath(node)));
234
- const isElement = (piece) => piece.type.startsWith('rich_text_');
235
226
  const borderedElement = (element) => {
236
227
  switch (element.type) {
237
228
  case 'rich_text_list':
@@ -243,45 +234,9 @@ const borderedElement = (element) => {
243
234
  return element;
244
235
  }
245
236
  };
246
- // What a quote holds besides text keeps a quote's border; a table has none.
247
- const bordered = (piece) => {
248
- if (isElement(piece)) {
249
- return borderedElement(piece);
250
- }
251
- switch (piece.type) {
252
- case 'rich_text':
253
- return { ...piece, elements: piece.elements.map(borderedElement) };
254
- case 'section':
255
- return piece.text?.type === 'mrkdwn'
256
- ? {
257
- ...piece,
258
- text: {
259
- ...piece.text,
260
- text: piece.text.text.replace(/^(?=.*\S)/gm, '> '),
261
- },
262
- }
263
- : piece;
264
- default:
265
- return piece;
266
- }
267
- };
268
- const blockPieces = (node) => {
269
- if (node.type === 'blockquote') {
270
- return quotePieces(node);
271
- }
272
- if (containsVerbatim(node) ||
273
- (node.type === 'list' && !fitsRichTextList(node))) {
274
- return viaStringPath(node);
275
- }
276
- if (node.type === 'table') {
277
- return tableBlock(node);
278
- }
279
- const translated = richTextElements(node);
280
- return translated.length === 0 &&
281
- !['paragraph', 'heading', 'code'].includes(node.type)
282
- ? viaStringPath(node)
283
- : translated;
284
- };
237
+ // What a quote holds besides text keeps a quote's border; a table or divider
238
+ // has none.
239
+ const bordered = (piece) => isElement(piece) ? borderedElement(piece) : piece;
285
240
  // A quote is one level, nested quotes spread into it: its text as
286
241
  // `rich_text_quote`, and any other block it holds with a border.
287
242
  const quotePieces = (quote) => {
@@ -300,21 +255,108 @@ const quotePieces = (quote) => {
300
255
  runs.push(...(runs.length > 0 && line.length > 0 ? textElement('\n', {}) : []), ...line);
301
256
  }
302
257
  else {
303
- flush();
304
- out.push(...blockPieces(child).map(bordered));
258
+ const pieces = blockPieces(child);
259
+ if (pieces.length > 0) {
260
+ flush();
261
+ out.push(...pieces.map(bordered));
262
+ }
305
263
  }
306
264
  }
307
265
  flush();
308
266
  return out;
309
267
  };
310
- /**
311
- * Builder content as Block Kit: paragraphs, headings, lists, quotes, and code
312
- * as `rich_text`, tables as `table` blocks. A quote is one level, and inside a
313
- * list item its blocks are the item's. A run of rich-text blocks shares one
314
- * `rich_text` block. Markdown printed as written, any block holding it, and a
315
- * list holding a table go through {@link gfmToSlackBlocks}.
316
- */
317
- export const markdownContentToSlackBlocks = (content) => {
268
+ const blockPieces = (node) => {
269
+ switch (node.type) {
270
+ case 'paragraph':
271
+ case 'html':
272
+ return section(childInline(node));
273
+ case 'heading':
274
+ return section(inline(node.children, { bold: true }));
275
+ case 'code':
276
+ return node.value === ''
277
+ ? []
278
+ : [
279
+ {
280
+ type: 'rich_text_preformatted',
281
+ elements: textElement(clampSlackText(node.value, SLACK_LIMITS.sectionTextChars), {}),
282
+ },
283
+ ];
284
+ case 'list':
285
+ return listPieces(node, 0);
286
+ case 'blockquote':
287
+ return quotePieces(node);
288
+ case 'table':
289
+ return tableBlock(node);
290
+ case 'thematicBreak':
291
+ return [{ type: 'divider' }];
292
+ case 'footnoteDefinition':
293
+ return footnotePieces(node);
294
+ default:
295
+ return [];
296
+ }
297
+ };
298
+ // Each reference resolved to its document's first definition.
299
+ const withReferences = (blocks) => {
300
+ const definitions = new Map();
301
+ const collect = (node) => {
302
+ if (node.type === 'definition' && !definitions.has(node.identifier)) {
303
+ definitions.set(node.identifier, node);
304
+ }
305
+ if ('children' in node) {
306
+ node.children.forEach(collect);
307
+ }
308
+ };
309
+ blocks.forEach(collect);
310
+ if (definitions.size === 0) {
311
+ return [...blocks];
312
+ }
313
+ const resolve = (node) => {
314
+ switch (node.type) {
315
+ case 'linkReference':
316
+ return {
317
+ type: 'link',
318
+ url: definitions.get(node.identifier)?.url ?? '',
319
+ children: node.children.map(resolve),
320
+ };
321
+ case 'imageReference':
322
+ return {
323
+ type: 'image',
324
+ url: definitions.get(node.identifier)?.url ?? '',
325
+ alt: node.alt ?? null,
326
+ };
327
+ default:
328
+ return 'children' in node
329
+ ? { ...node, children: node.children.map(resolve) }
330
+ : node;
331
+ }
332
+ };
333
+ return blocks.map(resolve);
334
+ };
335
+ const lines = (text) => text.replace(/\r\n?/g, '\n');
336
+ const literalParagraphs = (text) => lines(text)
337
+ .split(/\n[ \t]*\n/)
338
+ .filter((paragraph) => paragraph.trim() !== '')
339
+ .map((paragraph) => ({
340
+ type: 'paragraph',
341
+ children: [{ type: 'text', value: paragraph.trim() }],
342
+ }));
343
+ // Source past the parse budget prints as its literal paragraphs.
344
+ const gfmBlocks = (gfm) => {
345
+ const parsed = parseGfmBlocks(lines(gfm));
346
+ return parsed === null ? literalParagraphs(gfm) : withReferences(parsed);
347
+ };
348
+ // Markdown printed as written is read as the GFM it holds; authored source
349
+ // that sanitizing left inert is never parsed.
350
+ const expanded = (node) => {
351
+ if (node.type === VERBATIM_TYPE) {
352
+ const { value, source } = node;
353
+ return source === undefined ? gfmBlocks(value) : literalParagraphs(source);
354
+ }
355
+ return 'children' in node
356
+ ? [{ ...node, children: node.children.flatMap(expanded) }]
357
+ : [node];
358
+ };
359
+ const toSlackBlocks = (nodes) => {
318
360
  const blocks = [];
319
361
  let elements = [];
320
362
  const flush = () => {
@@ -337,7 +379,7 @@ export const markdownContentToSlackBlocks = (content) => {
337
379
  }
338
380
  elements = [];
339
381
  };
340
- for (const node of markdownBlocks(content)) {
382
+ for (const node of nodes) {
341
383
  for (const piece of blockPieces(node)) {
342
384
  if (isElement(piece)) {
343
385
  elements.push(piece);
@@ -351,4 +393,18 @@ export const markdownContentToSlackBlocks = (content) => {
351
393
  flush();
352
394
  return blocks;
353
395
  };
396
+ /**
397
+ * Builder content as Block Kit: paragraphs, headings, lists, quotes, and code
398
+ * as `rich_text`, tables as `table` blocks, and thematic breaks as `divider`
399
+ * blocks. A quote is one level, and inside a list item its blocks are the
400
+ * item's. A run of rich-text blocks shares one `rich_text` block. Source from
401
+ * `md.authored` is parsed as GFM and translated the same way.
402
+ */
403
+ export const markdownContentToSlackBlocks = (content) => toSlackBlocks(markdownBlocks(content).flatMap(expanded));
404
+ /**
405
+ * GFM as Block Kit, parsed as CommonMark with GFM and translated as
406
+ * {@link markdownContentToSlackBlocks} translates builder content. Source past
407
+ * the parse budget that `md.authored` applies prints as literal paragraphs.
408
+ */
409
+ export const gfmToSlackBlocks = (gfm) => toSlackBlocks(gfmBlocks(gfm));
354
410
  //# sourceMappingURL=markdown_content.js.map