@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":"index.d.ts","sourceRoot":"","sources":["../../../src/render/html/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ export { renderHTMLWithDispatcher, } from './envelope.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/html/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAOL,wBAAwB,GACzB,MAAM,YAAY,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 EnhancementDefinition } from './enhancements';\nexport {\n type HTMLDispatcherRenderOptions,\n type HTMLEnhancementScope,\n type HTMLRenderDispatcher,\n type HTMLRenderOptions,\n type HTMLRenderResult,\n type HTMLStyleAdapter,\n renderHTMLWithDispatcher,\n} from './envelope';\n"]}
@@ -0,0 +1,6 @@
1
+ export { LAYOUT_ROOM_ATTRIBUTE, NODE_ANCHOR_ATTRIBUTE, layoutRoom, nodeAnchor, withNodeAnchors, withoutAnchors, } from './anchors.js';
2
+ export { type FormatDisplayValueOptions, formatDisplayValue, isStructuredValue, rawDisplayValue, } from './format_display_value.js';
3
+ export { type LayoutBox, type LayoutFinding, type LayoutRect, checkLayout, } from './layout_check.js';
4
+ export { type PayloadMeasurement } from './payload.js';
5
+ export { type PrimitiveDispatcher, type PrimitiveDispatcherOptions, createPrimitiveDispatcher, } from './primitive_dispatch.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,UAAU,EACV,eAAe,EACf,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,yBAAyB,EAC9B,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ export { LAYOUT_ROOM_ATTRIBUTE, NODE_ANCHOR_ATTRIBUTE, layoutRoom, nodeAnchor, withNodeAnchors, withoutAnchors, } from './anchors.js';
8
+ export { formatDisplayValue, isStructuredValue, rawDisplayValue, } from './format_display_value.js';
9
+ export { checkLayout, } from './layout_check.js';
10
+ export { createPrimitiveDispatcher, } from './primitive_dispatch.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,UAAU,EACV,eAAe,EACf,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAEL,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAIL,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAGL,yBAAyB,GAC1B,MAAM,sBAAsB,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 LAYOUT_ROOM_ATTRIBUTE,\n NODE_ANCHOR_ATTRIBUTE,\n layoutRoom,\n nodeAnchor,\n withNodeAnchors,\n withoutAnchors,\n} from './anchors';\nexport {\n type FormatDisplayValueOptions,\n formatDisplayValue,\n isStructuredValue,\n rawDisplayValue,\n} from './format_display_value';\nexport {\n type LayoutBox,\n type LayoutFinding,\n type LayoutRect,\n checkLayout,\n} from './layout_check';\nexport { type PayloadMeasurement } from './payload';\nexport {\n type PrimitiveDispatcher,\n type PrimitiveDispatcherOptions,\n createPrimitiveDispatcher,\n} from './primitive_dispatch';\n"]}
@@ -0,0 +1,43 @@
1
+ import type { ChildNodeWalker } from '../composition/body_node_base.js';
2
+ /** A rectangle on the canvas, in pixels. */
3
+ export interface LayoutRect {
4
+ readonly x: number;
5
+ readonly y: number;
6
+ readonly width: number;
7
+ readonly height: number;
8
+ }
9
+ /** A laid-out element and the elements nested in it, as a layout engine measures them. */
10
+ export interface LayoutBox extends LayoutRect {
11
+ /** Absent means unscaled. */
12
+ readonly scale?: number;
13
+ /** Text laid out in the box. */
14
+ readonly runs?: readonly LayoutRect[];
15
+ /** Where a {@link NODE_ANCHOR_ATTRIBUTE} is read from. */
16
+ readonly attributes?: Readonly<Record<string, string>>;
17
+ readonly children: readonly LayoutBox[];
18
+ }
19
+ /** A node drawn past the room its container gives it, or onto a sibling, by `by` pixels. */
20
+ export interface LayoutFinding {
21
+ kind: 'overflow' | 'overlap';
22
+ /** In validation's form, e.g. `body[1].items[0]`. */
23
+ path: string;
24
+ type: string;
25
+ /** The sibling an `overlap` lands on. */
26
+ with?: {
27
+ path: string;
28
+ type: string;
29
+ };
30
+ by: number;
31
+ }
32
+ /**
33
+ * Where the nodes of `body` run past their room or onto each other in
34
+ * `layout`, a measured render on `surface` with node anchors on. Empty when
35
+ * nothing does.
36
+ *
37
+ * A node's room is the box of its nearest anchored or `layoutRoom` ancestor,
38
+ * or `layout` at the top level, and only siblings under one room are
39
+ * compared. Nothing inside a scaled box is checked. A finding is advice, not an error:
40
+ * an overlap may be intended.
41
+ */
42
+ export declare const checkLayout: (layout: LayoutBox, body: readonly unknown[], walk: ChildNodeWalker, surface: "react" | "snapshot") => LayoutFinding[];
43
+ //# sourceMappingURL=layout_check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout_check.d.ts","sourceRoot":"","sources":["../../src/render/layout_check.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAUrE,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,0FAA0F;AAC1F,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;CACzC;AAED,4FAA4F;AAC5F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;CACZ;AAqFD;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,SAAS,EACjB,MAAM,SAAS,OAAO,EAAE,EACxB,MAAM,eAAe,EACrB,SAAS,OAAO,GAAG,UAAU,KAC5B,aAAa,EAgFf,CAAC"}
@@ -0,0 +1,129 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ import { anchoredNodePaths, LAYOUT_ROOM_ATTRIBUTE, NODE_ANCHOR_ATTRIBUTE, nodeType, pairAnchors, } from './anchors.js';
8
+ // Sub-pixel rounding reads as overflow without it.
9
+ const tolerance = 1;
10
+ const isScaled = ({ scale = 1 }) => Math.abs(scale - 1) > 0.001;
11
+ const hasArea = ({ width, height }) => width > 0 && height > 0;
12
+ /** Every anchored box, pre-order, including those inside a scaled box, so a type's count matches its nodes. */
13
+ const anchoredBoxes = (box) => {
14
+ const value = box.attributes?.[NODE_ANCHOR_ATTRIBUTE];
15
+ return [
16
+ ...(value === undefined ? [] : [[value, box]]),
17
+ ...box.children.flatMap(anchoredBoxes),
18
+ ];
19
+ };
20
+ const roomBoxes = (box) => [
21
+ ...(box.attributes?.[LAYOUT_ROOM_ATTRIBUTE] === undefined ? [] : [box]),
22
+ ...box.children.flatMap(roomBoxes),
23
+ ];
24
+ /**
25
+ * The element boxes a node's own content fills: its box and those under it,
26
+ * down to the nodes nested in it. Text runs are left out because glyphs
27
+ * overhang a tight line height; a scaled box counts as itself alone.
28
+ */
29
+ const ownBoxes = (box, nested) => [
30
+ box,
31
+ ...(isScaled(box)
32
+ ? []
33
+ : box.children.flatMap((child) => nested.has(child) ? [] : ownBoxes(child, nested))),
34
+ ];
35
+ /** What a box paints: its text, or itself when it holds nothing else, like a dot or a rule. */
36
+ const painted = (box) => {
37
+ if (isScaled(box)) {
38
+ return [box];
39
+ }
40
+ const own = box.runs && box.runs.length > 0
41
+ ? box.runs
42
+ : box.children.length === 0
43
+ ? [box]
44
+ : [];
45
+ return [...own.filter(hasArea), ...box.children.flatMap(painted)];
46
+ };
47
+ const pastRoom = (room, { x, y, width, height }) => Math.max(room.x - x, room.y - y, x + width - (room.x + room.width), y + height - (room.y + room.height));
48
+ /** How far `a` and `b` would have to move apart, along one axis, to clear each other. */
49
+ const overlapOf = (a, b) => {
50
+ const width = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);
51
+ const height = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);
52
+ if (width <= tolerance || height <= tolerance) {
53
+ return 0;
54
+ }
55
+ return Math.min(a.x + a.width - b.x, b.x + b.width - a.x, a.y + a.height - b.y, b.y + b.height - a.y);
56
+ };
57
+ /**
58
+ * Where the nodes of `body` run past their room or onto each other in
59
+ * `layout`, a measured render on `surface` with node anchors on. Empty when
60
+ * nothing does.
61
+ *
62
+ * A node's room is the box of its nearest anchored or `layoutRoom` ancestor,
63
+ * or `layout` at the top level, and only siblings under one room are
64
+ * compared. Nothing inside a scaled box is checked. A finding is advice, not an error:
65
+ * an overlap may be intended.
66
+ */
67
+ export const checkLayout = (layout, body, walk, surface) => {
68
+ const nodes = anchoredNodePaths(body, walk, surface);
69
+ const anchored = anchoredBoxes(layout);
70
+ const boxes = pairAnchors(anchored, nodes.map(({ node }) => node));
71
+ const placed = new Map();
72
+ boxes.forEach((box, index) => {
73
+ const { node, path } = nodes[index];
74
+ const type = nodeType(node);
75
+ if (box !== undefined && type !== undefined) {
76
+ placed.set(box, { box, path, type });
77
+ }
78
+ });
79
+ // Every anchored box bounds its ancestors' content, paired or not.
80
+ const nested = new Set(anchored.map(([, box]) => box));
81
+ const bounding = new Set([...nested, ...roomBoxes(layout)]);
82
+ const rooms = new Map();
83
+ const siblings = new Map();
84
+ const visit = (box, parent) => {
85
+ const node = placed.get(box);
86
+ if (node !== undefined) {
87
+ rooms.set(node, parent ?? layout);
88
+ siblings.set(parent, [...(siblings.get(parent) ?? []), node]);
89
+ }
90
+ if (!isScaled(box)) {
91
+ box.children.forEach((child) => visit(child, bounding.has(box) ? box : parent));
92
+ }
93
+ };
94
+ visit(layout, undefined);
95
+ const overflows = [...rooms].flatMap(([node, room]) => {
96
+ const by = Math.max(0, ...ownBoxes(node.box, nested)
97
+ .filter(hasArea)
98
+ .map((box) => pastRoom(room, box)));
99
+ return by > tolerance
100
+ ? [
101
+ {
102
+ kind: 'overflow',
103
+ path: node.path,
104
+ type: node.type,
105
+ by: Math.round(by),
106
+ },
107
+ ]
108
+ : [];
109
+ });
110
+ const overlaps = [...siblings.values()].flatMap((group) => {
111
+ const paints = group.map(({ box }) => painted(box));
112
+ return group.flatMap((first, i) => group.slice(i + 1).flatMap((second, offset) => {
113
+ const by = Math.max(0, ...paints[i].flatMap((a) => paints[i + 1 + offset].map((b) => overlapOf(a, b))));
114
+ return by > 0
115
+ ? [
116
+ {
117
+ kind: 'overlap',
118
+ path: first.path,
119
+ type: first.type,
120
+ with: { path: second.path, type: second.type },
121
+ by: Math.round(by),
122
+ },
123
+ ]
124
+ : [];
125
+ }));
126
+ });
127
+ return [...overflows, ...overlaps];
128
+ };
129
+ //# sourceMappingURL=layout_check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout_check.js","sourceRoot":"","sources":["../../src/render/layout_check.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\nimport type { ChildNodeWalker } from '../composition/body_node_base';\n\nimport {\n anchoredNodePaths,\n LAYOUT_ROOM_ATTRIBUTE,\n NODE_ANCHOR_ATTRIBUTE,\n nodeType,\n pairAnchors,\n} from './anchors';\n\n/** A rectangle on the canvas, in pixels. */\nexport interface LayoutRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\n/** A laid-out element and the elements nested in it, as a layout engine measures them. */\nexport interface LayoutBox extends LayoutRect {\n /** Absent means unscaled. */\n readonly scale?: number;\n /** Text laid out in the box. */\n readonly runs?: readonly LayoutRect[];\n /** Where a {@link NODE_ANCHOR_ATTRIBUTE} is read from. */\n readonly attributes?: Readonly<Record<string, string>>;\n readonly children: readonly LayoutBox[];\n}\n\n/** A node drawn past the room its container gives it, or onto a sibling, by `by` pixels. */\nexport interface LayoutFinding {\n kind: 'overflow' | 'overlap';\n /** In validation's form, e.g. `body[1].items[0]`. */\n path: string;\n type: string;\n /** The sibling an `overlap` lands on. */\n with?: { path: string; type: string };\n by: number;\n}\n\ninterface PlacedNode {\n box: LayoutBox;\n path: string;\n type: string;\n}\n\n// Sub-pixel rounding reads as overflow without it.\nconst tolerance = 1;\n\nconst isScaled = ({ scale = 1 }: LayoutBox): boolean =>\n Math.abs(scale - 1) > 0.001;\n\nconst hasArea = ({ width, height }: LayoutRect): boolean =>\n width > 0 && height > 0;\n\n/** Every anchored box, pre-order, including those inside a scaled box, so a type's count matches its nodes. */\nconst anchoredBoxes = (box: LayoutBox): [string, LayoutBox][] => {\n const value = box.attributes?.[NODE_ANCHOR_ATTRIBUTE];\n return [\n ...(value === undefined ? [] : [[value, box] as [string, LayoutBox]]),\n ...box.children.flatMap(anchoredBoxes),\n ];\n};\n\nconst roomBoxes = (box: LayoutBox): LayoutBox[] => [\n ...(box.attributes?.[LAYOUT_ROOM_ATTRIBUTE] === undefined ? [] : [box]),\n ...box.children.flatMap(roomBoxes),\n];\n\n/**\n * The element boxes a node's own content fills: its box and those under it,\n * down to the nodes nested in it. Text runs are left out because glyphs\n * overhang a tight line height; a scaled box counts as itself alone.\n */\nconst ownBoxes = (\n box: LayoutBox,\n nested: ReadonlySet<LayoutBox>\n): LayoutBox[] => [\n box,\n ...(isScaled(box)\n ? []\n : box.children.flatMap((child) =>\n nested.has(child) ? [] : ownBoxes(child, nested)\n )),\n];\n\n/** What a box paints: its text, or itself when it holds nothing else, like a dot or a rule. */\nconst painted = (box: LayoutBox): LayoutRect[] => {\n if (isScaled(box)) {\n return [box];\n }\n const own =\n box.runs && box.runs.length > 0\n ? box.runs\n : box.children.length === 0\n ? [box]\n : [];\n return [...own.filter(hasArea), ...box.children.flatMap(painted)];\n};\n\nconst pastRoom = (room: LayoutRect, { x, y, width, height }: LayoutRect) =>\n Math.max(\n room.x - x,\n room.y - y,\n x + width - (room.x + room.width),\n y + height - (room.y + room.height)\n );\n\n/** How far `a` and `b` would have to move apart, along one axis, to clear each other. */\nconst overlapOf = (a: LayoutRect, b: LayoutRect): number => {\n const width = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);\n const height = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n if (width <= tolerance || height <= tolerance) {\n return 0;\n }\n return Math.min(\n a.x + a.width - b.x,\n b.x + b.width - a.x,\n a.y + a.height - b.y,\n b.y + b.height - a.y\n );\n};\n\n/**\n * Where the nodes of `body` run past their room or onto each other in\n * `layout`, a measured render on `surface` with node anchors on. Empty when\n * nothing does.\n *\n * A node's room is the box of its nearest anchored or `layoutRoom` ancestor,\n * or `layout` at the top level, and only siblings under one room are\n * compared. Nothing inside a scaled box is checked. A finding is advice, not an error:\n * an overlap may be intended.\n */\nexport const checkLayout = (\n layout: LayoutBox,\n body: readonly unknown[],\n walk: ChildNodeWalker,\n surface: 'react' | 'snapshot'\n): LayoutFinding[] => {\n const nodes = anchoredNodePaths(body, walk, surface);\n const anchored = anchoredBoxes(layout);\n const boxes = pairAnchors(\n anchored,\n nodes.map(({ node }) => node)\n );\n const placed = new Map<LayoutBox, PlacedNode>();\n boxes.forEach((box, index) => {\n const { node, path } = nodes[index]!;\n const type = nodeType(node);\n if (box !== undefined && type !== undefined) {\n placed.set(box, { box, path, type });\n }\n });\n\n // Every anchored box bounds its ancestors' content, paired or not.\n const nested = new Set(anchored.map(([, box]) => box));\n const bounding = new Set([...nested, ...roomBoxes(layout)]);\n const rooms = new Map<PlacedNode, LayoutBox>();\n const siblings = new Map<LayoutBox | undefined, PlacedNode[]>();\n const visit = (box: LayoutBox, parent: LayoutBox | undefined): void => {\n const node = placed.get(box);\n if (node !== undefined) {\n rooms.set(node, parent ?? layout);\n siblings.set(parent, [...(siblings.get(parent) ?? []), node]);\n }\n if (!isScaled(box)) {\n box.children.forEach((child) =>\n visit(child, bounding.has(box) ? box : parent)\n );\n }\n };\n visit(layout, undefined);\n\n const overflows = [...rooms].flatMap(([node, room]): LayoutFinding[] => {\n const by = Math.max(\n 0,\n ...ownBoxes(node.box, nested)\n .filter(hasArea)\n .map((box) => pastRoom(room, box))\n );\n return by > tolerance\n ? [\n {\n kind: 'overflow',\n path: node.path,\n type: node.type,\n by: Math.round(by),\n },\n ]\n : [];\n });\n\n const overlaps = [...siblings.values()].flatMap((group) => {\n const paints = group.map(({ box }) => painted(box));\n return group.flatMap((first, i) =>\n group.slice(i + 1).flatMap((second, offset): LayoutFinding[] => {\n const by = Math.max(\n 0,\n ...paints[i]!.flatMap((a) =>\n paints[i + 1 + offset]!.map((b) => overlapOf(a, b))\n )\n );\n return by > 0\n ? [\n {\n kind: 'overlap',\n path: first.path,\n type: first.type,\n with: { path: second.path, type: second.type },\n by: Math.round(by),\n },\n ]\n : [];\n })\n );\n });\n\n return [...overflows, ...overlaps];\n};\n"]}
@@ -0,0 +1,46 @@
1
+ import { type MarkdownBlock, type MarkdownContent, type MarkdownInline, type MarkdownInlineInput } from '../../define/markdown_content.js';
2
+ /** The node type of Markdown printed as written. */
3
+ export declare const VERBATIM_TYPE = "isomerVerbatim";
4
+ /**
5
+ * Builds Markdown as content rather than strings, so escaping follows where
6
+ * each value lands. Links and images apply the URL policy in
7
+ * `src/validate/url.ts`: a blocked link keeps its label on
8
+ * {@link BLOCKED_HREF}, and a blocked image degrades to its alt text.
9
+ *
10
+ * @example
11
+ * md.list(rows.map((row) => md.paragraph(md.strong(row.label), ': ', row.value)))
12
+ */
13
+ export declare const md: {
14
+ text: (value: string) => MarkdownInline;
15
+ strong: (...children: MarkdownInlineInput[]) => MarkdownInline;
16
+ emphasis: (...children: MarkdownInlineInput[]) => MarkdownInline;
17
+ code: (value: string) => MarkdownInline;
18
+ link: (label: MarkdownInlineInput | readonly MarkdownInlineInput[], href: string) => MarkdownInline;
19
+ image: (alt: string, src: string) => MarkdownInline;
20
+ /** A hard line break, printed as a backslash before the line ending. Inside a heading, strong, emphasis, link label, or table cell it is a space; at the start or end of any of these, or of a paragraph, it is dropped. */
21
+ break: () => MarkdownInline;
22
+ paragraph: (...children: MarkdownInlineInput[]) => MarkdownBlock;
23
+ heading: (depth: 1 | 2 | 3 | 4 | 5 | 6, ...children: MarkdownInlineInput[]) => MarkdownBlock;
24
+ /** A quote with no blocks, such as one holding only a hidden child, is dropped. */
25
+ blockquote: (...children: MarkdownContent[]) => MarkdownContent;
26
+ /**
27
+ * An item that is inline input becomes one paragraph; one with no blocks,
28
+ * such as a hidden child, is dropped. A `start` that would print a marker
29
+ * GFM does not read as a list number is ignored.
30
+ */
31
+ list: (items: readonly (MarkdownInlineInput | MarkdownContent)[], { ordered, start }?: {
32
+ ordered?: boolean;
33
+ start?: number;
34
+ }) => MarkdownBlock;
35
+ /** A cell is one inline run or several. GFM trims a cell's edge whitespace. */
36
+ table: (columns: readonly (MarkdownInlineInput | readonly MarkdownInlineInput[])[], rows: readonly (readonly (MarkdownInlineInput | readonly MarkdownInlineInput[])[])[]) => MarkdownBlock;
37
+ /** An unsafe `language` is dropped. */
38
+ codeBlock: (value: string, language?: string) => MarkdownBlock;
39
+ /** Authored Markdown source, after {@link sanitizeAuthoredSource}; whitespace-only source is dropped. */
40
+ authored: (source: string) => MarkdownContent;
41
+ };
42
+ /** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */
43
+ export declare const markdownBlocks: (content: MarkdownContent) => readonly unknown[];
44
+ /** `content` as GFM, without a trailing line break. */
45
+ export declare const serializeMarkdown: (content: MarkdownContent) => string;
46
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/builder.ts"],"names":[],"mappings":"AA6BA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AAYvC,oDAAoD;AACpD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAyG9C;;;;;;;;GAQG;AACH,eAAO,MAAM,EAAE;kBACC,MAAM,KAAG,cAAc;0BACf,mBAAmB,EAAE,KAAG,cAAc;4BAEpC,mBAAmB,EAAE,KAAG,cAAc;kBAEhD,MAAM,KAAG,cAAc;kBAK5B,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,QACrD,MAAM,KACX,cAAc;iBAMJ,MAAM,OAAO,MAAM,KAAG,cAAc;IAMjD,4NAA4N;iBACjN,cAAc;6BACA,mBAAmB,EAAE,KAAG,aAAa;qBAGrD,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eACf,mBAAmB,EAAE,KACjC,aAAa;IAEhB,mFAAmF;8BACzD,eAAe,EAAE,KAAG,eAAe;IAS7D;;;;OAIG;kBAEM,SAAS,CAAC,mBAAmB,GAAG,eAAe,CAAC,EAAE,uBAC7B;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAChE,aAAa;IAehB,+EAA+E;qBAEpE,SAAS,CAAC,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,CAAC,EAAE,QACpE,SAAS,CAAC,SAAS,CACvB,mBAAmB,GAAG,SAAS,mBAAmB,EAAE,CACrD,EAAE,CAAC,EAAE,KACL,aAAa;IAWhB,uCAAuC;uBACpB,MAAM,aAAa,MAAM,KAAG,aAAa;IAS5D,yGAAyG;uBACtF,MAAM,KAAG,eAAe;CAO5C,CAAC;AA+CF,qFAAqF;AACrF,eAAO,MAAM,cAAc,GAAI,SAAS,eAAe,KAAG,SAAS,OAAO,EACpD,CAAC;AAEvB,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,GAAI,SAAS,eAAe,KAAG,MAI1D,CAAC"}
@@ -0,0 +1,190 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ import { gfmToMarkdown } from 'mdast-util-gfm';
8
+ import { defaultHandlers, toMarkdown, } from 'mdast-util-to-markdown';
9
+ import { oneLine } from '../../composition/one_line.js';
10
+ import { markdownContent, } from '../../define/markdown_content.js';
11
+ import { BLOCKED_HREF, sanitizeAssetUrl, sanitizeNavigationHref, } from '../../validate/url.js';
12
+ import { sanitizeAuthoredSource } from './format.js';
13
+ // A fence-info string only allows word-ish tokens; anything else would
14
+ // terminate the fence early or inject markdown.
15
+ const FENCE_INFO_RE = /^[\w+#.-]+$/;
16
+ /** The node type of Markdown printed as written. */
17
+ export const VERBATIM_TYPE = 'isomerVerbatim';
18
+ const inline = (node) => Object.assign(node, { [markdownContent]: 'inline' });
19
+ const block = (node) => Object.assign(node, { [markdownContent]: 'block' });
20
+ const isContentList = (content) => Array.isArray(content);
21
+ const isInlineList = (label) => Array.isArray(label);
22
+ const phrasing = (input) => typeof input === 'string'
23
+ ? { type: 'text', value: oneLine(input) }
24
+ : input;
25
+ const emptyText = () => ({ type: 'text', value: '' });
26
+ const isEmptyText = (node) => node.type === 'text' && node.value === '';
27
+ // A break at either edge prints as a literal `\` or loose markers.
28
+ const withoutEdgeBreaks = (inputs) => {
29
+ const children = inputs.map(phrasing).filter((node) => !isEmptyText(node));
30
+ let start = 0;
31
+ let end = children.length;
32
+ while (start < end && children[start].type === 'break') {
33
+ start += 1;
34
+ }
35
+ while (end > start && children[end - 1].type === 'break') {
36
+ end -= 1;
37
+ }
38
+ return children.slice(start, end);
39
+ };
40
+ // Only a paragraph breaks a line: a heading with one turns setext, and the
41
+ // Slack fallback reads a line at a time.
42
+ const inlineChildren = (inputs) => withoutEdgeBreaks(inputs).map((node) => node.type === 'break' ? { type: 'text', value: ' ' } : node);
43
+ const rootContent = (content) => isContentList(content)
44
+ ? content.flatMap(rootContent)
45
+ : [content];
46
+ const isInlineInput = (item) => typeof item === 'string' ||
47
+ (!isContentList(item) && item[markdownContent] === 'inline');
48
+ const itemContent = (item) => isInlineInput(item)
49
+ ? [{ type: 'paragraph', children: withoutEdgeBreaks([item]) }]
50
+ : rootContent(item);
51
+ // GFM reads a list number of at most nine digits, so the last item's must fit.
52
+ const MAX_LIST_NUMBER = 999_999_999;
53
+ const isListStart = (start, count) => start !== undefined &&
54
+ Number.isInteger(start) &&
55
+ start >= 0 &&
56
+ start + Math.max(count - 1, 0) <= MAX_LIST_NUMBER;
57
+ // Printed as written, for Markdown that is already safe. Trailing whitespace
58
+ // would add blank lines between blocks. `source` is the authored text when
59
+ // sanitizing degraded it to inert text, whose escapes only Markdown resolves;
60
+ // surfaces that print literal text read it instead.
61
+ const verbatim = (markdown, source) => block({
62
+ type: VERBATIM_TYPE,
63
+ value: markdown.trimEnd(),
64
+ ...(source === undefined ? {} : { source }),
65
+ });
66
+ // An empty wrapper prints its markers alone: `****` reads as a thematic break.
67
+ const wrapper = (type, inputs) => {
68
+ const children = inlineChildren(inputs);
69
+ return inline(children.length === 0 ? emptyText() : { type, children });
70
+ };
71
+ const inlineRuns = (runs) => inlineChildren(isInlineList(runs) ? runs : [runs]);
72
+ /**
73
+ * Builds Markdown as content rather than strings, so escaping follows where
74
+ * each value lands. Links and images apply the URL policy in
75
+ * `src/validate/url.ts`: a blocked link keeps its label on
76
+ * {@link BLOCKED_HREF}, and a blocked image degrades to its alt text.
77
+ *
78
+ * @example
79
+ * md.list(rows.map((row) => md.paragraph(md.strong(row.label), ': ', row.value)))
80
+ */
81
+ export const md = {
82
+ text: (value) => inline(phrasing(value)),
83
+ strong: (...children) => wrapper('strong', children),
84
+ emphasis: (...children) => wrapper('emphasis', children),
85
+ code: (value) => inline(value === '' ? emptyText() : { type: 'inlineCode', value: oneLine(value) }),
86
+ link: (label, href) => inline({
87
+ type: 'link',
88
+ url: sanitizeNavigationHref(href) ?? BLOCKED_HREF,
89
+ children: inlineRuns(label),
90
+ }),
91
+ image: (alt, src) => {
92
+ const url = sanitizeAssetUrl(src);
93
+ return url === null
94
+ ? inline(phrasing(alt))
95
+ : inline({ type: 'image', url, alt: oneLine(alt) });
96
+ },
97
+ /** A hard line break, printed as a backslash before the line ending. Inside a heading, strong, emphasis, link label, or table cell it is a space; at the start or end of any of these, or of a paragraph, it is dropped. */
98
+ break: () => inline({ type: 'break' }),
99
+ paragraph: (...children) => block({ type: 'paragraph', children: withoutEdgeBreaks(children) }),
100
+ heading: (depth, ...children) => block({ type: 'heading', depth, children: inlineChildren(children) }),
101
+ /** A quote with no blocks, such as one holding only a hidden child, is dropped. */
102
+ blockquote: (...children) => {
103
+ const content = rootContent(children);
104
+ return content.length === 0
105
+ ? []
106
+ : block({
107
+ type: 'blockquote',
108
+ children: content,
109
+ });
110
+ },
111
+ /**
112
+ * An item that is inline input becomes one paragraph; one with no blocks,
113
+ * such as a hidden child, is dropped. A `start` that would print a marker
114
+ * GFM does not read as a list number is ignored.
115
+ */
116
+ list: (items, { ordered = false, start } = {}) => {
117
+ const children = items.flatMap((item) => {
118
+ const content = itemContent(item);
119
+ return content.length === 0
120
+ ? []
121
+ : [{ type: 'listItem', spread: false, children: content }];
122
+ });
123
+ return block({
124
+ type: 'list',
125
+ ordered,
126
+ ...(isListStart(start, children.length) ? { start } : {}),
127
+ spread: false,
128
+ children,
129
+ });
130
+ },
131
+ /** A cell is one inline run or several. GFM trims a cell's edge whitespace. */
132
+ table: (columns, rows) => block({
133
+ type: 'table',
134
+ children: [columns, ...rows].map((cells) => ({
135
+ type: 'tableRow',
136
+ children: cells.map((cell) => ({
137
+ type: 'tableCell',
138
+ children: inlineRuns(cell),
139
+ })),
140
+ })),
141
+ }),
142
+ /** An unsafe `language` is dropped. */
143
+ codeBlock: (value, language) => block({
144
+ type: 'code',
145
+ lang: language !== undefined && FENCE_INFO_RE.test(language)
146
+ ? language
147
+ : null,
148
+ value,
149
+ }),
150
+ /** Authored Markdown source, after {@link sanitizeAuthoredSource}; whitespace-only source is dropped. */
151
+ authored: (source) => {
152
+ if (source.trim() === '') {
153
+ return [];
154
+ }
155
+ const { markdown, inert } = sanitizeAuthoredSource(source);
156
+ return verbatim(markdown, inert ? source : undefined);
157
+ },
158
+ };
159
+ const asText = (node, ...rest) => defaultHandlers.text({ type: 'text', value: node.value ?? node.alt ?? '' }, ...rest);
160
+ // The URL policy again at serialization, for content built outside `md`.
161
+ const handlers = {
162
+ link: (node, ...rest) => defaultHandlers.link({ ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF }, ...rest),
163
+ definition: (node, ...rest) => defaultHandlers.definition({ ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF }, ...rest),
164
+ image: (node, ...rest) => {
165
+ const url = sanitizeAssetUrl(node.url);
166
+ return url === null
167
+ ? asText(node, ...rest)
168
+ : defaultHandlers.image({ ...node, url }, ...rest);
169
+ },
170
+ html: asText,
171
+ [VERBATIM_TYPE]: (node) => node.value,
172
+ };
173
+ const OPTIONS = {
174
+ bullet: '-',
175
+ // With `*`, emphasis around strong prints `***x***`, which the Slack
176
+ // fallback cannot split. `_` costs character references around emphasis
177
+ // inside a word.
178
+ emphasis: '_',
179
+ fence: '`',
180
+ listItemIndent: 'one',
181
+ rule: '-',
182
+ strong: '*',
183
+ extensions: [gfmToMarkdown({ tablePipeAlign: false })],
184
+ handlers: handlers,
185
+ };
186
+ /** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */
187
+ export const markdownBlocks = (content) => rootContent(content);
188
+ /** `content` as GFM, without a trailing line break. */
189
+ export const serializeMarkdown = (content) => toMarkdown({ type: 'root', children: rootContent(content) }, OPTIONS).replace(/\n$/, '');
190
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/render/markdown/builder.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// Builder content is mdast under a brand. Every mdast type stays inside this\n// module, so no emitted declaration names one.\n\nimport type {\n Blockquote,\n Definition,\n Image,\n Link,\n ListItem,\n PhrasingContent,\n RootContent,\n TableRow,\n} from 'mdast';\nimport { gfmToMarkdown } from 'mdast-util-gfm';\nimport {\n defaultHandlers,\n type Handle,\n type Options,\n toMarkdown,\n} from 'mdast-util-to-markdown';\n\nimport { oneLine } from '../../composition/one_line';\nimport {\n type MarkdownBlock,\n type MarkdownContent,\n markdownContent,\n type MarkdownInline,\n type MarkdownInlineInput,\n} from '../../define/markdown_content';\nimport {\n BLOCKED_HREF,\n sanitizeAssetUrl,\n sanitizeNavigationHref,\n} from '../../validate/url';\n\nimport { sanitizeAuthoredSource } from './format';\n\n// A fence-info string only allows word-ish tokens; anything else would\n// terminate the fence early or inject markdown.\nconst FENCE_INFO_RE = /^[\\w+#.-]+$/;\n/** The node type of Markdown printed as written. */\nexport const VERBATIM_TYPE = 'isomerVerbatim';\n\nconst inline = (node: PhrasingContent): MarkdownInline =>\n Object.assign(node, { [markdownContent]: 'inline' as const });\n\nconst block = (node: RootContent): MarkdownBlock =>\n Object.assign(node, { [markdownContent]: 'block' as const });\n\nconst isContentList = (\n content: MarkdownInline | MarkdownContent\n): content is readonly MarkdownContent[] => Array.isArray(content);\n\nconst isInlineList = (\n label: MarkdownInlineInput | readonly MarkdownInlineInput[]\n): label is readonly MarkdownInlineInput[] => Array.isArray(label);\n\nconst phrasing = (input: MarkdownInlineInput): PhrasingContent =>\n typeof input === 'string'\n ? { type: 'text', value: oneLine(input) }\n : (input as unknown as PhrasingContent);\n\nconst emptyText = (): PhrasingContent => ({ type: 'text', value: '' });\n\nconst isEmptyText = (node: PhrasingContent): boolean =>\n node.type === 'text' && node.value === '';\n\n// A break at either edge prints as a literal `\\` or loose markers.\nconst withoutEdgeBreaks = (\n inputs: readonly MarkdownInlineInput[]\n): PhrasingContent[] => {\n const children = inputs.map(phrasing).filter((node) => !isEmptyText(node));\n let start = 0;\n let end = children.length;\n while (start < end && children[start]!.type === 'break') {\n start += 1;\n }\n while (end > start && children[end - 1]!.type === 'break') {\n end -= 1;\n }\n return children.slice(start, end);\n};\n\n// Only a paragraph breaks a line: a heading with one turns setext, and the\n// Slack fallback reads a line at a time.\nconst inlineChildren = (\n inputs: readonly MarkdownInlineInput[]\n): PhrasingContent[] =>\n withoutEdgeBreaks(inputs).map((node) =>\n node.type === 'break' ? { type: 'text', value: ' ' } : node\n );\n\nconst rootContent = (content: MarkdownContent): RootContent[] =>\n isContentList(content)\n ? content.flatMap(rootContent)\n : [content as unknown as RootContent];\n\nconst isInlineInput = (\n item: MarkdownInlineInput | MarkdownContent\n): item is MarkdownInlineInput =>\n typeof item === 'string' ||\n (!isContentList(item) && item[markdownContent] === 'inline');\n\nconst itemContent = (\n item: MarkdownInlineInput | MarkdownContent\n): ListItem['children'] =>\n isInlineInput(item)\n ? [{ type: 'paragraph', children: withoutEdgeBreaks([item]) }]\n : (rootContent(item) as ListItem['children']);\n\n// GFM reads a list number of at most nine digits, so the last item's must fit.\nconst MAX_LIST_NUMBER = 999_999_999;\n\nconst isListStart = (\n start: number | undefined,\n count: number\n): start is number =>\n start !== undefined &&\n Number.isInteger(start) &&\n start >= 0 &&\n start + Math.max(count - 1, 0) <= MAX_LIST_NUMBER;\n\n// Printed as written, for Markdown that is already safe. Trailing whitespace\n// would add blank lines between blocks. `source` is the authored text when\n// sanitizing degraded it to inert text, whose escapes only Markdown resolves;\n// surfaces that print literal text read it instead.\nconst verbatim = (markdown: string, source?: string): MarkdownBlock =>\n block({\n type: VERBATIM_TYPE,\n value: markdown.trimEnd(),\n ...(source === undefined ? {} : { source }),\n } as unknown as RootContent);\n\n// An empty wrapper prints its markers alone: `****` reads as a thematic break.\nconst wrapper = (\n type: 'strong' | 'emphasis',\n inputs: MarkdownInlineInput[]\n): MarkdownInline => {\n const children = inlineChildren(inputs);\n return inline(children.length === 0 ? emptyText() : { type, children });\n};\n\nconst inlineRuns = (\n runs: MarkdownInlineInput | readonly MarkdownInlineInput[]\n): PhrasingContent[] => inlineChildren(isInlineList(runs) ? runs : [runs]);\n\n/**\n * Builds Markdown as content rather than strings, so escaping follows where\n * each value lands. Links and images apply the URL policy in\n * `src/validate/url.ts`: a blocked link keeps its label on\n * {@link BLOCKED_HREF}, and a blocked image degrades to its alt text.\n *\n * @example\n * md.list(rows.map((row) => md.paragraph(md.strong(row.label), ': ', row.value)))\n */\nexport const md = {\n text: (value: string): MarkdownInline => inline(phrasing(value)),\n strong: (...children: MarkdownInlineInput[]): MarkdownInline =>\n wrapper('strong', children),\n emphasis: (...children: MarkdownInlineInput[]): MarkdownInline =>\n wrapper('emphasis', children),\n code: (value: string): MarkdownInline =>\n inline(\n value === '' ? emptyText() : { type: 'inlineCode', value: oneLine(value) }\n ),\n link: (\n label: MarkdownInlineInput | readonly MarkdownInlineInput[],\n href: string\n ): MarkdownInline =>\n inline({\n type: 'link',\n url: sanitizeNavigationHref(href) ?? BLOCKED_HREF,\n children: inlineRuns(label),\n }),\n image: (alt: string, src: string): MarkdownInline => {\n const url = sanitizeAssetUrl(src);\n return url === null\n ? inline(phrasing(alt))\n : inline({ type: 'image', url, alt: oneLine(alt) });\n },\n /** A hard line break, printed as a backslash before the line ending. Inside a heading, strong, emphasis, link label, or table cell it is a space; at the start or end of any of these, or of a paragraph, it is dropped. */\n break: (): MarkdownInline => inline({ type: 'break' }),\n paragraph: (...children: MarkdownInlineInput[]): MarkdownBlock =>\n block({ type: 'paragraph', children: withoutEdgeBreaks(children) }),\n heading: (\n depth: 1 | 2 | 3 | 4 | 5 | 6,\n ...children: MarkdownInlineInput[]\n ): MarkdownBlock =>\n block({ type: 'heading', depth, children: inlineChildren(children) }),\n /** A quote with no blocks, such as one holding only a hidden child, is dropped. */\n blockquote: (...children: MarkdownContent[]): MarkdownContent => {\n const content = rootContent(children);\n return content.length === 0\n ? []\n : block({\n type: 'blockquote',\n children: content as Blockquote['children'],\n });\n },\n /**\n * An item that is inline input becomes one paragraph; one with no blocks,\n * such as a hidden child, is dropped. A `start` that would print a marker\n * GFM does not read as a list number is ignored.\n */\n list: (\n items: readonly (MarkdownInlineInput | MarkdownContent)[],\n { ordered = false, start }: { ordered?: boolean; start?: number } = {}\n ): MarkdownBlock => {\n const children = items.flatMap((item): ListItem[] => {\n const content = itemContent(item);\n return content.length === 0\n ? []\n : [{ type: 'listItem', spread: false, children: content }];\n });\n return block({\n type: 'list',\n ordered,\n ...(isListStart(start, children.length) ? { start } : {}),\n spread: false,\n children,\n });\n },\n /** A cell is one inline run or several. GFM trims a cell's edge whitespace. */\n table: (\n columns: readonly (MarkdownInlineInput | readonly MarkdownInlineInput[])[],\n rows: readonly (readonly (\n MarkdownInlineInput | readonly MarkdownInlineInput[]\n )[])[]\n ): MarkdownBlock =>\n block({\n type: 'table',\n children: [columns, ...rows].map((cells): TableRow => ({\n type: 'tableRow',\n children: cells.map((cell) => ({\n type: 'tableCell',\n children: inlineRuns(cell),\n })),\n })),\n }),\n /** An unsafe `language` is dropped. */\n codeBlock: (value: string, language?: string): MarkdownBlock =>\n block({\n type: 'code',\n lang:\n language !== undefined && FENCE_INFO_RE.test(language)\n ? language\n : null,\n value,\n }),\n /** Authored Markdown source, after {@link sanitizeAuthoredSource}; whitespace-only source is dropped. */\n authored: (source: string): MarkdownContent => {\n if (source.trim() === '') {\n return [];\n }\n const { markdown, inert } = sanitizeAuthoredSource(source);\n return verbatim(markdown, inert ? source : undefined);\n },\n};\n\nconst asText: Handle = (\n node: { value?: string; alt?: string | null },\n ...rest\n) =>\n defaultHandlers.text(\n { type: 'text', value: node.value ?? node.alt ?? '' },\n ...rest\n );\n\n// The URL policy again at serialization, for content built outside `md`.\nconst handlers: Record<string, Handle> = {\n link: (node: Link, ...rest) =>\n defaultHandlers.link(\n { ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF },\n ...rest\n ),\n definition: (node: Definition, ...rest) =>\n defaultHandlers.definition(\n { ...node, url: sanitizeNavigationHref(node.url) ?? BLOCKED_HREF },\n ...rest\n ),\n image: (node: Image, ...rest) => {\n const url = sanitizeAssetUrl(node.url);\n return url === null\n ? asText(node, ...rest)\n : defaultHandlers.image({ ...node, url }, ...rest);\n },\n html: asText,\n [VERBATIM_TYPE]: (node: { value: string }) => node.value,\n};\n\nconst OPTIONS: Options = {\n bullet: '-',\n // With `*`, emphasis around strong prints `***x***`, which the Slack\n // fallback cannot split. `_` costs character references around emphasis\n // inside a word.\n emphasis: '_',\n fence: '`',\n listItemIndent: 'one',\n rule: '-',\n strong: '*',\n extensions: [gfmToMarkdown({ tablePipeAlign: false })],\n handlers: handlers as Options['handlers'],\n};\n\n/** `content` as flat mdast blocks, typed `unknown` so no declaration names mdast. */\nexport const markdownBlocks = (content: MarkdownContent): readonly unknown[] =>\n rootContent(content);\n\n/** `content` as GFM, without a trailing line break. */\nexport const serializeMarkdown = (content: MarkdownContent): string =>\n toMarkdown({ type: 'root', children: rootContent(content) }, OPTIONS).replace(\n /\\n$/,\n ''\n );\n"]}
@@ -0,0 +1,20 @@
1
+ import type { Composition } from '../../composition/composition.js';
2
+ import type { PrimitiveNode } from '../../define/primitive_module.js';
3
+ import type { TextEnvelopeDispatcher } from '../text/envelope.js';
4
+ /** Adds GFM to {@link TextEnvelopeDispatcher}. */
5
+ export interface MarkdownEnvelopeDispatcher<TNode extends PrimitiveNode> extends TextEnvelopeDispatcher<TNode> {
6
+ /** Returns the empty string for a node with nothing to show; the envelope drops it rather than emitting a blank block. */
7
+ renderMarkdown(node: TNode): string;
8
+ }
9
+ /** Options for {@link renderMarkdownEnvelope}. */
10
+ export interface MarkdownEnvelopeOptions {
11
+ /** Renders the composition's title and subtitle. Defaults to `true`. Pass `false` when the host already shows the title, or the body opens with its own. */
12
+ heading?: boolean;
13
+ }
14
+ /**
15
+ * The composition as GFM: title as `h1`, subtitle italicized, then every node
16
+ * that rendered anything. The title and subtitle are text, escaped by
17
+ * {@link serializeMarkdown}.
18
+ */
19
+ export declare const renderMarkdownEnvelope: <TNode extends PrimitiveNode>(composition: Composition<TNode>, dispatcher: MarkdownEnvelopeDispatcher<TNode>, { heading }?: MarkdownEnvelopeOptions) => string;
20
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/envelope.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAI/D,kDAAkD;AAClD,MAAM,WAAW,0BAA0B,CACzC,KAAK,SAAS,aAAa,CAC3B,SAAQ,sBAAsB,CAAC,KAAK,CAAC;IACrC,0HAA0H;IAC1H,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACrC;AAED,kDAAkD;AAClD,MAAM,WAAW,uBAAuB;IACtC,4JAA4J;IAC5J,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,KAAK,SAAS,aAAa,EAChE,aAAa,WAAW,CAAC,KAAK,CAAC,EAC/B,YAAY,0BAA0B,CAAC,KAAK,CAAC,EAC7C,cAAoB,uBAA4B,KAC/C,MAiBF,CAAC"}
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0; you may not use this file except in compliance with the Elastic License
5
+ * 2.0.
6
+ */
7
+ import { md, serializeMarkdown } from './builder.js';
8
+ /**
9
+ * The composition as GFM: title as `h1`, subtitle italicized, then every node
10
+ * that rendered anything. The title and subtitle are text, escaped by
11
+ * {@link serializeMarkdown}.
12
+ */
13
+ export const renderMarkdownEnvelope = (composition, dispatcher, { heading = true } = {}) => {
14
+ const blocks = [];
15
+ if (heading && composition.title) {
16
+ blocks.push(serializeMarkdown(md.heading(1, composition.title)));
17
+ }
18
+ if (heading && composition.subtitle) {
19
+ blocks.push(serializeMarkdown(md.paragraph(md.emphasis(composition.subtitle))));
20
+ }
21
+ for (const node of composition.body) {
22
+ const rendered = dispatcher.renderMarkdown(node);
23
+ if (rendered.length > 0) {
24
+ blocks.push(rendered);
25
+ }
26
+ }
27
+ return blocks.join('\n\n');
28
+ };
29
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../src/render/markdown/envelope.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAgBlD;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,WAA+B,EAC/B,UAA6C,EAC7C,EAAE,OAAO,GAAG,IAAI,KAA8B,EAAE,EACxC,EAAE;IACV,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CACT,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC,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\nimport type { Composition } from '../../composition/composition';\nimport type { PrimitiveNode } from '../../define/primitive_module';\nimport type { TextEnvelopeDispatcher } from '../text/envelope';\n\nimport { md, serializeMarkdown } from './builder';\n\n/** Adds GFM to {@link TextEnvelopeDispatcher}. */\nexport interface MarkdownEnvelopeDispatcher<\n TNode extends PrimitiveNode,\n> extends TextEnvelopeDispatcher<TNode> {\n /** Returns the empty string for a node with nothing to show; the envelope drops it rather than emitting a blank block. */\n renderMarkdown(node: TNode): string;\n}\n\n/** Options for {@link renderMarkdownEnvelope}. */\nexport interface MarkdownEnvelopeOptions {\n /** Renders the composition's title and subtitle. Defaults to `true`. Pass `false` when the host already shows the title, or the body opens with its own. */\n heading?: boolean;\n}\n\n/**\n * The composition as GFM: title as `h1`, subtitle italicized, then every node\n * that rendered anything. The title and subtitle are text, escaped by\n * {@link serializeMarkdown}.\n */\nexport const renderMarkdownEnvelope = <TNode extends PrimitiveNode>(\n composition: Composition<TNode>,\n dispatcher: MarkdownEnvelopeDispatcher<TNode>,\n { heading = true }: MarkdownEnvelopeOptions = {}\n): string => {\n const blocks: string[] = [];\n if (heading && composition.title) {\n blocks.push(serializeMarkdown(md.heading(1, composition.title)));\n }\n if (heading && composition.subtitle) {\n blocks.push(\n serializeMarkdown(md.paragraph(md.emphasis(composition.subtitle)))\n );\n }\n for (const node of composition.body) {\n const rendered = dispatcher.renderMarkdown(node);\n if (rendered.length > 0) {\n blocks.push(rendered);\n }\n }\n return blocks.join('\\n\\n');\n};\n"]}
@@ -0,0 +1,10 @@
1
+ /** `markdown` as flat GFM mdast blocks, typed `unknown` so no declaration names mdast; `null` past the parse budget or the parser's recursion depth. */
2
+ export declare const parseGfmBlocks: (markdown: string) => readonly unknown[] | null;
3
+ /** {@link sanitizeMarkdownSource}'s result, and whether it degraded to inert text. */
4
+ export declare const sanitizeAuthoredSource: (markdown: string) => {
5
+ markdown: string;
6
+ inert: boolean;
7
+ };
8
+ /** Sanitizes GFM destinations and HTML; excessive syntax or length degrades to inert text. */
9
+ export declare const sanitizeMarkdownSource: (markdown: string) => string;
10
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/render/markdown/format.ts"],"names":[],"mappings":"AAkDA,wJAAwJ;AACxJ,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,KAAG,SAAS,OAAO,EAAE,GAAG,IAQtE,CAAC;AA6HF,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,GACjC,UAAU,MAAM,KACf;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAiBpC,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,sBAAsB,GAAI,UAAU,MAAM,KAAG,MACf,CAAC"}