@elastic/isomer-studio 0.0.0 → 0.4.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 (406) hide show
  1. package/LICENSE.txt +93 -0
  2. package/NOTICE.txt +17329 -0
  3. package/README.md +64 -0
  4. package/THIRD_PARTY_LICENSES.md +404 -0
  5. package/bin/isomer-studio.js +10 -0
  6. package/dist/app/assets/codicon-5T574S7B.ttf +0 -0
  7. package/dist/app/assets/editor.worker.js +11 -0
  8. package/dist/app/assets/esbuild.wasm +0 -0
  9. package/dist/app/assets/json.worker.js +47 -0
  10. package/dist/app/assets/slack.css +1 -0
  11. package/dist/app/assets/studio.css +11 -0
  12. package/dist/app/assets/ts.worker.js +37029 -0
  13. package/dist/app/index.html +16 -0
  14. package/dist/apps/app_host.d.ts +8 -0
  15. package/dist/apps/app_host.d.ts.map +1 -0
  16. package/dist/apps/app_host.js +73 -0
  17. package/dist/apps/app_host.js.map +1 -0
  18. package/dist/browser/dev_host.d.ts +5 -0
  19. package/dist/browser/dev_host.d.ts.map +1 -0
  20. package/dist/browser/dev_host.js +46 -0
  21. package/dist/browser/dev_host.js.map +1 -0
  22. package/dist/browser/mount.d.ts +16 -0
  23. package/dist/browser/mount.d.ts.map +1 -0
  24. package/dist/browser/mount.js +37 -0
  25. package/dist/browser/mount.js.map +1 -0
  26. package/dist/browser/static_host.d.ts +5 -0
  27. package/dist/browser/static_host.d.ts.map +1 -0
  28. package/dist/browser/static_host.js +55 -0
  29. package/dist/browser/static_host.js.map +1 -0
  30. package/dist/chrome/accent.d.ts +14 -0
  31. package/dist/chrome/accent.d.ts.map +1 -0
  32. package/dist/chrome/accent.js +31 -0
  33. package/dist/chrome/accent.js.map +1 -0
  34. package/dist/chrome/app_pages.d.ts +13 -0
  35. package/dist/chrome/app_pages.d.ts.map +1 -0
  36. package/dist/chrome/app_pages.js +33 -0
  37. package/dist/chrome/app_pages.js.map +1 -0
  38. package/dist/chrome/color_mode.d.ts +10 -0
  39. package/dist/chrome/color_mode.d.ts.map +1 -0
  40. package/dist/chrome/color_mode.js +45 -0
  41. package/dist/chrome/color_mode.js.map +1 -0
  42. package/dist/chrome/dev_tint.d.ts +7 -0
  43. package/dist/chrome/dev_tint.d.ts.map +1 -0
  44. package/dist/chrome/dev_tint.js +31 -0
  45. package/dist/chrome/dev_tint.js.map +1 -0
  46. package/dist/chrome/header.d.ts +20 -0
  47. package/dist/chrome/header.d.ts.map +1 -0
  48. package/dist/chrome/header.js +124 -0
  49. package/dist/chrome/header.js.map +1 -0
  50. package/dist/chrome/icon_data_uri.d.ts +12 -0
  51. package/dist/chrome/icon_data_uri.d.ts.map +1 -0
  52. package/dist/chrome/icon_data_uri.js +21 -0
  53. package/dist/chrome/icon_data_uri.js.map +1 -0
  54. package/dist/chrome/isomer_mark.d.ts +17 -0
  55. package/dist/chrome/isomer_mark.d.ts.map +1 -0
  56. package/dist/chrome/isomer_mark.js +46 -0
  57. package/dist/chrome/isomer_mark.js.map +1 -0
  58. package/dist/chrome/nav.d.ts +22 -0
  59. package/dist/chrome/nav.d.ts.map +1 -0
  60. package/dist/chrome/nav.js +306 -0
  61. package/dist/chrome/nav.js.map +1 -0
  62. package/dist/chrome/nav_groups.d.ts +6 -0
  63. package/dist/chrome/nav_groups.d.ts.map +1 -0
  64. package/dist/chrome/nav_groups.js +48 -0
  65. package/dist/chrome/nav_groups.js.map +1 -0
  66. package/dist/chrome/nav_sections.d.ts +29 -0
  67. package/dist/chrome/nav_sections.d.ts.map +1 -0
  68. package/dist/chrome/nav_sections.js +55 -0
  69. package/dist/chrome/nav_sections.js.map +1 -0
  70. package/dist/chrome/oklch.d.ts +10 -0
  71. package/dist/chrome/oklch.d.ts.map +1 -0
  72. package/dist/chrome/oklch.js +61 -0
  73. package/dist/chrome/oklch.js.map +1 -0
  74. package/dist/chrome/primitive_glyph.d.ts +14 -0
  75. package/dist/chrome/primitive_glyph.d.ts.map +1 -0
  76. package/dist/chrome/primitive_glyph.js +48 -0
  77. package/dist/chrome/primitive_glyph.js.map +1 -0
  78. package/dist/chrome/primitive_heading.d.ts +14 -0
  79. package/dist/chrome/primitive_heading.d.ts.map +1 -0
  80. package/dist/chrome/primitive_heading.js +32 -0
  81. package/dist/chrome/primitive_heading.js.map +1 -0
  82. package/dist/chrome/primitive_peek.d.ts +8 -0
  83. package/dist/chrome/primitive_peek.d.ts.map +1 -0
  84. package/dist/chrome/primitive_peek.js +51 -0
  85. package/dist/chrome/primitive_peek.js.map +1 -0
  86. package/dist/chrome/primitive_search.d.ts +9 -0
  87. package/dist/chrome/primitive_search.d.ts.map +1 -0
  88. package/dist/chrome/primitive_search.js +93 -0
  89. package/dist/chrome/primitive_search.js.map +1 -0
  90. package/dist/chrome/route.d.ts +48 -0
  91. package/dist/chrome/route.d.ts.map +1 -0
  92. package/dist/chrome/route.js +136 -0
  93. package/dist/chrome/route.js.map +1 -0
  94. package/dist/cli/args.d.ts +39 -0
  95. package/dist/cli/args.d.ts.map +1 -0
  96. package/dist/cli/args.js +171 -0
  97. package/dist/cli/args.js.map +1 -0
  98. package/dist/cli/run.d.ts +15 -0
  99. package/dist/cli/run.d.ts.map +1 -0
  100. package/dist/cli/run.js +113 -0
  101. package/dist/cli/run.js.map +1 -0
  102. package/dist/cli.d.ts +2 -0
  103. package/dist/cli.d.ts.map +1 -0
  104. package/dist/cli.js +22 -0
  105. package/dist/cli.js.map +1 -0
  106. package/dist/config.d.ts +118 -0
  107. package/dist/config.d.ts.map +1 -0
  108. package/dist/config.js +11 -0
  109. package/dist/config.js.map +1 -0
  110. package/dist/dev/code_editor.d.ts +10 -0
  111. package/dist/dev/code_editor.d.ts.map +1 -0
  112. package/dist/dev/code_editor.js +22 -0
  113. package/dist/dev/code_editor.js.map +1 -0
  114. package/dist/dev/dev_view.d.ts +9 -0
  115. package/dist/dev/dev_view.d.ts.map +1 -0
  116. package/dist/dev/dev_view.js +65 -0
  117. package/dist/dev/dev_view.js.map +1 -0
  118. package/dist/dev/editor_panel.d.ts +17 -0
  119. package/dist/dev/editor_panel.d.ts.map +1 -0
  120. package/dist/dev/editor_panel.js +51 -0
  121. package/dist/dev/editor_panel.js.map +1 -0
  122. package/dist/dev/monaco_editor.d.ts +15 -0
  123. package/dist/dev/monaco_editor.d.ts.map +1 -0
  124. package/dist/dev/monaco_editor.js +159 -0
  125. package/dist/dev/monaco_editor.js.map +1 -0
  126. package/dist/dev/preview_panel.d.ts +10 -0
  127. package/dist/dev/preview_panel.d.ts.map +1 -0
  128. package/dist/dev/preview_panel.js +45 -0
  129. package/dist/dev/preview_panel.js.map +1 -0
  130. package/dist/dev/prop_reference.d.ts +9 -0
  131. package/dist/dev/prop_reference.d.ts.map +1 -0
  132. package/dist/dev/prop_reference.js +134 -0
  133. package/dist/dev/prop_reference.js.map +1 -0
  134. package/dist/dev/tsx_language.d.ts +10 -0
  135. package/dist/dev/tsx_language.d.ts.map +1 -0
  136. package/dist/dev/tsx_language.js +283 -0
  137. package/dist/dev/tsx_language.js.map +1 -0
  138. package/dist/dev/use_editor.d.ts +23 -0
  139. package/dist/dev/use_editor.d.ts.map +1 -0
  140. package/dist/dev/use_editor.js +124 -0
  141. package/dist/dev/use_editor.js.map +1 -0
  142. package/dist/docs/docs_view.d.ts +10 -0
  143. package/dist/docs/docs_view.d.ts.map +1 -0
  144. package/dist/docs/docs_view.js +80 -0
  145. package/dist/docs/docs_view.js.map +1 -0
  146. package/dist/docs/example_source.d.ts +7 -0
  147. package/dist/docs/example_source.d.ts.map +1 -0
  148. package/dist/docs/example_source.js +56 -0
  149. package/dist/docs/example_source.js.map +1 -0
  150. package/dist/docs/examples_panel.d.ts +10 -0
  151. package/dist/docs/examples_panel.d.ts.map +1 -0
  152. package/dist/docs/examples_panel.js +51 -0
  153. package/dist/docs/examples_panel.js.map +1 -0
  154. package/dist/docs/gallery_view.d.ts +9 -0
  155. package/dist/docs/gallery_view.d.ts.map +1 -0
  156. package/dist/docs/gallery_view.js +98 -0
  157. package/dist/docs/gallery_view.js.map +1 -0
  158. package/dist/docs/inline_code.d.ts +11 -0
  159. package/dist/docs/inline_code.d.ts.map +1 -0
  160. package/dist/docs/inline_code.js +24 -0
  161. package/dist/docs/inline_code.js.map +1 -0
  162. package/dist/docs/on_this_page.d.ts +17 -0
  163. package/dist/docs/on_this_page.d.ts.map +1 -0
  164. package/dist/docs/on_this_page.js +77 -0
  165. package/dist/docs/on_this_page.js.map +1 -0
  166. package/dist/docs/props_table.d.ts +14 -0
  167. package/dist/docs/props_table.d.ts.map +1 -0
  168. package/dist/docs/props_table.js +34 -0
  169. package/dist/docs/props_table.js.map +1 -0
  170. package/dist/home/apps_section.d.ts +6 -0
  171. package/dist/home/apps_section.d.ts.map +1 -0
  172. package/dist/home/apps_section.js +44 -0
  173. package/dist/home/apps_section.js.map +1 -0
  174. package/dist/home/featured_strip.d.ts +12 -0
  175. package/dist/home/featured_strip.d.ts.map +1 -0
  176. package/dist/home/featured_strip.js +176 -0
  177. package/dist/home/featured_strip.js.map +1 -0
  178. package/dist/home/home_view.d.ts +11 -0
  179. package/dist/home/home_view.d.ts.map +1 -0
  180. package/dist/home/home_view.js +261 -0
  181. package/dist/home/home_view.js.map +1 -0
  182. package/dist/home/links.d.ts +8 -0
  183. package/dist/home/links.d.ts.map +1 -0
  184. package/dist/home/links.js +14 -0
  185. package/dist/home/links.js.map +1 -0
  186. package/dist/home/loaded_panel.d.ts +6 -0
  187. package/dist/home/loaded_panel.d.ts.map +1 -0
  188. package/dist/home/loaded_panel.js +116 -0
  189. package/dist/home/loaded_panel.js.map +1 -0
  190. package/dist/home/surface_chart.d.ts +6 -0
  191. package/dist/home/surface_chart.d.ts.map +1 -0
  192. package/dist/home/surface_chart.js +263 -0
  193. package/dist/home/surface_chart.js.map +1 -0
  194. package/dist/home/tokens.d.ts +49 -0
  195. package/dist/home/tokens.d.ts.map +1 -0
  196. package/dist/home/tokens.js +171 -0
  197. package/dist/home/tokens.js.map +1 -0
  198. package/dist/index.d.ts +6 -0
  199. package/dist/index.d.ts.map +1 -0
  200. package/dist/index.js +9 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/model/app_problems.d.ts +4 -0
  203. package/dist/model/app_problems.d.ts.map +1 -0
  204. package/dist/model/app_problems.js +90 -0
  205. package/dist/model/app_problems.js.map +1 -0
  206. package/dist/model/authoring_types.d.ts +23 -0
  207. package/dist/model/authoring_types.d.ts.map +1 -0
  208. package/dist/model/authoring_types.js +35 -0
  209. package/dist/model/authoring_types.js.map +1 -0
  210. package/dist/model/compile_jsx.d.ts +19 -0
  211. package/dist/model/compile_jsx.d.ts.map +1 -0
  212. package/dist/model/compile_jsx.js +55 -0
  213. package/dist/model/compile_jsx.js.map +1 -0
  214. package/dist/model/compose_example.d.ts +9 -0
  215. package/dist/model/compose_example.d.ts.map +1 -0
  216. package/dist/model/compose_example.js +24 -0
  217. package/dist/model/compose_example.js.map +1 -0
  218. package/dist/model/composition_key.d.ts +6 -0
  219. package/dist/model/composition_key.d.ts.map +1 -0
  220. package/dist/model/composition_key.js +26 -0
  221. package/dist/model/composition_key.js.map +1 -0
  222. package/dist/model/describe_runtime.d.ts +33 -0
  223. package/dist/model/describe_runtime.d.ts.map +1 -0
  224. package/dist/model/describe_runtime.js +77 -0
  225. package/dist/model/describe_runtime.js.map +1 -0
  226. package/dist/model/featured.d.ts +11 -0
  227. package/dist/model/featured.d.ts.map +1 -0
  228. package/dist/model/featured.js +70 -0
  229. package/dist/model/featured.js.map +1 -0
  230. package/dist/model/jsx_transform.d.ts +10 -0
  231. package/dist/model/jsx_transform.d.ts.map +1 -0
  232. package/dist/model/jsx_transform.js +31 -0
  233. package/dist/model/jsx_transform.js.map +1 -0
  234. package/dist/model/png_manifest.d.ts +23 -0
  235. package/dist/model/png_manifest.d.ts.map +1 -0
  236. package/dist/model/png_manifest.js +26 -0
  237. package/dist/model/png_manifest.js.map +1 -0
  238. package/dist/model/read_examples.d.ts +12 -0
  239. package/dist/model/read_examples.d.ts.map +1 -0
  240. package/dist/model/read_examples.js +43 -0
  241. package/dist/model/read_examples.js.map +1 -0
  242. package/dist/model/search.d.ts +4 -0
  243. package/dist/model/search.d.ts.map +1 -0
  244. package/dist/model/search.js +29 -0
  245. package/dist/model/search.js.map +1 -0
  246. package/dist/model/sha256.d.ts +3 -0
  247. package/dist/model/sha256.d.ts.map +1 -0
  248. package/dist/model/sha256.js +72 -0
  249. package/dist/model/sha256.js.map +1 -0
  250. package/dist/model/slack_limits.d.ts +9 -0
  251. package/dist/model/slack_limits.d.ts.map +1 -0
  252. package/dist/model/slack_limits.js +213 -0
  253. package/dist/model/slack_limits.js.map +1 -0
  254. package/dist/node/app_bundle.d.ts +45 -0
  255. package/dist/node/app_bundle.d.ts.map +1 -0
  256. package/dist/node/app_bundle.js +212 -0
  257. package/dist/node/app_bundle.js.map +1 -0
  258. package/dist/node/build_site.d.ts +28 -0
  259. package/dist/node/build_site.d.ts.map +1 -0
  260. package/dist/node/build_site.js +90 -0
  261. package/dist/node/build_site.js.map +1 -0
  262. package/dist/node/check.d.ts +40 -0
  263. package/dist/node/check.d.ts.map +1 -0
  264. package/dist/node/check.js +162 -0
  265. package/dist/node/check.js.map +1 -0
  266. package/dist/node/dev_bundle.d.ts +21 -0
  267. package/dist/node/dev_bundle.d.ts.map +1 -0
  268. package/dist/node/dev_bundle.js +121 -0
  269. package/dist/node/dev_bundle.js.map +1 -0
  270. package/dist/node/dev_server.d.ts +16 -0
  271. package/dist/node/dev_server.d.ts.map +1 -0
  272. package/dist/node/dev_server.js +291 -0
  273. package/dist/node/dev_server.js.map +1 -0
  274. package/dist/node/init_config.d.ts +30 -0
  275. package/dist/node/init_config.d.ts.map +1 -0
  276. package/dist/node/init_config.js +158 -0
  277. package/dist/node/init_config.js.map +1 -0
  278. package/dist/node/load_config.d.ts +34 -0
  279. package/dist/node/load_config.d.ts.map +1 -0
  280. package/dist/node/load_config.js +246 -0
  281. package/dist/node/load_config.js.map +1 -0
  282. package/dist/node/project_resolution.d.ts +17 -0
  283. package/dist/node/project_resolution.d.ts.map +1 -0
  284. package/dist/node/project_resolution.js +66 -0
  285. package/dist/node/project_resolution.js.map +1 -0
  286. package/dist/node/rasterize.d.ts +23 -0
  287. package/dist/node/rasterize.d.ts.map +1 -0
  288. package/dist/node/rasterize.js +79 -0
  289. package/dist/node/rasterize.js.map +1 -0
  290. package/dist/node/report.d.ts +8 -0
  291. package/dist/node/report.d.ts.map +1 -0
  292. package/dist/node/report.js +57 -0
  293. package/dist/node/report.js.map +1 -0
  294. package/dist/node/resolve_hooks.d.ts +16 -0
  295. package/dist/node/resolve_hooks.d.ts.map +1 -0
  296. package/dist/node/resolve_hooks.js +104 -0
  297. package/dist/node/resolve_hooks.js.map +1 -0
  298. package/dist/studio.d.ts +4 -0
  299. package/dist/studio.d.ts.map +1 -0
  300. package/dist/studio.js +188 -0
  301. package/dist/studio.js.map +1 -0
  302. package/dist/studio_context.d.ts +27 -0
  303. package/dist/studio_context.d.ts.map +1 -0
  304. package/dist/studio_context.js +17 -0
  305. package/dist/studio_context.js.map +1 -0
  306. package/dist/surfaces/adopt_stylesheet.d.ts +7 -0
  307. package/dist/surfaces/adopt_stylesheet.d.ts.map +1 -0
  308. package/dist/surfaces/adopt_stylesheet.js +64 -0
  309. package/dist/surfaces/adopt_stylesheet.js.map +1 -0
  310. package/dist/surfaces/app_preview.d.ts +4 -0
  311. package/dist/surfaces/app_preview.d.ts.map +1 -0
  312. package/dist/surfaces/app_preview.js +28 -0
  313. package/dist/surfaces/app_preview.js.map +1 -0
  314. package/dist/surfaces/app_surface.d.ts +9 -0
  315. package/dist/surfaces/app_surface.d.ts.map +1 -0
  316. package/dist/surfaces/app_surface.js +27 -0
  317. package/dist/surfaces/app_surface.js.map +1 -0
  318. package/dist/surfaces/applicable_enhancements.d.ts +4 -0
  319. package/dist/surfaces/applicable_enhancements.d.ts.map +1 -0
  320. package/dist/surfaces/applicable_enhancements.js +16 -0
  321. package/dist/surfaces/applicable_enhancements.js.map +1 -0
  322. package/dist/surfaces/enhancement_select.d.ts +10 -0
  323. package/dist/surfaces/enhancement_select.d.ts.map +1 -0
  324. package/dist/surfaces/enhancement_select.js +28 -0
  325. package/dist/surfaces/enhancement_select.js.map +1 -0
  326. package/dist/surfaces/example_picker.d.ts +11 -0
  327. package/dist/surfaces/example_picker.d.ts.map +1 -0
  328. package/dist/surfaces/example_picker.js +44 -0
  329. package/dist/surfaces/example_picker.js.map +1 -0
  330. package/dist/surfaces/format_source.d.ts +4 -0
  331. package/dist/surfaces/format_source.d.ts.map +1 -0
  332. package/dist/surfaces/format_source.js +30 -0
  333. package/dist/surfaces/format_source.js.map +1 -0
  334. package/dist/surfaces/html_surface.d.ts +14 -0
  335. package/dist/surfaces/html_surface.d.ts.map +1 -0
  336. package/dist/surfaces/html_surface.js +122 -0
  337. package/dist/surfaces/html_surface.js.map +1 -0
  338. package/dist/surfaces/png_surface.d.ts +13 -0
  339. package/dist/surfaces/png_surface.d.ts.map +1 -0
  340. package/dist/surfaces/png_surface.js +68 -0
  341. package/dist/surfaces/png_surface.js.map +1 -0
  342. package/dist/surfaces/react_surface.d.ts +11 -0
  343. package/dist/surfaces/react_surface.d.ts.map +1 -0
  344. package/dist/surfaces/react_surface.js +55 -0
  345. package/dist/surfaces/react_surface.js.map +1 -0
  346. package/dist/surfaces/render_output.d.ts +31 -0
  347. package/dist/surfaces/render_output.d.ts.map +1 -0
  348. package/dist/surfaces/render_output.js +119 -0
  349. package/dist/surfaces/render_output.js.map +1 -0
  350. package/dist/surfaces/scaled_preview.d.ts +17 -0
  351. package/dist/surfaces/scaled_preview.d.ts.map +1 -0
  352. package/dist/surfaces/scaled_preview.js +74 -0
  353. package/dist/surfaces/scaled_preview.js.map +1 -0
  354. package/dist/surfaces/shadow_root.d.ts +8 -0
  355. package/dist/surfaces/shadow_root.d.ts.map +1 -0
  356. package/dist/surfaces/shadow_root.js +41 -0
  357. package/dist/surfaces/shadow_root.js.map +1 -0
  358. package/dist/surfaces/slack_surface.d.ts +12 -0
  359. package/dist/surfaces/slack_surface.d.ts.map +1 -0
  360. package/dist/surfaces/slack_surface.js +27 -0
  361. package/dist/surfaces/slack_surface.js.map +1 -0
  362. package/dist/surfaces/snapshot_surface.d.ts +6 -0
  363. package/dist/surfaces/snapshot_surface.d.ts.map +1 -0
  364. package/dist/surfaces/snapshot_surface.js +5 -0
  365. package/dist/surfaces/snapshot_surface.js.map +1 -0
  366. package/dist/surfaces/surface_board.d.ts +19 -0
  367. package/dist/surfaces/surface_board.d.ts.map +1 -0
  368. package/dist/surfaces/surface_board.js +128 -0
  369. package/dist/surfaces/surface_board.js.map +1 -0
  370. package/dist/surfaces/surface_frame.d.ts +8 -0
  371. package/dist/surfaces/surface_frame.d.ts.map +1 -0
  372. package/dist/surfaces/surface_frame.js +4 -0
  373. package/dist/surfaces/surface_frame.js.map +1 -0
  374. package/dist/surfaces/surface_logos.d.ts +9 -0
  375. package/dist/surfaces/surface_logos.d.ts.map +1 -0
  376. package/dist/surfaces/surface_logos.js +21 -0
  377. package/dist/surfaces/surface_logos.js.map +1 -0
  378. package/dist/surfaces/surface_preview.d.ts +32 -0
  379. package/dist/surfaces/surface_preview.d.ts.map +1 -0
  380. package/dist/surfaces/surface_preview.js +66 -0
  381. package/dist/surfaces/surface_preview.js.map +1 -0
  382. package/dist/surfaces/surface_select.d.ts +34 -0
  383. package/dist/surfaces/surface_select.d.ts.map +1 -0
  384. package/dist/surfaces/surface_select.js +119 -0
  385. package/dist/surfaces/surface_select.js.map +1 -0
  386. package/dist/surfaces/text_surfaces.d.ts +14 -0
  387. package/dist/surfaces/text_surfaces.d.ts.map +1 -0
  388. package/dist/surfaces/text_surfaces.js +31 -0
  389. package/dist/surfaces/text_surfaces.js.map +1 -0
  390. package/dist/surfaces/zoom_select.d.ts +9 -0
  391. package/dist/surfaces/zoom_select.d.ts.map +1 -0
  392. package/dist/surfaces/zoom_select.js +32 -0
  393. package/dist/surfaces/zoom_select.js.map +1 -0
  394. package/dist/types.d.ts +32 -0
  395. package/dist/types.d.ts.map +1 -0
  396. package/dist/types.js +9 -0
  397. package/dist/types.js.map +1 -0
  398. package/docs/ci.md +55 -0
  399. package/docs/commands.md +167 -0
  400. package/docs/config.md +192 -0
  401. package/docs/images/home.png +0 -0
  402. package/docs/images/reference.png +0 -0
  403. package/docs/images/workbench.png +0 -0
  404. package/docs/index.md +96 -0
  405. package/docs/toc.yml +10 -0
  406. package/package.json +89 -5
@@ -0,0 +1,291 @@
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 { existsSync, realpathSync } from 'node:fs';
8
+ import { readFile } from 'node:fs/promises';
9
+ import { createServer } from 'node:http';
10
+ import { extname, join, normalize } from 'node:path';
11
+ import { transform } from 'esbuild';
12
+ import { createServer as createViteServer, createServerModuleRunner, } from 'vite';
13
+ import { describeTransformError, JSX_TRANSFORM_OPTIONS, } from '../model/jsx_transform.js';
14
+ import { APP_DIR, renderIndexHtml } from './app_bundle.js';
15
+ import { DEV_ENTRY_URL, devViteConfig } from './dev_bundle.js';
16
+ import { assertSingleReact, createStudioImporter, loadStudioConfig, studioConfigFrom, } from './load_config.js';
17
+ import { createRenderers, imageFontsOf } from './rasterize.js';
18
+ const HOST = '127.0.0.1';
19
+ const MAX_BODY_BYTES = 256 * 1024;
20
+ /** A whole deck's compositions. */
21
+ const MAX_PDF_BODY_BYTES = 8 * 1024 * 1024;
22
+ const ASSETS_DIR = join(APP_DIR, 'assets');
23
+ const CONTENT_TYPES = {
24
+ '.css': 'text/css; charset=utf-8',
25
+ '.html': 'text/html; charset=utf-8',
26
+ '.js': 'text/javascript; charset=utf-8',
27
+ '.json': 'application/json; charset=utf-8',
28
+ '.map': 'application/json; charset=utf-8',
29
+ '.png': 'image/png',
30
+ '.svg': 'image/svg+xml',
31
+ '.ttf': 'font/ttf',
32
+ '.wasm': 'application/wasm',
33
+ '.woff': 'font/woff',
34
+ '.woff2': 'font/woff2',
35
+ };
36
+ const readBody = (request, maxBytes = MAX_BODY_BYTES) => new Promise((resolve, reject) => {
37
+ const chunks = [];
38
+ let size = 0;
39
+ request.on('data', (chunk) => {
40
+ size += chunk.length;
41
+ if (size > maxBytes) {
42
+ reject(new Error(`Request body is over ${maxBytes} bytes.`));
43
+ request.destroy();
44
+ return;
45
+ }
46
+ chunks.push(chunk);
47
+ });
48
+ request.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
49
+ request.on('error', reject);
50
+ });
51
+ const sendText = (response, status, text) => {
52
+ response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });
53
+ response.end(text);
54
+ };
55
+ const LOOPBACK_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '[::1]']);
56
+ /** Whether a `Host` header names the loopback listener, which a DNS-rebinding page's own hostname does not. */
57
+ export const isLoopbackHost = (host) => {
58
+ if (host === undefined) {
59
+ return false;
60
+ }
61
+ try {
62
+ return LOOPBACK_HOSTNAMES.has(new URL(`http://${host}`).hostname);
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ };
68
+ /** Shape only: the snapshot surface validates the rest and draws what it can. */
69
+ const isComposition = (value) => typeof value === 'object' &&
70
+ value !== null &&
71
+ 'type' in value &&
72
+ typeof value.type === 'string';
73
+ const isPdfRequest = (value) => typeof value === 'object' &&
74
+ value !== null &&
75
+ 'compositions' in value &&
76
+ Array.isArray(value.compositions) &&
77
+ value.compositions.length > 0 &&
78
+ value.compositions.every(isComposition) &&
79
+ (!('title' in value) ||
80
+ value.title === undefined ||
81
+ typeof value.title === 'string');
82
+ const describeError = (error) => error instanceof Error ? error.message : String(error);
83
+ /** Serves the Studio for `configPath` with hot updates, re-running the Node-side config whenever its modules change. */
84
+ export const startDevServer = async ({ configPath: givenConfigPath, port, loader, log = (line) => process.stdout.write(`${line}\n`), }) => {
85
+ // Vite's module ids and serving allow list compare real paths.
86
+ const configPath = realpathSync(givenConfigPath);
87
+ if (!existsSync(join(APP_DIR, 'index.html'))) {
88
+ throw new Error(`The Studio's app assets are missing from ${APP_DIR}. In the Isomer repository, run \`pnpm build\` once.`);
89
+ }
90
+ assertSingleReact(configPath);
91
+ if (loader === 'none') {
92
+ log('PNGs render with the config as loaded now: Node caches a plain import(), so restart dev to pick up config or pack changes.');
93
+ }
94
+ const server = createServer();
95
+ const fontFiles = new Set();
96
+ const vite = await createViteServer(devViteConfig({
97
+ configPath,
98
+ server,
99
+ onConfigChange: (stale) => reloadConfig(stale),
100
+ reloadsWith: () => fontFiles,
101
+ }));
102
+ const runner = loader === 'none'
103
+ ? undefined
104
+ : createServerModuleRunner(vite.environments.ssr, { hmr: false });
105
+ const importModule = createStudioImporter(configPath, { loader });
106
+ const importConfig = async () => {
107
+ const config = runner
108
+ ? studioConfigFrom(await runner.import(configPath), configPath)
109
+ : await loadStudioConfig(configPath, { importModule });
110
+ const fonts = imageFontsOf(config, configPath, async (path) => {
111
+ if (!runner) {
112
+ return importModule(path);
113
+ }
114
+ const namespace = await runner.import(path);
115
+ const node = await vite.environments.ssr.moduleGraph.getModuleByUrl(path);
116
+ fontFiles.clear();
117
+ if (node?.file) {
118
+ fontFiles.add(node.file);
119
+ }
120
+ return namespace;
121
+ });
122
+ return { config, renderers: createRenderers(config.runtime, fonts) };
123
+ };
124
+ let loaded = importConfig();
125
+ const reloadConfig = async (stale) => {
126
+ if (!runner) {
127
+ return;
128
+ }
129
+ const { evaluatedModules } = runner;
130
+ stale.forEach(({ id }) => {
131
+ const node = id === null ? undefined : evaluatedModules.getModuleById(id);
132
+ if (node) {
133
+ evaluatedModules.invalidateModule(node);
134
+ }
135
+ });
136
+ const previous = loaded;
137
+ loaded = previous.then(importConfig).catch((error) => {
138
+ log(`Could not reload the Studio config: ${describeError(error)}`);
139
+ return previous;
140
+ });
141
+ await loaded;
142
+ };
143
+ const close = async () => {
144
+ await runner?.close();
145
+ await vite.close();
146
+ };
147
+ try {
148
+ await loaded;
149
+ }
150
+ catch (error) {
151
+ await close();
152
+ throw error;
153
+ }
154
+ const png = async (request, response) => {
155
+ const { renderers } = await loaded;
156
+ if (!renderers) {
157
+ sendText(response, 404, 'The runtime has no snapshot surface.');
158
+ return;
159
+ }
160
+ try {
161
+ const composition = JSON.parse(await readBody(request));
162
+ if (!isComposition(composition)) {
163
+ sendText(response, 400, 'Not a composition.');
164
+ return;
165
+ }
166
+ const image = await renderers.png(composition);
167
+ response.writeHead(200, {
168
+ 'content-type': 'image/png',
169
+ 'cache-control': 'no-store',
170
+ });
171
+ response.end(image);
172
+ }
173
+ catch (error) {
174
+ sendText(response, 400, describeError(error));
175
+ }
176
+ };
177
+ const pdf = async (request, response) => {
178
+ const { renderers } = await loaded;
179
+ if (!renderers) {
180
+ sendText(response, 404, 'The runtime has no snapshot surface.');
181
+ return;
182
+ }
183
+ try {
184
+ const body = JSON.parse(await readBody(request, MAX_PDF_BODY_BYTES));
185
+ if (!isPdfRequest(body)) {
186
+ sendText(response, 400, 'Not one or more compositions.');
187
+ return;
188
+ }
189
+ const { title, compositions } = body;
190
+ const document = await renderers.pdf(compositions, { title });
191
+ response.writeHead(200, {
192
+ 'content-type': 'application/pdf',
193
+ 'cache-control': 'no-store',
194
+ });
195
+ response.end(document);
196
+ }
197
+ catch (error) {
198
+ sendText(response, 400, describeError(error));
199
+ }
200
+ };
201
+ const transformJsx = async (request, response) => {
202
+ try {
203
+ const { code } = await transform(await readBody(request), JSX_TRANSFORM_OPTIONS);
204
+ response.writeHead(200, {
205
+ 'content-type': 'text/javascript; charset=utf-8',
206
+ });
207
+ response.end(code);
208
+ }
209
+ catch (error) {
210
+ sendText(response, 400, describeTransformError(error));
211
+ }
212
+ };
213
+ const serveAsset = async (pathname, response) => {
214
+ const relativePath = normalize(pathname.slice('/assets/'.length));
215
+ const file = relativePath.startsWith('..')
216
+ ? undefined
217
+ : await readFile(join(ASSETS_DIR, relativePath)).catch(() => undefined);
218
+ if (!file) {
219
+ sendText(response, 404, 'Not found');
220
+ return;
221
+ }
222
+ response.writeHead(200, {
223
+ 'content-type': CONTENT_TYPES[extname(pathname)] ?? 'application/octet-stream',
224
+ 'cache-control': 'no-store',
225
+ });
226
+ response.end(file);
227
+ };
228
+ const serveIndex = async (url, response) => {
229
+ try {
230
+ const { config } = await loaded;
231
+ const html = await vite.transformIndexHtml(url, renderIndexHtml({
232
+ base: '/',
233
+ title: config.title,
234
+ entry: DEV_ENTRY_URL,
235
+ }));
236
+ response.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
237
+ response.end(html);
238
+ }
239
+ catch (error) {
240
+ sendText(response, 500, describeError(error));
241
+ }
242
+ };
243
+ server.on('request', (request, response) => {
244
+ if (!isLoopbackHost(request.headers.host)) {
245
+ sendText(response, 403, 'Forbidden host');
246
+ return;
247
+ }
248
+ const url = request.url ?? '/';
249
+ const { pathname } = new URL(url, `http://${HOST}`);
250
+ if (request.method === 'POST' && pathname === '/transform') {
251
+ void transformJsx(request, response);
252
+ return;
253
+ }
254
+ if (request.method === 'POST' && pathname === '/png') {
255
+ void png(request, response);
256
+ return;
257
+ }
258
+ if (request.method === 'POST' && pathname === '/pdf') {
259
+ void pdf(request, response);
260
+ return;
261
+ }
262
+ if (pathname === '/' || pathname === '/index.html') {
263
+ void serveIndex(url, response);
264
+ return;
265
+ }
266
+ if (pathname.startsWith('/assets/')) {
267
+ void serveAsset(pathname, response);
268
+ return;
269
+ }
270
+ vite.middlewares(request, response, () => sendText(response, 404, 'Not found'));
271
+ });
272
+ await new Promise((resolve, reject) => {
273
+ server.once('error', (error) => reject(error.code === 'EADDRINUSE'
274
+ ? new Error(`Port ${port} is in use; pass --port.`)
275
+ : error));
276
+ server.listen(port, HOST, () => resolve());
277
+ }).catch(async (error) => {
278
+ await close();
279
+ throw error;
280
+ });
281
+ const address = server.address();
282
+ const boundPort = typeof address === 'object' && address !== null ? address.port : port;
283
+ return {
284
+ url: `http://${HOST}:${boundPort}/`,
285
+ close: async () => {
286
+ await close();
287
+ await new Promise((resolve) => server.close(() => resolve()));
288
+ },
289
+ };
290
+ };
291
+ //# sourceMappingURL=dev_server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_server.js","sourceRoot":"","sources":["../../src/node/dev_server.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 { existsSync, realpathSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport type { IncomingMessage, Server, ServerResponse } from 'node:http';\nimport { createServer } from 'node:http';\nimport { extname, join, normalize } from 'node:path';\n\nimport type { Composition } from '@elastic/isomer-sdk';\nimport { transform } from 'esbuild';\nimport {\n createServer as createViteServer,\n createServerModuleRunner,\n} from 'vite';\n\nimport type { StudioConfig } from '../config';\nimport {\n describeTransformError,\n JSX_TRANSFORM_OPTIONS,\n} from '../model/jsx_transform';\n\nimport { APP_DIR, renderIndexHtml } from './app_bundle';\nimport type { ConfigChangeHandler } from './dev_bundle';\nimport { DEV_ENTRY_URL, devViteConfig } from './dev_bundle';\nimport type { ConfigLoader } from './load_config';\nimport {\n assertSingleReact,\n createStudioImporter,\n loadStudioConfig,\n studioConfigFrom,\n} from './load_config';\nimport type { NodeRenderers } from './rasterize';\nimport { createRenderers, imageFontsOf } from './rasterize';\n\nconst HOST = '127.0.0.1';\nconst MAX_BODY_BYTES = 256 * 1024;\n/** A whole deck's compositions. */\nconst MAX_PDF_BODY_BYTES = 8 * 1024 * 1024;\nconst ASSETS_DIR = join(APP_DIR, 'assets');\n\nconst CONTENT_TYPES: Readonly<Record<string, string>> = {\n '.css': 'text/css; charset=utf-8',\n '.html': 'text/html; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.map': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ttf': 'font/ttf',\n '.wasm': 'application/wasm',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nconst readBody = (\n request: IncomingMessage,\n maxBytes = MAX_BODY_BYTES\n): Promise<string> =>\n new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let size = 0;\n request.on('data', (chunk: Buffer) => {\n size += chunk.length;\n if (size > maxBytes) {\n reject(new Error(`Request body is over ${maxBytes} bytes.`));\n request.destroy();\n return;\n }\n chunks.push(chunk);\n });\n request.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n request.on('error', reject);\n });\n\nconst sendText = (response: ServerResponse, status: number, text: string) => {\n response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });\n response.end(text);\n};\n\nconst LOOPBACK_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '[::1]']);\n\n/** Whether a `Host` header names the loopback listener, which a DNS-rebinding page's own hostname does not. */\nexport const isLoopbackHost = (host: string | undefined): boolean => {\n if (host === undefined) {\n return false;\n }\n try {\n return LOOPBACK_HOSTNAMES.has(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n};\n\n/** Shape only: the snapshot surface validates the rest and draws what it can. */\nconst isComposition = (value: unknown): value is Composition =>\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n typeof value.type === 'string';\n\nconst isPdfRequest = (\n value: unknown\n): value is { title?: string; compositions: Composition[] } =>\n typeof value === 'object' &&\n value !== null &&\n 'compositions' in value &&\n Array.isArray(value.compositions) &&\n value.compositions.length > 0 &&\n value.compositions.every(isComposition) &&\n (!('title' in value) ||\n value.title === undefined ||\n typeof value.title === 'string');\n\nconst describeError = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nexport interface DevServerOptions {\n configPath: string;\n port: number;\n loader?: ConfigLoader | undefined;\n log?: ((line: string) => void) | undefined;\n}\n\ninterface LoadedConfig {\n config: StudioConfig;\n renderers: NodeRenderers | undefined;\n}\n\nexport interface DevServer {\n url: string;\n close: () => Promise<void>;\n}\n\n/** Serves the Studio for `configPath` with hot updates, re-running the Node-side config whenever its modules change. */\nexport const startDevServer = async ({\n configPath: givenConfigPath,\n port,\n loader,\n log = (line) => process.stdout.write(`${line}\\n`),\n}: DevServerOptions): Promise<DevServer> => {\n // Vite's module ids and serving allow list compare real paths.\n const configPath = realpathSync(givenConfigPath);\n if (!existsSync(join(APP_DIR, 'index.html'))) {\n throw new Error(\n `The Studio's app assets are missing from ${APP_DIR}. In the Isomer repository, run \\`pnpm build\\` once.`\n );\n }\n assertSingleReact(configPath);\n if (loader === 'none') {\n log(\n 'PNGs render with the config as loaded now: Node caches a plain import(), so restart dev to pick up config or pack changes.'\n );\n }\n\n const server: Server = createServer();\n const fontFiles = new Set<string>();\n const vite = await createViteServer(\n devViteConfig({\n configPath,\n server,\n onConfigChange: (stale) => reloadConfig(stale),\n reloadsWith: () => fontFiles,\n })\n );\n const runner =\n loader === 'none'\n ? undefined\n : createServerModuleRunner(vite.environments.ssr, { hmr: false });\n\n const importModule = createStudioImporter(configPath, { loader });\n const importConfig = async (): Promise<LoadedConfig> => {\n const config = runner\n ? studioConfigFrom(await runner.import(configPath), configPath)\n : await loadStudioConfig(configPath, { importModule });\n const fonts = imageFontsOf(config, configPath, async (path) => {\n if (!runner) {\n return importModule(path);\n }\n const namespace: unknown = await runner.import(path);\n const node = await vite.environments.ssr.moduleGraph.getModuleByUrl(path);\n fontFiles.clear();\n if (node?.file) {\n fontFiles.add(node.file);\n }\n return namespace;\n });\n return { config, renderers: createRenderers(config.runtime, fonts) };\n };\n\n let loaded = importConfig();\n\n const reloadConfig: ConfigChangeHandler = async (stale) => {\n if (!runner) {\n return;\n }\n const { evaluatedModules } = runner;\n stale.forEach(({ id }) => {\n const node = id === null ? undefined : evaluatedModules.getModuleById(id);\n if (node) {\n evaluatedModules.invalidateModule(node);\n }\n });\n const previous = loaded;\n loaded = previous.then(importConfig).catch((error: unknown) => {\n log(`Could not reload the Studio config: ${describeError(error)}`);\n return previous;\n });\n await loaded;\n };\n\n const close = async () => {\n await runner?.close();\n await vite.close();\n };\n\n try {\n await loaded;\n } catch (error) {\n await close();\n throw error;\n }\n\n const png = async (request: IncomingMessage, response: ServerResponse) => {\n const { renderers } = await loaded;\n if (!renderers) {\n sendText(response, 404, 'The runtime has no snapshot surface.');\n return;\n }\n try {\n const composition: unknown = JSON.parse(await readBody(request));\n if (!isComposition(composition)) {\n sendText(response, 400, 'Not a composition.');\n return;\n }\n const image = await renderers.png(composition);\n response.writeHead(200, {\n 'content-type': 'image/png',\n 'cache-control': 'no-store',\n });\n response.end(image);\n } catch (error) {\n sendText(response, 400, describeError(error));\n }\n };\n\n const pdf = async (request: IncomingMessage, response: ServerResponse) => {\n const { renderers } = await loaded;\n if (!renderers) {\n sendText(response, 404, 'The runtime has no snapshot surface.');\n return;\n }\n try {\n const body: unknown = JSON.parse(\n await readBody(request, MAX_PDF_BODY_BYTES)\n );\n if (!isPdfRequest(body)) {\n sendText(response, 400, 'Not one or more compositions.');\n return;\n }\n const { title, compositions } = body;\n const document = await renderers.pdf(compositions, { title });\n response.writeHead(200, {\n 'content-type': 'application/pdf',\n 'cache-control': 'no-store',\n });\n response.end(document);\n } catch (error) {\n sendText(response, 400, describeError(error));\n }\n };\n\n const transformJsx = async (\n request: IncomingMessage,\n response: ServerResponse\n ) => {\n try {\n const { code } = await transform(\n await readBody(request),\n JSX_TRANSFORM_OPTIONS\n );\n response.writeHead(200, {\n 'content-type': 'text/javascript; charset=utf-8',\n });\n response.end(code);\n } catch (error) {\n sendText(response, 400, describeTransformError(error));\n }\n };\n\n const serveAsset = async (pathname: string, response: ServerResponse) => {\n const relativePath = normalize(pathname.slice('/assets/'.length));\n const file = relativePath.startsWith('..')\n ? undefined\n : await readFile(join(ASSETS_DIR, relativePath)).catch(() => undefined);\n if (!file) {\n sendText(response, 404, 'Not found');\n return;\n }\n response.writeHead(200, {\n 'content-type':\n CONTENT_TYPES[extname(pathname)] ?? 'application/octet-stream',\n 'cache-control': 'no-store',\n });\n response.end(file);\n };\n\n const serveIndex = async (url: string, response: ServerResponse) => {\n try {\n const { config } = await loaded;\n const html = await vite.transformIndexHtml(\n url,\n renderIndexHtml({\n base: '/',\n title: config.title,\n entry: DEV_ENTRY_URL,\n })\n );\n response.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });\n response.end(html);\n } catch (error) {\n sendText(response, 500, describeError(error));\n }\n };\n\n server.on('request', (request: IncomingMessage, response: ServerResponse) => {\n if (!isLoopbackHost(request.headers.host)) {\n sendText(response, 403, 'Forbidden host');\n return;\n }\n const url = request.url ?? '/';\n const { pathname } = new URL(url, `http://${HOST}`);\n if (request.method === 'POST' && pathname === '/transform') {\n void transformJsx(request, response);\n return;\n }\n if (request.method === 'POST' && pathname === '/png') {\n void png(request, response);\n return;\n }\n if (request.method === 'POST' && pathname === '/pdf') {\n void pdf(request, response);\n return;\n }\n if (pathname === '/' || pathname === '/index.html') {\n void serveIndex(url, response);\n return;\n }\n if (pathname.startsWith('/assets/')) {\n void serveAsset(pathname, response);\n return;\n }\n vite.middlewares(request, response, () =>\n sendText(response, 404, 'Not found')\n );\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', (error: NodeJS.ErrnoException) =>\n reject(\n error.code === 'EADDRINUSE'\n ? new Error(`Port ${port} is in use; pass --port.`)\n : error\n )\n );\n server.listen(port, HOST, () => resolve());\n }).catch(async (error: unknown) => {\n await close();\n throw error;\n });\n\n const address = server.address();\n const boundPort =\n typeof address === 'object' && address !== null ? address.port : port;\n return {\n url: `http://${HOST}:${boundPort}/`,\n close: async () => {\n await close();\n await new Promise<void>((resolve) => server.close(() => resolve()));\n },\n };\n};\n"]}
@@ -0,0 +1,30 @@
1
+ import type { ConfigLoader } from './load_config.js';
2
+ /** The module whose exports name the project's packs: its source index, else its manifest's root entry. */
3
+ export declare const packEntry: (projectDir: string) => string;
4
+ /** Structural, since a pack carries no brand: what `definePrimitivePack` returns. */
5
+ export declare const isPrimitivePack: (value: unknown) => boolean;
6
+ /** A pack a module exports, and where a config reaches it. */
7
+ export type PackImport = {
8
+ from: 'named';
9
+ name: string;
10
+ } | {
11
+ from: 'default';
12
+ }
13
+ /** A property of a default-exported object, as a CommonJS module exposes its packs. */
14
+ | {
15
+ from: 'defaultObject';
16
+ name: string;
17
+ };
18
+ /** Each distinct pack `namespace` exports, once, so an alias or a CommonJS mirror of a named export is not registered twice. */
19
+ export declare const packImports: (namespace: unknown) => PackImport[];
20
+ /** The config `init` writes: the packs `entry` exports, each under a local name no other import takes. */
21
+ export declare const initConfigSource: ({ entry, imports, title, }: {
22
+ entry: string;
23
+ imports: readonly PackImport[];
24
+ title?: string | undefined;
25
+ }) => string;
26
+ /** Writes a config into `projectDir` naming the packs its entry exports, `.ts` beside a `tsconfig.json` and `.js` otherwise, and returns its path. */
27
+ export declare const writeInitConfig: (projectDir: string, { loader }?: {
28
+ loader?: ConfigLoader | undefined;
29
+ }) => Promise<string>;
30
+ //# sourceMappingURL=init_config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init_config.d.ts","sourceRoot":"","sources":["../../src/node/init_config.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiDlD,2GAA2G;AAC3G,eAAO,MAAM,SAAS,GAAI,YAAY,MAAM,KAAG,MAY9C,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,OAKV,CAAC;AAYxC,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE;AACrB,uFAAuF;GACrF;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,gIAAgI;AAChI,eAAO,MAAM,WAAW,GAAI,WAAW,OAAO,KAAG,UAAU,EAwB1D,CAAC;AAOF,0GAA0G;AAC1G,eAAO,MAAM,gBAAgB,GAAI,4BAI9B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,KAAG,MAkDH,CAAC;AAEF,sJAAsJ;AACtJ,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,EAClB,aAAY;IAAE,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAAO,KACrD,OAAO,CAAC,MAAM,CA8BhB,CAAC"}
@@ -0,0 +1,158 @@
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 { existsSync, readFileSync, writeFileSync } from 'node:fs';
8
+ import { join, relative, sep } from 'node:path';
9
+ import { createStudioImporter, findDefaultConfig } from './load_config.js';
10
+ /** Tried before the manifest's entries, so a pack runs from source without a build. */
11
+ const SOURCE_ENTRIES = ['src/index', 'index'].flatMap((base) => ['tsx', 'ts', 'jsx', 'js'].map((extension) => `${base}.${extension}`));
12
+ const isRecord = (value) => typeof value === 'object' && value !== null;
13
+ const readManifest = (projectDir) => {
14
+ const path = join(projectDir, 'package.json');
15
+ if (!existsSync(path)) {
16
+ throw new Error(`No package.json in ${projectDir}: run init in a pack's package directory.`);
17
+ }
18
+ const manifest = JSON.parse(readFileSync(path, 'utf8'));
19
+ return isRecord(manifest) ? manifest : {};
20
+ };
21
+ /** Conditions `init` follows in a manifest's `exports`, nested ones included; `types` names no runnable file. */
22
+ const CONDITIONS = ['import', 'module', 'require', 'node', 'default'];
23
+ /** The file an `exports` value names for the package root. */
24
+ const exportTarget = (target) => {
25
+ if (typeof target === 'string') {
26
+ return target;
27
+ }
28
+ const candidates = Array.isArray(target)
29
+ ? target
30
+ : isRecord(target)
31
+ ? '.' in target
32
+ ? [target['.']]
33
+ : CONDITIONS.map((condition) => target[condition])
34
+ : [];
35
+ return candidates
36
+ .map(exportTarget)
37
+ .find((path) => path !== undefined);
38
+ };
39
+ /** The module whose exports name the project's packs: its source index, else its manifest's root entry. */
40
+ export const packEntry = (projectDir) => {
41
+ const { exports, module, main } = readManifest(projectDir);
42
+ const found = [...SOURCE_ENTRIES, exportTarget(exports), module, main]
43
+ .filter((path) => typeof path === 'string')
44
+ .map((path) => join(projectDir, path))
45
+ .find((path) => existsSync(path));
46
+ if (found === undefined) {
47
+ throw new Error(`No pack entry in ${projectDir}: add src/index.ts, or point package.json "main" at the module that exports the pack.`);
48
+ }
49
+ return found;
50
+ };
51
+ /** Structural, since a pack carries no brand: what `definePrimitivePack` returns. */
52
+ export const isPrimitivePack = (value) => isRecord(value) &&
53
+ typeof value.id === 'string' &&
54
+ Array.isArray(value.primitives) &&
55
+ isRecord(value.types) &&
56
+ typeof value.types.has === 'function';
57
+ /** A single-quoted string literal. */
58
+ const quote = (value) => `'${value.replace(/[\\']/g, (char) => `\\${char}`).replace(/\n/g, '\\n')}'`;
59
+ /** `path` from `fromDir`, as an import specifier. */
60
+ const specifierFrom = (fromDir, path) => {
61
+ const inside = relative(fromDir, path).split(sep).join('/');
62
+ return inside.startsWith('.') ? inside : `./${inside}`;
63
+ };
64
+ /** Each distinct pack `namespace` exports, once, so an alias or a CommonJS mirror of a named export is not registered twice. */
65
+ export const packImports = (namespace) => {
66
+ const exports = isRecord(namespace) ? namespace : {};
67
+ const { default: fallback } = exports;
68
+ const seen = new Set();
69
+ const found = [];
70
+ const take = (value, pack) => {
71
+ if (isPrimitivePack(value) && !seen.has(value)) {
72
+ seen.add(value);
73
+ found.push(pack);
74
+ }
75
+ };
76
+ Object.entries(exports).forEach(([name, value]) => {
77
+ if (name !== 'default') {
78
+ take(value, { from: 'named', name });
79
+ }
80
+ });
81
+ if (isPrimitivePack(fallback)) {
82
+ take(fallback, { from: 'default' });
83
+ }
84
+ else if (isRecord(fallback)) {
85
+ Object.entries(fallback).forEach(([name, value]) => take(value, { from: 'defaultObject', name }));
86
+ }
87
+ return found;
88
+ };
89
+ /** The names the config's own imports take. */
90
+ const HELPERS = ['createIsomerRuntime', 'defineStudioConfig'];
91
+ const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
92
+ /** The config `init` writes: the packs `entry` exports, each under a local name no other import takes. */
93
+ export const initConfigSource = ({ entry, imports, title, }) => {
94
+ const taken = new Set(HELPERS);
95
+ const local = (wanted) => {
96
+ let name = wanted;
97
+ for (let suffix = 2; taken.has(name); suffix += 1) {
98
+ name = `${wanted}${suffix}`;
99
+ }
100
+ taken.add(name);
101
+ return name;
102
+ };
103
+ // Named packs keep their own names where they can, so they are claimed first.
104
+ const named = new Map(imports.flatMap((pack) => pack.from === 'named' ? [[pack.name, local(pack.name)]] : []));
105
+ const defaultName = local(imports.some(({ from }) => from === 'default') ? 'pack' : 'entry');
106
+ const packs = imports.map((pack) => {
107
+ switch (pack.from) {
108
+ case 'named':
109
+ return named.get(pack.name);
110
+ case 'default':
111
+ return defaultName;
112
+ case 'defaultObject':
113
+ return IDENTIFIER.test(pack.name)
114
+ ? `${defaultName}.${pack.name}`
115
+ : `${defaultName}[${quote(pack.name)}]`;
116
+ }
117
+ });
118
+ const specifiers = [...named].map(([name, as]) => name === as ? name : `${name} as ${as}`);
119
+ const bindings = [
120
+ ...(imports.some(({ from }) => from !== 'named') ? [defaultName] : []),
121
+ ...(specifiers.length ? [`{ ${specifiers.join(', ')} }`] : []),
122
+ ];
123
+ return [
124
+ "import { createIsomerRuntime } from '@elastic/isomer-runtime';",
125
+ "import { defineStudioConfig } from '@elastic/isomer-studio';",
126
+ '',
127
+ `import ${bindings.join(', ')} from ${quote(entry)};`,
128
+ '',
129
+ 'export default defineStudioConfig({',
130
+ ...(title === undefined ? [] : [` title: ${quote(title)},`]),
131
+ ` runtime: createIsomerRuntime({ packs: [${packs.join(', ')}] }),`,
132
+ '});',
133
+ '',
134
+ ].join('\n');
135
+ };
136
+ /** Writes a config into `projectDir` naming the packs its entry exports, `.ts` beside a `tsconfig.json` and `.js` otherwise, and returns its path. */
137
+ export const writeInitConfig = async (projectDir, { loader } = {}) => {
138
+ const existing = findDefaultConfig(projectDir);
139
+ if (existing !== undefined) {
140
+ throw new Error(`${existing} already exists.`);
141
+ }
142
+ const entry = packEntry(projectDir);
143
+ const imports = packImports(await createStudioImporter(entry, { loader })(entry));
144
+ if (!imports.length) {
145
+ throw new Error(`${specifierFrom(projectDir, entry)} exports no primitive pack.`);
146
+ }
147
+ const typed = existsSync(join(projectDir, 'tsconfig.json'));
148
+ const specifier = specifierFrom(projectDir, entry);
149
+ const configPath = join(projectDir, typed ? 'isomer-studio.config.ts' : 'isomer-studio.config.js');
150
+ const { name } = readManifest(projectDir);
151
+ writeFileSync(configPath, initConfigSource({
152
+ entry: typed ? specifier.replace(/\.tsx?$/, '') : specifier,
153
+ imports,
154
+ title: typeof name === 'string' ? name : undefined,
155
+ }));
156
+ return configPath;
157
+ };
158
+ //# sourceMappingURL=init_config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init_config.js","sourceRoot":"","sources":["../../src/node/init_config.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 { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\n\nimport type { ConfigLoader } from './load_config';\nimport { createStudioImporter, findDefaultConfig } from './load_config';\n\n/** Tried before the manifest's entries, so a pack runs from source without a build. */\nconst SOURCE_ENTRIES = ['src/index', 'index'].flatMap((base) =>\n ['tsx', 'ts', 'jsx', 'js'].map((extension) => `${base}.${extension}`)\n);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\ninterface Manifest {\n name?: unknown;\n exports?: unknown;\n module?: unknown;\n main?: unknown;\n}\n\nconst readManifest = (projectDir: string): Manifest => {\n const path = join(projectDir, 'package.json');\n if (!existsSync(path)) {\n throw new Error(\n `No package.json in ${projectDir}: run init in a pack's package directory.`\n );\n }\n const manifest: unknown = JSON.parse(readFileSync(path, 'utf8'));\n return isRecord(manifest) ? manifest : {};\n};\n\n/** Conditions `init` follows in a manifest's `exports`, nested ones included; `types` names no runnable file. */\nconst CONDITIONS = ['import', 'module', 'require', 'node', 'default'] as const;\n\n/** The file an `exports` value names for the package root. */\nconst exportTarget = (target: unknown): string | undefined => {\n if (typeof target === 'string') {\n return target;\n }\n const candidates = Array.isArray(target)\n ? target\n : isRecord(target)\n ? '.' in target\n ? [target['.']]\n : CONDITIONS.map((condition) => target[condition])\n : [];\n return candidates\n .map(exportTarget)\n .find((path): path is string => path !== undefined);\n};\n\n/** The module whose exports name the project's packs: its source index, else its manifest's root entry. */\nexport const packEntry = (projectDir: string): string => {\n const { exports, module, main } = readManifest(projectDir);\n const found = [...SOURCE_ENTRIES, exportTarget(exports), module, main]\n .filter((path): path is string => typeof path === 'string')\n .map((path) => join(projectDir, path))\n .find((path) => existsSync(path));\n if (found === undefined) {\n throw new Error(\n `No pack entry in ${projectDir}: add src/index.ts, or point package.json \"main\" at the module that exports the pack.`\n );\n }\n return found;\n};\n\n/** Structural, since a pack carries no brand: what `definePrimitivePack` returns. */\nexport const isPrimitivePack = (value: unknown): boolean =>\n isRecord(value) &&\n typeof value.id === 'string' &&\n Array.isArray(value.primitives) &&\n isRecord(value.types) &&\n typeof value.types.has === 'function';\n\n/** A single-quoted string literal. */\nconst quote = (value: string): string =>\n `'${value.replace(/[\\\\']/g, (char) => `\\\\${char}`).replace(/\\n/g, '\\\\n')}'`;\n\n/** `path` from `fromDir`, as an import specifier. */\nconst specifierFrom = (fromDir: string, path: string): string => {\n const inside = relative(fromDir, path).split(sep).join('/');\n return inside.startsWith('.') ? inside : `./${inside}`;\n};\n\n/** A pack a module exports, and where a config reaches it. */\nexport type PackImport =\n | { from: 'named'; name: string }\n | { from: 'default' }\n /** A property of a default-exported object, as a CommonJS module exposes its packs. */\n | { from: 'defaultObject'; name: string };\n\n/** Each distinct pack `namespace` exports, once, so an alias or a CommonJS mirror of a named export is not registered twice. */\nexport const packImports = (namespace: unknown): PackImport[] => {\n const exports = isRecord(namespace) ? namespace : {};\n const { default: fallback } = exports;\n const seen = new Set<unknown>();\n const found: PackImport[] = [];\n const take = (value: unknown, pack: PackImport) => {\n if (isPrimitivePack(value) && !seen.has(value)) {\n seen.add(value);\n found.push(pack);\n }\n };\n Object.entries(exports).forEach(([name, value]) => {\n if (name !== 'default') {\n take(value, { from: 'named', name });\n }\n });\n if (isPrimitivePack(fallback)) {\n take(fallback, { from: 'default' });\n } else if (isRecord(fallback)) {\n Object.entries(fallback).forEach(([name, value]) =>\n take(value, { from: 'defaultObject', name })\n );\n }\n return found;\n};\n\n/** The names the config's own imports take. */\nconst HELPERS = ['createIsomerRuntime', 'defineStudioConfig'];\n\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\n\n/** The config `init` writes: the packs `entry` exports, each under a local name no other import takes. */\nexport const initConfigSource = ({\n entry,\n imports,\n title,\n}: {\n entry: string;\n imports: readonly PackImport[];\n title?: string | undefined;\n}): string => {\n const taken = new Set(HELPERS);\n const local = (wanted: string): string => {\n let name = wanted;\n for (let suffix = 2; taken.has(name); suffix += 1) {\n name = `${wanted}${suffix}`;\n }\n taken.add(name);\n return name;\n };\n // Named packs keep their own names where they can, so they are claimed first.\n const named = new Map(\n imports.flatMap((pack) =>\n pack.from === 'named' ? [[pack.name, local(pack.name)] as const] : []\n )\n );\n const defaultName = local(\n imports.some(({ from }) => from === 'default') ? 'pack' : 'entry'\n );\n const packs = imports.map((pack) => {\n switch (pack.from) {\n case 'named':\n return named.get(pack.name);\n case 'default':\n return defaultName;\n case 'defaultObject':\n return IDENTIFIER.test(pack.name)\n ? `${defaultName}.${pack.name}`\n : `${defaultName}[${quote(pack.name)}]`;\n }\n });\n const specifiers = [...named].map(([name, as]) =>\n name === as ? name : `${name} as ${as}`\n );\n const bindings = [\n ...(imports.some(({ from }) => from !== 'named') ? [defaultName] : []),\n ...(specifiers.length ? [`{ ${specifiers.join(', ')} }`] : []),\n ];\n return [\n \"import { createIsomerRuntime } from '@elastic/isomer-runtime';\",\n \"import { defineStudioConfig } from '@elastic/isomer-studio';\",\n '',\n `import ${bindings.join(', ')} from ${quote(entry)};`,\n '',\n 'export default defineStudioConfig({',\n ...(title === undefined ? [] : [` title: ${quote(title)},`]),\n ` runtime: createIsomerRuntime({ packs: [${packs.join(', ')}] }),`,\n '});',\n '',\n ].join('\\n');\n};\n\n/** Writes a config into `projectDir` naming the packs its entry exports, `.ts` beside a `tsconfig.json` and `.js` otherwise, and returns its path. */\nexport const writeInitConfig = async (\n projectDir: string,\n { loader }: { loader?: ConfigLoader | undefined } = {}\n): Promise<string> => {\n const existing = findDefaultConfig(projectDir);\n if (existing !== undefined) {\n throw new Error(`${existing} already exists.`);\n }\n const entry = packEntry(projectDir);\n const imports = packImports(\n await createStudioImporter(entry, { loader })(entry)\n );\n if (!imports.length) {\n throw new Error(\n `${specifierFrom(projectDir, entry)} exports no primitive pack.`\n );\n }\n const typed = existsSync(join(projectDir, 'tsconfig.json'));\n const specifier = specifierFrom(projectDir, entry);\n const configPath = join(\n projectDir,\n typed ? 'isomer-studio.config.ts' : 'isomer-studio.config.js'\n );\n const { name } = readManifest(projectDir);\n writeFileSync(\n configPath,\n initConfigSource({\n entry: typed ? specifier.replace(/\\.tsx?$/, '') : specifier,\n imports,\n title: typeof name === 'string' ? name : undefined,\n })\n );\n return configPath;\n};\n"]}
@@ -0,0 +1,34 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { StudioConfig } from '../config.js';
3
+ export type ConfigLoader = 'none' | 'tsx';
4
+ export declare const DEFAULT_CONFIG_NAMES: readonly ["isomer-studio.config.ts", "isomer-studio.config.tsx", "isomer-studio.config.js"];
5
+ /** The first default config name that exists in `cwd`. */
6
+ export declare const findDefaultConfig: (cwd: string) => string | undefined;
7
+ /** `config` against `cwd`, or the first default name that exists there. */
8
+ export declare const resolveConfigPath: (cwd: string, config?: string) => string;
9
+ /** Throws unless the config resolves React 18, which EUI needs, and `@elastic/isomer-runtime` resolves the same copy. */
10
+ export declare const assertSingleReact: (configPath: string) => void;
11
+ /** Throws when the config would load a different EUI or Emotion from the Studio's, which its apps share; one it cannot resolve at all is fine. */
12
+ export declare const assertSingleEui: (configPath: string, studioDir?: string) => void;
13
+ /** The `tsconfig.json` nearest the config, which `tsx` applies to the files it includes. */
14
+ export declare const nearestTsconfig: (configPath: string) => string | undefined;
15
+ /** The Studio config a module namespace default-exports, or an error naming `configPath`. */
16
+ export declare const studioConfigFrom: (namespace: unknown, configPath: string) => StudioConfig;
17
+ /** Applies the Studio's module resolution to every later `import` in this process; a process serves one project. */
18
+ export declare const registerProjectResolution: (configPath: string) => void;
19
+ export type StudioModuleImporter = (path: string) => Promise<unknown>;
20
+ /**
21
+ * Imports the config and the modules it names into one module graph, compiled with the config's nearest `tsconfig.json`.
22
+ * Each `tsx` namespace is a separate graph, so a package both import would otherwise load twice.
23
+ */
24
+ export declare const createStudioImporter: (configPath: string, { loader }?: {
25
+ loader?: ConfigLoader | undefined;
26
+ }) => StudioModuleImporter;
27
+ /** Imports the config's default export in Node; `tsx` compiles TypeScript and leaves resolution to Node. */
28
+ export declare const loadStudioConfig: (configPath: string, { loader, importModule, }?: {
29
+ loader?: ConfigLoader | undefined;
30
+ importModule?: StudioModuleImporter | undefined;
31
+ }) => Promise<StudioConfig>;
32
+ /** `react-dom/server`'s `renderToString`, from the config's own React. */
33
+ export declare const loadRenderToString: (configPath: string) => ((node: ReactNode) => string);
34
+ //# sourceMappingURL=load_config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load_config.d.ts","sourceRoot":"","sources":["../../src/node/load_config.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAS9C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC;AAE1C,eAAO,MAAM,oBAAoB,6FAIvB,CAAC;AAEX,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAGtD,CAAC;AAEJ,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,SAAS,MAAM,KAAG,MAehE,CAAC;AAmCF,yHAAyH;AACzH,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,KAAG,IA2BtD,CAAC;AAoCF,kJAAkJ;AAClJ,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,EAClB,YAAW,MAAoB,KAC9B,IAyBF,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,KAAG,MAAM,GAAG,SAU7D,CAAC;AAwBF,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,GAC3B,WAAW,OAAO,EAClB,YAAY,MAAM,KACjB,YAgCF,CAAC;AAIF,oHAAoH;AACpH,eAAO,MAAM,yBAAyB,GAAI,YAAY,MAAM,KAAG,IAyB9D,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,EAClB,aAAoB;IAAE,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAAO,KAC7D,oBASF,CAAC;AAEF,4GAA4G;AAC5G,eAAO,MAAM,gBAAgB,GAC3B,YAAY,MAAM,EAClB,4BAGG;IACD,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,YAAY,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC5C,KACL,OAAO,CAAC,YAAY,CAGtB,CAAC;AAMF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,KACjB,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAO9B,CAAC"}