@dxos/app-framework 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6

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 (505) hide show
  1. package/.storybook/main.mts +9 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/dist/lib/browser/capability-4NSF2SOO.mjs +38 -0
  5. package/dist/lib/browser/capability-4NSF2SOO.mjs.map +7 -0
  6. package/dist/lib/browser/capability-EB3UKSKA.mjs +35 -0
  7. package/dist/lib/browser/capability-EB3UKSKA.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-27FZETIA.mjs +950 -0
  9. package/dist/lib/browser/chunk-27FZETIA.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-CV7I2AAB.mjs +80 -0
  11. package/dist/lib/browser/chunk-CV7I2AAB.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-FL2XTEJH.mjs +76 -0
  13. package/dist/lib/browser/chunk-FL2XTEJH.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-H7OMDDGW.mjs +42 -0
  15. package/dist/lib/browser/chunk-H7OMDDGW.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-HDQXX5DC.mjs +157 -0
  17. package/dist/lib/browser/chunk-HDQXX5DC.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
  19. package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  21. package/dist/lib/browser/chunk-KNBRTZVK.mjs +892 -0
  22. package/dist/lib/browser/chunk-KNBRTZVK.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-NO7R7QHA.mjs +167 -0
  24. package/dist/lib/browser/chunk-NO7R7QHA.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-P2E7VMRF.mjs +148 -0
  26. package/dist/lib/browser/chunk-P2E7VMRF.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-QSXYHXCE.mjs +48 -0
  28. package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -0
  30. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  31. package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
  32. package/dist/lib/browser/cli/index.mjs +90 -0
  33. package/dist/lib/browser/cli/index.mjs.map +7 -0
  34. package/dist/lib/browser/common/activation-events.mjs +24 -0
  35. package/dist/lib/browser/common/capabilities.mjs +46 -0
  36. package/dist/lib/browser/core/activation-event.mjs +20 -0
  37. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  38. package/dist/lib/browser/core/capability.mjs +28 -0
  39. package/dist/lib/browser/core/capability.mjs.map +7 -0
  40. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  42. package/dist/lib/browser/core/plugin.mjs +29 -0
  43. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  44. package/dist/lib/browser/core/url-loader.mjs +12 -0
  45. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  46. package/dist/lib/browser/index.mjs +91 -156
  47. package/dist/lib/browser/index.mjs.map +4 -4
  48. package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs +43 -0
  49. package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs.map +7 -0
  50. package/dist/lib/browser/meta.json +1 -1
  51. package/dist/lib/browser/testing/index.mjs +115 -51
  52. package/dist/lib/browser/testing/index.mjs.map +4 -4
  53. package/dist/lib/browser/ui/index.mjs +44 -0
  54. package/dist/lib/browser/ui/index.mjs.map +7 -0
  55. package/dist/lib/node-esm/capability-CB3MNEI3.mjs +39 -0
  56. package/dist/lib/node-esm/capability-CB3MNEI3.mjs.map +7 -0
  57. package/dist/lib/node-esm/capability-CMROGK7R.mjs +36 -0
  58. package/dist/lib/node-esm/capability-CMROGK7R.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-37NG7SIN.mjs +77 -0
  60. package/dist/lib/node-esm/chunk-37NG7SIN.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-7JPKC7OM.mjs +893 -0
  62. package/dist/lib/node-esm/chunk-7JPKC7OM.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-7PPVTBYR.mjs +81 -0
  64. package/dist/lib/node-esm/chunk-7PPVTBYR.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-BQ56U4QX.mjs +43 -0
  66. package/dist/lib/node-esm/chunk-BQ56U4QX.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-CG6UBBZZ.mjs +149 -0
  68. package/dist/lib/node-esm/chunk-CG6UBBZZ.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
  70. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-EXYTXQ47.mjs +168 -0
  72. package/dist/lib/node-esm/chunk-EXYTXQ47.mjs.map +7 -0
  73. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
  74. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs.map +7 -0
  75. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  76. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  77. package/dist/lib/node-esm/chunk-OXXXRCQX.mjs +158 -0
  78. package/dist/lib/node-esm/chunk-OXXXRCQX.mjs.map +7 -0
  79. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
  80. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
  81. package/dist/lib/node-esm/chunk-YH44RHP6.mjs +951 -0
  82. package/dist/lib/node-esm/chunk-YH44RHP6.mjs.map +7 -0
  83. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs +49 -0
  84. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
  85. package/dist/lib/node-esm/cli/index.mjs +91 -0
  86. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  87. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  88. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  89. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  90. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  91. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  92. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  93. package/dist/lib/node-esm/core/capability.mjs +29 -0
  94. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  95. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  96. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  97. package/dist/lib/node-esm/core/plugin.mjs +30 -0
  98. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  99. package/dist/lib/node-esm/core/url-loader.mjs +13 -0
  100. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  101. package/dist/lib/node-esm/index.mjs +91 -156
  102. package/dist/lib/node-esm/index.mjs.map +4 -4
  103. package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs +44 -0
  104. package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs.map +7 -0
  105. package/dist/lib/node-esm/meta.json +1 -1
  106. package/dist/lib/node-esm/testing/index.mjs +115 -51
  107. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  108. package/dist/lib/node-esm/ui/index.mjs +45 -0
  109. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  110. package/dist/plugin/node-esm/index.mjs +384 -0
  111. package/dist/plugin/node-esm/index.mjs.map +7 -0
  112. package/dist/plugin/node-esm/meta.json +1 -0
  113. package/dist/types/src/cli/cli.d.ts +39 -0
  114. package/dist/types/src/cli/cli.d.ts.map +1 -0
  115. package/dist/types/src/cli/index.d.ts +2 -0
  116. package/dist/types/src/cli/index.d.ts.map +1 -0
  117. package/dist/types/src/common/activation-events.d.ts +27 -0
  118. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  119. package/dist/types/src/common/capabilities.d.ts +109 -123
  120. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  121. package/dist/types/src/common/index.d.ts +4 -8
  122. package/dist/types/src/common/index.d.ts.map +1 -1
  123. package/dist/types/src/common/operations.d.ts +19 -0
  124. package/dist/types/src/common/operations.d.ts.map +1 -0
  125. package/dist/types/src/common/translations.d.ts +8 -8
  126. package/dist/types/src/common/translations.d.ts.map +1 -1
  127. package/dist/types/src/context.d.ts +5 -0
  128. package/dist/types/src/context.d.ts.map +1 -0
  129. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +7 -7
  130. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  131. package/dist/types/src/core/capability-manager.d.ts +43 -0
  132. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  133. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  134. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  135. package/dist/types/src/core/capability.d.ts +150 -0
  136. package/dist/types/src/core/capability.d.ts.map +1 -0
  137. package/dist/types/src/core/index.d.ts +6 -4
  138. package/dist/types/src/core/index.d.ts.map +1 -1
  139. package/dist/types/src/core/plugin-manager.d.ts +73 -0
  140. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  141. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  142. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  143. package/dist/types/src/core/plugin.d.ts +103 -33
  144. package/dist/types/src/core/plugin.d.ts.map +1 -1
  145. package/dist/types/src/core/url-loader.d.ts +25 -0
  146. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  147. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  148. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  149. package/dist/types/src/index.d.ts +3 -4
  150. package/dist/types/src/index.d.ts.map +1 -1
  151. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  152. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  153. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  154. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  155. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  156. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  157. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  158. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  159. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  160. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  161. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  162. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  163. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  164. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  165. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  166. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  167. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  168. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  169. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  170. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  171. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  172. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  173. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  174. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  175. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  176. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  177. package/dist/types/src/plugin-operation/testing.d.ts +58 -0
  178. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  179. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  180. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  181. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  182. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  183. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  184. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  185. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  186. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  187. package/dist/types/src/testing/index.d.ts +1 -0
  188. package/dist/types/src/testing/index.d.ts.map +1 -1
  189. package/dist/types/src/testing/service.d.ts +8 -0
  190. package/dist/types/src/testing/service.d.ts.map +1 -0
  191. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  192. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  193. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  194. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  195. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  196. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  197. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  198. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  199. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  200. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  201. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts +13 -0
  202. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  203. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  204. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  205. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  206. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  207. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  208. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  209. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
  210. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  211. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  212. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  213. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  214. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  216. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/Surface/index.d.ts +26 -0
  218. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/Surface/types.d.ts +96 -0
  220. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  221. package/dist/types/src/ui/components/index.d.ts +4 -0
  222. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  223. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  224. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  225. package/dist/types/src/ui/hooks/useApp.d.ts +62 -0
  226. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  227. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  228. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  229. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  230. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  231. package/dist/types/src/ui/hooks/useLoading.d.ts +18 -0
  232. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  233. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  234. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  235. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  236. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  237. package/dist/types/src/ui/index.d.ts +3 -0
  238. package/dist/types/src/ui/index.d.ts.map +1 -0
  239. package/dist/types/src/vite-plugin/composer-plugin.d.ts +18 -0
  240. package/dist/types/src/vite-plugin/composer-plugin.d.ts.map +1 -0
  241. package/dist/types/src/vite-plugin/import-map-plugin.d.ts +16 -0
  242. package/dist/types/src/vite-plugin/import-map-plugin.d.ts.map +1 -0
  243. package/dist/types/src/vite-plugin/index.d.ts +3 -0
  244. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  245. package/dist/types/src/vite-plugin/packages.d.ts +7 -0
  246. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  247. package/dist/types/tsconfig.tsbuildinfo +1 -1
  248. package/moon.yml +25 -3
  249. package/package.json +132 -44
  250. package/src/cli/cli.ts +107 -0
  251. package/src/{playground/layout → cli}/index.ts +1 -1
  252. package/src/common/activation-events.ts +44 -0
  253. package/src/common/capabilities.ts +168 -114
  254. package/src/common/index.ts +4 -8
  255. package/src/common/operations.ts +36 -0
  256. package/src/common/translations.ts +18 -10
  257. package/src/context.ts +9 -0
  258. package/src/core/{events.ts → activation-event.ts} +10 -7
  259. package/src/core/capability-manager.test.ts +151 -0
  260. package/src/core/capability-manager.ts +171 -0
  261. package/src/core/capability.ts +237 -0
  262. package/src/core/index.ts +6 -4
  263. package/src/core/plugin-manager.test.ts +1114 -0
  264. package/src/core/plugin-manager.ts +883 -0
  265. package/src/core/plugin.ts +238 -37
  266. package/src/core/url-loader.test.ts +79 -0
  267. package/src/core/url-loader.ts +148 -0
  268. package/src/helpers.test.ts +1 -1
  269. package/src/index.ts +3 -4
  270. package/src/plugin-operation/OperationPlugin.ts +25 -0
  271. package/src/plugin-operation/history/capability.ts +37 -0
  272. package/src/plugin-operation/history/errors.ts +7 -0
  273. package/src/plugin-operation/history/history-tracker.test.ts +374 -0
  274. package/src/plugin-operation/history/history-tracker.ts +129 -0
  275. package/src/plugin-operation/history/index.ts +9 -0
  276. package/src/plugin-operation/history/types.ts +17 -0
  277. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  278. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  279. package/src/plugin-operation/history/undo-registry.ts +54 -0
  280. package/src/plugin-operation/index.ts +6 -0
  281. package/src/plugin-operation/invoker-capability.ts +54 -0
  282. package/src/plugin-operation/meta.ts +11 -0
  283. package/src/plugin-operation/testing.ts +154 -0
  284. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  285. package/src/plugin-runtime/capability.ts +53 -0
  286. package/src/{playground/debug → plugin-runtime}/index.ts +1 -1
  287. package/src/plugin-runtime/meta.ts +11 -0
  288. package/src/testing/index.ts +1 -0
  289. package/src/testing/service.ts +52 -0
  290. package/src/testing/withPluginManager.stories.tsx +15 -11
  291. package/src/testing/withPluginManager.tsx +80 -54
  292. package/src/ui/components/App/App.stories.tsx +92 -0
  293. package/src/ui/components/App/App.tsx +58 -0
  294. package/src/{playground/logger → ui/components/App}/index.ts +1 -1
  295. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  296. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  297. package/src/ui/components/PluginManager/index.ts +5 -0
  298. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +145 -0
  299. package/src/ui/components/Surface/SurfaceComponent.tsx +257 -0
  300. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  301. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  302. package/src/ui/components/Surface/context.ts +12 -0
  303. package/src/ui/components/Surface/index.ts +35 -0
  304. package/src/ui/components/Surface/types.ts +117 -0
  305. package/src/ui/components/index.ts +7 -0
  306. package/src/ui/hooks/index.ts +9 -0
  307. package/src/ui/hooks/useApp.test.tsx +159 -0
  308. package/src/ui/hooks/useApp.tsx +289 -0
  309. package/src/ui/hooks/useCapabilities.ts +67 -0
  310. package/src/ui/hooks/useLoading.tsx +68 -0
  311. package/src/ui/hooks/useSettingsState.ts +26 -0
  312. package/src/ui/hooks/useSurface.ts +13 -0
  313. package/src/ui/index.ts +6 -0
  314. package/src/vite-plugin/composer-plugin.ts +128 -0
  315. package/src/vite-plugin/import-map-plugin.ts +315 -0
  316. package/src/vite-plugin/index.ts +6 -0
  317. package/src/vite-plugin/packages.ts +29 -0
  318. package/tsconfig.json +15 -28
  319. package/tsconfig.node.json +2 -4
  320. package/typedoc.json +2 -4
  321. package/vitest.config.ts +8 -6
  322. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  323. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  324. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs +0 -137
  325. package/dist/lib/browser/app-graph-builder-LYF7EKNN.mjs.map +0 -7
  326. package/dist/lib/browser/chunk-FMN65HSW.mjs +0 -1519
  327. package/dist/lib/browser/chunk-FMN65HSW.mjs.map +0 -7
  328. package/dist/lib/browser/chunk-FO2PH7M3.mjs +0 -415
  329. package/dist/lib/browser/chunk-FO2PH7M3.mjs.map +0 -7
  330. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  331. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  332. package/dist/lib/browser/intent-dispatcher-LSYQZSEB.mjs +0 -11
  333. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs +0 -39
  334. package/dist/lib/browser/intent-resolver-ZTNOSO3A.mjs.map +0 -7
  335. package/dist/lib/browser/store-KML2R4IE.mjs +0 -30
  336. package/dist/lib/browser/store-KML2R4IE.mjs.map +0 -7
  337. package/dist/lib/browser/worker.mjs +0 -79
  338. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs +0 -138
  339. package/dist/lib/node-esm/app-graph-builder-SAOWGJDK.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-73HGSHKE.mjs +0 -416
  341. package/dist/lib/node-esm/chunk-73HGSHKE.mjs.map +0 -7
  342. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  343. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  344. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs +0 -1521
  345. package/dist/lib/node-esm/chunk-ZEZ4FVEU.mjs.map +0 -7
  346. package/dist/lib/node-esm/intent-dispatcher-6CYNGPSW.mjs +0 -12
  347. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs +0 -40
  348. package/dist/lib/node-esm/intent-resolver-W7Z7WFFM.mjs.map +0 -7
  349. package/dist/lib/node-esm/store-QEXGXLWZ.mjs +0 -31
  350. package/dist/lib/node-esm/store-QEXGXLWZ.mjs.map +0 -7
  351. package/dist/lib/node-esm/worker.mjs +0 -80
  352. package/dist/types/src/App.d.ts +0 -43
  353. package/dist/types/src/App.d.ts.map +0 -1
  354. package/dist/types/src/common/collaboration.d.ts +0 -19
  355. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  356. package/dist/types/src/common/events.d.ts +0 -52
  357. package/dist/types/src/common/events.d.ts.map +0 -1
  358. package/dist/types/src/common/file.d.ts +0 -14
  359. package/dist/types/src/common/file.d.ts.map +0 -1
  360. package/dist/types/src/common/graph.d.ts +0 -21
  361. package/dist/types/src/common/graph.d.ts.map +0 -1
  362. package/dist/types/src/common/layout.d.ts +0 -281
  363. package/dist/types/src/common/layout.d.ts.map +0 -1
  364. package/dist/types/src/common/surface.d.ts +0 -65
  365. package/dist/types/src/common/surface.d.ts.map +0 -1
  366. package/dist/types/src/core/capabilities.d.ts +0 -114
  367. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  368. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  369. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  370. package/dist/types/src/core/events.d.ts.map +0 -1
  371. package/dist/types/src/core/manager.d.ts +0 -122
  372. package/dist/types/src/core/manager.d.ts.map +0 -1
  373. package/dist/types/src/core/manager.test.d.ts +0 -2
  374. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  375. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  376. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  377. package/dist/types/src/playground/debug/index.d.ts +0 -2
  378. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  379. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  380. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  381. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  382. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  383. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  384. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  385. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  386. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  387. package/dist/types/src/playground/generator/index.d.ts +0 -3
  388. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  389. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  390. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  391. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  392. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  393. package/dist/types/src/playground/layout/index.d.ts +0 -2
  394. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  395. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  396. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  397. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  398. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  399. package/dist/types/src/playground/logger/index.d.ts +0 -2
  400. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  401. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  402. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  403. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  404. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  405. package/dist/types/src/playground/playground.stories.d.ts +0 -10
  406. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  407. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  408. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  409. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  410. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  411. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  412. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  413. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  414. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  415. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  416. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  417. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  418. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  419. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  420. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  421. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  422. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  423. package/dist/types/src/plugin-settings/actions.d.ts +0 -27
  424. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  425. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  426. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  427. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  428. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  429. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  430. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  431. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  432. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  433. package/dist/types/src/plugin-settings/translations.d.ts +0 -10
  434. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  435. package/dist/types/src/react/ErrorBoundary.d.ts +0 -31
  436. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  437. package/dist/types/src/react/IntentContext.d.ts +0 -8
  438. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  439. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  440. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  441. package/dist/types/src/react/Surface.d.ts +0 -12
  442. package/dist/types/src/react/Surface.d.ts.map +0 -1
  443. package/dist/types/src/react/Surface.stories.d.ts +0 -16
  444. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  445. package/dist/types/src/react/common.d.ts +0 -13
  446. package/dist/types/src/react/common.d.ts.map +0 -1
  447. package/dist/types/src/react/index.d.ts +0 -7
  448. package/dist/types/src/react/index.d.ts.map +0 -1
  449. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  450. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  451. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  452. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  453. package/dist/types/src/worker.d.ts +0 -4
  454. package/dist/types/src/worker.d.ts.map +0 -1
  455. package/src/App.tsx +0 -276
  456. package/src/common/collaboration.ts +0 -21
  457. package/src/common/events.ts +0 -77
  458. package/src/common/file.ts +0 -22
  459. package/src/common/graph.ts +0 -30
  460. package/src/common/layout.ts +0 -278
  461. package/src/common/surface.ts +0 -86
  462. package/src/core/capabilities.test.ts +0 -136
  463. package/src/core/capabilities.ts +0 -254
  464. package/src/core/manager.test.ts +0 -515
  465. package/src/core/manager.ts +0 -519
  466. package/src/playground/debug/Debug.tsx +0 -39
  467. package/src/playground/debug/plugin.ts +0 -17
  468. package/src/playground/generator/Main.tsx +0 -71
  469. package/src/playground/generator/Toolbar.tsx +0 -46
  470. package/src/playground/generator/generator.ts +0 -48
  471. package/src/playground/generator/index.ts +0 -6
  472. package/src/playground/generator/plugin.ts +0 -23
  473. package/src/playground/layout/Layout.tsx +0 -33
  474. package/src/playground/layout/plugin.ts +0 -17
  475. package/src/playground/logger/Toolbar.tsx +0 -29
  476. package/src/playground/logger/plugin.ts +0 -36
  477. package/src/playground/logger/schema.ts +0 -12
  478. package/src/playground/playground.stories.tsx +0 -42
  479. package/src/plugin-intent/IntentPlugin.ts +0 -20
  480. package/src/plugin-intent/actions.ts +0 -33
  481. package/src/plugin-intent/errors.ts +0 -39
  482. package/src/plugin-intent/index.ts +0 -8
  483. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  484. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  485. package/src/plugin-intent/intent.ts +0 -154
  486. package/src/plugin-settings/SettingsPlugin.ts +0 -35
  487. package/src/plugin-settings/actions.ts +0 -29
  488. package/src/plugin-settings/app-graph-builder.ts +0 -157
  489. package/src/plugin-settings/index.ts +0 -6
  490. package/src/plugin-settings/intent-resolver.ts +0 -34
  491. package/src/plugin-settings/store.ts +0 -33
  492. package/src/plugin-settings/translations.ts +0 -19
  493. package/src/react/ErrorBoundary.tsx +0 -45
  494. package/src/react/IntentContext.tsx +0 -34
  495. package/src/react/Surface.stories.tsx +0 -96
  496. package/src/react/Surface.tsx +0 -77
  497. package/src/react/common.ts +0 -12
  498. package/src/react/index.ts +0 -10
  499. package/src/react/useCapabilities.ts +0 -30
  500. package/src/react/useIntentResolver.ts +0 -22
  501. package/src/worker.ts +0 -11
  502. /package/dist/lib/browser/{intent-dispatcher-LSYQZSEB.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  503. /package/dist/lib/browser/{worker.mjs.map → chunk-RFSO3JRG.mjs.map} +0 -0
  504. /package/dist/lib/{node-esm/intent-dispatcher-6CYNGPSW.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  505. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,207 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, {
6
+ type Context,
7
+ type PropsWithChildren,
8
+ type ProfilerOnRenderCallback,
9
+ createContext,
10
+ useContext,
11
+ useMemo,
12
+ useRef,
13
+ useSyncExternalStore,
14
+ } from 'react';
15
+
16
+ const MAX_ENTRIES = 500;
17
+
18
+ /**
19
+ * Single profiler record captured from React Profiler onRender callback.
20
+ */
21
+ export type SurfaceProfilerEntry = {
22
+ id: string;
23
+ phase: 'mount' | 'update' | 'nested-update';
24
+ actualDuration: number;
25
+ baseDuration: number;
26
+ startTime: number;
27
+ commitTime: number;
28
+ timestamp: number;
29
+ };
30
+
31
+ /**
32
+ * Aggregated stats for a single profiled surface.
33
+ */
34
+ export type SurfaceProfilerStats = {
35
+ id: string;
36
+ mountCount: number;
37
+ updateCount: number;
38
+ totalRenders: number;
39
+ avgActualDuration: number;
40
+ maxActualDuration: number;
41
+ avgBaseDuration: number;
42
+ lastActualDuration: number;
43
+ lastCommitTime: number;
44
+ };
45
+
46
+ /**
47
+ * Store that collects profiler entries and notifies subscribers.
48
+ */
49
+ class SurfaceProfilerStore {
50
+ private _entries: SurfaceProfilerEntry[] = [];
51
+ private _listeners = new Set<() => void>();
52
+ private _snapshot: readonly SurfaceProfilerEntry[] = [];
53
+ private _pendingNotify = false;
54
+
55
+ /** Records an entry and schedules a deferred notification to avoid re-render loops. */
56
+ record(entry: SurfaceProfilerEntry) {
57
+ this._entries.push(entry);
58
+ if (this._entries.length > MAX_ENTRIES) {
59
+ this._entries = this._entries.slice(-MAX_ENTRIES);
60
+ }
61
+ this._snapshot = [...this._entries];
62
+ this._scheduleNotify();
63
+ }
64
+
65
+ clear() {
66
+ this._entries = [];
67
+ this._snapshot = [];
68
+ this._notifySync();
69
+ }
70
+
71
+ subscribe = (listener: () => void) => {
72
+ this._listeners.add(listener);
73
+ return () => {
74
+ this._listeners.delete(listener);
75
+ };
76
+ };
77
+
78
+ getSnapshot = (): readonly SurfaceProfilerEntry[] => {
79
+ return this._snapshot;
80
+ };
81
+
82
+ /**
83
+ * Defers notification to the next animation frame to break the
84
+ * Profiler onRender → record → notify → re-render → onRender loop.
85
+ */
86
+ private _scheduleNotify() {
87
+ if (!this._pendingNotify) {
88
+ this._pendingNotify = true;
89
+ requestAnimationFrame(() => {
90
+ this._pendingNotify = false;
91
+ this._notifySync();
92
+ });
93
+ }
94
+ }
95
+
96
+ private _notifySync() {
97
+ for (const listener of this._listeners) {
98
+ listener();
99
+ }
100
+ }
101
+ }
102
+
103
+ type SurfaceProfilerContextValue = {
104
+ store: SurfaceProfilerStore;
105
+ };
106
+
107
+ const SurfaceProfilerContext: Context<SurfaceProfilerContextValue | undefined> = createContext<
108
+ SurfaceProfilerContextValue | undefined
109
+ >(undefined);
110
+
111
+ /**
112
+ * Provider that collects React Profiler data from Surface components.
113
+ */
114
+ export const SurfaceProfilerProvider = ({ children }: PropsWithChildren) => {
115
+ const storeRef = useRef<SurfaceProfilerStore>(null);
116
+ if (!storeRef.current) {
117
+ storeRef.current = new SurfaceProfilerStore();
118
+ }
119
+ return (
120
+ <SurfaceProfilerContext.Provider value={{ store: storeRef.current }}>{children}</SurfaceProfilerContext.Provider>
121
+ );
122
+ };
123
+
124
+ /**
125
+ * Returns a stable onRender callback for use with React Profiler.
126
+ */
127
+ export const useSurfaceProfilerCallback = (): ProfilerOnRenderCallback | undefined => {
128
+ const store = useContext(SurfaceProfilerContext)?.store;
129
+ return useMemo<ProfilerOnRenderCallback | undefined>(() => {
130
+ if (!store) {
131
+ return undefined;
132
+ }
133
+ return (id, phase, actualDuration, baseDuration, startTime, commitTime) => {
134
+ store.record({
135
+ id,
136
+ phase,
137
+ actualDuration,
138
+ baseDuration,
139
+ startTime,
140
+ commitTime,
141
+ timestamp: Date.now(),
142
+ });
143
+ };
144
+ }, [store]);
145
+ };
146
+
147
+ /**
148
+ * Returns all profiler entries reactively.
149
+ */
150
+ export const useSurfaceProfilerEntries = (): readonly SurfaceProfilerEntry[] => {
151
+ const context = useContext(SurfaceProfilerContext);
152
+ return useSyncExternalStore(context?.store.subscribe ?? noop, context?.store.getSnapshot ?? emptySnapshot);
153
+ };
154
+
155
+ /**
156
+ * Returns aggregated stats grouped by surface id.
157
+ */
158
+ export const useSurfaceProfilerStats = (): SurfaceProfilerStats[] => {
159
+ const entries = useSurfaceProfilerEntries();
160
+ const statsMap = new Map<string, SurfaceProfilerStats>();
161
+
162
+ for (const entry of entries) {
163
+ let stats = statsMap.get(entry.id);
164
+ if (!stats) {
165
+ stats = {
166
+ id: entry.id,
167
+ mountCount: 0,
168
+ updateCount: 0,
169
+ totalRenders: 0,
170
+ avgActualDuration: 0,
171
+ maxActualDuration: 0,
172
+ avgBaseDuration: 0,
173
+ lastActualDuration: 0,
174
+ lastCommitTime: 0,
175
+ };
176
+ statsMap.set(entry.id, stats);
177
+ }
178
+
179
+ if (entry.phase === 'mount') {
180
+ stats.mountCount++;
181
+ } else {
182
+ stats.updateCount++;
183
+ }
184
+ stats.totalRenders++;
185
+ stats.avgActualDuration =
186
+ (stats.avgActualDuration * (stats.totalRenders - 1) + entry.actualDuration) / stats.totalRenders;
187
+ stats.avgBaseDuration =
188
+ (stats.avgBaseDuration * (stats.totalRenders - 1) + entry.baseDuration) / stats.totalRenders;
189
+ stats.maxActualDuration = Math.max(stats.maxActualDuration, entry.actualDuration);
190
+ stats.lastActualDuration = entry.actualDuration;
191
+ stats.lastCommitTime = entry.commitTime;
192
+ }
193
+
194
+ return [...statsMap.values()].sort((a, b) => b.maxActualDuration - a.maxActualDuration);
195
+ };
196
+
197
+ /**
198
+ * Clears all collected profiler entries.
199
+ */
200
+ export const useSurfaceProfilerClear = (): (() => void) | undefined => {
201
+ const store = useContext(SurfaceProfilerContext)?.store;
202
+ return useMemo(() => (store ? () => store.clear() : undefined), [store]);
203
+ };
204
+
205
+ const noop = () => () => {};
206
+ const EMPTY_SNAPSHOT: readonly SurfaceProfilerEntry[] = [];
207
+ const emptySnapshot = () => EMPTY_SNAPSHOT;
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Context, createContext } from 'react';
6
+
7
+ import { type Props } from './types';
8
+
9
+ export type SurfaceContext = Pick<Props, 'id' | 'role' | 'data'>;
10
+
11
+ // TODO(burdon): Use @radix-ui/react-context
12
+ export const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
@@ -0,0 +1,35 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // TODO(wittjosiah): Cleanup to avoid re-naming.
6
+ import { SurfaceContext } from './context';
7
+ import { SurfaceComponent, isSurfaceAvailable } from './SurfaceComponent';
8
+ import {
9
+ SurfaceProfilerProvider,
10
+ useSurfaceProfilerCallback,
11
+ useSurfaceProfilerClear,
12
+ useSurfaceProfilerEntries,
13
+ useSurfaceProfilerStats,
14
+ } from './SurfaceProfilerContext';
15
+ import { type Definition as SurfaceDefinition, create as createSurface, createWeb as createWebSurface } from './types';
16
+
17
+ export namespace Surface {
18
+ export type Definition = SurfaceDefinition;
19
+ export const create = createSurface;
20
+ export const createWeb = createWebSurface;
21
+
22
+ export type Context = SurfaceContext;
23
+ export const Context = SurfaceContext;
24
+
25
+ export const Surface = SurfaceComponent;
26
+ export const isAvailable = isSurfaceAvailable;
27
+
28
+ export const ProfilerProvider = SurfaceProfilerProvider;
29
+ export const useProfilerCallback = useSurfaceProfilerCallback;
30
+ export const useProfilerEntries = useSurfaceProfilerEntries;
31
+ export const useProfilerStats = useSurfaceProfilerStats;
32
+ export const useProfilerClear = useSurfaceProfilerClear;
33
+ }
34
+
35
+ export type { SurfaceProfilerEntry, SurfaceProfilerStats } from './SurfaceProfilerContext';
@@ -0,0 +1,117 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import type { FC, PropsWithChildren, ReactNode, RefCallback } from 'react';
6
+
7
+ import type { MakeOptional, Position } from '@dxos/util';
8
+
9
+ /**
10
+ * Props that are passed to the Surface component.
11
+ */
12
+ export type Props<T extends Record<string, any> = Record<string, unknown>> = {
13
+ /**
14
+ * If specified, the Surface will be wrapped in an error boundary.
15
+ * The fallback component will be rendered if an error occurs.
16
+ */
17
+ fallback?: FC<{ error: Error; data?: any }>;
18
+
19
+ /**
20
+ * If specified, the Surface will be wrapped in a suspense boundary.
21
+ * The placeholder component will be rendered while the surface component is loading.
22
+ */
23
+ placeholder?: ReactNode;
24
+ } & MakeOptional<CoreProps<T>, 'id' | 'data'> &
25
+ /**
26
+ * Additional props to pass to the component.
27
+ * These props are not used by Surface itself but may be used by components which resolve the surface.
28
+ * Exclude known prop names to prevent overriding well-defined props.
29
+ */
30
+ {
31
+ [K in keyof Record<string, any>]: K extends keyof CoreProps<T> | 'fallback' | 'placeholder' ? never : any;
32
+ };
33
+
34
+ /**
35
+ * NOTE: If `[key: string]: unknown` is included in shared types, when re-used other fields become unknown as well.
36
+ */
37
+ export type CoreProps<T extends Record<string, any> = Record<string, unknown>> = PropsWithChildren<{
38
+ /**
39
+ * ID for debugging.
40
+ */
41
+ id: string;
42
+
43
+ /**
44
+ * Role defines how the data should be rendered.
45
+ */
46
+ role: string;
47
+
48
+ /**
49
+ * The data to be rendered by the surface.
50
+ * NOTE: This must be a stable value.
51
+ */
52
+ data: T;
53
+
54
+ /**
55
+ * If more than one component is resolved, the limit determines how many are rendered.
56
+ */
57
+ limit?: number | undefined;
58
+ }>;
59
+
60
+ // TODO(burdon): Remove ref since relying on this would be error prone.
61
+ export type ComponentProps<T extends Record<string, any> = Record<string, any>> = CoreProps<T> & {
62
+ ref?: RefCallback<HTMLElement>;
63
+ } & Record<string, any>;
64
+
65
+ /**
66
+ * React component used to render a surface once is has matched.
67
+ */
68
+ export type ComponentFunction<T extends Record<string, any> = Record<string, any>> = (
69
+ props: ComponentProps<T>,
70
+ ) => ReactNode;
71
+
72
+ /**
73
+ * Definition of when a React component surface should be rendered.
74
+ */
75
+ export type ReactDefinition<T extends Record<string, any> = any> = Readonly<{
76
+ kind: 'react';
77
+ id: string;
78
+ role: string | string[];
79
+ position?: Position;
80
+ component: ComponentFunction<T>;
81
+ filter?: (data: Record<string, unknown>) => data is T;
82
+ }>;
83
+
84
+ /**
85
+ * Definition of when a Web Component surface should be rendered.
86
+ */
87
+ export type WebComponentDefinition<T extends Record<string, any> = any> = Readonly<{
88
+ kind: 'web-component';
89
+ id: string;
90
+ role: string | string[];
91
+ position?: Position;
92
+ /**
93
+ * The tag name of the Web Component to render.
94
+ * The Web Component will receive the same props as React surfaces via properties/attributes.
95
+ */
96
+ tagName: string;
97
+ filter?: (data: Record<string, unknown>) => data is T;
98
+ }>;
99
+
100
+ /**
101
+ * Definition of when a surface (React or Web Component) should be rendered.
102
+ */
103
+ export type Definition<T extends Record<string, any> = any> = ReactDefinition<T> | WebComponentDefinition<T>;
104
+
105
+ /**
106
+ * Creates a React surface definition.
107
+ */
108
+ export const create = <T extends Record<string, any> = any>(
109
+ definition: Omit<ReactDefinition<T>, 'kind'>,
110
+ ): ReactDefinition<T> => ({ ...definition, kind: 'react' });
111
+
112
+ /**
113
+ * Creates a Web Component surface definition.
114
+ */
115
+ export const createWeb = <T extends Record<string, any> = any>(
116
+ definition: Omit<WebComponentDefinition<T>, 'kind'>,
117
+ ): WebComponentDefinition<T> => ({ ...definition, kind: 'web-component' });
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './App';
6
+ export * from './PluginManager';
7
+ export * from './Surface';
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './useApp';
6
+ export * from './useCapabilities';
7
+ export * from './useLoading';
8
+ export * from './useSettingsState';
9
+ export * from './useSurface';
@@ -0,0 +1,159 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { assert, describe, it } from '@effect/vitest';
6
+ import { render, waitFor } from '@testing-library/react';
7
+ import * as Effect from 'effect/Effect';
8
+ import React from 'react';
9
+
10
+ import { ActivationEvents, Capabilities } from '../../common';
11
+ import { Capability, Plugin, PluginManager } from '../../core';
12
+ import { useApp } from './useApp';
13
+
14
+ const String = Capability.make<{ string: string }>('org.dxos.test.string');
15
+ const testMeta = { id: 'org.dxos.plugin.test', name: 'Test' };
16
+
17
+ const pluginLoader = (plugins: Plugin.Plugin[]) =>
18
+ Effect.fn(function* (id: string) {
19
+ const plugin = plugins.find((plugin) => plugin.meta.id === id);
20
+ if (!plugin) {
21
+ return yield* Effect.fail(new Error(`Plugin not found: ${id}`));
22
+ }
23
+ return plugin;
24
+ });
25
+
26
+ const TestHost = ({ manager }: { manager: PluginManager.PluginManager }) => {
27
+ const App = useApp({ pluginManager: manager });
28
+ return <App />;
29
+ };
30
+
31
+ describe('useApp cleanup integration', () => {
32
+ it.effect('external manager is not shut down when useApp does not own it', () =>
33
+ Effect.gen(function* () {
34
+ const plugin = Plugin.define(testMeta).pipe(
35
+ Plugin.addModule({
36
+ id: 'Hello',
37
+ activatesOn: ActivationEvents.Startup,
38
+ activate: () => Effect.succeed(Capability.contributes(String, { string: 'hello' })),
39
+ }),
40
+ Plugin.make,
41
+ )();
42
+
43
+ const manager = PluginManager.make({
44
+ pluginLoader: pluginLoader([plugin]),
45
+ plugins: [plugin],
46
+ });
47
+
48
+ manager.capabilities.contribute({
49
+ interface: Capabilities.PluginManager,
50
+ implementation: manager,
51
+ module: 'org.dxos.app-framework.plugin-manager',
52
+ });
53
+ manager.capabilities.contribute({
54
+ interface: Capabilities.AtomRegistry,
55
+ implementation: manager.registry,
56
+ module: 'org.dxos.app-framework.atom-registry',
57
+ });
58
+
59
+ const view = yield* Effect.promise(() => Promise.resolve(render(<TestHost manager={manager} />)));
60
+ yield* Effect.promise(() =>
61
+ waitFor(() => {
62
+ assert.strictEqual(manager.capabilities.getAll(Capabilities.PluginManager).length, 1);
63
+ assert.strictEqual(manager.capabilities.getAll(Capabilities.AtomRegistry).length, 1);
64
+ assert.strictEqual(manager.capabilities.getAll(String).length, 1);
65
+ assert.isTrue(manager.getActive().length > 0);
66
+ }),
67
+ );
68
+
69
+ yield* Effect.promise(() => Promise.resolve(view.unmount()));
70
+ yield* Effect.promise(() =>
71
+ waitFor(() => {
72
+ assert.strictEqual(manager.capabilities.getAll(Capabilities.PluginManager).length, 1);
73
+ assert.strictEqual(manager.capabilities.getAll(Capabilities.AtomRegistry).length, 1);
74
+ assert.strictEqual(manager.capabilities.getAll(String).length, 1);
75
+ assert.isTrue(manager.getActive().length > 0);
76
+ }),
77
+ );
78
+
79
+ yield* manager.shutdown();
80
+
81
+ assert.strictEqual(manager.capabilities.getAll(Capabilities.PluginManager).length, 1);
82
+ assert.strictEqual(manager.capabilities.getAll(Capabilities.AtomRegistry).length, 1);
83
+ assert.strictEqual(manager.capabilities.getAll(String).length, 0);
84
+ assert.deepStrictEqual(manager.getActive(), []);
85
+ }),
86
+ );
87
+
88
+ it.effect('shutdown deactivates modules and clears bookkeeping', () =>
89
+ Effect.gen(function* () {
90
+ const plugin = Plugin.define(testMeta).pipe(
91
+ Plugin.addModule({
92
+ id: 'Hello',
93
+ activatesOn: ActivationEvents.Startup,
94
+ activate: () => Effect.succeed(Capability.contributes(String, { string: 'hello' })),
95
+ }),
96
+ Plugin.make,
97
+ )();
98
+
99
+ const manager = PluginManager.make({
100
+ pluginLoader: pluginLoader([plugin]),
101
+ plugins: [plugin],
102
+ });
103
+
104
+ manager.capabilities.contribute({
105
+ interface: Capabilities.PluginManager,
106
+ implementation: manager,
107
+ module: 'org.dxos.app-framework.plugin-manager',
108
+ });
109
+ manager.capabilities.contribute({
110
+ interface: Capabilities.AtomRegistry,
111
+ implementation: manager.registry,
112
+ module: 'org.dxos.app-framework.atom-registry',
113
+ });
114
+ yield* manager.activate(ActivationEvents.Startup);
115
+
116
+ assert.strictEqual(manager.capabilities.getAll(String).length, 1);
117
+ assert.isTrue(manager.getActive().length > 0);
118
+
119
+ yield* manager.shutdown();
120
+
121
+ assert.strictEqual(manager.capabilities.getAll(String).length, 0);
122
+ assert.deepStrictEqual(manager.getActive(), []);
123
+ assert.deepStrictEqual(manager.getEventsFired(), []);
124
+ }),
125
+ );
126
+
127
+ it.effect('shutdown is idempotent when called multiple times', () =>
128
+ Effect.gen(function* () {
129
+ const plugin = Plugin.define(testMeta).pipe(
130
+ Plugin.addModule({
131
+ id: 'Hello',
132
+ activatesOn: ActivationEvents.Startup,
133
+ activate: () => Effect.succeed(Capability.contributes(String, { string: 'hello' })),
134
+ }),
135
+ Plugin.make,
136
+ )();
137
+
138
+ const manager = PluginManager.make({
139
+ pluginLoader: pluginLoader([plugin]),
140
+ plugins: [plugin],
141
+ });
142
+
143
+ manager.capabilities.contribute({
144
+ interface: Capabilities.PluginManager,
145
+ implementation: manager,
146
+ module: 'org.dxos.app-framework.plugin-manager',
147
+ });
148
+ yield* manager.activate(ActivationEvents.Startup);
149
+
150
+ yield* manager.shutdown();
151
+ assert.deepStrictEqual(manager.getActive(), []);
152
+
153
+ // Second shutdown should succeed without error.
154
+ const result = yield* manager.shutdown();
155
+ assert.isTrue(result);
156
+ assert.deepStrictEqual(manager.getActive(), []);
157
+ }),
158
+ );
159
+ });