@elastic/isomer-sdk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/NOTICE.txt +0 -286
  2. package/README.md +13 -2
  3. package/THIRD_PARTY_LICENSES.md +1 -885
  4. package/dist/author/authored_fields.d.ts +93 -18
  5. package/dist/author/authored_fields.d.ts.map +1 -1
  6. package/dist/author/authored_fields.js +63 -43
  7. package/dist/author/authored_fields.js.map +1 -1
  8. package/dist/author/authoring_input.d.ts +7 -0
  9. package/dist/author/authoring_input.d.ts.map +1 -0
  10. package/dist/author/authoring_input.js +66 -0
  11. package/dist/author/authoring_input.js.map +1 -0
  12. package/dist/author/authoring_model.d.ts +33 -0
  13. package/dist/author/authoring_model.d.ts.map +1 -0
  14. package/dist/author/authoring_model.js +142 -0
  15. package/dist/author/authoring_model.js.map +1 -0
  16. package/dist/author/declarations.d.ts +13 -0
  17. package/dist/author/declarations.d.ts.map +1 -0
  18. package/dist/author/declarations.js +288 -0
  19. package/dist/author/declarations.js.map +1 -0
  20. package/dist/author/index.d.ts +4 -1
  21. package/dist/author/index.d.ts.map +1 -1
  22. package/dist/author/index.js +4 -1
  23. package/dist/author/index.js.map +1 -1
  24. package/dist/author/jsx_shim.d.ts +50 -30
  25. package/dist/author/jsx_shim.d.ts.map +1 -1
  26. package/dist/author/jsx_shim.js +146 -138
  27. package/dist/author/jsx_shim.js.map +1 -1
  28. package/dist/author/print_jsx.d.ts +19 -0
  29. package/dist/author/print_jsx.d.ts.map +1 -0
  30. package/dist/author/print_jsx.js +372 -0
  31. package/dist/author/print_jsx.js.map +1 -0
  32. package/dist/author/prompt.d.ts +2 -2
  33. package/dist/author/prompt.d.ts.map +1 -1
  34. package/dist/author/prompt.js +7 -2
  35. package/dist/author/prompt.js.map +1 -1
  36. package/dist/author/schema_to_typescript.d.ts +37 -0
  37. package/dist/author/schema_to_typescript.d.ts.map +1 -0
  38. package/dist/author/schema_to_typescript.js +289 -0
  39. package/dist/author/schema_to_typescript.js.map +1 -0
  40. package/dist/cjs/author/authored_fields.js +68 -47
  41. package/dist/cjs/author/authored_fields.js.map +1 -1
  42. package/dist/cjs/author/authoring_input.js +70 -0
  43. package/dist/cjs/author/authoring_input.js.map +1 -0
  44. package/dist/cjs/author/authoring_model.js +149 -0
  45. package/dist/cjs/author/authoring_model.js.map +1 -0
  46. package/dist/cjs/author/declarations.js +292 -0
  47. package/dist/cjs/author/declarations.js.map +1 -0
  48. package/dist/cjs/author/index.js +10 -1
  49. package/dist/cjs/author/index.js.map +1 -1
  50. package/dist/cjs/author/jsx_shim.js +148 -140
  51. package/dist/cjs/author/jsx_shim.js.map +1 -1
  52. package/dist/cjs/author/print_jsx.js +378 -0
  53. package/dist/cjs/author/print_jsx.js.map +1 -0
  54. package/dist/cjs/author/prompt.js +7 -2
  55. package/dist/cjs/author/prompt.js.map +1 -1
  56. package/dist/cjs/author/schema_to_typescript.js +298 -0
  57. package/dist/cjs/author/schema_to_typescript.js.map +1 -0
  58. package/dist/cjs/composition/body_node_base.js +11 -4
  59. package/dist/cjs/composition/body_node_base.js.map +1 -1
  60. package/dist/cjs/composition/error.js +2 -0
  61. package/dist/cjs/composition/error.js.map +1 -1
  62. package/dist/cjs/composition/index.js +2 -1
  63. package/dist/cjs/composition/index.js.map +1 -1
  64. package/dist/cjs/composition/structured_value.js.map +1 -1
  65. package/dist/cjs/define/frame.js +2 -3
  66. package/dist/cjs/define/frame.js.map +1 -1
  67. package/dist/cjs/define/index.js +7 -1
  68. package/dist/cjs/define/index.js.map +1 -1
  69. package/dist/cjs/define/primitive_example.js +26 -0
  70. package/dist/cjs/define/primitive_example.js.map +1 -0
  71. package/dist/cjs/define/primitive_icon.js +17 -0
  72. package/dist/cjs/define/primitive_icon.js.map +1 -0
  73. package/dist/cjs/define/primitive_module.js +24 -7
  74. package/dist/cjs/define/primitive_module.js.map +1 -1
  75. package/dist/cjs/define/slack_assets.js.map +1 -1
  76. package/dist/cjs/entries/index.js +8 -2
  77. package/dist/cjs/entries/index.js.map +1 -1
  78. package/dist/cjs/entries/markdown.js +2 -1
  79. package/dist/cjs/entries/markdown.js.map +1 -1
  80. package/dist/cjs/entries/slack.js +1 -2
  81. package/dist/cjs/entries/slack.js.map +1 -1
  82. package/dist/cjs/pack/capabilities.js +17 -11
  83. package/dist/cjs/pack/capabilities.js.map +1 -1
  84. package/dist/cjs/pack/compose.js +4 -1
  85. package/dist/cjs/pack/compose.js.map +1 -1
  86. package/dist/cjs/pack/index.js +2 -1
  87. package/dist/cjs/pack/index.js.map +1 -1
  88. package/dist/cjs/pack/primitive_pack.js +27 -5
  89. package/dist/cjs/pack/primitive_pack.js.map +1 -1
  90. package/dist/cjs/render/anchors.js +1 -1
  91. package/dist/cjs/render/anchors.js.map +1 -1
  92. package/dist/cjs/render/format_number.js +2 -1
  93. package/dist/cjs/render/format_number.js.map +1 -1
  94. package/dist/cjs/render/html/envelope.js +12 -6
  95. package/dist/cjs/render/html/envelope.js.map +1 -1
  96. package/dist/cjs/render/layout_check.js.map +1 -1
  97. package/dist/cjs/render/markdown/builder.js +18 -8
  98. package/dist/cjs/render/markdown/builder.js.map +1 -1
  99. package/dist/cjs/render/markdown/format.js +70 -30
  100. package/dist/cjs/render/markdown/format.js.map +1 -1
  101. package/dist/cjs/render/markdown/host_tags.js +67 -0
  102. package/dist/cjs/render/markdown/host_tags.js.map +1 -0
  103. package/dist/cjs/render/markdown/index.js +3 -1
  104. package/dist/cjs/render/markdown/index.js.map +1 -1
  105. package/dist/cjs/render/markdown/split.js +325 -0
  106. package/dist/cjs/render/markdown/split.js.map +1 -0
  107. package/dist/cjs/render/primitive_dispatch.js +11 -25
  108. package/dist/cjs/render/primitive_dispatch.js.map +1 -1
  109. package/dist/cjs/render/react/content.js +3 -1
  110. package/dist/cjs/render/react/content.js.map +1 -1
  111. package/dist/cjs/render/slack/format.js +1 -601
  112. package/dist/cjs/render/slack/format.js.map +1 -1
  113. package/dist/cjs/render/slack/index.js +1 -2
  114. package/dist/cjs/render/slack/index.js.map +1 -1
  115. package/dist/cjs/render/slack/markdown_content.js +172 -115
  116. package/dist/cjs/render/slack/markdown_content.js.map +1 -1
  117. package/dist/cjs/testing/conformance.js +40 -24
  118. package/dist/cjs/testing/conformance.js.map +1 -1
  119. package/dist/cjs/testing/icon.js +248 -0
  120. package/dist/cjs/testing/icon.js.map +1 -0
  121. package/dist/cjs/testing/index.js +3 -1
  122. package/dist/cjs/testing/index.js.map +1 -1
  123. package/dist/cjs/testing/registration.js +5 -3
  124. package/dist/cjs/testing/registration.js.map +1 -1
  125. package/dist/cjs/validate/authoring_schema.js +17 -1
  126. package/dist/cjs/validate/authoring_schema.js.map +1 -1
  127. package/dist/cjs/validate/index.js +2 -1
  128. package/dist/cjs/validate/index.js.map +1 -1
  129. package/dist/cjs/validate/json_schema.js +10 -3
  130. package/dist/cjs/validate/json_schema.js.map +1 -1
  131. package/dist/cjs/validate/url.js +2 -1
  132. package/dist/cjs/validate/url.js.map +1 -1
  133. package/dist/cjs/validate/validation.js +2 -45
  134. package/dist/cjs/validate/validation.js.map +1 -1
  135. package/dist/composition/body_node_base.d.ts +7 -6
  136. package/dist/composition/body_node_base.d.ts.map +1 -1
  137. package/dist/composition/body_node_base.js +10 -3
  138. package/dist/composition/body_node_base.js.map +1 -1
  139. package/dist/composition/error.d.ts +2 -0
  140. package/dist/composition/error.d.ts.map +1 -1
  141. package/dist/composition/error.js +2 -0
  142. package/dist/composition/error.js.map +1 -1
  143. package/dist/composition/index.d.ts +1 -1
  144. package/dist/composition/index.d.ts.map +1 -1
  145. package/dist/composition/index.js +1 -1
  146. package/dist/composition/index.js.map +1 -1
  147. package/dist/composition/structured_value.d.ts +3 -3
  148. package/dist/composition/structured_value.d.ts.map +1 -1
  149. package/dist/composition/structured_value.js.map +1 -1
  150. package/dist/define/frame.d.ts +9 -20
  151. package/dist/define/frame.d.ts.map +1 -1
  152. package/dist/define/frame.js +2 -3
  153. package/dist/define/frame.js.map +1 -1
  154. package/dist/define/index.d.ts +3 -1
  155. package/dist/define/index.d.ts.map +1 -1
  156. package/dist/define/index.js +3 -1
  157. package/dist/define/index.js.map +1 -1
  158. package/dist/define/primitive_example.d.ts +30 -0
  159. package/dist/define/primitive_example.d.ts.map +1 -0
  160. package/dist/define/primitive_example.js +21 -0
  161. package/dist/define/primitive_example.js.map +1 -0
  162. package/dist/define/primitive_icon.d.ts +11 -0
  163. package/dist/define/primitive_icon.d.ts.map +1 -0
  164. package/dist/define/primitive_icon.js +14 -0
  165. package/dist/define/primitive_icon.js.map +1 -0
  166. package/dist/define/primitive_module.d.ts +45 -24
  167. package/dist/define/primitive_module.d.ts.map +1 -1
  168. package/dist/define/primitive_module.js +24 -7
  169. package/dist/define/primitive_module.js.map +1 -1
  170. package/dist/define/slack_assets.d.ts +1 -1
  171. package/dist/define/slack_assets.d.ts.map +1 -1
  172. package/dist/define/slack_assets.js.map +1 -1
  173. package/dist/entries/index.d.ts +3 -3
  174. package/dist/entries/index.d.ts.map +1 -1
  175. package/dist/entries/index.js +3 -3
  176. package/dist/entries/index.js.map +1 -1
  177. package/dist/entries/markdown.d.ts +1 -1
  178. package/dist/entries/markdown.d.ts.map +1 -1
  179. package/dist/entries/markdown.js +1 -1
  180. package/dist/entries/markdown.js.map +1 -1
  181. package/dist/entries/slack.d.ts +1 -1
  182. package/dist/entries/slack.d.ts.map +1 -1
  183. package/dist/entries/slack.js +1 -1
  184. package/dist/entries/slack.js.map +1 -1
  185. package/dist/pack/capabilities.d.ts +24 -10
  186. package/dist/pack/capabilities.d.ts.map +1 -1
  187. package/dist/pack/capabilities.js +17 -11
  188. package/dist/pack/capabilities.js.map +1 -1
  189. package/dist/pack/compose.d.ts +4 -1
  190. package/dist/pack/compose.d.ts.map +1 -1
  191. package/dist/pack/compose.js +4 -1
  192. package/dist/pack/compose.js.map +1 -1
  193. package/dist/pack/index.d.ts +2 -2
  194. package/dist/pack/index.d.ts.map +1 -1
  195. package/dist/pack/index.js +2 -2
  196. package/dist/pack/index.js.map +1 -1
  197. package/dist/pack/primitive_pack.d.ts +14 -3
  198. package/dist/pack/primitive_pack.d.ts.map +1 -1
  199. package/dist/pack/primitive_pack.js +25 -4
  200. package/dist/pack/primitive_pack.js.map +1 -1
  201. package/dist/render/anchors.d.ts +2 -2
  202. package/dist/render/anchors.d.ts.map +1 -1
  203. package/dist/render/anchors.js +1 -1
  204. package/dist/render/anchors.js.map +1 -1
  205. package/dist/render/format_number.d.ts.map +1 -1
  206. package/dist/render/format_number.js +2 -1
  207. package/dist/render/format_number.js.map +1 -1
  208. package/dist/render/html/envelope.d.ts +3 -3
  209. package/dist/render/html/envelope.js +12 -6
  210. package/dist/render/html/envelope.js.map +1 -1
  211. package/dist/render/layout_check.d.ts +1 -1
  212. package/dist/render/layout_check.d.ts.map +1 -1
  213. package/dist/render/layout_check.js.map +1 -1
  214. package/dist/render/markdown/builder.d.ts +5 -4
  215. package/dist/render/markdown/builder.d.ts.map +1 -1
  216. package/dist/render/markdown/builder.js +16 -7
  217. package/dist/render/markdown/builder.js.map +1 -1
  218. package/dist/render/markdown/format.d.ts +9 -0
  219. package/dist/render/markdown/format.d.ts.map +1 -1
  220. package/dist/render/markdown/format.js +67 -31
  221. package/dist/render/markdown/format.js.map +1 -1
  222. package/dist/render/markdown/host_tags.d.ts +14 -0
  223. package/dist/render/markdown/host_tags.d.ts.map +1 -0
  224. package/dist/render/markdown/host_tags.js +63 -0
  225. package/dist/render/markdown/host_tags.js.map +1 -0
  226. package/dist/render/markdown/index.d.ts +1 -0
  227. package/dist/render/markdown/index.d.ts.map +1 -1
  228. package/dist/render/markdown/index.js +1 -0
  229. package/dist/render/markdown/index.js.map +1 -1
  230. package/dist/render/markdown/split.d.ts +32 -0
  231. package/dist/render/markdown/split.d.ts.map +1 -0
  232. package/dist/render/markdown/split.js +321 -0
  233. package/dist/render/markdown/split.js.map +1 -0
  234. package/dist/render/primitive_dispatch.d.ts +6 -6
  235. package/dist/render/primitive_dispatch.d.ts.map +1 -1
  236. package/dist/render/primitive_dispatch.js +12 -26
  237. package/dist/render/primitive_dispatch.js.map +1 -1
  238. package/dist/render/react/content.d.ts +1 -1
  239. package/dist/render/react/content.d.ts.map +1 -1
  240. package/dist/render/react/content.js +3 -1
  241. package/dist/render/react/content.js.map +1 -1
  242. package/dist/render/slack/format.d.ts +0 -25
  243. package/dist/render/slack/format.d.ts.map +1 -1
  244. package/dist/render/slack/format.js +1 -599
  245. package/dist/render/slack/format.js.map +1 -1
  246. package/dist/render/slack/index.d.ts +1 -1
  247. package/dist/render/slack/index.d.ts.map +1 -1
  248. package/dist/render/slack/index.js +1 -1
  249. package/dist/render/slack/index.js.map +1 -1
  250. package/dist/render/slack/markdown_content.d.ts +10 -4
  251. package/dist/render/slack/markdown_content.d.ts.map +1 -1
  252. package/dist/render/slack/markdown_content.js +169 -113
  253. package/dist/render/slack/markdown_content.js.map +1 -1
  254. package/dist/testing/conformance.d.ts +19 -14
  255. package/dist/testing/conformance.d.ts.map +1 -1
  256. package/dist/testing/conformance.js +40 -24
  257. package/dist/testing/conformance.js.map +1 -1
  258. package/dist/testing/icon.d.ts +11 -0
  259. package/dist/testing/icon.d.ts.map +1 -0
  260. package/dist/testing/icon.js +244 -0
  261. package/dist/testing/icon.js.map +1 -0
  262. package/dist/testing/index.d.ts +2 -1
  263. package/dist/testing/index.d.ts.map +1 -1
  264. package/dist/testing/index.js +1 -0
  265. package/dist/testing/index.js.map +1 -1
  266. package/dist/testing/registration.d.ts +1 -1
  267. package/dist/testing/registration.d.ts.map +1 -1
  268. package/dist/testing/registration.js +6 -4
  269. package/dist/testing/registration.js.map +1 -1
  270. package/dist/validate/authoring_schema.d.ts +6 -0
  271. package/dist/validate/authoring_schema.d.ts.map +1 -1
  272. package/dist/validate/authoring_schema.js +15 -0
  273. package/dist/validate/authoring_schema.js.map +1 -1
  274. package/dist/validate/index.d.ts +1 -1
  275. package/dist/validate/index.d.ts.map +1 -1
  276. package/dist/validate/index.js +1 -1
  277. package/dist/validate/index.js.map +1 -1
  278. package/dist/validate/json_schema.d.ts.map +1 -1
  279. package/dist/validate/json_schema.js +10 -3
  280. package/dist/validate/json_schema.js.map +1 -1
  281. package/dist/validate/url.d.ts.map +1 -1
  282. package/dist/validate/url.js +2 -1
  283. package/dist/validate/url.js.map +1 -1
  284. package/dist/validate/validation.d.ts +1 -11
  285. package/dist/validate/validation.d.ts.map +1 -1
  286. package/dist/validate/validation.js +3 -46
  287. package/dist/validate/validation.js.map +1 -1
  288. package/package.json +3 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print_jsx.js","sourceRoot":"","sources":["../../src/author/print_jsx.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 { createElement, type ReactElement, type ReactNode } from 'react';\nimport type { ZodType } from 'zod';\n\nimport type { PrimitiveNode } from '../define/primitive_module';\n\nimport type {\n AuthorChildContext,\n AuthoredChildField,\n AuthoredSpec,\n} from './authored_fields';\nimport { readAuthoredSpec } from './authored_fields';\nimport { capitalize, memberType } from './authoring_model';\nimport type { JsxShim } from './jsx_shim';\nimport { textFromChildren } from './jsx_shim';\n\n/** What {@link printNodeJsx} reads a pack's authoring from. */\nexport interface PrintJsxEnv {\n schemaFor: (type: string) => ZodType | undefined;\n /** Parses each candidate back, so a field prints as children only when that round-trips. */\n shim: JsxShim;\n /** Reads a schema's authoring brands; returning `undefined` prints every field as a prop. */\n readSpec?: (schema: ZodType) => AuthoredSpec | undefined;\n}\n\nconst MAX_LINE = 80;\nconst INDENT = ' ';\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nconst UNSAFE_TEXT = /[{}<>&]/;\nconst UNSAFE_ATTRIBUTE = /[\"\\\\\\n\\r&]/;\n\nconst TREE = Symbol.for('elastic.isomer.author.jsx_tree');\n\n/** A text child: the value React receives, and how it prints at an indent. */\ninterface TextChild {\n value: string;\n print: (indent: string) => string;\n}\n\n/** An element to print. Attribute values may hold trees, printed as JSX expressions. */\ninterface JsxTree {\n [TREE]: true;\n name: string;\n attributes: ReadonlyArray<[string, unknown]>;\n children: ReadonlyArray<JsxTree | TextChild>;\n}\n\nconst isRecord = (item: unknown): item is Record<string, unknown> =>\n typeof item === 'object' && item !== null && !Array.isArray(item);\n\nconst isTree = (value: unknown): value is JsxTree =>\n isRecord(value) && (value as Partial<JsxTree>)[TREE] === true;\n\nconst tree = (\n name: string,\n attributes: ReadonlyArray<[string, unknown]>,\n children: ReadonlyArray<JsxTree | TextChild> = []\n): JsxTree => ({ [TREE]: true, name, attributes, children });\n\nconst printKey = (key: string): string => {\n if (key === '__proto__') {\n return '[\"__proto__\"]';\n }\n return IDENTIFIER.test(key) ? key : JSON.stringify(key);\n};\n\n/** A JavaScript literal for `value`, on one line when it fits. */\nexport const printValue = (value: unknown, indent = ''): string => {\n if (isTree(value)) {\n return printTree(value, indent);\n }\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value !== 'object' || value === null) {\n return String(value);\n }\n\n const inner = indent + INDENT;\n const parts = Array.isArray(value)\n ? value.map((item) => printValue(item, inner))\n : Object.entries(value)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => `${printKey(key)}: ${printValue(item, inner)}`);\n const [open, close] = Array.isArray(value) ? ['[', ']'] : ['{ ', ' }'];\n\n if (!parts.length) {\n return Array.isArray(value) ? '[]' : '{}';\n }\n\n const inline = `${open}${parts.join(', ')}${close}`;\n if (inline.length + indent.length <= MAX_LINE && !inline.includes('\\n')) {\n return inline;\n }\n return `${open.trim()}\\n${parts\n .map((part) => `${inner}${part},`)\n .join('\\n')}\\n${indent}${close.trim()}`;\n};\n\nconst printAttribute = (\n name: string,\n value: unknown,\n indent: string\n): string => {\n if (typeof value === 'string' && !UNSAFE_ATTRIBUTE.test(value)) {\n return `${name}=\"${value}\"`;\n }\n const printed = printValue(value, indent);\n if (isTree(value) && printed.includes('\\n')) {\n const inner = indent + INDENT;\n return `${name}={\\n${inner}${printValue(value, inner)}\\n${indent}}`;\n }\n return `${name}={${printed}}`;\n};\n\nconst escapeTemplate = (text: string): string =>\n text.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$\\{/g, '\\\\${');\n\n/** A template literal's text at `indent`: a line break after the backtick, each line one step in, and the closing one back at `indent`. */\nconst templateText = (lines: readonly string[], indent: string): string =>\n `\\n${lines.map((line) => (line ? `${indent}${INDENT}${line}` : line)).join('\\n')}\\n${indent}`;\n\n/**\n * Ways to write `text` as a child, most readable first. A template literal's value depends on its\n * indent only through leading whitespace every line shares, so it is checked at no indent.\n */\nconst textChildren = (text: string): TextChild[] => {\n const children: TextChild[] = [];\n if (\n text &&\n text.trim() === text &&\n !UNSAFE_TEXT.test(text) &&\n !/[^\\S ]/.test(text)\n ) {\n children.push({ value: text, print: () => text });\n }\n if (text.includes('\\n') && !text.includes('\\r')) {\n const lines = text.split('\\n');\n children.push({\n value: templateText(lines, ''),\n print: (indent) =>\n `{\\`${templateText(lines.map(escapeTemplate), indent)}\\`}`,\n });\n }\n children.push({\n value: text,\n print: () => `{${JSON.stringify(text)}}`,\n });\n return children;\n};\n\nconst printTree = (\n { name, attributes, children }: JsxTree,\n indent: string\n): string => {\n const inner = indent + INDENT;\n const inlineAttributes = attributes.map(([key, value]) =>\n printAttribute(key, value, indent)\n );\n const inlineOpen = [name, ...inlineAttributes].join(' ');\n const fits =\n indent.length + inlineOpen.length + 2 <= MAX_LINE &&\n !inlineAttributes.some((attribute) => attribute.includes('\\n'));\n\n const open = fits\n ? `<${inlineOpen}`\n : `<${name}\\n${attributes\n .map(([key, value]) => `${inner}${printAttribute(key, value, inner)}`)\n .join('\\n')}\\n${indent}`;\n\n if (!children.length) {\n return `${open}${fits ? ' ' : ''}/>`;\n }\n const printed = children.map((child) =>\n isTree(child) ? printTree(child, inner) : child.print(inner)\n );\n const [only = ''] = printed;\n const inline = `${open}>${only}</${name}>`;\n const isText =\n printed.length === 1 && !only.startsWith('<') && !only.includes('\\n');\n if (fits && isText && indent.length + inline.length <= MAX_LINE) {\n return inline;\n }\n return `${open}>\\n${printed.map((child) => `${inner}${child}`).join('\\n')}\\n${indent}</${name}>`;\n};\n\n/** Deep equality that ignores `undefined` entries and key order. */\nconst sameValue = (a: unknown, b: unknown): boolean => {\n if (Array.isArray(a) || Array.isArray(b)) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((item, index) => sameValue(item, b[index]))\n );\n }\n if (isRecord(a) && isRecord(b)) {\n const keys = (record: Record<string, unknown>) =>\n Object.keys(record).filter((key) => record[key] !== undefined);\n const [aKeys, bKeys] = [keys(a), keys(b)];\n return (\n aKeys.length === bKeys.length &&\n aKeys.every((key) => sameValue(a[key], b[key]))\n );\n }\n return a === b;\n};\n\n/** A field's children, or `undefined` when they cannot carry it. */\ntype Children = ReadonlyArray<JsxTree | TextChild> | undefined;\n\n/** Round trips one node's printer tries per attribute style before printing every field as a prop. */\nconst MAX_CANDIDATES = 256;\n\n/** The `size`-element subsets of `0..count - 1`, in colexicographic order. */\nfunction* subsetsOfSize(count: number, size: number): Generator<number[]> {\n if (size === 0) {\n yield [];\n return;\n }\n if (count < size) {\n return;\n }\n yield* subsetsOfSize(count - 1, size);\n for (const subset of subsetsOfSize(count - 1, size - 1)) {\n yield [...subset, count - 1];\n }\n}\n\n/** Every subset of `0..count - 1`, largest first. */\nfunction* subsetsBySize(count: number): Generator<number[]> {\n for (let size = count; size >= 0; size -= 1) {\n yield* subsetsOfSize(count, size);\n }\n}\n\ninterface Printer {\n nodeTree: (node: PrimitiveNode) => JsxTree;\n}\n\nconst createPrinter = ({\n schemaFor,\n shim,\n readSpec = readAuthoredSpec,\n}: PrintJsxEnv): Printer => {\n const components = shim as unknown as Record<string, unknown>;\n const trees = new WeakMap<object, JsxTree>();\n\n const isNode = (value: unknown): value is PrimitiveNode =>\n isRecord(value) &&\n typeof value.type === 'string' &&\n schemaFor(value.type) !== undefined;\n\n const toReact = (value: unknown): unknown => {\n if (isTree(value)) {\n return toElement(value);\n }\n return Array.isArray(value) ? value.map(toReact) : value;\n };\n\n const toElement = ({ name, attributes, children }: JsxTree): ReactElement => {\n const component = name\n .split('.')\n .reduce<unknown>(\n (scope, part) =>\n typeof scope === 'function' || isRecord(scope)\n ? (scope as Record<string, unknown>)[part]\n : undefined,\n components\n );\n if (typeof component !== 'function' && !isRecord(component)) {\n throw new Error(`No authoring component <${name}>.`);\n }\n return createElement(\n component as Parameters<typeof createElement>[0],\n Object.fromEntries(\n attributes.map(([key, value]) => [key, toReact(value)])\n ),\n ...children.map((child) =>\n isTree(child) ? toElement(child) : child.value\n )\n );\n };\n\n const parseBody = (children: ReactNode): PrimitiveNode[] =>\n shim.toComposition(createElement(shim.Composition, null, children)).body;\n\n const childContext: AuthorChildContext = { parseChildren: parseBody };\n\n const roundTrips = (candidate: JsxTree, node: PrimitiveNode): boolean => {\n try {\n const [parsed, ...rest] = parseBody(toElement(candidate));\n return rest.length === 0 && sameValue(parsed, node);\n } catch {\n return false;\n }\n };\n\n /** Nodes as element children, or `undefined` when `value` is not a node or a non-empty list of them. */\n const nodeChildren = (value: unknown): JsxTree[] | undefined => {\n const items: unknown[] = Array.isArray(value) ? value : [value];\n return items.length && items.every(isNode)\n ? items.map(nodeTree)\n : undefined;\n };\n\n /** `value` with each node, alone or in a list, as an element. */\n const jsxAttribute = (value: unknown): unknown => {\n if (isNode(value)) {\n return nodeTree(value);\n }\n return Array.isArray(value) && value.length && value.every(isNode)\n ? value.map(nodeTree)\n : value;\n };\n\n const textChild = (\n text: unknown,\n readBack: (value: string) => string\n ): TextChild | undefined =>\n typeof text === 'string'\n ? textChildren(text).find(({ value }) => readBack(value) === text)\n : undefined;\n\n /** Children of a custom `toItem` field's element: the first whose `toItem` gives `item` back. */\n const customItemTree = (\n item: unknown,\n {\n textField,\n toItem,\n }: Pick<AuthoredChildField, 'textField'> & {\n toItem: NonNullable<AuthoredChildField['toItem']>;\n },\n name: string\n ): JsxTree | undefined => {\n const candidates: JsxTree[] = [];\n const withChildren = (\n attributes: ReadonlyArray<[string, unknown]>,\n value: unknown\n ) => {\n if (value === '') {\n candidates.push(tree(name, attributes));\n }\n if (typeof value === 'string') {\n textChildren(value).forEach((child) =>\n candidates.push(tree(name, attributes, [child]))\n );\n return;\n }\n if (\n Array.isArray(value) &&\n value.length &&\n value.every((line) => typeof line === 'string')\n ) {\n withChildren(attributes, value.join('\\n'));\n return;\n }\n const nodes = nodeChildren(value);\n if (nodes) {\n candidates.push(tree(name, attributes, nodes));\n }\n };\n\n if (isRecord(item) && !isNode(item)) {\n const keys = [\n ...new Set([...(textField ? [textField] : []), ...Object.keys(item)]),\n ];\n keys.forEach((key) =>\n withChildren(\n Object.entries(item).filter(\n ([other, value]) => other !== key && value !== undefined\n ),\n item[key]\n )\n );\n candidates.push(\n tree(\n name,\n Object.entries(item).filter(([, value]) => value !== undefined)\n )\n );\n } else {\n withChildren([], item);\n }\n\n return candidates.find((candidate) => {\n try {\n const { props } = toElement(candidate) as ReactElement<object>;\n return sameValue(toItem(props, childContext), item);\n } catch {\n return false;\n }\n });\n };\n\n /** One child-field item as an element, or `undefined` when it cannot be one. */\n const itemTree = (\n item: unknown,\n field: AuthoredChildField,\n owner: string\n ): JsxTree | undefined => {\n const name = capitalize(memberType(owner, field));\n const { toItem } = field;\n if (toItem) {\n return customItemTree(item, { ...field, toItem }, name);\n }\n if (!isRecord(item)) {\n return undefined;\n }\n const spec = readSpec(field.itemSchema);\n const entries = Object.entries(item).filter(\n ([, value]) => value !== undefined\n );\n const attributes: Array<[string, unknown]> = [];\n const children: Array<JsxTree | TextChild> = [];\n const claimed = new Set<string>();\n const text = field.textField\n ? textChild(item[field.textField], (value) => textFromChildren(value))\n : undefined;\n entries.forEach(([key, value]) => {\n if (key === field.textField && text) {\n children.unshift(text);\n return;\n }\n const nested = spec?.children.find((child) => child.field === key);\n const sharesName = (other: AuthoredChildField) =>\n other.field !== key &&\n other.name === nested?.name &&\n item[other.field] === undefined;\n if (\n nested &&\n !claimed.has(nested.name) &&\n !spec?.children.some(sharesName)\n ) {\n const items: unknown[] = Array.isArray(value) ? value : [value];\n const nestedTrees = items.map((entry) =>\n itemTree(entry, nested, owner)\n );\n if (items.length && nestedTrees.every(isTree)) {\n claimed.add(nested.name);\n children.push(...nestedTrees);\n return;\n }\n }\n attributes.push([key, value]);\n });\n return tree(name, attributes, children);\n };\n\n /** What a node's field prints as when it is in children. */\n const fieldChildren = (\n key: string,\n value: unknown,\n spec: AuthoredSpec,\n owner: string\n ): Children => {\n const text = spec.text.find(({ field }) => field === key);\n if (text) {\n const child = textChild(value, (read) =>\n textFromChildren(read, {\n collapseWhitespace: text.collapseWhitespace,\n ...(text.dedent ? { dedent: true } : {}),\n })\n );\n return child ? [child] : undefined;\n }\n const field = spec.children.find((child) => child.field === key);\n if (field) {\n const items: unknown[] = Array.isArray(value) ? value : [value];\n const itemTrees = items.map((item) => itemTree(item, field, owner));\n return items.length && itemTrees.every(isTree) ? itemTrees : undefined;\n }\n return nodeChildren(value);\n };\n\n const nodeTree = (node: PrimitiveNode): JsxTree => {\n const cached = trees.get(node);\n if (cached) {\n return cached;\n }\n const { type } = node;\n const name = capitalize(type);\n const schema = schemaFor(type);\n const spec = schema ? readSpec(schema) : undefined;\n const entries = Object.entries(node).filter(\n ([key, value]) => key !== 'type' && value !== undefined\n );\n if (!spec) {\n return tree(name, entries);\n }\n\n const capable = entries.flatMap(([key, value]) => {\n const children = fieldChildren(key, value, spec, type);\n return children ? [{ key, children }] : [];\n });\n const build = (\n inChildren: ReadonlySet<string>,\n attribute: (value: unknown) => unknown\n ): JsxTree => {\n const children = capable\n .filter(({ key }) => inChildren.has(key))\n .flatMap(({ children: fieldTrees }) => fieldTrees);\n return tree(\n name,\n entries\n .filter(([key]) => !inChildren.has(key))\n .map(([key, value]) => [key, attribute(value)]),\n [\n ...children.filter((child) => !isTree(child)),\n ...children.filter(isTree),\n ]\n );\n };\n\n const search = (): JsxTree => {\n for (const attribute of [jsxAttribute, (value: unknown) => value]) {\n let tried = 0;\n for (const indexes of subsetsBySize(capable.length)) {\n if (tried++ === MAX_CANDIDATES) {\n break;\n }\n const candidate = build(\n new Set(indexes.map((index) => capable[index]!.key)),\n attribute\n );\n if (roundTrips(candidate, node)) {\n return candidate;\n }\n }\n }\n return tree(name, entries);\n };\n const found = search();\n trees.set(node, found);\n return found;\n };\n\n return { nodeTree };\n};\n\n/** Prints one node as authoring JSX for `buildJsxShim`'s components. */\nexport const printNodeJsx = (node: PrimitiveNode, env: PrintJsxEnv): string =>\n printTree(createPrinter(env).nodeTree(node), '');\n\n/** Prints a composition body as JSX children of `<Composition>`. */\nexport const printCompositionJsx = (\n body: readonly PrimitiveNode[],\n env: PrintJsxEnv\n): string => {\n const { nodeTree } = createPrinter(env);\n const nodes = body\n .map((node) => printTree(nodeTree(node), ''))\n .join('\\n')\n .split('\\n')\n .map((line) => (line ? `${INDENT}${line}` : line))\n .join('\\n');\n return `<Composition>\\n${nodes}\\n</Composition>`;\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { PrimitiveCatalogEntry } from '../define/primitive_module.js';
2
- import type { PrimitiveGroup } from '../pack/primitive_pack.js';
2
+ import { type PrimitiveGroup } from '../pack/primitive_pack.js';
3
3
  type JsonSchema = Record<string, unknown>;
4
4
  /** Which authoring job the prompt frames for the model. */
5
5
  export type AuthoringProfileId = 'general' | 'registered-view-router' | 'compose-from-primitives';
@@ -29,7 +29,7 @@ export interface AuthoringPromptContext {
29
29
  primitives: readonly PrimitiveCatalogEntry[];
30
30
  /** `'index'` lists each primitive's type and purpose only, for a host that serves the rest on request. */
31
31
  catalog?: 'full' | 'index';
32
- /** Headings an index sorts primitives under; a type in none is listed under "Other". */
32
+ /** Headings an index sorts primitives under; a type in none is listed under {@link UNCATEGORIZED_GROUP_TITLE}. */
33
33
  groups?: readonly PrimitiveGroup[];
34
34
  /**
35
35
  * Extra host-supplied compositions beyond each primitive's catalog example.
@@ -1 +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"}
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,EACL,KAAK,cAAc,EAEpB,MAAM,wBAAwB,CAAC;AAEhC,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,kHAAkH;IAClH,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;AAyED,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,MAqCF,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * 2.0.
6
6
  */
7
7
  import { oneLine } from '../composition/one_line.js';
8
+ import { UNCATEGORIZED_GROUP_TITLE, } from '../pack/primitive_pack.js';
8
9
  /** Every {@link AuthoringProfileId}. */
9
10
  export const AUTHORING_PROFILE_IDS = [
10
11
  'general',
@@ -12,6 +13,8 @@ export const AUTHORING_PROFILE_IDS = [
12
13
  'compose-from-primitives',
13
14
  ];
14
15
  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.';
16
+ /** The root shape, which a prompt without the composition schema shows nowhere else. */
17
+ const VIEW_ENVELOPE = 'A view is `{"type":"view","body":[…]}`: primitives go in `body`, and a primitive is never the view itself.';
15
18
  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
19
  const PROFILE_INTROS = {
17
20
  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.',
@@ -74,7 +77,7 @@ const renderIndex = (primitives, groups = []) => {
74
77
  entries: types.flatMap((type) => byType.get(type) ?? []),
75
78
  })),
76
79
  {
77
- title: 'Other',
80
+ title: UNCATEGORIZED_GROUP_TITLE,
78
81
  entries: primitives.filter(({ type }) => !grouped.has(type)),
79
82
  },
80
83
  ];
@@ -124,7 +127,9 @@ export const buildAuthoringPrompt = (profile, context) => {
124
127
  : PROFILE_INTROS[profile];
125
128
  const sections = [
126
129
  context.heading ?? '# View authoring',
127
- context.intro ?? intro,
130
+ schema === undefined
131
+ ? `${context.intro ?? intro} ${VIEW_ENVELOPE}`
132
+ : (context.intro ?? intro),
128
133
  `## Guide\n\n${context.guide}`,
129
134
  ];
130
135
  if (context.rules !== undefined && context.rules.length > 0) {
@@ -1 +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"]}
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 {\n type PrimitiveGroup,\n UNCATEGORIZED_GROUP_TITLE,\n} 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 {@link UNCATEGORIZED_GROUP_TITLE}. */\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\n/** The root shape, which a prompt without the composition schema shows nowhere else. */\nconst VIEW_ENVELOPE =\n 'A view is `{\"type\":\"view\",\"body\":[…]}`: primitives go in `body`, and a primitive is never the view itself.';\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: UNCATEGORIZED_GROUP_TITLE,\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 schema === undefined\n ? `${context.intro ?? intro} ${VIEW_ENVELOPE}`\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;AA6DF,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,WA2PvB,CAAC"}
@@ -0,0 +1,289 @@
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 const DEF_PREFIX = '#/$defs/';
8
+ /** Ids `z.toJSONSchema` gives a def no one named. */
9
+ export const ANONYMOUS_DEF = /^__schema\d+$/;
10
+ const STRUCTURAL_KEYS = [
11
+ 'type',
12
+ 'const',
13
+ 'enum',
14
+ 'properties',
15
+ 'additionalProperties',
16
+ 'patternProperties',
17
+ 'propertyNames',
18
+ 'items',
19
+ 'prefixItems',
20
+ 'oneOf',
21
+ 'anyOf',
22
+ 'allOf',
23
+ ];
24
+ const INDENT = ' ';
25
+ export const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
26
+ export const isJsonObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
27
+ export const parseDefRef = (ref) => typeof ref === 'string' && ref.startsWith(DEF_PREFIX)
28
+ ? ref.slice(DEF_PREFIX.length)
29
+ : undefined;
30
+ export const ownDef = (defs, id) => Object.hasOwn(defs, id) ? defs[id] : undefined;
31
+ /** `slideStats` becomes `SlideStats`; anything but letters and digits splits words. */
32
+ export const pascalCase = (value) => {
33
+ const name = value
34
+ .split(/[^A-Za-z0-9]+/)
35
+ .filter(Boolean)
36
+ .map((word) => `${word.slice(0, 1).toUpperCase()}${word.slice(1)}`)
37
+ .join('');
38
+ if (name === '') {
39
+ return 'Type';
40
+ }
41
+ return /^\d/.test(name) ? `_${name}` : name;
42
+ };
43
+ /** A JSDoc block for `lines`, or `''` when there are none. */
44
+ export const jsDoc = (lines, pad) => {
45
+ const text = lines
46
+ .flatMap((line) => line.split('\n'))
47
+ .map((line) => line.replaceAll('*/', '*\\/').trimEnd());
48
+ while (text[0] === '') {
49
+ text.shift();
50
+ }
51
+ while (text.at(-1) === '') {
52
+ text.pop();
53
+ }
54
+ if (text.length === 0) {
55
+ return '';
56
+ }
57
+ const [only] = text;
58
+ if (text.length === 1 && only !== undefined) {
59
+ return `${pad}/** ${only} */\n`;
60
+ }
61
+ return `${pad}/**\n${text
62
+ .map((line) => (line === '' ? `${pad} *` : `${pad} * ${line}`))
63
+ .join('\n')}\n${pad} */\n`;
64
+ };
65
+ const propertyKey = (key) => IDENTIFIER.test(key) ? key : JSON.stringify(key);
66
+ const literal = (value) => {
67
+ if (value === null) {
68
+ return 'null';
69
+ }
70
+ switch (typeof value) {
71
+ case 'string':
72
+ return JSON.stringify(value);
73
+ case 'number':
74
+ case 'boolean':
75
+ return String(value);
76
+ default:
77
+ return 'unknown';
78
+ }
79
+ };
80
+ const atom = (text) => ({ text, kind: 'atom' });
81
+ const union = (members) => {
82
+ if (members.some(({ text }) => text === 'unknown')) {
83
+ return atom('unknown');
84
+ }
85
+ const unique = new Map(members.map((member) => [member.text, member]));
86
+ const [only] = [...unique.values()];
87
+ if (unique.size === 0) {
88
+ return atom('never');
89
+ }
90
+ return unique.size === 1 && only
91
+ ? only
92
+ : { text: [...unique.keys()].join(' | '), kind: 'union' };
93
+ };
94
+ const intersection = (members) => {
95
+ const unique = new Map(members.map((member) => [member.text, member]));
96
+ const [only] = [...unique.values()];
97
+ if (!only) {
98
+ return atom('unknown');
99
+ }
100
+ if (unique.size === 1 && only) {
101
+ return only;
102
+ }
103
+ return {
104
+ text: [...unique.values()]
105
+ .map(({ text, kind }) => (kind === 'union' ? `(${text})` : text))
106
+ .join(' & '),
107
+ kind: 'intersection',
108
+ };
109
+ };
110
+ const arrayOf = ({ text, kind }) => atom(kind === 'atom' ? `${text}[]` : `(${text})[]`);
111
+ /** A TypeScript printer over the subset of JSON Schema `z.toJSONSchema` emits. */
112
+ export const createTypePrinter = ({ defs, names, claim, }) => {
113
+ const promotedNames = new Map();
114
+ const printRef = (id, depth, active) => {
115
+ const named = names.get(id);
116
+ if (named !== undefined) {
117
+ return atom(named);
118
+ }
119
+ const target = ownDef(defs, id);
120
+ if (target === undefined) {
121
+ return atom('unknown');
122
+ }
123
+ if (active.has(id)) {
124
+ const name = promotedNames.get(id) ?? claim(pascalCase(id));
125
+ promotedNames.set(id, name);
126
+ return atom(name);
127
+ }
128
+ return printNode(target, depth, new Set([...active, id]));
129
+ };
130
+ const printNode = (node, depth, active) => {
131
+ if (node === false) {
132
+ return atom('never');
133
+ }
134
+ if (!isJsonObject(node)) {
135
+ return atom('unknown');
136
+ }
137
+ const parts = [];
138
+ const ref = parseDefRef(node.$ref);
139
+ if (ref !== undefined) {
140
+ parts.push(printRef(ref, depth, active));
141
+ }
142
+ if (STRUCTURAL_KEYS.some((key) => Object.hasOwn(node, key))) {
143
+ parts.push(printStructure(node, depth, active));
144
+ }
145
+ return parts.length === 0 ? atom('unknown') : intersection(parts);
146
+ };
147
+ const printStructure = (node, depth, active) => {
148
+ const parts = [];
149
+ const own = printOwn(node, depth, active);
150
+ if (own) {
151
+ parts.push(own);
152
+ }
153
+ for (const key of ['oneOf', 'anyOf']) {
154
+ const members = node[key];
155
+ if (Array.isArray(members)) {
156
+ parts.push(union(members.map((member) => printNode(member, depth, active))));
157
+ }
158
+ }
159
+ if (Array.isArray(node.allOf)) {
160
+ parts.push(intersection(node.allOf.map((member) => printNode(member, depth, active))));
161
+ }
162
+ return parts.length === 0 ? atom('unknown') : intersection(parts);
163
+ };
164
+ // `undefined` when the node only combines other schemas.
165
+ const printOwn = (node, depth, active) => {
166
+ if (Object.hasOwn(node, 'const')) {
167
+ return atom(literal(node.const));
168
+ }
169
+ if (Array.isArray(node.enum)) {
170
+ return union(node.enum.map((value) => atom(literal(value))));
171
+ }
172
+ const { type } = node;
173
+ if (Array.isArray(type)) {
174
+ return union(type.map((member) => printTyped(member, node, depth, active)));
175
+ }
176
+ if (typeof type === 'string') {
177
+ return printTyped(type, node, depth, active);
178
+ }
179
+ if (Object.hasOwn(node, 'properties') ||
180
+ Object.hasOwn(node, 'additionalProperties')) {
181
+ return printObject(node, depth, active);
182
+ }
183
+ if (Object.hasOwn(node, 'items') || Object.hasOwn(node, 'prefixItems')) {
184
+ return printArray(node, depth, active);
185
+ }
186
+ return undefined;
187
+ };
188
+ const printTyped = (type, node, depth, active) => {
189
+ switch (type) {
190
+ case 'string':
191
+ return atom('string');
192
+ case 'number':
193
+ case 'integer':
194
+ return atom('number');
195
+ case 'boolean':
196
+ return atom('boolean');
197
+ case 'null':
198
+ return atom('null');
199
+ case 'array':
200
+ return printArray(node, depth, active);
201
+ case 'object':
202
+ return printObject(node, depth, active);
203
+ default:
204
+ return atom('unknown');
205
+ }
206
+ };
207
+ const printArray = (node, depth, active) => {
208
+ const { prefixItems, items } = node;
209
+ if (Array.isArray(prefixItems)) {
210
+ const required = typeof node.minItems === 'number' ? node.minItems : 0;
211
+ const elements = prefixItems.map((item, index) => {
212
+ const printed = printNode(item, depth, active);
213
+ return index < required
214
+ ? printed.text
215
+ : `${printed.kind === 'atom' ? printed.text : `(${printed.text})`}?`;
216
+ });
217
+ if (items !== undefined && items !== false) {
218
+ elements.push(`...${arrayOf(printNode(items, depth, active)).text}`);
219
+ }
220
+ return atom(`[${elements.join(', ')}]`);
221
+ }
222
+ return arrayOf(items === undefined ? atom('unknown') : printNode(items, depth, active));
223
+ };
224
+ const printObject = (node, depth, active) => {
225
+ const properties = isJsonObject(node.properties) ? node.properties : {};
226
+ const lines = printMembers(node, depth, active, {});
227
+ const extra = node.additionalProperties;
228
+ const patterns = isJsonObject(node.patternProperties)
229
+ ? Object.values(node.patternProperties)
230
+ : [];
231
+ const open = extra !== false;
232
+ const values = [
233
+ ...patterns.map((schema) => printNode(schema, depth, active)),
234
+ ];
235
+ if (open) {
236
+ values.push(extra === undefined || extra === true
237
+ ? atom('unknown')
238
+ : printNode(extra, depth, active));
239
+ }
240
+ const index = values.length === 0
241
+ ? Object.keys(properties).length === 0
242
+ ? `${INDENT.repeat(depth + 1)}[key: string]: never;\n`
243
+ : ''
244
+ : `${INDENT.repeat(depth + 1)}[key: string]: ${union([
245
+ ...values,
246
+ ...Object.values(properties).map((schema) => printNode(schema, depth, active)),
247
+ ...(Object.keys(properties).some((key) => !Array.isArray(node.required) || !node.required.includes(key))
248
+ ? [atom('undefined')]
249
+ : []),
250
+ ]).text};\n`;
251
+ return atom(`{\n${lines}${index}${INDENT.repeat(depth)}}`);
252
+ };
253
+ const printMembers = (node, depth, active, { omit, optional }) => {
254
+ const pad = INDENT.repeat(depth + 1);
255
+ const required = new Set(Array.isArray(node.required)
256
+ ? node.required.filter((key) => typeof key === 'string')
257
+ : []);
258
+ const properties = isJsonObject(node.properties) ? node.properties : {};
259
+ return Object.entries(properties)
260
+ .filter(([key]) => !omit?.has(key))
261
+ .map(([key, property]) => {
262
+ const doc = isJsonObject(property)
263
+ ? jsDoc([
264
+ typeof property.description === 'string'
265
+ ? property.description
266
+ : '',
267
+ ...(Object.hasOwn(property, 'default')
268
+ ? [`@default ${JSON.stringify(property.default)}`]
269
+ : []),
270
+ ], pad)
271
+ : '';
272
+ const mark = required.has(key) && !optional?.has(key) ? '' : '?';
273
+ return `${doc}${pad}${propertyKey(key)}${mark}: ${printNode(property, depth + 1, active).text};\n`;
274
+ })
275
+ .join('');
276
+ };
277
+ return {
278
+ print: (schema, depth = 0) => printNode(schema, depth, new Set()).text,
279
+ members: (schema, depth, options = {}) => printMembers(schema, depth, new Set(), options),
280
+ promoted: () => {
281
+ const aliases = [];
282
+ for (const [id, name] of promotedNames) {
283
+ aliases.push(`type ${name} = ${printNode(ownDef(defs, id), 0, new Set([id])).text};`);
284
+ }
285
+ return aliases;
286
+ },
287
+ };
288
+ };
289
+ //# sourceMappingURL=schema_to_typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_to_typescript.js","sourceRoot":"","sources":["../../src/author/schema_to_typescript.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\nexport type JsonObject = Record<string, unknown>;\n\nexport const DEF_PREFIX = '#/$defs/';\n\n/** Ids `z.toJSONSchema` gives a def no one named. */\nexport const ANONYMOUS_DEF = /^__schema\\d+$/;\n\nconst STRUCTURAL_KEYS = [\n 'type',\n 'const',\n 'enum',\n 'properties',\n 'additionalProperties',\n 'patternProperties',\n 'propertyNames',\n 'items',\n 'prefixItems',\n 'oneOf',\n 'anyOf',\n 'allOf',\n] as const;\n\nconst INDENT = ' ';\n\nexport const IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\n\nexport const isJsonObject = (value: unknown): value is JsonObject =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const parseDefRef = (ref: unknown): string | undefined =>\n typeof ref === 'string' && ref.startsWith(DEF_PREFIX)\n ? ref.slice(DEF_PREFIX.length)\n : undefined;\n\nexport const ownDef = (defs: JsonObject, id: string): unknown =>\n Object.hasOwn(defs, id) ? defs[id] : undefined;\n\n/** `slideStats` becomes `SlideStats`; anything but letters and digits splits words. */\nexport const pascalCase = (value: string): string => {\n const name = value\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((word) => `${word.slice(0, 1).toUpperCase()}${word.slice(1)}`)\n .join('');\n if (name === '') {\n return 'Type';\n }\n return /^\\d/.test(name) ? `_${name}` : name;\n};\n\n/** A JSDoc block for `lines`, or `''` when there are none. */\nexport const jsDoc = (lines: readonly string[], pad: string): string => {\n const text = lines\n .flatMap((line) => line.split('\\n'))\n .map((line) => line.replaceAll('*/', '*\\\\/').trimEnd());\n while (text[0] === '') {\n text.shift();\n }\n while (text.at(-1) === '') {\n text.pop();\n }\n if (text.length === 0) {\n return '';\n }\n const [only] = text;\n if (text.length === 1 && only !== undefined) {\n return `${pad}/** ${only} */\\n`;\n }\n return `${pad}/**\\n${text\n .map((line) => (line === '' ? `${pad} *` : `${pad} * ${line}`))\n .join('\\n')}\\n${pad} */\\n`;\n};\n\nconst propertyKey = (key: string): string =>\n IDENTIFIER.test(key) ? key : JSON.stringify(key);\n\nconst literal = (value: unknown): string => {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'string':\n return JSON.stringify(value);\n case 'number':\n case 'boolean':\n return String(value);\n default:\n return 'unknown';\n }\n};\n\ninterface Printed {\n text: string;\n kind: 'atom' | 'union' | 'intersection';\n}\n\nconst atom = (text: string): Printed => ({ text, kind: 'atom' });\n\nconst union = (members: readonly Printed[]): Printed => {\n if (members.some(({ text }) => text === 'unknown')) {\n return atom('unknown');\n }\n const unique = new Map(members.map((member) => [member.text, member]));\n const [only] = [...unique.values()];\n if (unique.size === 0) {\n return atom('never');\n }\n return unique.size === 1 && only\n ? only\n : { text: [...unique.keys()].join(' | '), kind: 'union' };\n};\n\nconst intersection = (members: readonly Printed[]): Printed => {\n const unique = new Map(members.map((member) => [member.text, member]));\n const [only] = [...unique.values()];\n if (!only) {\n return atom('unknown');\n }\n if (unique.size === 1 && only) {\n return only;\n }\n return {\n text: [...unique.values()]\n .map(({ text, kind }) => (kind === 'union' ? `(${text})` : text))\n .join(' & '),\n kind: 'intersection',\n };\n};\n\nconst arrayOf = ({ text, kind }: Printed): Printed =>\n atom(kind === 'atom' ? `${text}[]` : `(${text})[]`);\n\n/** What {@link TypePrinter.members} prints and how. */\nexport interface MemberOptions {\n /** Properties left out. */\n omit?: ReadonlySet<string>;\n /** Properties printed optional whether or not the schema requires them. */\n optional?: ReadonlySet<string>;\n}\n\nexport interface TypePrinterOptions {\n defs: JsonObject;\n /** TypeScript names for defs printed by reference; every other def is inlined. */\n names: ReadonlyMap<string, string>;\n /** A fresh, unused name, for a def inlining cannot express. */\n claim: (base: string) => string;\n}\n\nexport interface TypePrinter {\n /** `schema` as a TypeScript type, written at `depth` levels of indent. */\n print: (schema: unknown, depth?: number) => string;\n /** The `key?: Type;` members of an object schema, with their JSDoc, at `depth + 1`. */\n members: (\n schema: JsonObject,\n depth: number,\n options?: MemberOptions\n ) => string;\n /** Type aliases for the anonymous defs that refer to themselves. Call last. */\n promoted: () => string[];\n}\n\n/** A TypeScript printer over the subset of JSON Schema `z.toJSONSchema` emits. */\nexport const createTypePrinter = ({\n defs,\n names,\n claim,\n}: TypePrinterOptions): TypePrinter => {\n const promotedNames = new Map<string, string>();\n\n const printRef = (\n id: string,\n depth: number,\n active: ReadonlySet<string>\n ): Printed => {\n const named = names.get(id);\n if (named !== undefined) {\n return atom(named);\n }\n const target = ownDef(defs, id);\n if (target === undefined) {\n return atom('unknown');\n }\n if (active.has(id)) {\n const name = promotedNames.get(id) ?? claim(pascalCase(id));\n promotedNames.set(id, name);\n return atom(name);\n }\n return printNode(target, depth, new Set([...active, id]));\n };\n\n const printNode = (\n node: unknown,\n depth: number,\n active: ReadonlySet<string>\n ): Printed => {\n if (node === false) {\n return atom('never');\n }\n if (!isJsonObject(node)) {\n return atom('unknown');\n }\n const parts: Printed[] = [];\n const ref = parseDefRef(node.$ref);\n if (ref !== undefined) {\n parts.push(printRef(ref, depth, active));\n }\n if (STRUCTURAL_KEYS.some((key) => Object.hasOwn(node, key))) {\n parts.push(printStructure(node, depth, active));\n }\n return parts.length === 0 ? atom('unknown') : intersection(parts);\n };\n\n const printStructure = (\n node: JsonObject,\n depth: number,\n active: ReadonlySet<string>\n ): Printed => {\n const parts: Printed[] = [];\n const own = printOwn(node, depth, active);\n if (own) {\n parts.push(own);\n }\n for (const key of ['oneOf', 'anyOf'] as const) {\n const members = node[key];\n if (Array.isArray(members)) {\n parts.push(\n union(members.map((member) => printNode(member, depth, active)))\n );\n }\n }\n if (Array.isArray(node.allOf)) {\n parts.push(\n intersection(\n node.allOf.map((member) => printNode(member, depth, active))\n )\n );\n }\n return parts.length === 0 ? atom('unknown') : intersection(parts);\n };\n\n // `undefined` when the node only combines other schemas.\n const printOwn = (\n node: JsonObject,\n depth: number,\n active: ReadonlySet<string>\n ): Printed | undefined => {\n if (Object.hasOwn(node, 'const')) {\n return atom(literal(node.const));\n }\n if (Array.isArray(node.enum)) {\n return union(node.enum.map((value) => atom(literal(value))));\n }\n const { type } = node;\n if (Array.isArray(type)) {\n return union(\n type.map((member) => printTyped(member, node, depth, active))\n );\n }\n if (typeof type === 'string') {\n return printTyped(type, node, depth, active);\n }\n if (\n Object.hasOwn(node, 'properties') ||\n Object.hasOwn(node, 'additionalProperties')\n ) {\n return printObject(node, depth, active);\n }\n if (Object.hasOwn(node, 'items') || Object.hasOwn(node, 'prefixItems')) {\n return printArray(node, depth, active);\n }\n return undefined;\n };\n\n const printTyped = (\n type: unknown,\n node: JsonObject,\n depth: number,\n active: ReadonlySet<string>\n ): Printed => {\n switch (type) {\n case 'string':\n return atom('string');\n case 'number':\n case 'integer':\n return atom('number');\n case 'boolean':\n return atom('boolean');\n case 'null':\n return atom('null');\n case 'array':\n return printArray(node, depth, active);\n case 'object':\n return printObject(node, depth, active);\n default:\n return atom('unknown');\n }\n };\n\n const printArray = (\n node: JsonObject,\n depth: number,\n active: ReadonlySet<string>\n ): Printed => {\n const { prefixItems, items } = node;\n if (Array.isArray(prefixItems)) {\n const required = typeof node.minItems === 'number' ? node.minItems : 0;\n const elements = prefixItems.map((item, index) => {\n const printed = printNode(item, depth, active);\n return index < required\n ? printed.text\n : `${printed.kind === 'atom' ? printed.text : `(${printed.text})`}?`;\n });\n if (items !== undefined && items !== false) {\n elements.push(`...${arrayOf(printNode(items, depth, active)).text}`);\n }\n return atom(`[${elements.join(', ')}]`);\n }\n return arrayOf(\n items === undefined ? atom('unknown') : printNode(items, depth, active)\n );\n };\n\n const printObject = (\n node: JsonObject,\n depth: number,\n active: ReadonlySet<string>\n ): Printed => {\n const properties = isJsonObject(node.properties) ? node.properties : {};\n const lines = printMembers(node, depth, active, {});\n const extra = node.additionalProperties;\n const patterns = isJsonObject(node.patternProperties)\n ? Object.values(node.patternProperties)\n : [];\n const open = extra !== false;\n const values = [\n ...patterns.map((schema) => printNode(schema, depth, active)),\n ];\n if (open) {\n values.push(\n extra === undefined || extra === true\n ? atom('unknown')\n : printNode(extra, depth, active)\n );\n }\n const index =\n values.length === 0\n ? Object.keys(properties).length === 0\n ? `${INDENT.repeat(depth + 1)}[key: string]: never;\\n`\n : ''\n : `${INDENT.repeat(depth + 1)}[key: string]: ${\n union([\n ...values,\n ...Object.values(properties).map((schema) =>\n printNode(schema, depth, active)\n ),\n ...(Object.keys(properties).some(\n (key) =>\n !Array.isArray(node.required) || !node.required.includes(key)\n )\n ? [atom('undefined')]\n : []),\n ]).text\n };\\n`;\n return atom(`{\\n${lines}${index}${INDENT.repeat(depth)}}`);\n };\n\n const printMembers = (\n node: JsonObject,\n depth: number,\n active: ReadonlySet<string>,\n { omit, optional }: MemberOptions\n ): string => {\n const pad = INDENT.repeat(depth + 1);\n const required = new Set(\n Array.isArray(node.required)\n ? node.required.filter((key) => typeof key === 'string')\n : []\n );\n const properties = isJsonObject(node.properties) ? node.properties : {};\n return Object.entries(properties)\n .filter(([key]) => !omit?.has(key))\n .map(([key, property]) => {\n const doc = isJsonObject(property)\n ? jsDoc(\n [\n typeof property.description === 'string'\n ? property.description\n : '',\n ...(Object.hasOwn(property, 'default')\n ? [`@default ${JSON.stringify(property.default)}`]\n : []),\n ],\n pad\n )\n : '';\n const mark = required.has(key) && !optional?.has(key) ? '' : '?';\n return `${doc}${pad}${propertyKey(key)}${mark}: ${\n printNode(property, depth + 1, active).text\n };\\n`;\n })\n .join('');\n };\n\n return {\n print: (schema, depth = 0) => printNode(schema, depth, new Set()).text,\n members: (schema, depth, options = {}) =>\n printMembers(schema, depth, new Set(), options),\n promoted: () => {\n const aliases: string[] = [];\n for (const [id, name] of promotedNames) {\n aliases.push(\n `type ${name} = ${printNode(ownDef(defs, id), 0, new Set([id])).text};`\n );\n }\n return aliases;\n },\n };\n};\n"]}