@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,90 @@
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 { cpSync, existsSync, mkdirSync, readdirSync, rmSync, writeFileSync, } from 'node:fs';
8
+ import { join, relative, resolve, sep } from 'node:path';
9
+ import { build } from 'esbuild';
10
+ import { composeExample, composeOf } from '../model/compose_example.js';
11
+ import { compositionKey } from '../model/composition_key.js';
12
+ import { readExamples } from '../model/read_examples.js';
13
+ import { APP_DIR, appBuildOptions, appStylesheets, renderIndexHtml, } from './app_bundle.js';
14
+ import { createStudioImporter, loadStudioConfig } from './load_config.js';
15
+ import { createRasterizer, imageFontsOf } from './rasterize.js';
16
+ const THEMES = ['light', 'dark'];
17
+ /** Rasterizes every example in both themes into `dir`, keyed by `compositionKey`, plus `manifest.json`. */
18
+ export const prerenderPngs = async (config, rasterize, dir) => {
19
+ const { runtime } = config;
20
+ const compose = composeOf(config);
21
+ mkdirSync(dir, { recursive: true });
22
+ const manifest = { version: 1, entries: {} };
23
+ const failures = [];
24
+ for (const definition of runtime.primitives) {
25
+ for (const { name: example, node } of readExamples(definition)) {
26
+ for (const theme of THEMES) {
27
+ try {
28
+ const composition = composeExample(compose, [node], theme);
29
+ const key = compositionKey(composition);
30
+ if (manifest.entries[key]) {
31
+ continue;
32
+ }
33
+ const file = `${key}.png`;
34
+ writeFileSync(join(dir, file), await rasterize(composition));
35
+ manifest.entries[key] = {
36
+ file,
37
+ primitive: definition.type,
38
+ example,
39
+ theme,
40
+ };
41
+ }
42
+ catch (error) {
43
+ failures.push(`${definition.type} › ${example} (${theme}): ${error instanceof Error ? error.message : String(error)}`);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ writeFileSync(join(dir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`);
49
+ return { manifest, failures };
50
+ };
51
+ /** Written into every build, so a later build only clears a directory a Studio build made. */
52
+ export const BUILD_MARKER = '.isomer-studio-build';
53
+ /** Clears `out` for a new build, refusing a non-empty directory that is not a previous build. */
54
+ export const prepareOut = (out) => {
55
+ if (existsSync(out) &&
56
+ readdirSync(out).length > 0 &&
57
+ !existsSync(join(out, BUILD_MARKER))) {
58
+ throw new Error(`${out} is not empty and holds no Studio build; pick another --out.`);
59
+ }
60
+ rmSync(out, { force: true, recursive: true });
61
+ mkdirSync(out, { recursive: true });
62
+ writeFileSync(join(out, BUILD_MARKER), '');
63
+ };
64
+ /** Writes the static Studio for `configPath` to `out`: the prebuilt assets, `app.js`, and the PNG manifest. */
65
+ export const buildSite = async ({ configPath, out, base, loader, }) => {
66
+ const importModule = createStudioImporter(configPath, { loader });
67
+ const config = await loadStudioConfig(configPath, { importModule });
68
+ prepareOut(out);
69
+ cpSync(APP_DIR, out, { recursive: true });
70
+ const { metafile } = await build({
71
+ ...appBuildOptions({ configPath, assetsDir: join(out, 'assets') }),
72
+ metafile: true,
73
+ });
74
+ const { bundle, chunks } = appStylesheets(metafile);
75
+ chunks.forEach((chunk) => rmSync(resolve(chunk)));
76
+ writeFileSync(join(out, 'index.html'), renderIndexHtml({
77
+ base,
78
+ title: config.title,
79
+ stylesheets: bundle === undefined
80
+ ? []
81
+ : [relative(out, resolve(bundle)).split(sep).join('/')],
82
+ }));
83
+ const rasterize = createRasterizer(config.runtime, imageFontsOf(config, configPath, importModule));
84
+ if (!rasterize) {
85
+ return { pngs: 0, failures: [] };
86
+ }
87
+ const { manifest, failures } = await prerenderPngs(config, rasterize, join(out, 'png'));
88
+ return { pngs: Object.keys(manifest.entries).length, failures };
89
+ };
90
+ //# sourceMappingURL=build_site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_site.js","sourceRoot":"","sources":["../../src/node/build_site.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,MAAM,EACN,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EACL,OAAO,EACP,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,MAAM,GAA2B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAQzD,2GAA2G;AAC3G,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,MAAoB,EACpB,SAAyB,EACzB,GAAW,EACe,EAAE;IAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAgB,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;oBAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;oBACxC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1B,SAAS;oBACX,CAAC;oBACD,MAAM,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;oBAC1B,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC7D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG;wBACtB,IAAI;wBACJ,SAAS,EAAE,UAAU,CAAC,IAAI;wBAC1B,OAAO;wBACP,KAAK;qBACN,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CAAC,IAAI,CACX,GAAG,UAAU,CAAC,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxG,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC1B,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACzC,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAEnD,iGAAiG;AACjG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAQ,EAAE;IAC9C,IACE,UAAU,CAAC,GAAG,CAAC;QACf,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;QAC3B,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,EACpC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,8DAA8D,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC;AAcF,+GAA+G;AAC/G,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,EAC9B,UAAU,EACV,GAAG,EACH,IAAI,EACJ,MAAM,GACW,EAA4B,EAAE;IAC/C,MAAM,YAAY,GAAG,oBAAoB,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,KAAK,CAAC;QAC/B,GAAG,eAAe,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClE,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClD,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EACvB,eAAe,CAAC;QACd,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EACT,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAC5D,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAAG,gBAAgB,CAChC,MAAM,CAAC,OAAO,EACd,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAC/C,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,aAAa,CAChD,MAAM,EACN,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CACjB,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClE,CAAC,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport {\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join, relative, resolve, sep } from 'node:path';\n\nimport { build } from 'esbuild';\n\nimport type { StudioConfig, StudioTheme } from '../config';\nimport { composeExample, composeOf } from '../model/compose_example';\nimport { compositionKey } from '../model/composition_key';\nimport type { PngManifest } from '../model/png_manifest';\nimport { readExamples } from '../model/read_examples';\n\nimport {\n APP_DIR,\n appBuildOptions,\n appStylesheets,\n renderIndexHtml,\n} from './app_bundle';\nimport type { ConfigLoader } from './load_config';\nimport { createStudioImporter, loadStudioConfig } from './load_config';\nimport type { NodeRasterizer } from './rasterize';\nimport { createRasterizer, imageFontsOf } from './rasterize';\n\nconst THEMES: readonly StudioTheme[] = ['light', 'dark'];\n\nexport interface PrerenderResult {\n manifest: PngManifest;\n /** Examples that could not be rasterized, as `primitive › example (theme): message`. */\n failures: string[];\n}\n\n/** Rasterizes every example in both themes into `dir`, keyed by `compositionKey`, plus `manifest.json`. */\nexport const prerenderPngs = async (\n config: StudioConfig,\n rasterize: NodeRasterizer,\n dir: string\n): Promise<PrerenderResult> => {\n const { runtime } = config;\n const compose = composeOf(config);\n mkdirSync(dir, { recursive: true });\n const manifest: PngManifest = { version: 1, entries: {} };\n const failures: string[] = [];\n\n for (const definition of runtime.primitives) {\n for (const { name: example, node } of readExamples(definition)) {\n for (const theme of THEMES) {\n try {\n const composition = composeExample(compose, [node], theme);\n const key = compositionKey(composition);\n if (manifest.entries[key]) {\n continue;\n }\n const file = `${key}.png`;\n writeFileSync(join(dir, file), await rasterize(composition));\n manifest.entries[key] = {\n file,\n primitive: definition.type,\n example,\n theme,\n };\n } catch (error) {\n failures.push(\n `${definition.type} › ${example} (${theme}): ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n }\n\n writeFileSync(\n join(dir, 'manifest.json'),\n `${JSON.stringify(manifest, null, 2)}\\n`\n );\n return { manifest, failures };\n};\n\n/** Written into every build, so a later build only clears a directory a Studio build made. */\nexport const BUILD_MARKER = '.isomer-studio-build';\n\n/** Clears `out` for a new build, refusing a non-empty directory that is not a previous build. */\nexport const prepareOut = (out: string): void => {\n if (\n existsSync(out) &&\n readdirSync(out).length > 0 &&\n !existsSync(join(out, BUILD_MARKER))\n ) {\n throw new Error(\n `${out} is not empty and holds no Studio build; pick another --out.`\n );\n }\n rmSync(out, { force: true, recursive: true });\n mkdirSync(out, { recursive: true });\n writeFileSync(join(out, BUILD_MARKER), '');\n};\n\nexport interface BuildSiteOptions {\n configPath: string;\n out: string;\n base: string;\n loader?: ConfigLoader | undefined;\n}\n\nexport interface BuildSiteResult {\n pngs: number;\n failures: string[];\n}\n\n/** Writes the static Studio for `configPath` to `out`: the prebuilt assets, `app.js`, and the PNG manifest. */\nexport const buildSite = async ({\n configPath,\n out,\n base,\n loader,\n}: BuildSiteOptions): Promise<BuildSiteResult> => {\n const importModule = createStudioImporter(configPath, { loader });\n const config = await loadStudioConfig(configPath, { importModule });\n prepareOut(out);\n cpSync(APP_DIR, out, { recursive: true });\n const { metafile } = await build({\n ...appBuildOptions({ configPath, assetsDir: join(out, 'assets') }),\n metafile: true,\n });\n const { bundle, chunks } = appStylesheets(metafile);\n chunks.forEach((chunk) => rmSync(resolve(chunk)));\n writeFileSync(\n join(out, 'index.html'),\n renderIndexHtml({\n base,\n title: config.title,\n stylesheets:\n bundle === undefined\n ? []\n : [relative(out, resolve(bundle)).split(sep).join('/')],\n })\n );\n\n const rasterize = createRasterizer(\n config.runtime,\n imageFontsOf(config, configPath, importModule)\n );\n if (!rasterize) {\n return { pngs: 0, failures: [] };\n }\n const { manifest, failures } = await prerenderPngs(\n config,\n rasterize,\n join(out, 'png')\n );\n return { pngs: Object.keys(manifest.entries).length, failures };\n};\n"]}
@@ -0,0 +1,40 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { Composition } from '@elastic/isomer-sdk';
3
+ import type { StudioConfig, StudioTheme } from '../config.js';
4
+ import type { StudioSurface } from '../model/describe_runtime.js';
5
+ export type CheckStatus = 'passed' | 'failed' | 'skipped';
6
+ /** What one result checked: a primitive's icon, an example's props, or one surface. */
7
+ export type CheckName = StudioSurface | 'icon' | 'png' | 'props';
8
+ export interface CheckResult {
9
+ /** A primitive's type, or `app:<id>` for a Studio app's checks. */
10
+ primitive: string;
11
+ /** Absent for checks on the primitive itself, such as `icon`. */
12
+ example?: string | undefined;
13
+ check: CheckName;
14
+ status: CheckStatus;
15
+ message?: string | undefined;
16
+ }
17
+ export interface CheckReport {
18
+ title: string;
19
+ /** How many apps the config lists; `check` never loads them. */
20
+ apps: number;
21
+ results: CheckResult[];
22
+ passed: number;
23
+ failed: number;
24
+ skipped: number;
25
+ }
26
+ export interface CheckOptions {
27
+ /** `react-dom/server`'s `renderToString`, from the config's React. */
28
+ renderToString: (node: ReactNode) => string;
29
+ /** Limits the surfaces rendered; defaults to every surface the runtime has. */
30
+ surfaces?: readonly StudioSurface[] | undefined;
31
+ /** Rasterizes each composition as the `png` check; absent skips it. */
32
+ rasterizePng?: ((composition: Composition) => Promise<unknown>) | undefined;
33
+ theme?: StudioTheme | undefined;
34
+ }
35
+ /**
36
+ * Validates and renders every example of every primitive, composed as the Studio composes it, on every surface
37
+ * the runtime has. Surfaces the runtime or a primitive lacks are skipped, not failed.
38
+ */
39
+ export declare const checkStudio: (config: StudioConfig, { renderToString, surfaces: only, rasterizePng, theme, }: CheckOptions) => Promise<CheckReport>;
40
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/node/check.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAEV,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAiB,WAAW,EAAE,MAAM,WAAW,CAAC;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAK/D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE1D,uFAAuF;AACvF,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC;IAC5C,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;IAChD,uEAAuE;IACvE,YAAY,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5E,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACjC;AA2FD;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,YAAY,EACpB,0DAKG,YAAY,KACd,OAAO,CAAC,WAAW,CAiGrB,CAAC"}
@@ -0,0 +1,162 @@
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 { formatValidationError } from '@elastic/isomer-sdk';
8
+ import { assertPackIconsValid } from '@elastic/isomer-sdk/testing';
9
+ import { composeExample, composeOf } from '../model/compose_example.js';
10
+ import { runtimeSurfaces } from '../model/describe_runtime.js';
11
+ import { readExamples } from '../model/read_examples.js';
12
+ import { slackLimitProblems } from '../model/slack_limits.js';
13
+ const PASSED = { status: 'passed' };
14
+ const describeError = (error) => error instanceof Error ? error.message : String(error);
15
+ const fromProblems = (problems) => problems.length ? { status: 'failed', message: problems.join('\n') } : PASSED;
16
+ const attempt = (check) => {
17
+ try {
18
+ return fromProblems(check());
19
+ }
20
+ catch (error) {
21
+ return { status: 'failed', message: describeError(error) };
22
+ }
23
+ };
24
+ const attemptAsync = async (check) => {
25
+ try {
26
+ await check();
27
+ return PASSED;
28
+ }
29
+ catch (error) {
30
+ return { status: 'failed', message: describeError(error) };
31
+ }
32
+ };
33
+ /** Renders `composition` on `surface`, returning what Slack would refuse; a render that throws fails. */
34
+ const renderSurface = (runtime, surface, composition, renderToString) => {
35
+ const { surfaces } = runtime;
36
+ switch (surface) {
37
+ case 'react':
38
+ renderToString(surfaces.react.render(composition, { wrapper: true }));
39
+ return [];
40
+ case 'html':
41
+ surfaces.html.render(composition);
42
+ return [];
43
+ case 'markdown':
44
+ surfaces.markdown.render(composition);
45
+ return [];
46
+ case 'text':
47
+ surfaces.text.render(composition);
48
+ return [];
49
+ case 'slack':
50
+ return slackLimitProblems(surfaces.slack.render(composition));
51
+ case 'snapshot':
52
+ surfaces.snapshot?.render(composition);
53
+ return [];
54
+ }
55
+ };
56
+ const iconOutcome = (pack, { type, icon }) => {
57
+ const found = pack.icons?.[type] ?? icon;
58
+ if (!found) {
59
+ return { status: 'failed', message: `\`${type}\` has no icon.` };
60
+ }
61
+ return attempt(() => {
62
+ assertPackIconsValid({ icons: { [type]: found }, primitives: [] });
63
+ return [];
64
+ });
65
+ };
66
+ const summarize = (title, apps, results) => {
67
+ const count = (status) => results.filter((result) => result.status === status).length;
68
+ return {
69
+ title,
70
+ apps,
71
+ results,
72
+ passed: count('passed'),
73
+ failed: count('failed'),
74
+ skipped: count('skipped'),
75
+ };
76
+ };
77
+ /**
78
+ * Validates and renders every example of every primitive, composed as the Studio composes it, on every surface
79
+ * the runtime has. Surfaces the runtime or a primitive lacks are skipped, not failed.
80
+ */
81
+ export const checkStudio = async (config, { renderToString, surfaces: only, rasterizePng, theme = 'light', }) => {
82
+ const { runtime, apps = [], title = 'Isomer Studio' } = config;
83
+ const compose = composeOf(config);
84
+ const { support } = runtime.getCapabilities();
85
+ const available = runtimeSurfaces(runtime);
86
+ const surfaces = only
87
+ ? only.filter((surface) => available.includes(surface))
88
+ : available;
89
+ const results = apps.flatMap(({ id, icon }) => icon
90
+ ? [
91
+ {
92
+ primitive: `app:${id}`,
93
+ check: 'icon',
94
+ ...attempt(() => {
95
+ assertPackIconsValid({ icons: { [id]: icon }, primitives: [] });
96
+ return [];
97
+ }),
98
+ },
99
+ ]
100
+ : []);
101
+ for (const pack of runtime.packs) {
102
+ for (const definition of pack.primitives) {
103
+ const { type: primitive } = definition;
104
+ results.push({
105
+ primitive,
106
+ check: 'icon',
107
+ ...iconOutcome(pack, definition),
108
+ });
109
+ for (const { name: example, node } of readExamples(definition)) {
110
+ const skipAll = (message) => [...surfaces, ...(rasterizePng ? ['png'] : [])].forEach((check) => results.push({
111
+ primitive,
112
+ example,
113
+ check,
114
+ status: 'skipped',
115
+ message,
116
+ }));
117
+ let composition;
118
+ try {
119
+ composition = composeExample(compose, [node], theme);
120
+ }
121
+ catch (error) {
122
+ results.push({
123
+ primitive,
124
+ example,
125
+ check: 'props',
126
+ status: 'failed',
127
+ message: `\`compose\` threw: ${describeError(error)}`,
128
+ });
129
+ skipAll('The example could not be composed.');
130
+ continue;
131
+ }
132
+ const validation = runtime.validate(composition);
133
+ const props = fromProblems(validation.errors.map(formatValidationError));
134
+ results.push({ primitive, example, check: 'props', ...props });
135
+ if (props.status === 'failed') {
136
+ skipAll('The composition is invalid.');
137
+ continue;
138
+ }
139
+ for (const surface of surfaces) {
140
+ const outcome = support[primitive]?.[surface] === 'native'
141
+ ? attempt(() => renderSurface(runtime, surface, composition, renderToString))
142
+ : {
143
+ status: 'skipped',
144
+ message: `\`${primitive}\` has no ${surface} renderer.`,
145
+ };
146
+ results.push({ primitive, example, check: surface, ...outcome });
147
+ }
148
+ if (rasterizePng) {
149
+ const outcome = available.includes('snapshot')
150
+ ? await attemptAsync(() => rasterizePng(composition))
151
+ : {
152
+ status: 'skipped',
153
+ message: 'The runtime has no snapshot surface.',
154
+ };
155
+ results.push({ primitive, example, check: 'png', ...outcome });
156
+ }
157
+ }
158
+ }
159
+ }
160
+ return summarize(title, apps.length, results);
161
+ };
162
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/node/check.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { ReactNode } from 'react';\nimport type {\n AnyPrimitiveDefinition,\n Composition,\n PrimitivePack,\n} from '@elastic/isomer-sdk';\nimport { formatValidationError } from '@elastic/isomer-sdk';\nimport { assertPackIconsValid } from '@elastic/isomer-sdk/testing';\n\nimport type { StudioConfig, StudioRuntime, StudioTheme } from '../config';\nimport { composeExample, composeOf } from '../model/compose_example';\nimport type { StudioSurface } from '../model/describe_runtime';\nimport { runtimeSurfaces } from '../model/describe_runtime';\nimport { readExamples } from '../model/read_examples';\nimport { slackLimitProblems } from '../model/slack_limits';\n\nexport type CheckStatus = 'passed' | 'failed' | 'skipped';\n\n/** What one result checked: a primitive's icon, an example's props, or one surface. */\nexport type CheckName = StudioSurface | 'icon' | 'png' | 'props';\n\nexport interface CheckResult {\n /** A primitive's type, or `app:<id>` for a Studio app's checks. */\n primitive: string;\n /** Absent for checks on the primitive itself, such as `icon`. */\n example?: string | undefined;\n check: CheckName;\n status: CheckStatus;\n message?: string | undefined;\n}\n\nexport interface CheckReport {\n title: string;\n /** How many apps the config lists; `check` never loads them. */\n apps: number;\n results: CheckResult[];\n passed: number;\n failed: number;\n skipped: number;\n}\n\nexport interface CheckOptions {\n /** `react-dom/server`'s `renderToString`, from the config's React. */\n renderToString: (node: ReactNode) => string;\n /** Limits the surfaces rendered; defaults to every surface the runtime has. */\n surfaces?: readonly StudioSurface[] | undefined;\n /** Rasterizes each composition as the `png` check; absent skips it. */\n rasterizePng?: ((composition: Composition) => Promise<unknown>) | undefined;\n theme?: StudioTheme | undefined;\n}\n\ntype Outcome = Pick<CheckResult, 'message' | 'status'>;\n\nconst PASSED: Outcome = { status: 'passed' };\n\nconst describeError = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst fromProblems = (problems: readonly string[]): Outcome =>\n problems.length ? { status: 'failed', message: problems.join('\\n') } : PASSED;\n\nconst attempt = (check: () => readonly string[]): Outcome => {\n try {\n return fromProblems(check());\n } catch (error) {\n return { status: 'failed', message: describeError(error) };\n }\n};\n\nconst attemptAsync = async (\n check: () => Promise<unknown>\n): Promise<Outcome> => {\n try {\n await check();\n return PASSED;\n } catch (error) {\n return { status: 'failed', message: describeError(error) };\n }\n};\n\n/** Renders `composition` on `surface`, returning what Slack would refuse; a render that throws fails. */\nconst renderSurface = (\n runtime: StudioRuntime,\n surface: StudioSurface,\n composition: Composition,\n renderToString: CheckOptions['renderToString']\n): readonly string[] => {\n const { surfaces } = runtime;\n switch (surface) {\n case 'react':\n renderToString(surfaces.react.render(composition, { wrapper: true }));\n return [];\n case 'html':\n surfaces.html.render(composition);\n return [];\n case 'markdown':\n surfaces.markdown.render(composition);\n return [];\n case 'text':\n surfaces.text.render(composition);\n return [];\n case 'slack':\n return slackLimitProblems(surfaces.slack.render(composition));\n case 'snapshot':\n surfaces.snapshot?.render(composition);\n return [];\n }\n};\n\nconst iconOutcome = (\n pack: PrimitivePack<never>,\n { type, icon }: AnyPrimitiveDefinition\n): Outcome => {\n const found = pack.icons?.[type] ?? icon;\n if (!found) {\n return { status: 'failed', message: `\\`${type}\\` has no icon.` };\n }\n return attempt(() => {\n assertPackIconsValid({ icons: { [type]: found }, primitives: [] });\n return [];\n });\n};\n\nconst summarize = (\n title: string,\n apps: number,\n results: CheckResult[]\n): CheckReport => {\n const count = (status: CheckStatus) =>\n results.filter((result) => result.status === status).length;\n return {\n title,\n apps,\n results,\n passed: count('passed'),\n failed: count('failed'),\n skipped: count('skipped'),\n };\n};\n\n/**\n * Validates and renders every example of every primitive, composed as the Studio composes it, on every surface\n * the runtime has. Surfaces the runtime or a primitive lacks are skipped, not failed.\n */\nexport const checkStudio = async (\n config: StudioConfig,\n {\n renderToString,\n surfaces: only,\n rasterizePng,\n theme = 'light',\n }: CheckOptions\n): Promise<CheckReport> => {\n const { runtime, apps = [], title = 'Isomer Studio' } = config;\n const compose = composeOf(config);\n const { support } = runtime.getCapabilities();\n const available = runtimeSurfaces(runtime);\n const surfaces = only\n ? only.filter((surface) => available.includes(surface))\n : available;\n const results: CheckResult[] = apps.flatMap(({ id, icon }) =>\n icon\n ? [\n {\n primitive: `app:${id}`,\n check: 'icon' as const,\n ...attempt(() => {\n assertPackIconsValid({ icons: { [id]: icon }, primitives: [] });\n return [];\n }),\n },\n ]\n : []\n );\n\n for (const pack of runtime.packs) {\n for (const definition of pack.primitives) {\n const { type: primitive } = definition;\n results.push({\n primitive,\n check: 'icon',\n ...iconOutcome(pack, definition),\n });\n\n for (const { name: example, node } of readExamples(definition)) {\n const skipAll = (message: string) =>\n [...surfaces, ...(rasterizePng ? (['png'] as const) : [])].forEach(\n (check) =>\n results.push({\n primitive,\n example,\n check,\n status: 'skipped',\n message,\n })\n );\n\n let composition: Composition;\n try {\n composition = composeExample(compose, [node], theme);\n } catch (error) {\n results.push({\n primitive,\n example,\n check: 'props',\n status: 'failed',\n message: `\\`compose\\` threw: ${describeError(error)}`,\n });\n skipAll('The example could not be composed.');\n continue;\n }\n\n const validation = runtime.validate(composition);\n const props = fromProblems(\n validation.errors.map(formatValidationError)\n );\n results.push({ primitive, example, check: 'props', ...props });\n if (props.status === 'failed') {\n skipAll('The composition is invalid.');\n continue;\n }\n\n for (const surface of surfaces) {\n const outcome: Outcome =\n support[primitive]?.[surface] === 'native'\n ? attempt(() =>\n renderSurface(runtime, surface, composition, renderToString)\n )\n : {\n status: 'skipped',\n message: `\\`${primitive}\\` has no ${surface} renderer.`,\n };\n results.push({ primitive, example, check: surface, ...outcome });\n }\n\n if (rasterizePng) {\n const outcome: Outcome = available.includes('snapshot')\n ? await attemptAsync(() => rasterizePng(composition))\n : {\n status: 'skipped',\n message: 'The runtime has no snapshot surface.',\n };\n results.push({ primitive, example, check: 'png', ...outcome });\n }\n }\n }\n }\n\n return summarize(title, apps.length, results);\n};\n"]}
@@ -0,0 +1,21 @@
1
+ import type { Server } from 'node:http';
2
+ import type { EnvironmentModuleNode, InlineConfig, Plugin } from 'vite';
3
+ /** The URL the dev page loads the entry from. */
4
+ export declare const DEV_ENTRY_URL = "/@id/virtual:isomer-studio/app";
5
+ /** `modules` and every module that imports one of them, transitively. */
6
+ export declare const withImporters: <T extends {
7
+ importers: Iterable<T>;
8
+ }>(modules: Iterable<T>) => Set<T>;
9
+ /** Receives the server-side modules a change invalidates, when they include the config or a file it reloads with. */
10
+ export type ConfigChangeHandler = (stale: ReadonlySet<EnvironmentModuleNode>) => Promise<void>;
11
+ /** Vite's counterpart to the static build's `projectResolution`. */
12
+ export declare const projectResolutionPlugin: (configPath: string) => Plugin;
13
+ /** Vite options for `isomer-studio dev`: HMR over `server`, React Fast Refresh, and `onConfigChange` before the browser receives an update that re-runs the config. */
14
+ export declare const devViteConfig: ({ configPath, server, onConfigChange, reloadsWith, }: {
15
+ configPath: string;
16
+ server: Server;
17
+ onConfigChange: ConfigChangeHandler;
18
+ /** Server-side entries other than the config, such as its `imageFonts` module, whose changes also re-run it. */
19
+ reloadsWith?: (() => Iterable<string>) | undefined;
20
+ }) => InlineConfig;
21
+ //# sourceMappingURL=dev_bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_bundle.d.ts","sourceRoot":"","sources":["../../src/node/dev_bundle.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAIxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAmBxE,iDAAiD;AACjD,eAAO,MAAM,aAAa,mCAAkB,CAAC;AAE7C,yEAAyE;AACzE,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS;IAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;CAAE,EAChE,SAAS,QAAQ,CAAC,CAAC,CAAC,KACnB,GAAG,CAAC,CAAC,CAUP,CAAC;AAEF,qHAAqH;AACrH,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,WAAW,CAAC,qBAAqB,CAAC,KACtC,OAAO,CAAC,IAAI,CAAC,CAAC;AA4BnB,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM,KAAG,MAgC5D,CAAC;AAEF,uKAAuK;AACvK,eAAO,MAAM,aAAa,GAAI,sDAK3B;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;IACpC,gHAAgH;IAChH,WAAW,CAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;CACpD,KAAG,YAuCH,CAAC"}
@@ -0,0 +1,121 @@
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 { dirname, join } from 'node:path';
8
+ import react from '@vitejs/plugin-react';
9
+ import { normalizePath, searchForWorkspaceRoot } from 'vite';
10
+ import { appEntry, browserModule, PACKAGE_DIR, RUNS_FROM_SOURCE, } from './app_bundle.js';
11
+ import { installDirectory, isStudioSpecifier, projectDirectory, sharedResolveDir, } from './project_resolution.js';
12
+ const ENTRY = 'virtual:isomer-studio/app';
13
+ const RESOLVED_ENTRY = `\0${ENTRY}`;
14
+ /** The URL the dev page loads the entry from. */
15
+ export const DEV_ENTRY_URL = `/@id/${ENTRY}`;
16
+ /** `modules` and every module that imports one of them, transitively. */
17
+ export const withImporters = (modules) => {
18
+ const found = new Set();
19
+ const pending = [...modules];
20
+ for (let next = pending.pop(); next; next = pending.pop()) {
21
+ if (!found.has(next)) {
22
+ found.add(next);
23
+ pending.push(...next.importers);
24
+ }
25
+ }
26
+ return found;
27
+ };
28
+ const studioEntry = (configPath, onConfigChange, reloadsWith) => {
29
+ const configFile = normalizePath(configPath);
30
+ return {
31
+ name: 'isomer-studio-entry',
32
+ resolveId: (id) => (id === ENTRY ? RESOLVED_ENTRY : undefined),
33
+ load: (id) => id === RESOLVED_ENTRY ? appEntry(configPath, 'dev') : undefined,
34
+ hotUpdate: async function ({ modules }) {
35
+ if (this.environment.name !== 'ssr') {
36
+ return;
37
+ }
38
+ const stale = withImporters(modules);
39
+ const roots = new Set([configFile, ...reloadsWith()]);
40
+ if (![...stale].some(({ file }) => file !== null && roots.has(file))) {
41
+ return;
42
+ }
43
+ await onConfigChange(stale);
44
+ return [];
45
+ },
46
+ };
47
+ };
48
+ /** Vite's counterpart to the static build's `projectResolution`. */
49
+ export const projectResolutionPlugin = (configPath) => {
50
+ const projectDir = projectDirectory(configPath);
51
+ const parentIn = (dir) => join(dir, 'package.json');
52
+ return {
53
+ name: 'isomer-studio-project-resolution',
54
+ enforce: 'pre',
55
+ resolveId: async function (source, importer, options) {
56
+ const shared = sharedResolveDir(source, importer, projectDir);
57
+ if (shared !== undefined) {
58
+ const resolved = await this.resolve(source, parentIn(shared), {
59
+ ...options,
60
+ skipSelf: true,
61
+ });
62
+ if (resolved) {
63
+ return resolved;
64
+ }
65
+ }
66
+ if (!isStudioSpecifier(source)) {
67
+ return undefined;
68
+ }
69
+ return ((await this.resolve(source, importer, {
70
+ ...options,
71
+ skipSelf: true,
72
+ })) ??
73
+ this.resolve(source, parentIn(PACKAGE_DIR), {
74
+ ...options,
75
+ skipSelf: true,
76
+ }));
77
+ },
78
+ };
79
+ };
80
+ /** Vite options for `isomer-studio dev`: HMR over `server`, React Fast Refresh, and `onConfigChange` before the browser receives an update that re-runs the config. */
81
+ export const devViteConfig = ({ configPath, server, onConfigChange, reloadsWith = () => [], }) => {
82
+ const root = dirname(configPath);
83
+ return {
84
+ configFile: false,
85
+ root,
86
+ appType: 'custom',
87
+ clearScreen: false,
88
+ logLevel: 'info',
89
+ server: {
90
+ middlewareMode: true,
91
+ hmr: { server },
92
+ fs: {
93
+ allow: [
94
+ searchForWorkspaceRoot(root),
95
+ PACKAGE_DIR,
96
+ installDirectory(PACKAGE_DIR),
97
+ ],
98
+ },
99
+ },
100
+ resolve: { dedupe: ['react', 'react-dom'] },
101
+ define: { global: 'globalThis' },
102
+ // The dependency scanner crawls these when `optimizeDeps.entries` is unset; the virtual entry itself is not on disk.
103
+ build: {
104
+ rolldownOptions: {
105
+ input: [configPath, browserModule('mount'), browserModule('dev_host')],
106
+ },
107
+ },
108
+ optimizeDeps: {
109
+ // The scanner ignores tsconfig, so it misses the Emotion JSX runtime the Studio's own `.tsx` compiles to.
110
+ include: RUNS_FROM_SOURCE
111
+ ? ['@elastic/isomer-studio > @emotion/react/jsx-dev-runtime']
112
+ : [],
113
+ },
114
+ plugins: [
115
+ projectResolutionPlugin(configPath),
116
+ studioEntry(configPath, onConfigChange, reloadsWith),
117
+ react(),
118
+ ],
119
+ };
120
+ };
121
+ //# sourceMappingURL=dev_bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_bundle.js","sourceRoot":"","sources":["../../src/node/dev_bundle.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport type { Server } from 'node:http';\nimport { dirname, join } from 'node:path';\n\nimport react from '@vitejs/plugin-react';\nimport type { EnvironmentModuleNode, InlineConfig, Plugin } from 'vite';\nimport { normalizePath, searchForWorkspaceRoot } from 'vite';\n\nimport {\n appEntry,\n browserModule,\n PACKAGE_DIR,\n RUNS_FROM_SOURCE,\n} from './app_bundle';\nimport {\n installDirectory,\n isStudioSpecifier,\n projectDirectory,\n sharedResolveDir,\n} from './project_resolution';\n\nconst ENTRY = 'virtual:isomer-studio/app';\nconst RESOLVED_ENTRY = `\\0${ENTRY}`;\n\n/** The URL the dev page loads the entry from. */\nexport const DEV_ENTRY_URL = `/@id/${ENTRY}`;\n\n/** `modules` and every module that imports one of them, transitively. */\nexport const withImporters = <T extends { importers: Iterable<T> }>(\n modules: Iterable<T>\n): Set<T> => {\n const found = new Set<T>();\n const pending = [...modules];\n for (let next = pending.pop(); next; next = pending.pop()) {\n if (!found.has(next)) {\n found.add(next);\n pending.push(...next.importers);\n }\n }\n return found;\n};\n\n/** Receives the server-side modules a change invalidates, when they include the config or a file it reloads with. */\nexport type ConfigChangeHandler = (\n stale: ReadonlySet<EnvironmentModuleNode>\n) => Promise<void>;\n\nconst studioEntry = (\n configPath: string,\n onConfigChange: ConfigChangeHandler,\n reloadsWith: () => Iterable<string>\n): Plugin => {\n const configFile = normalizePath(configPath);\n return {\n name: 'isomer-studio-entry',\n resolveId: (id) => (id === ENTRY ? RESOLVED_ENTRY : undefined),\n load: (id) =>\n id === RESOLVED_ENTRY ? appEntry(configPath, 'dev') : undefined,\n hotUpdate: async function ({ modules }) {\n if (this.environment.name !== 'ssr') {\n return;\n }\n const stale = withImporters(modules);\n const roots = new Set([configFile, ...reloadsWith()]);\n if (![...stale].some(({ file }) => file !== null && roots.has(file))) {\n return;\n }\n await onConfigChange(stale);\n return [];\n },\n };\n};\n\n/** Vite's counterpart to the static build's `projectResolution`. */\nexport const projectResolutionPlugin = (configPath: string): Plugin => {\n const projectDir = projectDirectory(configPath);\n const parentIn = (dir: string) => join(dir, 'package.json');\n return {\n name: 'isomer-studio-project-resolution',\n enforce: 'pre',\n resolveId: async function (source, importer, options) {\n const shared = sharedResolveDir(source, importer, projectDir);\n if (shared !== undefined) {\n const resolved = await this.resolve(source, parentIn(shared), {\n ...options,\n skipSelf: true,\n });\n if (resolved) {\n return resolved;\n }\n }\n if (!isStudioSpecifier(source)) {\n return undefined;\n }\n return (\n (await this.resolve(source, importer, {\n ...options,\n skipSelf: true,\n })) ??\n this.resolve(source, parentIn(PACKAGE_DIR), {\n ...options,\n skipSelf: true,\n })\n );\n },\n };\n};\n\n/** Vite options for `isomer-studio dev`: HMR over `server`, React Fast Refresh, and `onConfigChange` before the browser receives an update that re-runs the config. */\nexport const devViteConfig = ({\n configPath,\n server,\n onConfigChange,\n reloadsWith = () => [],\n}: {\n configPath: string;\n server: Server;\n onConfigChange: ConfigChangeHandler;\n /** Server-side entries other than the config, such as its `imageFonts` module, whose changes also re-run it. */\n reloadsWith?: (() => Iterable<string>) | undefined;\n}): InlineConfig => {\n const root = dirname(configPath);\n return {\n configFile: false,\n root,\n appType: 'custom',\n clearScreen: false,\n logLevel: 'info',\n server: {\n middlewareMode: true,\n hmr: { server },\n fs: {\n allow: [\n searchForWorkspaceRoot(root),\n PACKAGE_DIR,\n installDirectory(PACKAGE_DIR),\n ],\n },\n },\n resolve: { dedupe: ['react', 'react-dom'] },\n define: { global: 'globalThis' },\n // The dependency scanner crawls these when `optimizeDeps.entries` is unset; the virtual entry itself is not on disk.\n build: {\n rolldownOptions: {\n input: [configPath, browserModule('mount'), browserModule('dev_host')],\n },\n },\n optimizeDeps: {\n // The scanner ignores tsconfig, so it misses the Emotion JSX runtime the Studio's own `.tsx` compiles to.\n include: RUNS_FROM_SOURCE\n ? ['@elastic/isomer-studio > @emotion/react/jsx-dev-runtime']\n : [],\n },\n plugins: [\n projectResolutionPlugin(configPath),\n studioEntry(configPath, onConfigChange, reloadsWith),\n react(),\n ],\n };\n};\n"]}
@@ -0,0 +1,16 @@
1
+ import type { ConfigLoader } from './load_config.js';
2
+ /** Whether a `Host` header names the loopback listener, which a DNS-rebinding page's own hostname does not. */
3
+ export declare const isLoopbackHost: (host: string | undefined) => boolean;
4
+ export interface DevServerOptions {
5
+ configPath: string;
6
+ port: number;
7
+ loader?: ConfigLoader | undefined;
8
+ log?: ((line: string) => void) | undefined;
9
+ }
10
+ export interface DevServer {
11
+ url: string;
12
+ close: () => Promise<void>;
13
+ }
14
+ /** Serves the Studio for `configPath` with hot updates, re-running the Node-side config whenever its modules change. */
15
+ export declare const startDevServer: ({ configPath: givenConfigPath, port, loader, log, }: DevServerOptions) => Promise<DevServer>;
16
+ //# sourceMappingURL=dev_server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev_server.d.ts","sourceRoot":"","sources":["../../src/node/dev_server.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAyDlD,+GAA+G;AAC/G,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,GAAG,SAAS,KAAG,OASzD,CAAC;AAyBF,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC5C;AAOD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wHAAwH;AACxH,eAAO,MAAM,cAAc,GAAU,qDAKlC,gBAAgB,KAAG,OAAO,CAAC,SAAS,CAiPtC,CAAC"}