@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,270 @@
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 { Children, Fragment, isValidElement, } from 'react';
8
+ import { IsomerError } from '../composition/error.js';
9
+ import { readAuthoredSpec, } from './authored_fields.js';
10
+ import { capitalize, createAuthoringModel, } from './authoring_model.js';
11
+ import { authorType, defineAuthorComponent } from './jsx.js';
12
+ /**
13
+ * Builds a pack's {@link JsxShim} from its primitive list.
14
+ *
15
+ * Branded schema fields ({@link fromChildren}, {@link fromTextChildren}) fill
16
+ * from JSX children, and each child type becomes a component. A primitive with
17
+ * no brand still fills its one child slot, array or single node, from
18
+ * {@link PrimitiveDefinition.children}.
19
+ */
20
+ export const buildJsxShim = (primitives = []) => {
21
+ const primitiveTypes = new Set(primitives.map((primitive) => primitive.type));
22
+ const { authoredByType, children, childSlotsByType } = createAuthoringModel(primitives);
23
+ const childComponents = new Map([...children.keys()].map((type) => [type, defineAuthorComponent(type)]));
24
+ const view = defineAuthorComponent('view');
25
+ const env = {
26
+ authoredByType,
27
+ childSlotsByType,
28
+ primitiveTypes,
29
+ };
30
+ return {
31
+ Composition: view,
32
+ toComposition: (element) => toAuthorComposition(element, env),
33
+ ...Object.fromEntries(primitives.map((primitive) => [
34
+ capitalize(primitive.type),
35
+ defineAuthorComponent(primitive.type),
36
+ ])),
37
+ ...Object.fromEntries([...childComponents].map(([type, component]) => [
38
+ capitalize(type),
39
+ component,
40
+ ])),
41
+ };
42
+ };
43
+ const toAuthorComposition = (element, env) => {
44
+ requireAuthorElement(element, 'view');
45
+ const props = element.props;
46
+ const resolvedBody = props.body ??
47
+ flattenChildren(props.children).map((child) => bodyNodeFromElement(child, env));
48
+ const spec = {
49
+ type: 'view',
50
+ body: resolvedBody,
51
+ };
52
+ if (props.version !== undefined) {
53
+ spec.version = props.version;
54
+ }
55
+ if (props.title !== undefined) {
56
+ spec.title = props.title;
57
+ }
58
+ if (props.subtitle !== undefined) {
59
+ spec.subtitle = props.subtitle;
60
+ }
61
+ if (props.theme !== undefined) {
62
+ spec.theme = props.theme;
63
+ }
64
+ if (props.meta !== undefined) {
65
+ spec.meta = props.meta;
66
+ }
67
+ return spec;
68
+ };
69
+ const bodyNodeFromElement = (node, env) => {
70
+ const element = requireAuthorElement(node);
71
+ const type = getAuthorType(element);
72
+ if (!env.primitiveTypes.has(type)) {
73
+ throw new IsomerError('INVALID_BODY_NODE', `"${type}" cannot be used as a composition body node.`);
74
+ }
75
+ const parseChild = (child) => bodyNodeFromElement(child, env);
76
+ const slots = env.childSlotsByType.get(type) ?? [];
77
+ const authored = env.authoredByType.get(type);
78
+ const converted = {};
79
+ for (const [key, value] of Object.entries(withoutChildren(element))) {
80
+ const childField = authored?.children.find((field) => field.field === key);
81
+ converted[key] = childField
82
+ ? valueFromChildField(value, childField, env)
83
+ : convertPropValue(value, key, slots, parseChild);
84
+ }
85
+ const rawChildren = element.props.children;
86
+ if (authored && (authored.children.length > 0 || authored.text.length > 0)) {
87
+ fillAuthoredFields(converted, authored, rawChildren, env);
88
+ }
89
+ else {
90
+ const unique = slots.length === 1 ? slots[0] : undefined;
91
+ if (unique &&
92
+ converted[unique.field] === undefined &&
93
+ rawChildren !== undefined) {
94
+ const nested = flattenChildren(rawChildren).map(parseChild);
95
+ converted[unique.field] = unique.array ? nested : nested[0];
96
+ }
97
+ else if (slots.length === 0 && flattenChildren(rawChildren).length > 0) {
98
+ throw new IsomerError('UNEXPECTED_CHILDREN', `<${capitalize(type)}> takes no JSX children; set its fields through props.`);
99
+ }
100
+ }
101
+ return omitUndefined({ ...converted, type });
102
+ };
103
+ const fillAuthoredFields = (converted, authored, rawChildren, env) => {
104
+ for (const field of authored.children) {
105
+ if (converted[field.field] !== undefined || rawChildren === undefined) {
106
+ continue;
107
+ }
108
+ converted[field.field] = valueFromBrand(flattenChildren(rawChildren), field, env);
109
+ }
110
+ for (const field of authored.text) {
111
+ if (converted[field.field] !== undefined) {
112
+ continue;
113
+ }
114
+ if (rawChildren === undefined) {
115
+ if (!field.optional) {
116
+ throw new IsomerError('MISSING_AUTHORED_TEXT', `Expected text children for "${field.field}".`);
117
+ }
118
+ continue;
119
+ }
120
+ converted[field.field] = textFromChildren(rawChildren, {
121
+ collapseWhitespace: field.collapseWhitespace,
122
+ });
123
+ }
124
+ };
125
+ const valueFromChildField = (value, field, env) => {
126
+ if (isJsxNodes(value)) {
127
+ return valueFromBrand(flattenChildren(value), field, env);
128
+ }
129
+ return value;
130
+ };
131
+ const isJsxNodes = (value) => {
132
+ if (isAuthorElement(value)) {
133
+ return true;
134
+ }
135
+ if (isValidElement(value) && value.type === Fragment) {
136
+ return true;
137
+ }
138
+ return (Array.isArray(value) &&
139
+ value.some((item) => isAuthorElement(item) || isValidElement(item)));
140
+ };
141
+ /** The field's array of items, or its one item; throws on a second element for a single-item field. */
142
+ const valueFromBrand = (elements, field, env) => {
143
+ const items = elements.map((child) => itemFromElement(child, field, env));
144
+ if (field.array) {
145
+ return items;
146
+ }
147
+ if (items.length > 1) {
148
+ throw new IsomerError('UNEXPECTED_CHILDREN', `"${field.field}" takes one <${capitalize(field.childType)}>, not ${items.length}.`);
149
+ }
150
+ return items[0];
151
+ };
152
+ const itemFromElement = (child, field, env) => {
153
+ const element = requireAuthorElement(child, field.childType);
154
+ if (field.toItem) {
155
+ return field.toItem(element.props, {
156
+ parseChildren: (nested) => flattenChildren(nested).map((node) => bodyNodeFromElement(node, env)),
157
+ });
158
+ }
159
+ const props = withoutChildren(element);
160
+ const nested = flattenChildren(element.props.children);
161
+ const elements = nested.filter(isAuthorElement);
162
+ const text = nested.filter((child) => !isAuthorElement(child));
163
+ if (field.textField !== undefined &&
164
+ props[field.textField] === undefined &&
165
+ text.length > 0) {
166
+ props[field.textField] = textFromChildren(text);
167
+ }
168
+ fillNestedBrands(field.itemSchema, props, elements, env);
169
+ return props;
170
+ };
171
+ const fillNestedBrands = (itemSchema, props, elements, env) => {
172
+ if (elements.length === 0) {
173
+ return;
174
+ }
175
+ for (const field of readAuthoredSpec(itemSchema).children) {
176
+ if (props[field.field] !== undefined) {
177
+ continue;
178
+ }
179
+ const matching = elements.filter((child) => getAuthorType(child) === field.childType);
180
+ if (matching.length > 0) {
181
+ props[field.field] = valueFromBrand(matching, field, env);
182
+ }
183
+ }
184
+ };
185
+ const convertPropValue = (value, field, slots, parseChild) => {
186
+ const asArray = slots.some((slot) => slot.field === field && slot.array);
187
+ const fromJsx = nodesFromJsx(value, parseChild);
188
+ if (fromJsx) {
189
+ return asArray ? fromJsx : fromJsx[0];
190
+ }
191
+ if (Array.isArray(value)) {
192
+ return value.flatMap((item) => {
193
+ const nodes = nodesFromJsx(item, parseChild);
194
+ return nodes ?? [item];
195
+ });
196
+ }
197
+ return value;
198
+ };
199
+ const nodesFromJsx = (value, parseChild) => {
200
+ if (isAuthorElement(value)) {
201
+ return [parseChild(value)];
202
+ }
203
+ if (isValidElement(value) && value.type === Fragment) {
204
+ return flattenChildren(value).map(parseChild);
205
+ }
206
+ return undefined;
207
+ };
208
+ const isAuthorElement = (value) => {
209
+ if (!isValidElement(value)) {
210
+ return false;
211
+ }
212
+ const component = value.type;
213
+ return typeof component[authorType] === 'string';
214
+ };
215
+ /** React children as a flat array, with fragments inlined. */
216
+ export const flattenChildren = (children) => Children.toArray(children).flatMap((child) => {
217
+ if (isValidElement(child) && child.type === Fragment) {
218
+ const props = child.props;
219
+ return flattenChildren(props.children);
220
+ }
221
+ return child;
222
+ });
223
+ /**
224
+ * Children joined into one string. Throws on an element child, so a prop typed as text stays text. Collapses whitespace unless `{ collapseWhitespace: false }`.
225
+ */
226
+ export const textFromChildren = (children, options) => {
227
+ const text = flattenChildren(children)
228
+ .map((child) => {
229
+ if (typeof child === 'string' || typeof child === 'number') {
230
+ return String(child);
231
+ }
232
+ throw new IsomerError('EXPECTED_TEXT_CHILDREN', 'Expected text children.');
233
+ })
234
+ .join('');
235
+ if (options?.collapseWhitespace === false) {
236
+ return text.trim();
237
+ }
238
+ return text.replace(/\s+/g, ' ').trim();
239
+ };
240
+ /** An element's props without `children` and without `undefined` entries. */
241
+ const withoutChildren = (element) => {
242
+ const props = { ...element.props };
243
+ delete props.children;
244
+ return omitUndefined(props);
245
+ };
246
+ /** Narrows `element` to an authoring element, asserting `type` when given. */
247
+ const requireAuthorElement = (element, type) => {
248
+ assertValidElement(element);
249
+ const actual = getAuthorType(element);
250
+ if (type !== undefined && actual !== type) {
251
+ throw new IsomerError('AUTHOR_TYPE_MISMATCH', `Expected <${type}> but received <${actual}>.`);
252
+ }
253
+ return element;
254
+ };
255
+ /** The primitive type {@link authorType} brands onto `element`'s component. */
256
+ const getAuthorType = (element) => {
257
+ const component = element.type;
258
+ const type = component[authorType];
259
+ if (!type) {
260
+ throw new IsomerError('EXPECTED_AUTHOR_COMPONENT', 'Expected an Isomer authoring component.');
261
+ }
262
+ return type;
263
+ };
264
+ const assertValidElement = (element) => {
265
+ if (!isValidElement(element)) {
266
+ throw new IsomerError('EXPECTED_JSX_ELEMENT', 'Expected an Isomer JSX element.');
267
+ }
268
+ };
269
+ const omitUndefined = (value) => Object.fromEntries(Object.entries(value).filter((entry) => entry[1] !== undefined));
270
+ //# sourceMappingURL=jsx_shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx_shim.js","sourceRoot":"","sources":["../../src/author/jsx_shim.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 {\n Children,\n Fragment,\n isValidElement,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport type { z, ZodObject, ZodType } from 'zod';\n\nimport type { Composition } from '../composition/composition';\nimport { IsomerError } from '../composition/error';\nimport type { PrimitiveNode } from '../define/primitive_module';\n\nimport {\n type AuthoredChildBrand,\n type AuthoredChildField,\n type AuthoredSpec,\n type AuthoredTextBrand,\n type AuthoredToItemBrand,\n type ItemSchema,\n readAuthoredSpec,\n} from './authored_fields';\nimport {\n capitalize,\n type ChildSlot,\n createAuthoringModel,\n} from './authoring_model';\nimport { type AuthorComponent, authorType, defineAuthorComponent } from './jsx';\n\n/** A {@link Composition} whose `body` is the pack's own authoring node type. */\nexport type AuthorComposition<TNode extends PrimitiveNode = PrimitiveNode> =\n Omit<Composition<TNode>, 'body'> & {\n body: TNode[];\n };\n\n/**\n * Props of the shim's root element: the composition fields minus `type`, with\n * `body` given either as an array or as JSX children.\n */\nexport interface CompositionAuthorProps<\n TNode extends PrimitiveNode = PrimitiveNode,\n> extends Omit<AuthorComposition<TNode>, 'type' | 'body'> {\n /** Wins outright when present: `children` are then ignored, not merged. */\n body?: TNode[];\n /** Parsed into `body` only when `body` is absent. Each child must be an authoring element of a registered primitive type. */\n children?: ReactNode;\n}\n\n/** Literal `type` strings; wide `string` is dropped so a string index cannot collide with `component`. */\ntype LiteralType<T extends string> = string extends T ? never : T;\n\n/** No keys. Intersects away, unlike `Record<string, never>`. */\ntype NoKeys = Record<never, never>;\n\ntype ShapeOf<T> = T extends { shape: infer Shape } ? Shape : NoKeys;\n\n/** A primitive's schema type, or `never` when it declares none. */\ntype SchemaOf<P> = P extends { schema: infer S }\n ? S extends ZodObject\n ? S\n : never\n : never;\n\n/** A bare `ZodObject` has a string index; a real shape does not. */\ntype LooseSchema<TSchema> = string extends keyof ShapeOf<TSchema>\n ? true\n : false;\n\n// The schema a brand is read from: `F`, or one an optional, nullable, default,\n// or readonly wrapper holds.\ntype Branded<F> = F extends\n AuthoredChildBrand<string, unknown> | AuthoredTextBrand\n ? F\n : F extends {\n _zod: {\n def: {\n type: 'optional' | 'nullable' | 'default' | 'readonly';\n innerType: infer Inner;\n };\n };\n }\n ? Branded<Inner>\n : F;\n\ntype AuthoredNames<TSchema> = {\n [K in keyof ShapeOf<TSchema>]: Branded<ShapeOf<TSchema>[K]> extends\n AuthoredChildBrand<string, unknown> | AuthoredTextBrand\n ? K\n : never;\n}[keyof ShapeOf<TSchema>];\n\ntype AuthorPropsForSchema<TSchema extends ZodObject> =\n LooseSchema<TSchema> extends true\n ? Record<string, unknown> & { children?: ReactNode }\n : Omit<z.infer<TSchema>, 'type' | AuthoredNames<TSchema>> &\n Partial<\n Pick<\n z.infer<TSchema>,\n Extract<AuthoredNames<TSchema>, keyof z.infer<TSchema>>\n >\n > & { children?: ReactNode };\n\ntype AuthorPropsFor<P> = [SchemaOf<P>] extends [never]\n ? Record<string, unknown> & { children?: ReactNode }\n : AuthorPropsForSchema<SchemaOf<P>>;\n\ntype ChildEntry<F, TDepth extends unknown[]> = 0 extends 1 & F\n ? NoKeys\n : F extends AuthoredChildBrand<infer Name, infer Props>\n ? [Name] extends [string]\n ? {\n [K in Capitalize<Name>]: AuthorComponent<\n Props & { children?: ReactNode },\n Name\n >;\n } & (F extends AuthoredToItemBrand\n ? NoKeys\n : ChildComponentsOf<ItemSchema<F>, [...TDepth, unknown]>)\n : NoKeys\n : NoKeys;\n\ntype UnionToIntersection<T> = (\n T extends unknown ? (value: T) => void : never\n) extends (value: infer R) => void\n ? R\n : never;\n\n/** Child components branded on `TSchema`, then on each child's item schema, five levels deep. */\ntype ChildComponentsOf<\n TSchema,\n TDepth extends unknown[] = [],\n> = TDepth['length'] extends 5\n ? NoKeys\n : LooseSchema<TSchema> extends true\n ? NoKeys\n : UnionToIntersection<\n {\n [K in keyof ShapeOf<TSchema>]: ChildEntry<\n Branded<ShapeOf<TSchema>[K]>,\n TDepth\n >;\n }[keyof ShapeOf<TSchema>]\n >;\n\ntype ChildMapOfTuple<TPrimitives> = TPrimitives extends readonly [\n infer Head,\n ...infer Tail,\n]\n ? ChildComponentsOf<SchemaOf<Head>> &\n ChildMapOfTuple<Tail extends readonly { type: string }[] ? Tail : []>\n : NoKeys;\n\ntype ChildComponentMap<TPrimitives extends readonly { type: string }[]> =\n ChildMapOfTuple<TPrimitives>;\n\n/**\n * PascalCase authoring components keyed from a pack's primitive `type` list.\n * `slideFrame` becomes `SlideFrame`. Props come from the primitive's schema.\n */\nexport type PrimitiveComponentMap<\n TPrimitives extends readonly { type: string }[],\n> = {\n [\n P in TPrimitives[number] as Capitalize<LiteralType<P['type'] & string>>\n ]: AuthorComponent<AuthorPropsFor<P>, P['type'] & string>;\n};\n\n/**\n * A pack's JSX authoring front: the root `Composition` element, one\n * PascalCase component per primitive and per branded child, and the conversion\n * back to plain data.\n */\nexport type JsxShim<\n TNode extends PrimitiveNode = PrimitiveNode,\n TPrimitives extends readonly { type: string }[] = readonly { type: string }[],\n> = {\n Composition: AuthorComponent<CompositionAuthorProps<TNode>, 'view'>;\n /** Throws when the root is not the `Composition` element, or when a child is not a registered primitive. */\n toComposition: (\n element: ReactElement<CompositionAuthorProps<TNode>>\n ) => AuthorComposition<TNode>;\n} & PrimitiveComponentMap<TPrimitives> &\n ChildComponentMap<TPrimitives>;\n\n/**\n * Builds a pack's {@link JsxShim} from its primitive list.\n *\n * Branded schema fields ({@link fromChildren}, {@link fromTextChildren}) fill\n * from JSX children, and each child type becomes a component. A primitive with\n * no brand still fills its one child slot, array or single node, from\n * {@link PrimitiveDefinition.children}.\n */\nexport const buildJsxShim = <\n const TPrimitives extends readonly { type: string }[] = readonly {\n type: string;\n }[],\n TNode extends PrimitiveNode = PrimitiveNode,\n>(\n primitives: TPrimitives = [] as unknown as TPrimitives\n): JsxShim<TNode, TPrimitives> => {\n const primitiveTypes = new Set(primitives.map((primitive) => primitive.type));\n const { authoredByType, children, childSlotsByType } =\n createAuthoringModel(primitives);\n const childComponents = new Map(\n [...children.keys()].map((type) => [type, defineAuthorComponent(type)])\n );\n const view = defineAuthorComponent<CompositionAuthorProps<TNode>, 'view'>(\n 'view'\n );\n const env: ParseEnv = {\n authoredByType,\n childSlotsByType,\n primitiveTypes,\n };\n\n return {\n Composition: view,\n toComposition: (element) => toAuthorComposition<TNode>(element, env),\n ...Object.fromEntries(\n primitives.map((primitive) => [\n capitalize(primitive.type),\n defineAuthorComponent(primitive.type),\n ])\n ),\n ...Object.fromEntries(\n [...childComponents].map(([type, component]) => [\n capitalize(type),\n component,\n ])\n ),\n } as JsxShim<TNode, TPrimitives>;\n};\n\ninterface ParseEnv {\n authoredByType: ReadonlyMap<string, AuthoredSpec>;\n childSlotsByType: ReadonlyMap<string, readonly ChildSlot[]>;\n primitiveTypes: ReadonlySet<string>;\n}\n\nconst toAuthorComposition = <TNode extends PrimitiveNode>(\n element: ReactElement<CompositionAuthorProps<TNode>>,\n env: ParseEnv\n): AuthorComposition<TNode> => {\n requireAuthorElement<CompositionAuthorProps<TNode>>(element, 'view');\n const props = element.props;\n const resolvedBody =\n props.body ??\n flattenChildren(props.children).map((child) =>\n bodyNodeFromElement<TNode>(child, env)\n );\n const spec: AuthorComposition<TNode> = {\n type: 'view',\n body: resolvedBody,\n };\n\n if (props.version !== undefined) {\n spec.version = props.version;\n }\n if (props.title !== undefined) {\n spec.title = props.title;\n }\n if (props.subtitle !== undefined) {\n spec.subtitle = props.subtitle;\n }\n if (props.theme !== undefined) {\n spec.theme = props.theme;\n }\n if (props.meta !== undefined) {\n spec.meta = props.meta;\n }\n\n return spec;\n};\n\nconst bodyNodeFromElement = <TNode extends PrimitiveNode>(\n node: ReactNode,\n env: ParseEnv\n): TNode => {\n const element = requireAuthorElement<{ children?: ReactNode }>(node);\n const type = getAuthorType(element);\n if (!env.primitiveTypes.has(type)) {\n throw new IsomerError(\n 'INVALID_BODY_NODE',\n `\"${type}\" cannot be used as a composition body node.`\n );\n }\n\n const parseChild = (child: ReactNode): TNode =>\n bodyNodeFromElement<TNode>(child, env);\n const slots = env.childSlotsByType.get(type) ?? [];\n const authored = env.authoredByType.get(type);\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(\n withoutChildren<Record<string, unknown>>(element)\n )) {\n const childField = authored?.children.find((field) => field.field === key);\n converted[key] = childField\n ? valueFromChildField(value, childField, env)\n : convertPropValue(value, key, slots, parseChild);\n }\n\n const rawChildren = element.props.children;\n if (authored && (authored.children.length > 0 || authored.text.length > 0)) {\n fillAuthoredFields(converted, authored, rawChildren, env);\n } else {\n const unique = slots.length === 1 ? slots[0] : undefined;\n if (\n unique &&\n converted[unique.field] === undefined &&\n rawChildren !== undefined\n ) {\n const nested = flattenChildren(rawChildren).map(parseChild);\n converted[unique.field] = unique.array ? nested : nested[0];\n } else if (slots.length === 0 && flattenChildren(rawChildren).length > 0) {\n throw new IsomerError(\n 'UNEXPECTED_CHILDREN',\n `<${capitalize(type)}> takes no JSX children; set its fields through props.`\n );\n }\n }\n\n return omitUndefined({ ...converted, type }) as TNode;\n};\n\nconst fillAuthoredFields = (\n converted: Record<string, unknown>,\n authored: AuthoredSpec,\n rawChildren: ReactNode,\n env: ParseEnv\n): void => {\n for (const field of authored.children) {\n if (converted[field.field] !== undefined || rawChildren === undefined) {\n continue;\n }\n converted[field.field] = valueFromBrand(\n flattenChildren(rawChildren),\n field,\n env\n );\n }\n for (const field of authored.text) {\n if (converted[field.field] !== undefined) {\n continue;\n }\n if (rawChildren === undefined) {\n if (!field.optional) {\n throw new IsomerError(\n 'MISSING_AUTHORED_TEXT',\n `Expected text children for \"${field.field}\".`\n );\n }\n continue;\n }\n converted[field.field] = textFromChildren(rawChildren, {\n collapseWhitespace: field.collapseWhitespace,\n });\n }\n};\n\nconst valueFromChildField = (\n value: unknown,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n if (isJsxNodes(value)) {\n return valueFromBrand(flattenChildren(value), field, env);\n }\n return value;\n};\n\nconst isJsxNodes = (value: unknown): value is ReactNode => {\n if (isAuthorElement(value)) {\n return true;\n }\n if (isValidElement(value) && value.type === Fragment) {\n return true;\n }\n return (\n Array.isArray(value) &&\n value.some((item: unknown) => isAuthorElement(item) || isValidElement(item))\n );\n};\n\n/** The field's array of items, or its one item; throws on a second element for a single-item field. */\nconst valueFromBrand = (\n elements: readonly ReactNode[],\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n const items = elements.map((child) => itemFromElement(child, field, env));\n if (field.array) {\n return items;\n }\n if (items.length > 1) {\n throw new IsomerError(\n 'UNEXPECTED_CHILDREN',\n `\"${field.field}\" takes one <${capitalize(field.childType)}>, not ${items.length}.`\n );\n }\n return items[0];\n};\n\nconst itemFromElement = (\n child: ReactNode,\n field: AuthoredChildField,\n env: ParseEnv\n): unknown => {\n const element = requireAuthorElement<Record<string, unknown>>(\n child,\n field.childType\n );\n if (field.toItem) {\n return field.toItem(element.props, {\n parseChildren: (nested) =>\n flattenChildren(nested).map((node) => bodyNodeFromElement(node, env)),\n });\n }\n const props = withoutChildren<Record<string, unknown>>(element);\n const nested = flattenChildren(element.props.children);\n const elements = nested.filter(isAuthorElement);\n const text = nested.filter((child) => !isAuthorElement(child));\n if (\n field.textField !== undefined &&\n props[field.textField] === undefined &&\n text.length > 0\n ) {\n props[field.textField] = textFromChildren(text);\n }\n fillNestedBrands(field.itemSchema, props, elements, env);\n return props;\n};\n\nconst fillNestedBrands = (\n itemSchema: ZodType,\n props: Record<string, unknown>,\n elements: readonly ReactElement[],\n env: ParseEnv\n): void => {\n if (elements.length === 0) {\n return;\n }\n for (const field of readAuthoredSpec(itemSchema).children) {\n if (props[field.field] !== undefined) {\n continue;\n }\n const matching = elements.filter(\n (child) => getAuthorType(child) === field.childType\n );\n if (matching.length > 0) {\n props[field.field] = valueFromBrand(matching, field, env);\n }\n }\n};\n\nconst convertPropValue = <TNode extends PrimitiveNode>(\n value: unknown,\n field: string,\n slots: readonly ChildSlot[],\n parseChild: (child: ReactNode) => TNode\n): unknown => {\n const asArray = slots.some((slot) => slot.field === field && slot.array);\n const fromJsx = nodesFromJsx(value, parseChild);\n if (fromJsx) {\n return asArray ? fromJsx : fromJsx[0];\n }\n if (Array.isArray(value)) {\n return value.flatMap((item: unknown) => {\n const nodes = nodesFromJsx(item, parseChild);\n return nodes ?? [item];\n });\n }\n return value;\n};\n\nconst nodesFromJsx = <TNode extends PrimitiveNode>(\n value: unknown,\n parseChild: (child: ReactNode) => TNode\n): TNode[] | undefined => {\n if (isAuthorElement(value)) {\n return [parseChild(value)];\n }\n if (isValidElement(value) && value.type === Fragment) {\n return flattenChildren(value).map(parseChild);\n }\n return undefined;\n};\n\nconst isAuthorElement = (value: unknown): value is ReactElement => {\n if (!isValidElement(value)) {\n return false;\n }\n const component = value.type as Partial<AuthorComponent<unknown, string>>;\n return typeof component[authorType] === 'string';\n};\n\n/** React children as a flat array, with fragments inlined. */\nexport const flattenChildren = (children: ReactNode): ReactNode[] =>\n Children.toArray(children).flatMap((child) => {\n if (isValidElement(child) && child.type === Fragment) {\n const props = child.props as { children?: ReactNode };\n return flattenChildren(props.children);\n }\n return child;\n });\n\n/**\n * Children joined into one string. Throws on an element child, so a prop typed as text stays text. Collapses whitespace unless `{ collapseWhitespace: false }`.\n */\nexport const textFromChildren = (\n children: ReactNode,\n options?: { collapseWhitespace?: boolean }\n): string => {\n const text = flattenChildren(children)\n .map((child) => {\n if (typeof child === 'string' || typeof child === 'number') {\n return String(child);\n }\n throw new IsomerError(\n 'EXPECTED_TEXT_CHILDREN',\n 'Expected text children.'\n );\n })\n .join('');\n if (options?.collapseWhitespace === false) {\n return text.trim();\n }\n return text.replace(/\\s+/g, ' ').trim();\n};\n\n/** An element's props without `children` and without `undefined` entries. */\nconst withoutChildren = <TProps>(element: ReactElement<unknown>): TProps => {\n const props = { ...(element.props as TProps & { children?: ReactNode }) };\n delete props.children;\n return omitUndefined(props);\n};\n\n/** Narrows `element` to an authoring element, asserting `type` when given. */\nconst requireAuthorElement = <TProps>(\n element: ReactNode,\n type?: string\n): ReactElement<TProps & { children?: ReactNode }> => {\n assertValidElement(element);\n const actual = getAuthorType(element);\n if (type !== undefined && actual !== type) {\n throw new IsomerError(\n 'AUTHOR_TYPE_MISMATCH',\n `Expected <${type}> but received <${actual}>.`\n );\n }\n return element as ReactElement<TProps & { children?: ReactNode }>;\n};\n\n/** The primitive type {@link authorType} brands onto `element`'s component. */\nconst getAuthorType = (element: ReactElement<unknown>): string => {\n const component = element.type as Partial<AuthorComponent<unknown, string>>;\n const type = component[authorType];\n if (!type) {\n throw new IsomerError(\n 'EXPECTED_AUTHOR_COMPONENT',\n 'Expected an Isomer authoring component.'\n );\n }\n return type;\n};\n\nconst assertValidElement: (\n element: ReactNode\n) => asserts element is ReactElement<unknown> = (element) => {\n if (!isValidElement(element)) {\n throw new IsomerError(\n 'EXPECTED_JSX_ELEMENT',\n 'Expected an Isomer JSX element.'\n );\n }\n};\n\nconst omitUndefined = <T extends object>(value: T): T =>\n Object.fromEntries(\n Object.entries(value).filter((entry) => entry[1] !== undefined)\n ) as T;\n"]}
@@ -0,0 +1,58 @@
1
+ import type { PrimitiveCatalogEntry } from '../define/primitive_module.js';
2
+ import type { PrimitiveGroup } from '../pack/primitive_pack.js';
3
+ type JsonSchema = Record<string, unknown>;
4
+ /** Which authoring job the prompt frames for the model. */
5
+ export type AuthoringProfileId = 'general' | 'registered-view-router' | 'compose-from-primitives';
6
+ /** Every {@link AuthoringProfileId}. */
7
+ export declare const AUTHORING_PROFILE_IDS: readonly AuthoringProfileId[];
8
+ /**
9
+ * A registered view, declared structurally so this module does not import the
10
+ * runtime. {@link RegisteredViewSummary} must stay assignable to this.
11
+ */
12
+ export interface AuthoringViewSummary {
13
+ id: string;
14
+ title: string;
15
+ description?: string;
16
+ /** Natural-language queries the view answers, printed so the model can route by them. */
17
+ answers: readonly string[];
18
+ /** JSON Schema for the view's input, printed inline when present. */
19
+ inputSchema?: JsonSchema;
20
+ }
21
+ /** The pack-supplied material {@link buildAuthoringPrompt} assembles. */
22
+ export interface AuthoringPromptContext {
23
+ guide: string;
24
+ /** Absent or empty drops the `## Rules` section. */
25
+ rules?: string;
26
+ /** JSON Schema for a whole composition. Absent, or under the router profile, it is not inlined. */
27
+ schema?: JsonSchema;
28
+ /** Rendered as a bullet per entry, with its `useWhen`, `avoidWhen`, and `example`. */
29
+ primitives: readonly PrimitiveCatalogEntry[];
30
+ /** `'index'` lists each primitive's type and purpose only, for a host that serves the rest on request. */
31
+ catalog?: 'full' | 'index';
32
+ /** Headings an index sorts primitives under; a type in none is listed under "Other". */
33
+ groups?: readonly PrimitiveGroup[];
34
+ /**
35
+ * Extra host-supplied compositions beyond each primitive's catalog example.
36
+ * Trimmed to the profile's budget. An empty list drops `## Examples`.
37
+ */
38
+ examples: readonly unknown[];
39
+ /** Registered views the model can request by id. An empty list drops the section. */
40
+ views?: readonly AuthoringViewSummary[];
41
+ /** Defaults to `'# View authoring'`. */
42
+ heading?: string;
43
+ /** Replaces the profile's own framing sentence. */
44
+ intro?: string;
45
+ }
46
+ /** One primitive's catalog bullet: its purpose, `useWhen`, `avoidWhen`, and example. */
47
+ export declare const formatPrimitiveEntry: (entry: PrimitiveCatalogEntry) => string;
48
+ /**
49
+ * Assembles `context` into the prompt for `profile`, trimming the examples to
50
+ * that profile's budget.
51
+ *
52
+ * The copy says "view" throughout because that is the wire discriminator and
53
+ * the word models are trained and prompted on; pass `heading` and `intro` to
54
+ * override it per host.
55
+ */
56
+ export declare const buildAuthoringPrompt: (profile: AuthoringProfileId, context: AuthoringPromptContext) => string;
57
+ export {};
58
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/author/prompt.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAC5B,SAAS,GAAG,wBAAwB,GAAG,yBAAyB,CAAC;AAEnE,wCAAwC;AACxC,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAI9D,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,qEAAqE;IACrE,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B;AAED,yEAAyE;AACzE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,sFAAsF;IACtF,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC7C,0GAA0G;IAC1G,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,wFAAwF;IACxF,MAAM,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC;;;OAGG;IACH,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAC7B,qFAAqF;IACrF,KAAK,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACxC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqED,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,GAAI,OAAO,qBAAqB,KAAG,MAUnE,CAAC;AA4DF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,kBAAkB,EAC3B,SAAS,sBAAsB,KAC9B,MAmCF,CAAC"}
@@ -0,0 +1,148 @@
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 { oneLine } from '../composition/one_line.js';
8
+ /** Every {@link AuthoringProfileId}. */
9
+ export const AUTHORING_PROFILE_IDS = [
10
+ 'general',
11
+ 'registered-view-router',
12
+ 'compose-from-primitives',
13
+ ];
14
+ const COMPOSE_INTRO_WITHOUT_SCHEMA = 'You compose views from scratch. Build a single JSON object that answers the question using only the primitives in the catalog below.';
15
+ const INDEX_INTRO = 'Each primitive is listed by type and purpose. Before using one, request its catalog entry and JSON Schema by type; compose only from primitives whose details you have.';
16
+ const PROFILE_INTROS = {
17
+ general: 'You author views: compact, host-portable operational displays expressed as a single JSON object. Route to a registered view when one answers the question; otherwise compose a view from the primitive catalog below.',
18
+ 'registered-view-router': 'You route questions to registered views. Prefer an existing registered view whose answers index matches the question; request it by id with its input. Only fall back to composing a view when no registered view fits, using the catalog below.',
19
+ 'compose-from-primitives': 'You compose views from scratch. Build a single JSON object that answers the question using only the primitives in the catalog below, and validate your output mentally against the JSON Schema before responding.',
20
+ };
21
+ /** Host-supplied composition examples kept after each primitive already shows its shape. */
22
+ const PROFILE_EXAMPLE_LIMITS = {
23
+ general: 1,
24
+ 'registered-view-router': 0,
25
+ 'compose-from-primitives': 1,
26
+ };
27
+ const PROFILE_INCLUDES_SCHEMA = {
28
+ general: true,
29
+ 'registered-view-router': false,
30
+ 'compose-from-primitives': true,
31
+ };
32
+ /** Minified JSON with U+2028 and U+2029 escaped, so it always prints on one line. */
33
+ const compactJson = (value) => String(JSON.stringify(value)).replace(/[\u2028\u2029]/g, (separator) => `\\u${separator.charCodeAt(0).toString(16)}`);
34
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
35
+ /** Host examples show composition, not provenance. */
36
+ const withoutMeta = (value) => {
37
+ if (!isRecord(value) || !('meta' in value)) {
38
+ return value;
39
+ }
40
+ const rest = { ...value };
41
+ delete rest.meta;
42
+ return rest;
43
+ };
44
+ /** `text` as a Markdown code span, fenced longer than any backtick run inside it. */
45
+ const codeSpan = (text) => {
46
+ const longestRun = Math.max(0, ...(text.match(/`+/g) ?? []).map(({ length }) => length));
47
+ const fence = '`'.repeat(longestRun + 1);
48
+ const pad = /^`|`$/.test(text) ? ' ' : '';
49
+ return `${fence}${pad}${text}${pad}${fence}`;
50
+ };
51
+ /** A lookup key as a code span, JSON-quoted when it would not survive printing bare. */
52
+ const keySpan = (key) => codeSpan(key !== '' && key.trim() === key && !/[\p{Cc}\p{Cs}\u2028\u2029]/u.test(key)
53
+ ? key
54
+ : compactJson(key));
55
+ /** One primitive's catalog bullet: its purpose, `useWhen`, `avoidWhen`, and example. */
56
+ export const formatPrimitiveEntry = (entry) => {
57
+ const lines = [`- ${keySpan(entry.type)} — ${oneLine(entry.purpose)}`];
58
+ if (entry.useWhen.length > 0) {
59
+ lines.push(` - Use when: ${oneLine(entry.useWhen.join(' '))}`);
60
+ }
61
+ if (entry.avoidWhen.length > 0) {
62
+ lines.push(` - Avoid when: ${oneLine(entry.avoidWhen.join(' '))}`);
63
+ }
64
+ lines.push(` - Example: ${codeSpan(compactJson(entry.example))}`);
65
+ return lines.join('\n');
66
+ };
67
+ const renderCatalog = (primitives) => primitives.map(formatPrimitiveEntry).join('\n');
68
+ const renderIndex = (primitives, groups = []) => {
69
+ const byType = new Map(primitives.map((entry) => [entry.type, entry]));
70
+ const grouped = new Set(groups.flatMap(({ types }) => types));
71
+ const sections = [
72
+ ...groups.map(({ title, types }) => ({
73
+ title,
74
+ entries: types.flatMap((type) => byType.get(type) ?? []),
75
+ })),
76
+ {
77
+ title: 'Other',
78
+ entries: primitives.filter(({ type }) => !grouped.has(type)),
79
+ },
80
+ ];
81
+ return [
82
+ INDEX_INTRO,
83
+ ...sections
84
+ .filter(({ entries }) => entries.length > 0)
85
+ .map(({ title, entries }) => `### ${oneLine(title)}\n\n${entries
86
+ .map(({ type, purpose }) => `- ${keySpan(type)} — ${oneLine(purpose)}`)
87
+ .join('\n')}`),
88
+ ].join('\n\n');
89
+ };
90
+ const renderViews = (views) => views
91
+ .map((view) => {
92
+ const lines = [`- ${keySpan(view.id)} — ${oneLine(view.title)}`];
93
+ if (view.description !== undefined && view.description.length > 0) {
94
+ lines.push(` - ${oneLine(view.description)}`);
95
+ }
96
+ if (view.answers.length > 0) {
97
+ lines.push(` - Answers: ${oneLine(view.answers.join('; '))}`);
98
+ }
99
+ if (view.inputSchema !== undefined) {
100
+ lines.push(` - Input: ${codeSpan(compactJson(view.inputSchema))}`);
101
+ }
102
+ return lines.join('\n');
103
+ })
104
+ .join('\n');
105
+ const renderExamples = (examples) => examples
106
+ .map((example) => `\`\`\`json\n${compactJson(withoutMeta(example))}\n\`\`\``)
107
+ .join('\n\n');
108
+ /**
109
+ * Assembles `context` into the prompt for `profile`, trimming the examples to
110
+ * that profile's budget.
111
+ *
112
+ * The copy says "view" throughout because that is the wire discriminator and
113
+ * the word models are trained and prompted on; pass `heading` and `intro` to
114
+ * override it per host.
115
+ */
116
+ export const buildAuthoringPrompt = (profile, context) => {
117
+ const examples = context.examples
118
+ .slice(0, PROFILE_EXAMPLE_LIMITS[profile])
119
+ .map(withoutMeta);
120
+ const views = context.views ?? [];
121
+ const schema = PROFILE_INCLUDES_SCHEMA[profile] ? context.schema : undefined;
122
+ const intro = profile === 'compose-from-primitives' && schema === undefined
123
+ ? COMPOSE_INTRO_WITHOUT_SCHEMA
124
+ : PROFILE_INTROS[profile];
125
+ const sections = [
126
+ context.heading ?? '# View authoring',
127
+ context.intro ?? intro,
128
+ `## Guide\n\n${context.guide}`,
129
+ ];
130
+ if (context.rules !== undefined && context.rules.length > 0) {
131
+ sections.push(`## Rules\n\n${context.rules}`);
132
+ }
133
+ if (views.length > 0) {
134
+ sections.push(`## Registered views\n\n${renderViews(views)}`);
135
+ }
136
+ const catalog = context.catalog === 'index'
137
+ ? renderIndex(context.primitives, context.groups)
138
+ : renderCatalog(context.primitives);
139
+ sections.push(`## Primitive catalog\n\n${catalog}`);
140
+ if (schema !== undefined) {
141
+ sections.push(`## JSON Schema\n\n\`\`\`json\n${compactJson(schema)}\n\`\`\``);
142
+ }
143
+ if (examples.length > 0) {
144
+ sections.push(`## Examples\n\n${renderExamples(examples)}`);
145
+ }
146
+ return sections.join('\n\n');
147
+ };
148
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/author/prompt.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 { oneLine } from '../composition/one_line';\nimport type { PrimitiveCatalogEntry } from '../define/primitive_module';\nimport type { PrimitiveGroup } from '../pack/primitive_pack';\n\ntype JsonSchema = Record<string, unknown>;\n\n/** Which authoring job the prompt frames for the model. */\nexport type AuthoringProfileId =\n 'general' | 'registered-view-router' | 'compose-from-primitives';\n\n/** Every {@link AuthoringProfileId}. */\nexport const AUTHORING_PROFILE_IDS: readonly AuthoringProfileId[] = [\n 'general',\n 'registered-view-router',\n 'compose-from-primitives',\n];\n\n/**\n * A registered view, declared structurally so this module does not import the\n * runtime. {@link RegisteredViewSummary} must stay assignable to this.\n */\nexport interface AuthoringViewSummary {\n id: string;\n title: string;\n description?: string;\n /** Natural-language queries the view answers, printed so the model can route by them. */\n answers: readonly string[];\n /** JSON Schema for the view's input, printed inline when present. */\n inputSchema?: JsonSchema;\n}\n\n/** The pack-supplied material {@link buildAuthoringPrompt} assembles. */\nexport interface AuthoringPromptContext {\n guide: string;\n /** Absent or empty drops the `## Rules` section. */\n rules?: string;\n /** JSON Schema for a whole composition. Absent, or under the router profile, it is not inlined. */\n schema?: JsonSchema;\n /** Rendered as a bullet per entry, with its `useWhen`, `avoidWhen`, and `example`. */\n primitives: readonly PrimitiveCatalogEntry[];\n /** `'index'` lists each primitive's type and purpose only, for a host that serves the rest on request. */\n catalog?: 'full' | 'index';\n /** Headings an index sorts primitives under; a type in none is listed under \"Other\". */\n groups?: readonly PrimitiveGroup[];\n /**\n * Extra host-supplied compositions beyond each primitive's catalog example.\n * Trimmed to the profile's budget. An empty list drops `## Examples`.\n */\n examples: readonly unknown[];\n /** Registered views the model can request by id. An empty list drops the section. */\n views?: readonly AuthoringViewSummary[];\n /** Defaults to `'# View authoring'`. */\n heading?: string;\n /** Replaces the profile's own framing sentence. */\n intro?: string;\n}\n\nconst COMPOSE_INTRO_WITHOUT_SCHEMA =\n 'You compose views from scratch. Build a single JSON object that answers the question using only the primitives in the catalog below.';\n\nconst INDEX_INTRO =\n 'Each primitive is listed by type and purpose. Before using one, request its catalog entry and JSON Schema by type; compose only from primitives whose details you have.';\n\nconst PROFILE_INTROS: Record<AuthoringProfileId, string> = {\n general:\n 'You author views: compact, host-portable operational displays expressed as a single JSON object. Route to a registered view when one answers the question; otherwise compose a view from the primitive catalog below.',\n 'registered-view-router':\n 'You route questions to registered views. Prefer an existing registered view whose answers index matches the question; request it by id with its input. Only fall back to composing a view when no registered view fits, using the catalog below.',\n 'compose-from-primitives':\n 'You compose views from scratch. Build a single JSON object that answers the question using only the primitives in the catalog below, and validate your output mentally against the JSON Schema before responding.',\n};\n\n/** Host-supplied composition examples kept after each primitive already shows its shape. */\nconst PROFILE_EXAMPLE_LIMITS: Record<AuthoringProfileId, number> = {\n general: 1,\n 'registered-view-router': 0,\n 'compose-from-primitives': 1,\n};\n\nconst PROFILE_INCLUDES_SCHEMA: Record<AuthoringProfileId, boolean> = {\n general: true,\n 'registered-view-router': false,\n 'compose-from-primitives': true,\n};\n\n/** Minified JSON with U+2028 and U+2029 escaped, so it always prints on one line. */\nconst compactJson = (value: unknown): string =>\n String(JSON.stringify(value)).replace(\n /[\\u2028\\u2029]/g,\n (separator) => `\\\\u${separator.charCodeAt(0).toString(16)}`\n );\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** Host examples show composition, not provenance. */\nconst withoutMeta = (value: unknown): unknown => {\n if (!isRecord(value) || !('meta' in value)) {\n return value;\n }\n const rest = { ...value };\n delete rest.meta;\n return rest;\n};\n\n/** `text` as a Markdown code span, fenced longer than any backtick run inside it. */\nconst codeSpan = (text: string): string => {\n const longestRun = Math.max(\n 0,\n ...(text.match(/`+/g) ?? []).map(({ length }) => length)\n );\n const fence = '`'.repeat(longestRun + 1);\n const pad = /^`|`$/.test(text) ? ' ' : '';\n return `${fence}${pad}${text}${pad}${fence}`;\n};\n\n/** A lookup key as a code span, JSON-quoted when it would not survive printing bare. */\nconst keySpan = (key: string): string =>\n codeSpan(\n key !== '' && key.trim() === key && !/[\\p{Cc}\\p{Cs}\\u2028\\u2029]/u.test(key)\n ? key\n : compactJson(key)\n );\n\n/** One primitive's catalog bullet: its purpose, `useWhen`, `avoidWhen`, and example. */\nexport const formatPrimitiveEntry = (entry: PrimitiveCatalogEntry): string => {\n const lines = [`- ${keySpan(entry.type)} — ${oneLine(entry.purpose)}`];\n if (entry.useWhen.length > 0) {\n lines.push(` - Use when: ${oneLine(entry.useWhen.join(' '))}`);\n }\n if (entry.avoidWhen.length > 0) {\n lines.push(` - Avoid when: ${oneLine(entry.avoidWhen.join(' '))}`);\n }\n lines.push(` - Example: ${codeSpan(compactJson(entry.example))}`);\n return lines.join('\\n');\n};\n\nconst renderCatalog = (primitives: readonly PrimitiveCatalogEntry[]): string =>\n primitives.map(formatPrimitiveEntry).join('\\n');\n\nconst renderIndex = (\n primitives: readonly PrimitiveCatalogEntry[],\n groups: readonly PrimitiveGroup[] = []\n): string => {\n const byType = new Map(primitives.map((entry) => [entry.type, entry]));\n const grouped = new Set(groups.flatMap(({ types }) => types));\n const sections = [\n ...groups.map(({ title, types }) => ({\n title,\n entries: types.flatMap((type) => byType.get(type) ?? []),\n })),\n {\n title: 'Other',\n entries: primitives.filter(({ type }) => !grouped.has(type)),\n },\n ];\n return [\n INDEX_INTRO,\n ...sections\n .filter(({ entries }) => entries.length > 0)\n .map(\n ({ title, entries }) =>\n `### ${oneLine(title)}\\n\\n${entries\n .map(\n ({ type, purpose }) => `- ${keySpan(type)} — ${oneLine(purpose)}`\n )\n .join('\\n')}`\n ),\n ].join('\\n\\n');\n};\n\nconst renderViews = (views: readonly AuthoringViewSummary[]): string =>\n views\n .map((view) => {\n const lines = [`- ${keySpan(view.id)} — ${oneLine(view.title)}`];\n if (view.description !== undefined && view.description.length > 0) {\n lines.push(` - ${oneLine(view.description)}`);\n }\n if (view.answers.length > 0) {\n lines.push(` - Answers: ${oneLine(view.answers.join('; '))}`);\n }\n if (view.inputSchema !== undefined) {\n lines.push(` - Input: ${codeSpan(compactJson(view.inputSchema))}`);\n }\n return lines.join('\\n');\n })\n .join('\\n');\n\nconst renderExamples = (examples: readonly unknown[]): string =>\n examples\n .map(\n (example) => `\\`\\`\\`json\\n${compactJson(withoutMeta(example))}\\n\\`\\`\\``\n )\n .join('\\n\\n');\n\n/**\n * Assembles `context` into the prompt for `profile`, trimming the examples to\n * that profile's budget.\n *\n * The copy says \"view\" throughout because that is the wire discriminator and\n * the word models are trained and prompted on; pass `heading` and `intro` to\n * override it per host.\n */\nexport const buildAuthoringPrompt = (\n profile: AuthoringProfileId,\n context: AuthoringPromptContext\n): string => {\n const examples = context.examples\n .slice(0, PROFILE_EXAMPLE_LIMITS[profile])\n .map(withoutMeta);\n const views = context.views ?? [];\n const schema = PROFILE_INCLUDES_SCHEMA[profile] ? context.schema : undefined;\n const intro =\n profile === 'compose-from-primitives' && schema === undefined\n ? COMPOSE_INTRO_WITHOUT_SCHEMA\n : PROFILE_INTROS[profile];\n const sections = [\n context.heading ?? '# View authoring',\n context.intro ?? intro,\n `## Guide\\n\\n${context.guide}`,\n ];\n if (context.rules !== undefined && context.rules.length > 0) {\n sections.push(`## Rules\\n\\n${context.rules}`);\n }\n if (views.length > 0) {\n sections.push(`## Registered views\\n\\n${renderViews(views)}`);\n }\n const catalog =\n context.catalog === 'index'\n ? renderIndex(context.primitives, context.groups)\n : renderCatalog(context.primitives);\n sections.push(`## Primitive catalog\\n\\n${catalog}`);\n if (schema !== undefined) {\n sections.push(\n `## JSON Schema\\n\\n\\`\\`\\`json\\n${compactJson(schema)}\\n\\`\\`\\``\n );\n }\n if (examples.length > 0) {\n sections.push(`## Examples\\n\\n${renderExamples(examples)}`);\n }\n return sections.join('\\n\\n');\n};\n"]}
@@ -0,0 +1,37 @@
1
+ export type JsonObject = Record<string, unknown>;
2
+ export declare const DEF_PREFIX = "#/$defs/";
3
+ /** Ids `z.toJSONSchema` gives a def no one named. */
4
+ export declare const ANONYMOUS_DEF: RegExp;
5
+ export declare const IDENTIFIER: RegExp;
6
+ export declare const isJsonObject: (value: unknown) => value is JsonObject;
7
+ export declare const parseDefRef: (ref: unknown) => string | undefined;
8
+ export declare const ownDef: (defs: JsonObject, id: string) => unknown;
9
+ /** `slideStats` becomes `SlideStats`; anything but letters and digits splits words. */
10
+ export declare const pascalCase: (value: string) => string;
11
+ /** A JSDoc block for `lines`, or `''` when there are none. */
12
+ export declare const jsDoc: (lines: readonly string[], pad: string) => string;
13
+ /** What {@link TypePrinter.members} prints and how. */
14
+ export interface MemberOptions {
15
+ /** Properties left out. */
16
+ omit?: ReadonlySet<string>;
17
+ /** Properties printed optional whether or not the schema requires them. */
18
+ optional?: ReadonlySet<string>;
19
+ }
20
+ export interface TypePrinterOptions {
21
+ defs: JsonObject;
22
+ /** TypeScript names for defs printed by reference; every other def is inlined. */
23
+ names: ReadonlyMap<string, string>;
24
+ /** A fresh, unused name, for a def inlining cannot express. */
25
+ claim: (base: string) => string;
26
+ }
27
+ export interface TypePrinter {
28
+ /** `schema` as a TypeScript type, written at `depth` levels of indent. */
29
+ print: (schema: unknown, depth?: number) => string;
30
+ /** The `key?: Type;` members of an object schema, with their JSDoc, at `depth + 1`. */
31
+ members: (schema: JsonObject, depth: number, options?: MemberOptions) => string;
32
+ /** Type aliases for the anonymous defs that refer to themselves. Call last. */
33
+ promoted: () => string[];
34
+ }
35
+ /** A TypeScript printer over the subset of JSON Schema `z.toJSONSchema` emits. */
36
+ export declare const createTypePrinter: ({ defs, names, claim, }: TypePrinterOptions) => TypePrinter;
37
+ //# sourceMappingURL=schema_to_typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_to_typescript.d.ts","sourceRoot":"","sources":["../../src/author/schema_to_typescript.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,qDAAqD;AACrD,eAAO,MAAM,aAAa,QAAkB,CAAC;AAmB7C,eAAO,MAAM,UAAU,QAAuB,CAAC;AAE/C,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,UACe,CAAC;AAEvE,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,KAAG,MAAM,GAAG,SAGrC,CAAC;AAEhB,eAAO,MAAM,MAAM,GAAI,MAAM,UAAU,EAAE,IAAI,MAAM,KAAG,OACN,CAAC;AAEjD,uFAAuF;AACvF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAU1C,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,KAAK,GAAI,OAAO,SAAS,MAAM,EAAE,EAAE,KAAK,MAAM,KAAG,MAoB7D,CAAC;AAyDF,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,kFAAkF;IAClF,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,+DAA+D;IAC/D,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,uFAAuF;IACvF,OAAO,EAAE,CACP,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,KACpB,MAAM,CAAC;IACZ,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,MAAM,EAAE,CAAC;CAC1B;AAED,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,GAAI,yBAI/B,kBAAkB,KAAG,WA0PvB,CAAC"}