@elastic/isomer-sdk 0.0.0 → 0.2.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 (492) hide show
  1. package/LICENSE.txt +93 -0
  2. package/NOTICE.txt +1861 -0
  3. package/README.md +69 -0
  4. package/THIRD_PARTY_LICENSES.md +957 -0
  5. package/dist/author/authored_fields.d.ts +153 -0
  6. package/dist/author/authored_fields.d.ts.map +1 -0
  7. package/dist/author/authored_fields.js +227 -0
  8. package/dist/author/authored_fields.js.map +1 -0
  9. package/dist/author/authoring_input.d.ts +7 -0
  10. package/dist/author/authoring_input.d.ts.map +1 -0
  11. package/dist/author/authoring_input.js +60 -0
  12. package/dist/author/authoring_input.js.map +1 -0
  13. package/dist/author/authoring_model.d.ts +27 -0
  14. package/dist/author/authoring_model.d.ts.map +1 -0
  15. package/dist/author/authoring_model.js +98 -0
  16. package/dist/author/authoring_model.js.map +1 -0
  17. package/dist/author/declarations.d.ts +13 -0
  18. package/dist/author/declarations.d.ts.map +1 -0
  19. package/dist/author/declarations.js +277 -0
  20. package/dist/author/declarations.js.map +1 -0
  21. package/dist/author/index.d.ts +7 -0
  22. package/dist/author/index.d.ts.map +1 -0
  23. package/dist/author/index.js +12 -0
  24. package/dist/author/index.js.map +1 -0
  25. package/dist/author/jsx.d.ts +21 -0
  26. package/dist/author/jsx.d.ts.map +1 -0
  27. package/dist/author/jsx.js +20 -0
  28. package/dist/author/jsx.js.map +1 -0
  29. package/dist/author/jsx_shim.d.ts +117 -0
  30. package/dist/author/jsx_shim.d.ts.map +1 -0
  31. package/dist/author/jsx_shim.js +270 -0
  32. package/dist/author/jsx_shim.js.map +1 -0
  33. package/dist/author/prompt.d.ts +58 -0
  34. package/dist/author/prompt.d.ts.map +1 -0
  35. package/dist/author/prompt.js +148 -0
  36. package/dist/author/prompt.js.map +1 -0
  37. package/dist/author/schema_to_typescript.d.ts +37 -0
  38. package/dist/author/schema_to_typescript.d.ts.map +1 -0
  39. package/dist/author/schema_to_typescript.js +286 -0
  40. package/dist/author/schema_to_typescript.js.map +1 -0
  41. package/dist/cjs/author/authored_fields.js +233 -0
  42. package/dist/cjs/author/authored_fields.js.map +1 -0
  43. package/dist/cjs/author/authoring_input.js +64 -0
  44. package/dist/cjs/author/authoring_input.js.map +1 -0
  45. package/dist/cjs/author/authoring_model.js +104 -0
  46. package/dist/cjs/author/authoring_model.js.map +1 -0
  47. package/dist/cjs/author/declarations.js +281 -0
  48. package/dist/cjs/author/declarations.js.map +1 -0
  49. package/dist/cjs/author/index.js +25 -0
  50. package/dist/cjs/author/index.js.map +1 -0
  51. package/dist/cjs/author/jsx.js +24 -0
  52. package/dist/cjs/author/jsx.js.map +1 -0
  53. package/dist/cjs/author/jsx_shim.js +276 -0
  54. package/dist/cjs/author/jsx_shim.js.map +1 -0
  55. package/dist/cjs/author/prompt.js +153 -0
  56. package/dist/cjs/author/prompt.js.map +1 -0
  57. package/dist/cjs/author/schema_to_typescript.js +295 -0
  58. package/dist/cjs/author/schema_to_typescript.js.map +1 -0
  59. package/dist/cjs/composition/action_event.js +9 -0
  60. package/dist/cjs/composition/action_event.js.map +1 -0
  61. package/dist/cjs/composition/body_node_base.js +112 -0
  62. package/dist/cjs/composition/body_node_base.js.map +1 -0
  63. package/dist/cjs/composition/composition.js +9 -0
  64. package/dist/cjs/composition/composition.js.map +1 -0
  65. package/dist/cjs/composition/error.js +73 -0
  66. package/dist/cjs/composition/error.js.map +1 -0
  67. package/dist/cjs/composition/index.js +32 -0
  68. package/dist/cjs/composition/index.js.map +1 -0
  69. package/dist/cjs/composition/map_nodes.js +85 -0
  70. package/dist/cjs/composition/map_nodes.js.map +1 -0
  71. package/dist/cjs/composition/named_color.js +20 -0
  72. package/dist/cjs/composition/named_color.js.map +1 -0
  73. package/dist/cjs/composition/node.js +9 -0
  74. package/dist/cjs/composition/node.js.map +1 -0
  75. package/dist/cjs/composition/one_line.js +23 -0
  76. package/dist/cjs/composition/one_line.js.map +1 -0
  77. package/dist/cjs/composition/structured_value.js +21 -0
  78. package/dist/cjs/composition/structured_value.js.map +1 -0
  79. package/dist/cjs/composition/validation_error.js +40 -0
  80. package/dist/cjs/composition/validation_error.js.map +1 -0
  81. package/dist/cjs/define/frame.js +31 -0
  82. package/dist/cjs/define/frame.js.map +1 -0
  83. package/dist/cjs/define/index.js +31 -0
  84. package/dist/cjs/define/index.js.map +1 -0
  85. package/dist/cjs/define/markdown_content.js +12 -0
  86. package/dist/cjs/define/markdown_content.js.map +1 -0
  87. package/dist/cjs/define/primitive_example.js +26 -0
  88. package/dist/cjs/define/primitive_example.js.map +1 -0
  89. package/dist/cjs/define/primitive_icon.js +17 -0
  90. package/dist/cjs/define/primitive_icon.js.map +1 -0
  91. package/dist/cjs/define/primitive_module.js +118 -0
  92. package/dist/cjs/define/primitive_module.js.map +1 -0
  93. package/dist/cjs/define/slack_assets.js +9 -0
  94. package/dist/cjs/define/slack_assets.js.map +1 -0
  95. package/dist/cjs/define/slack_blocks.js +9 -0
  96. package/dist/cjs/define/slack_blocks.js.map +1 -0
  97. package/dist/cjs/define/zod_format.js +122 -0
  98. package/dist/cjs/define/zod_format.js.map +1 -0
  99. package/dist/cjs/define/zod_helpers.js +26 -0
  100. package/dist/cjs/define/zod_helpers.js.map +1 -0
  101. package/dist/cjs/entries/html.js +12 -0
  102. package/dist/cjs/entries/html.js.map +1 -0
  103. package/dist/cjs/entries/index.js +80 -0
  104. package/dist/cjs/entries/index.js.map +1 -0
  105. package/dist/cjs/entries/markdown.js +14 -0
  106. package/dist/cjs/entries/markdown.js.map +1 -0
  107. package/dist/cjs/entries/react.js +20 -0
  108. package/dist/cjs/entries/react.js.map +1 -0
  109. package/dist/cjs/entries/slack.js +25 -0
  110. package/dist/cjs/entries/slack.js.map +1 -0
  111. package/dist/cjs/entries/text.js +12 -0
  112. package/dist/cjs/entries/text.js.map +1 -0
  113. package/dist/cjs/pack/capabilities.js +40 -0
  114. package/dist/cjs/pack/capabilities.js.map +1 -0
  115. package/dist/cjs/pack/compose.js +59 -0
  116. package/dist/cjs/pack/compose.js.map +1 -0
  117. package/dist/cjs/pack/enhancements.js +65 -0
  118. package/dist/cjs/pack/enhancements.js.map +1 -0
  119. package/dist/cjs/pack/index.js +18 -0
  120. package/dist/cjs/pack/index.js.map +1 -0
  121. package/dist/cjs/pack/primitive_pack.js +97 -0
  122. package/dist/cjs/pack/primitive_pack.js.map +1 -0
  123. package/dist/cjs/package.json +3 -0
  124. package/dist/cjs/render/anchors.js +167 -0
  125. package/dist/cjs/render/anchors.js.map +1 -0
  126. package/dist/cjs/render/context_view.js +54 -0
  127. package/dist/cjs/render/context_view.js.map +1 -0
  128. package/dist/cjs/render/format_display_value.js +143 -0
  129. package/dist/cjs/render/format_display_value.js.map +1 -0
  130. package/dist/cjs/render/format_number.js +46 -0
  131. package/dist/cjs/render/format_number.js.map +1 -0
  132. package/dist/cjs/render/html/enhancements.js +30 -0
  133. package/dist/cjs/render/html/enhancements.js.map +1 -0
  134. package/dist/cjs/render/html/envelope.js +218 -0
  135. package/dist/cjs/render/html/envelope.js.map +1 -0
  136. package/dist/cjs/render/html/index.js +12 -0
  137. package/dist/cjs/render/html/index.js.map +1 -0
  138. package/dist/cjs/render/index.js +25 -0
  139. package/dist/cjs/render/index.js.map +1 -0
  140. package/dist/cjs/render/layout_check.js +133 -0
  141. package/dist/cjs/render/layout_check.js.map +1 -0
  142. package/dist/cjs/render/markdown/builder.js +195 -0
  143. package/dist/cjs/render/markdown/builder.js.map +1 -0
  144. package/dist/cjs/render/markdown/envelope.js +33 -0
  145. package/dist/cjs/render/markdown/envelope.js.map +1 -0
  146. package/dist/cjs/render/markdown/format.js +208 -0
  147. package/dist/cjs/render/markdown/format.js.map +1 -0
  148. package/dist/cjs/render/markdown/index.js +15 -0
  149. package/dist/cjs/render/markdown/index.js.map +1 -0
  150. package/dist/cjs/render/measure_dom.js +61 -0
  151. package/dist/cjs/render/measure_dom.js.map +1 -0
  152. package/dist/cjs/render/payload.js +13 -0
  153. package/dist/cjs/render/payload.js.map +1 -0
  154. package/dist/cjs/render/primitive_dispatch.js +173 -0
  155. package/dist/cjs/render/primitive_dispatch.js.map +1 -0
  156. package/dist/cjs/render/react/content.js +44 -0
  157. package/dist/cjs/render/react/content.js.map +1 -0
  158. package/dist/cjs/render/react/enhancements.js +32 -0
  159. package/dist/cjs/render/react/enhancements.js.map +1 -0
  160. package/dist/cjs/render/react/index.js +15 -0
  161. package/dist/cjs/render/react/index.js.map +1 -0
  162. package/dist/cjs/render/slack/assets.js +45 -0
  163. package/dist/cjs/render/slack/assets.js.map +1 -0
  164. package/dist/cjs/render/slack/blocks.js +80 -0
  165. package/dist/cjs/render/slack/blocks.js.map +1 -0
  166. package/dist/cjs/render/slack/envelope.js +551 -0
  167. package/dist/cjs/render/slack/envelope.js.map +1 -0
  168. package/dist/cjs/render/slack/format.js +225 -0
  169. package/dist/cjs/render/slack/format.js.map +1 -0
  170. package/dist/cjs/render/slack/index.js +30 -0
  171. package/dist/cjs/render/slack/index.js.map +1 -0
  172. package/dist/cjs/render/slack/markdown_content.js +409 -0
  173. package/dist/cjs/render/slack/markdown_content.js.map +1 -0
  174. package/dist/cjs/render/text/envelope.js +21 -0
  175. package/dist/cjs/render/text/envelope.js.map +1 -0
  176. package/dist/cjs/render/text/index.js +12 -0
  177. package/dist/cjs/render/text/index.js.map +1 -0
  178. package/dist/cjs/testing/conformance.js +312 -0
  179. package/dist/cjs/testing/conformance.js.map +1 -0
  180. package/dist/cjs/testing/icon.js +248 -0
  181. package/dist/cjs/testing/icon.js.map +1 -0
  182. package/dist/cjs/testing/index.js +18 -0
  183. package/dist/cjs/testing/index.js.map +1 -0
  184. package/dist/cjs/testing/registration.js +142 -0
  185. package/dist/cjs/testing/registration.js.map +1 -0
  186. package/dist/cjs/validate/authoring_schema.js +312 -0
  187. package/dist/cjs/validate/authoring_schema.js.map +1 -0
  188. package/dist/cjs/validate/composition_schema.js +135 -0
  189. package/dist/cjs/validate/composition_schema.js.map +1 -0
  190. package/dist/cjs/validate/index.js +53 -0
  191. package/dist/cjs/validate/index.js.map +1 -0
  192. package/dist/cjs/validate/input_budget.js +156 -0
  193. package/dist/cjs/validate/input_budget.js.map +1 -0
  194. package/dist/cjs/validate/json_schema.js +72 -0
  195. package/dist/cjs/validate/json_schema.js.map +1 -0
  196. package/dist/cjs/validate/node_issues.js +65 -0
  197. package/dist/cjs/validate/node_issues.js.map +1 -0
  198. package/dist/cjs/validate/url.js +116 -0
  199. package/dist/cjs/validate/url.js.map +1 -0
  200. package/dist/cjs/validate/validation.js +165 -0
  201. package/dist/cjs/validate/validation.js.map +1 -0
  202. package/dist/cjs/validate/value_schemas.js +53 -0
  203. package/dist/cjs/validate/value_schemas.js.map +1 -0
  204. package/dist/composition/action_event.d.ts +13 -0
  205. package/dist/composition/action_event.d.ts.map +1 -0
  206. package/dist/composition/action_event.js +8 -0
  207. package/dist/composition/action_event.js.map +1 -0
  208. package/dist/composition/body_node_base.d.ts +72 -0
  209. package/dist/composition/body_node_base.d.ts.map +1 -0
  210. package/dist/composition/body_node_base.js +104 -0
  211. package/dist/composition/body_node_base.js.map +1 -0
  212. package/dist/composition/composition.d.ts +71 -0
  213. package/dist/composition/composition.d.ts.map +1 -0
  214. package/dist/composition/composition.js +8 -0
  215. package/dist/composition/composition.js.map +1 -0
  216. package/dist/composition/error.d.ts +61 -0
  217. package/dist/composition/error.d.ts.map +1 -0
  218. package/dist/composition/error.js +69 -0
  219. package/dist/composition/error.js.map +1 -0
  220. package/dist/composition/index.d.ts +11 -0
  221. package/dist/composition/index.d.ts.map +1 -0
  222. package/dist/composition/index.js +14 -0
  223. package/dist/composition/index.js.map +1 -0
  224. package/dist/composition/map_nodes.d.ts +16 -0
  225. package/dist/composition/map_nodes.d.ts.map +1 -0
  226. package/dist/composition/map_nodes.js +81 -0
  227. package/dist/composition/map_nodes.js.map +1 -0
  228. package/dist/composition/named_color.d.ts +9 -0
  229. package/dist/composition/named_color.d.ts.map +1 -0
  230. package/dist/composition/named_color.js +17 -0
  231. package/dist/composition/named_color.js.map +1 -0
  232. package/dist/composition/node.d.ts +11 -0
  233. package/dist/composition/node.d.ts.map +1 -0
  234. package/dist/composition/node.js +8 -0
  235. package/dist/composition/node.js.map +1 -0
  236. package/dist/composition/one_line.d.ts +7 -0
  237. package/dist/composition/one_line.d.ts.map +1 -0
  238. package/dist/composition/one_line.js +17 -0
  239. package/dist/composition/one_line.js.map +1 -0
  240. package/dist/composition/structured_value.d.ts +27 -0
  241. package/dist/composition/structured_value.d.ts.map +1 -0
  242. package/dist/composition/structured_value.js +18 -0
  243. package/dist/composition/structured_value.js.map +1 -0
  244. package/dist/composition/validation_error.d.ts +33 -0
  245. package/dist/composition/validation_error.d.ts.map +1 -0
  246. package/dist/composition/validation_error.js +35 -0
  247. package/dist/composition/validation_error.js.map +1 -0
  248. package/dist/define/frame.d.ts +155 -0
  249. package/dist/define/frame.d.ts.map +1 -0
  250. package/dist/define/frame.js +27 -0
  251. package/dist/define/frame.js.map +1 -0
  252. package/dist/define/index.d.ts +10 -0
  253. package/dist/define/index.d.ts.map +1 -0
  254. package/dist/define/index.js +13 -0
  255. package/dist/define/index.js.map +1 -0
  256. package/dist/define/markdown_content.d.ts +15 -0
  257. package/dist/define/markdown_content.d.ts.map +1 -0
  258. package/dist/define/markdown_content.js +9 -0
  259. package/dist/define/markdown_content.js.map +1 -0
  260. package/dist/define/primitive_example.d.ts +30 -0
  261. package/dist/define/primitive_example.d.ts.map +1 -0
  262. package/dist/define/primitive_example.js +21 -0
  263. package/dist/define/primitive_example.js.map +1 -0
  264. package/dist/define/primitive_icon.d.ts +11 -0
  265. package/dist/define/primitive_icon.d.ts.map +1 -0
  266. package/dist/define/primitive_icon.js +14 -0
  267. package/dist/define/primitive_icon.js.map +1 -0
  268. package/dist/define/primitive_module.d.ts +435 -0
  269. package/dist/define/primitive_module.d.ts.map +1 -0
  270. package/dist/define/primitive_module.js +112 -0
  271. package/dist/define/primitive_module.js.map +1 -0
  272. package/dist/define/slack_assets.d.ts +28 -0
  273. package/dist/define/slack_assets.d.ts.map +1 -0
  274. package/dist/define/slack_assets.js +8 -0
  275. package/dist/define/slack_assets.js.map +1 -0
  276. package/dist/define/slack_blocks.d.ts +234 -0
  277. package/dist/define/slack_blocks.d.ts.map +1 -0
  278. package/dist/define/slack_blocks.js +8 -0
  279. package/dist/define/slack_blocks.js.map +1 -0
  280. package/dist/define/zod_format.d.ts +33 -0
  281. package/dist/define/zod_format.d.ts.map +1 -0
  282. package/dist/define/zod_format.js +114 -0
  283. package/dist/define/zod_format.js.map +1 -0
  284. package/dist/define/zod_helpers.d.ts +10 -0
  285. package/dist/define/zod_helpers.d.ts.map +1 -0
  286. package/dist/define/zod_helpers.js +22 -0
  287. package/dist/define/zod_helpers.js.map +1 -0
  288. package/dist/entries/html.d.ts +3 -0
  289. package/dist/entries/html.d.ts.map +1 -0
  290. package/dist/entries/html.js +8 -0
  291. package/dist/entries/html.js.map +1 -0
  292. package/dist/entries/index.d.ts +6 -0
  293. package/dist/entries/index.d.ts.map +1 -0
  294. package/dist/entries/index.js +12 -0
  295. package/dist/entries/index.js.map +1 -0
  296. package/dist/entries/markdown.d.ts +3 -0
  297. package/dist/entries/markdown.d.ts.map +1 -0
  298. package/dist/entries/markdown.js +8 -0
  299. package/dist/entries/markdown.js.map +1 -0
  300. package/dist/entries/react.d.ts +5 -0
  301. package/dist/entries/react.d.ts.map +1 -0
  302. package/dist/entries/react.js +11 -0
  303. package/dist/entries/react.js.map +1 -0
  304. package/dist/entries/slack.d.ts +2 -0
  305. package/dist/entries/slack.d.ts.map +1 -0
  306. package/dist/entries/slack.js +8 -0
  307. package/dist/entries/slack.js.map +1 -0
  308. package/dist/entries/text.d.ts +2 -0
  309. package/dist/entries/text.d.ts.map +1 -0
  310. package/dist/entries/text.js +8 -0
  311. package/dist/entries/text.js.map +1 -0
  312. package/dist/pack/capabilities.d.ts +41 -0
  313. package/dist/pack/capabilities.d.ts.map +1 -0
  314. package/dist/pack/capabilities.js +36 -0
  315. package/dist/pack/capabilities.js.map +1 -0
  316. package/dist/pack/compose.d.ts +24 -0
  317. package/dist/pack/compose.d.ts.map +1 -0
  318. package/dist/pack/compose.js +55 -0
  319. package/dist/pack/compose.js.map +1 -0
  320. package/dist/pack/enhancements.d.ts +65 -0
  321. package/dist/pack/enhancements.d.ts.map +1 -0
  322. package/dist/pack/enhancements.js +59 -0
  323. package/dist/pack/enhancements.js.map +1 -0
  324. package/dist/pack/index.d.ts +5 -0
  325. package/dist/pack/index.d.ts.map +1 -0
  326. package/dist/pack/index.js +11 -0
  327. package/dist/pack/index.js.map +1 -0
  328. package/dist/pack/primitive_pack.d.ts +164 -0
  329. package/dist/pack/primitive_pack.d.ts.map +1 -0
  330. package/dist/pack/primitive_pack.js +92 -0
  331. package/dist/pack/primitive_pack.js.map +1 -0
  332. package/dist/render/anchors.d.ts +82 -0
  333. package/dist/render/anchors.d.ts.map +1 -0
  334. package/dist/render/anchors.js +153 -0
  335. package/dist/render/anchors.js.map +1 -0
  336. package/dist/render/context_view.d.ts +10 -0
  337. package/dist/render/context_view.d.ts.map +1 -0
  338. package/dist/render/context_view.js +49 -0
  339. package/dist/render/context_view.js.map +1 -0
  340. package/dist/render/format_display_value.d.ts +20 -0
  341. package/dist/render/format_display_value.d.ts.map +1 -0
  342. package/dist/render/format_display_value.js +137 -0
  343. package/dist/render/format_display_value.js.map +1 -0
  344. package/dist/render/format_number.d.ts +9 -0
  345. package/dist/render/format_number.d.ts.map +1 -0
  346. package/dist/render/format_number.js +42 -0
  347. package/dist/render/format_number.js.map +1 -0
  348. package/dist/render/html/enhancements.d.ts +10 -0
  349. package/dist/render/html/enhancements.d.ts.map +1 -0
  350. package/dist/render/html/enhancements.js +25 -0
  351. package/dist/render/html/enhancements.js.map +1 -0
  352. package/dist/render/html/envelope.d.ts +182 -0
  353. package/dist/render/html/envelope.d.ts.map +1 -0
  354. package/dist/render/html/envelope.js +214 -0
  355. package/dist/render/html/envelope.js.map +1 -0
  356. package/dist/render/html/index.d.ts +3 -0
  357. package/dist/render/html/index.d.ts.map +1 -0
  358. package/dist/render/html/index.js +8 -0
  359. package/dist/render/html/index.js.map +1 -0
  360. package/dist/render/index.d.ts +6 -0
  361. package/dist/render/index.d.ts.map +1 -0
  362. package/dist/render/index.js +11 -0
  363. package/dist/render/index.js.map +1 -0
  364. package/dist/render/layout_check.d.ts +43 -0
  365. package/dist/render/layout_check.d.ts.map +1 -0
  366. package/dist/render/layout_check.js +129 -0
  367. package/dist/render/layout_check.js.map +1 -0
  368. package/dist/render/markdown/builder.d.ts +46 -0
  369. package/dist/render/markdown/builder.d.ts.map +1 -0
  370. package/dist/render/markdown/builder.js +190 -0
  371. package/dist/render/markdown/builder.js.map +1 -0
  372. package/dist/render/markdown/envelope.d.ts +20 -0
  373. package/dist/render/markdown/envelope.d.ts.map +1 -0
  374. package/dist/render/markdown/envelope.js +29 -0
  375. package/dist/render/markdown/envelope.js.map +1 -0
  376. package/dist/render/markdown/format.d.ts +10 -0
  377. package/dist/render/markdown/format.d.ts.map +1 -0
  378. package/dist/render/markdown/format.js +202 -0
  379. package/dist/render/markdown/format.js.map +1 -0
  380. package/dist/render/markdown/index.d.ts +3 -0
  381. package/dist/render/markdown/index.d.ts.map +1 -0
  382. package/dist/render/markdown/index.js +9 -0
  383. package/dist/render/markdown/index.js.map +1 -0
  384. package/dist/render/measure_dom.d.ts +10 -0
  385. package/dist/render/measure_dom.d.ts.map +1 -0
  386. package/dist/render/measure_dom.js +57 -0
  387. package/dist/render/measure_dom.js.map +1 -0
  388. package/dist/render/payload.d.ts +16 -0
  389. package/dist/render/payload.d.ts.map +1 -0
  390. package/dist/render/payload.js +9 -0
  391. package/dist/render/payload.js.map +1 -0
  392. package/dist/render/primitive_dispatch.d.ts +72 -0
  393. package/dist/render/primitive_dispatch.d.ts.map +1 -0
  394. package/dist/render/primitive_dispatch.js +169 -0
  395. package/dist/render/primitive_dispatch.js.map +1 -0
  396. package/dist/render/react/content.d.ts +40 -0
  397. package/dist/render/react/content.d.ts.map +1 -0
  398. package/dist/render/react/content.js +39 -0
  399. package/dist/render/react/content.js.map +1 -0
  400. package/dist/render/react/enhancements.d.ts +15 -0
  401. package/dist/render/react/enhancements.d.ts.map +1 -0
  402. package/dist/render/react/enhancements.js +28 -0
  403. package/dist/render/react/enhancements.js.map +1 -0
  404. package/dist/render/react/index.d.ts +3 -0
  405. package/dist/render/react/index.d.ts.map +1 -0
  406. package/dist/render/react/index.js +9 -0
  407. package/dist/render/react/index.js.map +1 -0
  408. package/dist/render/slack/assets.d.ts +16 -0
  409. package/dist/render/slack/assets.d.ts.map +1 -0
  410. package/dist/render/slack/assets.js +40 -0
  411. package/dist/render/slack/assets.js.map +1 -0
  412. package/dist/render/slack/blocks.d.ts +72 -0
  413. package/dist/render/slack/blocks.d.ts.map +1 -0
  414. package/dist/render/slack/blocks.js +77 -0
  415. package/dist/render/slack/blocks.js.map +1 -0
  416. package/dist/render/slack/envelope.d.ts +52 -0
  417. package/dist/render/slack/envelope.d.ts.map +1 -0
  418. package/dist/render/slack/envelope.js +547 -0
  419. package/dist/render/slack/envelope.js.map +1 -0
  420. package/dist/render/slack/format.d.ts +70 -0
  421. package/dist/render/slack/format.d.ts.map +1 -0
  422. package/dist/render/slack/format.js +209 -0
  423. package/dist/render/slack/format.js.map +1 -0
  424. package/dist/render/slack/index.d.ts +6 -0
  425. package/dist/render/slack/index.d.ts.map +1 -0
  426. package/dist/render/slack/index.js +12 -0
  427. package/dist/render/slack/index.js.map +1 -0
  428. package/dist/render/slack/markdown_content.d.ts +17 -0
  429. package/dist/render/slack/markdown_content.d.ts.map +1 -0
  430. package/dist/render/slack/markdown_content.js +404 -0
  431. package/dist/render/slack/markdown_content.js.map +1 -0
  432. package/dist/render/text/envelope.d.ts +15 -0
  433. package/dist/render/text/envelope.d.ts.map +1 -0
  434. package/dist/render/text/envelope.js +17 -0
  435. package/dist/render/text/envelope.js.map +1 -0
  436. package/dist/render/text/index.d.ts +2 -0
  437. package/dist/render/text/index.d.ts.map +1 -0
  438. package/dist/render/text/index.js +8 -0
  439. package/dist/render/text/index.js.map +1 -0
  440. package/dist/testing/conformance.d.ts +145 -0
  441. package/dist/testing/conformance.d.ts.map +1 -0
  442. package/dist/testing/conformance.js +303 -0
  443. package/dist/testing/conformance.js.map +1 -0
  444. package/dist/testing/icon.d.ts +11 -0
  445. package/dist/testing/icon.d.ts.map +1 -0
  446. package/dist/testing/icon.js +244 -0
  447. package/dist/testing/icon.js.map +1 -0
  448. package/dist/testing/index.d.ts +4 -0
  449. package/dist/testing/index.d.ts.map +1 -0
  450. package/dist/testing/index.js +10 -0
  451. package/dist/testing/index.js.map +1 -0
  452. package/dist/testing/registration.d.ts +32 -0
  453. package/dist/testing/registration.d.ts.map +1 -0
  454. package/dist/testing/registration.js +105 -0
  455. package/dist/testing/registration.js.map +1 -0
  456. package/dist/validate/authoring_schema.d.ts +33 -0
  457. package/dist/validate/authoring_schema.d.ts.map +1 -0
  458. package/dist/validate/authoring_schema.js +306 -0
  459. package/dist/validate/authoring_schema.js.map +1 -0
  460. package/dist/validate/composition_schema.d.ts +80 -0
  461. package/dist/validate/composition_schema.d.ts.map +1 -0
  462. package/dist/validate/composition_schema.js +127 -0
  463. package/dist/validate/composition_schema.js.map +1 -0
  464. package/dist/validate/index.d.ts +9 -0
  465. package/dist/validate/index.d.ts.map +1 -0
  466. package/dist/validate/index.js +15 -0
  467. package/dist/validate/index.js.map +1 -0
  468. package/dist/validate/input_budget.d.ts +35 -0
  469. package/dist/validate/input_budget.d.ts.map +1 -0
  470. package/dist/validate/input_budget.js +151 -0
  471. package/dist/validate/input_budget.js.map +1 -0
  472. package/dist/validate/json_schema.d.ts +32 -0
  473. package/dist/validate/json_schema.d.ts.map +1 -0
  474. package/dist/validate/json_schema.js +68 -0
  475. package/dist/validate/json_schema.js.map +1 -0
  476. package/dist/validate/node_issues.d.ts +12 -0
  477. package/dist/validate/node_issues.d.ts.map +1 -0
  478. package/dist/validate/node_issues.js +61 -0
  479. package/dist/validate/node_issues.js.map +1 -0
  480. package/dist/validate/url.d.ts +50 -0
  481. package/dist/validate/url.d.ts.map +1 -0
  482. package/dist/validate/url.js +107 -0
  483. package/dist/validate/url.js.map +1 -0
  484. package/dist/validate/validation.d.ts +95 -0
  485. package/dist/validate/validation.d.ts.map +1 -0
  486. package/dist/validate/validation.js +157 -0
  487. package/dist/validate/validation.js.map +1 -0
  488. package/dist/validate/value_schemas.d.ts +53 -0
  489. package/dist/validate/value_schemas.d.ts.map +1 -0
  490. package/dist/validate/value_schemas.js +50 -0
  491. package/dist/validate/value_schemas.js.map +1 -0
  492. package/package.json +119 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../../src/render/slack/blocks.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA6CH;;;GAGG;AACU,QAAA,YAAY,GAAG;IAC1B,gBAAgB,EAAE,EAAE;IACpB,sBAAsB;IACtB,gBAAgB,EAAE,IAAI;IACtB,qCAAqC;IACrC,iBAAiB,EAAE,IAAI;IACvB,uCAAuC;IACvC,mBAAmB,EAAE,IAAI;IACzB,4CAA4C;IAC5C,eAAe,EAAE,GAAG;IACpB,gBAAgB,EAAE,EAAE;IACpB,oCAAoC;IACpC,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,kFAAkF;IAClF,iBAAiB,EAAE,IAAI;IACvB,yEAAyE;IACzE,eAAe,EAAE,EAAE;IACnB,sDAAsD;IACtD,gBAAgB,EAAE,GAAG;IACrB,4DAA4D;IAC5D,kBAAkB,EAAE,CAAC;IACrB,4DAA4D;IAC5D,gBAAgB,EAAE,EAAE;IACpB,+EAA+E;IAC/E,qBAAqB,EAAE,GAAG;IAC1B,yDAAyD;IACzD,gBAAgB,EAAE,GAAG;IACrB,0BAA0B;IAC1B,gBAAgB,EAAE,IAAI;IACtB,6CAA6C;IAC7C,QAAQ,EAAE,IAAI;IACd,4CAA4C;IAC5C,aAAa,EAAE,GAAG;IAClB,6CAA6C;IAC7C,qBAAqB,EAAE,CAAC;IACxB;;;;;OAKG;IACH,wBAAwB,EAAE,MAAM;IAChC,wDAAwD;IACxD,SAAS,EAAE,GAAG;IACd,iDAAiD;IACjD,YAAY,EAAE,EAAE;IAChB,oDAAoD;IACpD,aAAa,EAAE,IAAI;IACnB,mDAAmD;IACnD,iBAAiB,EAAE,IAAI;IACvB,6BAA6B;IAC7B,eAAe,EAAE,IAAI;IACrB,4DAA4D;IAC5D,eAAe,EAAE,GAAG;IACpB,kEAAkE;IAClE,qBAAqB,EAAE,GAAG;IAC1B,iEAAiE;IACjE,oBAAoB,EAAE,EAAE;IACxB,+BAA+B;IAC/B,eAAe,EAAE,EAAE;IACnB,4BAA4B;IAC5B,gBAAgB,EAAE,GAAG;IACrB,+BAA+B;IAC/B,qBAAqB,EAAE,EAAE;CACjB,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 type {\n SlackActionElement,\n SlackActionsBlock,\n SlackBlock,\n SlackButtonElement,\n SlackCheckboxesElement,\n SlackContextBlock,\n SlackDividerBlock,\n SlackFileReference,\n SlackHeaderBlock,\n SlackHeaderLevel,\n SlackImageBlock,\n SlackImageElement,\n SlackMrkdwnTextObject,\n SlackMultiStaticSelectElement,\n SlackOptionGroup,\n SlackOptionObject,\n SlackOverflowElement,\n SlackPlainTextObject,\n SlackRadioButtonsElement,\n SlackRawTextElement,\n SlackRichTextBlock,\n SlackRichTextBlockElement,\n SlackRichTextInline,\n SlackRichTextLink,\n SlackRichTextList,\n SlackRichTextPreformatted,\n SlackRichTextQuote,\n SlackRichTextSection,\n SlackRichTextStyle,\n SlackRichTextTag,\n SlackRichTextText,\n SlackSectionAccessory,\n SlackSectionBlock,\n SlackStaticSelectElement,\n SlackTableBlock,\n SlackTableCell,\n SlackTableColumnSetting,\n SlackTagColor,\n SlackTextObject,\n SlackVideoBlock,\n} from '../../define/slack_blocks';\n\n/**\n * Slack's published surface limits, enforced by the renderer so a composition\n * cannot silently trip Slack's validation.\n */\nexport const SLACK_LIMITS = {\n blocksPerMessage: 50,\n /** `section.text`. */\n sectionTextChars: 3000,\n /** One entry of `section.fields`. */\n sectionFieldChars: 2000,\n /** One entry of `context.elements`. */\n contextElementChars: 2000,\n /** `header.text`, which is `plain_text`. */\n headerTextChars: 150,\n fieldsPerSection: 10,\n /** Elements per `context` block. */\n contextElements: 10,\n buttonsPerActions: 25,\n /** Slack truncates the top-level `text` fallback in notifications around here. */\n fallbackTextChars: 4000,\n /** `plain_text` option labels (selects, radio, checkboxes, overflow). */\n optionTextChars: 75,\n /** Options per select, or per option group of one. */\n optionsPerSelect: 100,\n /** Options per overflow menu (Slack caps overflow at 5). */\n optionsPerOverflow: 5,\n /** Options per radio button group or checkboxes element. */\n optionsPerChoice: 10,\n /** Option groups per select, each holding up to `optionsPerSelect` options. */\n optionGroupsPerSelect: 100,\n /** An option's `value`, which interactions send back. */\n optionValueChars: 150,\n /** A button's `value`. */\n buttonValueChars: 2000,\n /** A button's or overflow option's `url`. */\n urlChars: 3000,\n /** An interactive element's `action_id`. */\n actionIdChars: 255,\n /** Max indent level for `rich_text_list`. */\n richTextListMaxIndent: 8,\n /**\n * Characters across every table cell in one message. Slack publishes the\n * same 10,000 figure per table and per message, so the message-wide\n * aggregate is the binding one.\n * https://docs.slack.dev/reference/block-kit/blocks/table-block/\n */\n tableCellCharsPerMessage: 10_000,\n /** Rows per `table` block (includes the header row). */\n tableRows: 100,\n /** Cells per `table` row / columns per table. */\n tableColumns: 20,\n /** `image`/image-element `image_url` max length. */\n imageUrlChars: 3000,\n /** `image`/image-element `alt_text` max length. */\n imageAltTextChars: 2000,\n /** `image` block `title`. */\n imageTitleChars: 2000,\n /** `video` block `title`; Slack requires fewer than 200. */\n videoTitleChars: 199,\n /** `video` block `description`; Slack requires fewer than 200. */\n videoDescriptionChars: 199,\n /** `video` block `author_name`; Slack requires fewer than 50. */\n videoAuthorNameChars: 49,\n /** `button` element `text`. */\n buttonTextChars: 75,\n /** Select `placeholder`. */\n placeholderChars: 150,\n /** `option_groups[].label`. */\n optionGroupLabelChars: 75,\n} as const;\n"]}
@@ -0,0 +1,551 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.renderSlackEnvelope = void 0;
10
+ const envelope_1 = require("../text/envelope");
11
+ const assets_1 = require("./assets");
12
+ const blocks_1 = require("./blocks");
13
+ const format_1 = require("./format");
14
+ /**
15
+ * The composition as a `chat.postMessage` payload: notification `text`, blocks,
16
+ * and the images the host must upload first.
17
+ *
18
+ * Degradation for a node with no `slack` renderer is the dispatcher's, which
19
+ * has to own it to reach a child nested inside a container. The result is
20
+ * fitted to Slack's limits — text is clamped, blocks past a count limit and
21
+ * `rich_text` elements past a section's limit split, tables past a table limit
22
+ * or the message's cell budget become rich text, spacers and then whole blocks
23
+ * are dropped — so the output is always postable. `assets` stays empty
24
+ * unless `collectAssets` is set.
25
+ */
26
+ const renderSlackEnvelope = (composition, dispatcher, options = {}) => {
27
+ const blocks = [];
28
+ // The collector is opt-in: without it, charts keep their markdown/text
29
+ // degradation and non-reachable images degrade to a link/text section, so
30
+ // default output is safe for callers that cannot upload files.
31
+ const collector = options.collectAssets
32
+ ? (0, assets_1.createSlackAssetCollector)(options.assetPrefix === undefined ? {} : { prefix: options.assetPrefix })
33
+ : undefined;
34
+ const { heading = true } = options;
35
+ if (heading && composition.title) {
36
+ blocks.push(headerBlock(composition.title, 1));
37
+ }
38
+ if (heading && composition.subtitle) {
39
+ blocks.push(contextBlock([(0, format_1.escapeMrkdwn)(composition.subtitle)]));
40
+ }
41
+ for (const node of composition.body) {
42
+ blocks.push(...dispatcher.renderSlack(node, collector).flatMap(fitBlock));
43
+ }
44
+ // Split after the rhythm, so the fragments of one block read as one.
45
+ const rhythm = applySectionRhythm(coalesceFieldSections(enforceTableLimits(blocks))).flatMap(splitBlockCounts);
46
+ const budgeted = enforceBlockBudget(rhythm);
47
+ // Only ask the host to upload assets whose placeholder block survived the
48
+ // budget; blocks elided by `enforceBlockBudget` are never posted, so
49
+ // uploading their files would be wasted (and orphaned) work.
50
+ const keptRefs = collectSlackFileRefs(budgeted);
51
+ return {
52
+ text: (0, format_1.clampMrkdwn)(options.text ??
53
+ (0, format_1.escapeMrkdwn)((0, envelope_1.renderTextEnvelope)(composition, dispatcher, { heading })), blocks_1.SLACK_LIMITS.fallbackTextChars),
54
+ blocks: budgeted,
55
+ assets: collector
56
+ ? collector.requests.filter((request) => keptRefs.has(request.ref))
57
+ : [],
58
+ };
59
+ };
60
+ exports.renderSlackEnvelope = renderSlackEnvelope;
61
+ const clampText = (text, max) => text.text.length <= max
62
+ ? text
63
+ : {
64
+ ...text,
65
+ text: (text.type === 'mrkdwn' ? format_1.clampMrkdwn : format_1.clampSlackText)(text.text, max),
66
+ };
67
+ const fitsImageUrl = ({ image_url }) => image_url === undefined || image_url.length <= blocks_1.SLACK_LIMITS.imageUrlChars;
68
+ const clampAlt = (image) => image.alt_text.length <= blocks_1.SLACK_LIMITS.imageAltTextChars
69
+ ? image
70
+ : {
71
+ ...image,
72
+ alt_text: (0, format_1.clampSlackText)(image.alt_text, blocks_1.SLACK_LIMITS.imageAltTextChars),
73
+ };
74
+ // A cut URL would point somewhere else, so one past the limit is dropped.
75
+ const withoutLongUrl = (element) => {
76
+ if (element.url === undefined ||
77
+ element.url.length <= blocks_1.SLACK_LIMITS.urlChars) {
78
+ return element;
79
+ }
80
+ const { url: _dropped, ...rest } = element;
81
+ return rest;
82
+ };
83
+ const optionValue = (value) => (0, format_1.cutSlackValue)(value, blocks_1.SLACK_LIMITS.optionValueChars);
84
+ const clampOption = (option) => withoutLongUrl({
85
+ ...option,
86
+ text: clampText(option.text, blocks_1.SLACK_LIMITS.optionTextChars),
87
+ value: optionValue(option.value),
88
+ ...(option.description && {
89
+ description: clampText(option.description, blocks_1.SLACK_LIMITS.optionTextChars),
90
+ }),
91
+ });
92
+ const clampControl = (element) => {
93
+ const actionId = element.action_id === undefined
94
+ ? {}
95
+ : {
96
+ action_id: (0, format_1.cutSlackValue)(element.action_id, blocks_1.SLACK_LIMITS.actionIdChars),
97
+ };
98
+ if (element.type === 'button') {
99
+ return withoutLongUrl({
100
+ ...element,
101
+ ...actionId,
102
+ text: clampText(element.text, blocks_1.SLACK_LIMITS.buttonTextChars),
103
+ ...(element.value !== undefined && {
104
+ value: (0, format_1.cutSlackValue)(element.value, blocks_1.SLACK_LIMITS.buttonValueChars),
105
+ }),
106
+ });
107
+ }
108
+ const menu = { ...element, ...actionId };
109
+ const maxOptions = menu.type === 'overflow'
110
+ ? blocks_1.SLACK_LIMITS.optionsPerOverflow
111
+ : menu.type === 'radio_buttons' || menu.type === 'checkboxes'
112
+ ? blocks_1.SLACK_LIMITS.optionsPerChoice
113
+ : blocks_1.SLACK_LIMITS.optionsPerSelect;
114
+ if (menu.options) {
115
+ menu.options = menu.options.slice(0, maxOptions).map(clampOption);
116
+ }
117
+ if ('placeholder' in menu && menu.placeholder) {
118
+ menu.placeholder = clampText(menu.placeholder, blocks_1.SLACK_LIMITS.placeholderChars);
119
+ }
120
+ if ('option_groups' in menu && menu.option_groups) {
121
+ menu.option_groups = menu.option_groups
122
+ .slice(0, blocks_1.SLACK_LIMITS.optionGroupsPerSelect)
123
+ .map((group) => ({
124
+ ...group,
125
+ label: clampText(group.label, blocks_1.SLACK_LIMITS.optionGroupLabelChars),
126
+ options: group.options.slice(0, maxOptions).map(clampOption),
127
+ }));
128
+ }
129
+ // Slack requires an initial option to equal one it emits, so each is
130
+ // replaced by the emitted option of the same value, or dropped.
131
+ const emitted = new Map([
132
+ ...(menu.options ?? []),
133
+ ...(('option_groups' in menu && menu.option_groups) || []).flatMap(({ options }) => options),
134
+ ].map((option) => [option.value, option]));
135
+ if ('initial_option' in menu && menu.initial_option) {
136
+ const match = emitted.get(optionValue(menu.initial_option.value));
137
+ if (match) {
138
+ menu.initial_option = match;
139
+ }
140
+ else {
141
+ delete menu.initial_option;
142
+ }
143
+ }
144
+ if ('initial_options' in menu && menu.initial_options) {
145
+ const matches = menu.initial_options.flatMap(({ value }) => {
146
+ const match = emitted.get(optionValue(value));
147
+ return match ? [match] : [];
148
+ });
149
+ if (matches.length > 0) {
150
+ menu.initial_options = matches;
151
+ }
152
+ else {
153
+ delete menu.initial_options;
154
+ }
155
+ }
156
+ return menu;
157
+ };
158
+ const chunks = (items, size) => Array.from({ length: Math.ceil(items.length / size) }, (_, index) => items.slice(index * size, (index + 1) * size));
159
+ // Splits a block past a count limit into blocks of its type. Only the first
160
+ // keeps a `block_id`, which Slack requires to be unique.
161
+ const splitBlockCounts = (block) => {
162
+ switch (block.type) {
163
+ case 'context':
164
+ return chunks(block.elements, blocks_1.SLACK_LIMITS.contextElements).map((elements, index) => index === 0 ? { ...block, elements } : { type: 'context', elements });
165
+ case 'actions':
166
+ return chunks(block.elements, blocks_1.SLACK_LIMITS.buttonsPerActions).map((elements, index) => index === 0 ? { ...block, elements } : { type: 'actions', elements });
167
+ case 'section': {
168
+ if (!block.fields ||
169
+ block.fields.length <= blocks_1.SLACK_LIMITS.fieldsPerSection) {
170
+ return [block];
171
+ }
172
+ return chunks(block.fields, blocks_1.SLACK_LIMITS.fieldsPerSection).map((fields, index) => index === 0 ? { ...block, fields } : { type: 'section', fields });
173
+ }
174
+ default:
175
+ return [block];
176
+ }
177
+ };
178
+ // An image whose URL Slack would reject leaves its alt text.
179
+ const fitImageUrls = (block) => {
180
+ switch (block.type) {
181
+ case 'image':
182
+ return fitsImageUrl(block)
183
+ ? [block]
184
+ : block.alt_text
185
+ ? [contextBlock([(0, format_1.escapeMrkdwn)(block.alt_text)])]
186
+ : [];
187
+ case 'context':
188
+ return [
189
+ {
190
+ ...block,
191
+ elements: block.elements.flatMap((element) => element.type !== 'image' || fitsImageUrl(element)
192
+ ? [element]
193
+ : element.alt_text
194
+ ? [{ type: 'mrkdwn', text: (0, format_1.escapeMrkdwn)(element.alt_text) }]
195
+ : []),
196
+ },
197
+ ];
198
+ case 'section': {
199
+ if (block.accessory?.type !== 'image' || fitsImageUrl(block.accessory)) {
200
+ return [block];
201
+ }
202
+ const { accessory, ...rest } = block;
203
+ return accessory.alt_text
204
+ ? [rest, contextBlock([(0, format_1.escapeMrkdwn)(accessory.alt_text)])]
205
+ : [rest];
206
+ }
207
+ default:
208
+ return [block];
209
+ }
210
+ };
211
+ const fitBlock = (block) => fitImageUrls(block).map(clampBlockText);
212
+ // Pack renderers build their own blocks, and one overlong text makes Slack
213
+ // reject the whole message.
214
+ const clampBlockText = (block) => {
215
+ switch (block.type) {
216
+ case 'header':
217
+ return {
218
+ ...block,
219
+ text: clampText(block.text, blocks_1.SLACK_LIMITS.headerTextChars),
220
+ };
221
+ case 'section':
222
+ return {
223
+ ...block,
224
+ ...(block.text && {
225
+ text: clampText(block.text, blocks_1.SLACK_LIMITS.sectionTextChars),
226
+ }),
227
+ ...(block.fields && {
228
+ fields: block.fields.map((field) => clampText(field, blocks_1.SLACK_LIMITS.sectionFieldChars)),
229
+ }),
230
+ ...(block.accessory && {
231
+ accessory: block.accessory.type === 'image'
232
+ ? clampAlt(block.accessory)
233
+ : clampControl(block.accessory),
234
+ }),
235
+ };
236
+ case 'rich_text':
237
+ return {
238
+ ...block,
239
+ elements: block.elements.flatMap(splitRichTextElement),
240
+ };
241
+ case 'context':
242
+ return {
243
+ ...block,
244
+ elements: block.elements.map((element) => element.type === 'image'
245
+ ? clampAlt(element)
246
+ : clampText(element, blocks_1.SLACK_LIMITS.contextElementChars)),
247
+ };
248
+ case 'image':
249
+ return {
250
+ ...clampAlt(block),
251
+ ...(block.title && {
252
+ title: clampText(block.title, blocks_1.SLACK_LIMITS.imageTitleChars),
253
+ }),
254
+ };
255
+ case 'video':
256
+ return {
257
+ ...block,
258
+ title: clampText(block.title, blocks_1.SLACK_LIMITS.videoTitleChars),
259
+ ...(block.description && {
260
+ description: clampText(block.description, blocks_1.SLACK_LIMITS.videoDescriptionChars),
261
+ }),
262
+ ...(block.author_name !== undefined && {
263
+ author_name: (0, format_1.clampSlackText)(block.author_name, blocks_1.SLACK_LIMITS.videoAuthorNameChars),
264
+ }),
265
+ };
266
+ case 'actions':
267
+ return { ...block, elements: block.elements.map(clampControl) };
268
+ default:
269
+ return block;
270
+ }
271
+ };
272
+ const collectSlackFileRefs = (blocks) => {
273
+ const refs = new Set();
274
+ for (const block of blocks) {
275
+ if (block.type === 'image' && block.slack_file?.ref !== undefined) {
276
+ refs.add(block.slack_file.ref);
277
+ }
278
+ }
279
+ return refs;
280
+ };
281
+ const headerBlock = (title, level) => ({
282
+ type: 'header',
283
+ text: { type: 'plain_text', text: (0, format_1.formatHeaderText)(title), emoji: true },
284
+ ...(level !== undefined ? { level } : {}),
285
+ });
286
+ const contextBlock = (lines) => ({
287
+ type: 'context',
288
+ elements: lines
289
+ .filter((line) => line !== undefined && line.length > 0)
290
+ .map((text) => ({
291
+ type: 'mrkdwn',
292
+ text: (0, format_1.clampMrkdwn)(text, blocks_1.SLACK_LIMITS.contextElementChars),
293
+ })),
294
+ });
295
+ const SLACK_SPACER_TEXT = ' ';
296
+ const slackSpacerBlock = () => ({
297
+ type: 'section',
298
+ text: { type: 'mrkdwn', text: SLACK_SPACER_TEXT },
299
+ });
300
+ const isSpacer = (block) => block.type === 'section' &&
301
+ block.text?.type === 'mrkdwn' &&
302
+ block.text.text === SLACK_SPACER_TEXT &&
303
+ block.fields === undefined &&
304
+ block.accessory === undefined;
305
+ const isFieldsOnly = (block) => block.type === 'section' &&
306
+ (block.fields?.length ?? 0) > 0 &&
307
+ block.text === undefined &&
308
+ block.accessory === undefined;
309
+ const isContent = (block) => block.type !== 'header' &&
310
+ block.type !== 'divider' &&
311
+ block.type !== 'actions' &&
312
+ block.type !== 'context' &&
313
+ !isSpacer(block);
314
+ // Consecutive 1-field sections pack into Slack's two-column `fields` grid.
315
+ // A section that already has 2+ fields is a finished batch (e.g. a
316
+ // description list) and is left alone.
317
+ const coalesceFieldSections = (blocks) => {
318
+ const out = [];
319
+ let index = 0;
320
+ while (index < blocks.length) {
321
+ const block = blocks[index];
322
+ if (isFieldsOnly(block) && block.fields?.length === 1) {
323
+ const fields = [...block.fields];
324
+ index += 1;
325
+ while (index < blocks.length) {
326
+ const next = blocks[index];
327
+ if (!isFieldsOnly(next) ||
328
+ next.fields.length !== 1 ||
329
+ fields.length >= blocks_1.SLACK_LIMITS.fieldsPerSection) {
330
+ break;
331
+ }
332
+ fields.push(...next.fields);
333
+ index += 1;
334
+ }
335
+ out.push({ type: 'section', fields });
336
+ continue;
337
+ }
338
+ out.push(block);
339
+ index += 1;
340
+ }
341
+ return out;
342
+ };
343
+ // Divider before every section heading (and trailing actions) after the
344
+ // composition title; spacer after each content run except a table already
345
+ // about to be followed by a divider. Consecutive field-only sections are
346
+ // not spaced — they read as one grid.
347
+ const applySectionRhythm = (blocks) => {
348
+ if (blocks.length === 0) {
349
+ return [];
350
+ }
351
+ const out = [];
352
+ for (let index = 0; index < blocks.length; index += 1) {
353
+ const block = blocks[index];
354
+ const prev = out[out.length - 1];
355
+ const needsDividerBefore = (block.type === 'header' && out.length > 0) || block.type === 'actions';
356
+ if (needsDividerBefore && prev && prev.type !== 'divider') {
357
+ if (isContent(prev) && prev.type !== 'table') {
358
+ out.push(slackSpacerBlock());
359
+ }
360
+ out.push({ type: 'divider' });
361
+ }
362
+ out.push(block);
363
+ if (isContent(block) && index + 1 < blocks.length) {
364
+ const next = blocks[index + 1];
365
+ if (isContent(next) && !(isFieldsOnly(block) && isFieldsOnly(next))) {
366
+ out.push(slackSpacerBlock());
367
+ }
368
+ }
369
+ }
370
+ return out;
371
+ };
372
+ const truncateWithNotice = (blocks) => {
373
+ const kept = blocks.slice(0, blocks_1.SLACK_LIMITS.blocksPerMessage - 1);
374
+ const dropped = blocks.length - kept.length;
375
+ kept.push(contextBlock([
376
+ (0, format_1.italic)(`+${dropped} more blocks elided to fit Slack's limit.`),
377
+ ]));
378
+ return kept;
379
+ };
380
+ const richTextInlineText = (inline) => inline.type === 'link' ? (inline.text ?? inline.url) : inline.text;
381
+ const richTextElementText = (element) => element.type === 'rich_text_list'
382
+ ? element.elements.map(richTextElementText).join('')
383
+ : element.elements.map(richTextInlineText).join('');
384
+ const tableCellText = (cell) => cell.type === 'raw_text'
385
+ ? cell.text
386
+ : cell.elements.map(richTextElementText).join('');
387
+ const tableCharCount = (block) => block.rows.reduce((total, row) => total + row.reduce((sum, cell) => sum + tableCellText(cell).length, 0), 0);
388
+ const textRun = (text) => ({ type: 'text', text });
389
+ const richSection = (elements) => ({ type: 'rich_text_section', elements });
390
+ const rowBreak = () => richSection([textRun('\n')]);
391
+ const cellElements = (cell) => {
392
+ if (cell?.type === 'rich_text') {
393
+ return cell.elements.filter(({ elements }) => elements.length > 0);
394
+ }
395
+ return cell?.text ? [richSection([textRun(cell.text)])] : [];
396
+ };
397
+ const boldInline = (inline) => ({
398
+ ...inline,
399
+ style: { ...inline.style, bold: true },
400
+ });
401
+ const boldElement = (element) => element.type === 'rich_text_list'
402
+ ? {
403
+ ...element,
404
+ elements: element.elements.map((item) => ({
405
+ ...item,
406
+ elements: item.elements.map(boldInline),
407
+ })),
408
+ }
409
+ : { ...element, elements: element.elements.map(boldInline) };
410
+ const isBlank = (cell) => cell === undefined || tableCellText(cell).trim() === '';
411
+ // A one-section heading leads its cell as `heading: `; any other heading keeps
412
+ // its blocks, bold, above the cell. A blank heading leaves the cell alone.
413
+ const columnElements = (heading, cell) => {
414
+ const body = cellElements(cell);
415
+ if (isBlank(heading)) {
416
+ return body;
417
+ }
418
+ const head = cellElements(heading);
419
+ const [only] = head;
420
+ if (head.length !== 1 || only?.type !== 'rich_text_section') {
421
+ return [...head.map(boldElement), ...body];
422
+ }
423
+ const lead = [...only.elements.map(boldInline), textRun(': ')];
424
+ const [first, ...rest] = body;
425
+ return first?.type === 'rich_text_section'
426
+ ? [richSection([...lead, ...first.elements]), ...rest]
427
+ : [richSection(lead), ...body];
428
+ };
429
+ const endsLine = (element) => /[\n\r\u2028\u2029]$/u.test(richTextElementText(element));
430
+ // Slack runs adjacent sections together, so a section followed by another ends
431
+ // its line unless its rendered text already does.
432
+ const breakSections = (elements) => elements.map((element, index) => element.type === 'rich_text_section' &&
433
+ elements[index + 1]?.type === 'rich_text_section' &&
434
+ !endsLine(element)
435
+ ? richSection([...element.elements, textRun('\n')])
436
+ : element);
437
+ // Graphemes, and the code points of any grapheme past `max`.
438
+ const textUnits = (text, max) => Array.from(new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text), ({ segment }) => (segment.length > max ? Array.from(segment) : [segment])).flat();
439
+ /**
440
+ * A section, quote, or preformatted element past `sectionTextChars` as adjacent ones of its type, with nothing added between them; a list comes back as is.
441
+ * A link or tag no longer than that stays whole; anything longer splits at grapheme boundaries into inlines of its own type, a link's label (or URL) across links to the same URL.
442
+ */
443
+ const splitRichTextElement = (element) => {
444
+ const max = blocks_1.SLACK_LIMITS.sectionTextChars;
445
+ if (element.type === 'rich_text_list' ||
446
+ richTextElementText(element).length <= max) {
447
+ return [element];
448
+ }
449
+ const chunks = [];
450
+ let chunk = [];
451
+ let room = max;
452
+ const flush = () => {
453
+ if (chunk.length > 0) {
454
+ chunks.push(chunk);
455
+ }
456
+ chunk = [];
457
+ room = max;
458
+ };
459
+ for (const inline of element.elements) {
460
+ const whole = richTextInlineText(inline);
461
+ if (inline.type !== 'text' && whole.length <= max) {
462
+ if (whole.length > room) {
463
+ flush();
464
+ }
465
+ chunk.push(inline);
466
+ room -= whole.length;
467
+ continue;
468
+ }
469
+ let text = '';
470
+ for (const unit of textUnits(whole, max)) {
471
+ if (text.length + unit.length > room) {
472
+ if (text) {
473
+ chunk.push({ ...inline, text });
474
+ }
475
+ flush();
476
+ text = '';
477
+ }
478
+ text += unit;
479
+ }
480
+ if (text) {
481
+ chunk.push({ ...inline, text });
482
+ room -= text.length;
483
+ }
484
+ }
485
+ flush();
486
+ return chunks.map((elements) => ({ ...element, elements }));
487
+ };
488
+ // A table Slack would reject is replaced by one `rich_text` block. Each row's
489
+ // columns run `heading: cell` to the wider of the header and the row, and a
490
+ // blank section parts the rows. A cell keeps its inlines, styles, and blocks; a
491
+ // table whose rows past the header have no cells prints its headings, and one
492
+ // with nothing to print is dropped.
493
+ const degradeTable = ({ rows: [header = [], ...body], }) => {
494
+ const rows = body.filter((row) => row.length > 0);
495
+ const pieces = rows.length === 0
496
+ ? [
497
+ header
498
+ .filter((heading) => !isBlank(heading))
499
+ .flatMap((heading) => cellElements(heading).map(boldElement)),
500
+ ]
501
+ : rows.map((row) => Array.from({ length: Math.max(header.length, row.length) }, (_, column) => columnElements(header[column], row[column])).flat());
502
+ const elements = pieces
503
+ .filter((piece) => piece.length > 0)
504
+ .flatMap((piece, index) => (index > 0 ? [rowBreak(), ...piece] : piece));
505
+ return elements.length === 0
506
+ ? []
507
+ : [
508
+ {
509
+ type: 'rich_text',
510
+ elements: breakSections(elements).flatMap(splitRichTextElement),
511
+ },
512
+ ];
513
+ };
514
+ const fitsTableShape = ({ rows }) => rows.length > 0 &&
515
+ rows.length <= blocks_1.SLACK_LIMITS.tableRows &&
516
+ rows.every((row) => row.length > 0 && row.length <= blocks_1.SLACK_LIMITS.tableColumns);
517
+ // Slack counts table cell characters across the whole message, not per block,
518
+ // so a composition whose tables individually fit can still be rejected. In
519
+ // document order, a table is kept if its shape fits and its cells fit what the
520
+ // kept ones left.
521
+ const enforceTableLimits = (blocks) => {
522
+ let spent = 0;
523
+ return blocks.flatMap((block) => {
524
+ if (block.type !== 'table') {
525
+ return [block];
526
+ }
527
+ const cost = tableCharCount(block);
528
+ if (fitsTableShape(block) &&
529
+ spent + cost <= blocks_1.SLACK_LIMITS.tableCellCharsPerMessage) {
530
+ spent += cost;
531
+ return [block];
532
+ }
533
+ return degradeTable(block);
534
+ });
535
+ };
536
+ const enforceBlockBudget = (blocks) => {
537
+ if (blocks.length <= blocks_1.SLACK_LIMITS.blocksPerMessage) {
538
+ return blocks;
539
+ }
540
+ const trimmed = [...blocks];
541
+ for (let index = trimmed.length - 1; index >= 0 && trimmed.length > blocks_1.SLACK_LIMITS.blocksPerMessage; index -= 1) {
542
+ if (isSpacer(trimmed[index])) {
543
+ trimmed.splice(index, 1);
544
+ }
545
+ }
546
+ if (trimmed.length <= blocks_1.SLACK_LIMITS.blocksPerMessage) {
547
+ return trimmed;
548
+ }
549
+ return truncateWithNotice(trimmed);
550
+ };
551
+ //# sourceMappingURL=envelope.js.map