@dxos/app-framework 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (420) hide show
  1. package/.storybook/main.mts +1 -1
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +149 -0
  4. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +7 -0
  5. package/dist/lib/browser/capability-7PCNSWBT.mjs +33 -0
  6. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +7 -0
  7. package/dist/lib/browser/capability-KP3PFEXD.mjs +31 -0
  8. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-6Y7PZV72.mjs +77 -0
  10. package/dist/lib/browser/chunk-6Y7PZV72.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-7IQHKD4U.mjs +170 -0
  12. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BLQJSGL3.mjs +732 -0
  14. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
  16. package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FMZN33N4.mjs +807 -0
  18. package/dist/lib/browser/chunk-FMZN33N4.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-H4WPA7U7.mjs +77 -0
  20. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
  23. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-TCLLRCS3.mjs +145 -0
  25. package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-XYNO72GQ.mjs +746 -0
  27. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +7 -0
  28. package/dist/lib/browser/common/index.mjs +38 -0
  29. package/dist/lib/browser/core/activation-event.mjs +20 -0
  30. package/dist/lib/browser/core/capability.mjs +28 -0
  31. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  32. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  33. package/dist/lib/browser/core/plugin.mjs +27 -0
  34. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  35. package/dist/lib/browser/index.mjs +162 -128
  36. package/dist/lib/browser/index.mjs.map +4 -4
  37. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs +32 -0
  38. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +7 -0
  39. package/dist/lib/browser/meta.json +1 -1
  40. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +64 -0
  41. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +7 -0
  42. package/dist/lib/browser/react/index.mjs +46 -0
  43. package/dist/lib/browser/react/index.mjs.map +7 -0
  44. package/dist/lib/browser/testing/index.mjs +68 -22
  45. package/dist/lib/browser/testing/index.mjs.map +4 -4
  46. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +150 -0
  47. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +7 -0
  48. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs +34 -0
  49. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +7 -0
  50. package/dist/lib/node-esm/capability-RCUNM2M7.mjs +32 -0
  51. package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +7 -0
  52. package/dist/lib/node-esm/chunk-663A54LQ.mjs +171 -0
  53. package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs +747 -0
  55. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
  57. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +733 -0
  59. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs +146 -0
  61. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-STMXUEPO.mjs +78 -0
  65. package/dist/lib/node-esm/chunk-STMXUEPO.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
  67. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +78 -0
  69. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs +808 -0
  71. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +7 -0
  72. package/dist/lib/node-esm/common/index.mjs +39 -0
  73. package/dist/lib/node-esm/common/index.mjs.map +7 -0
  74. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  75. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  76. package/dist/lib/node-esm/core/capability.mjs +29 -0
  77. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  78. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  79. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  80. package/dist/lib/node-esm/core/plugin.mjs +28 -0
  81. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  82. package/dist/lib/node-esm/index.mjs +162 -128
  83. package/dist/lib/node-esm/index.mjs.map +4 -4
  84. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs +33 -0
  85. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +7 -0
  86. package/dist/lib/node-esm/meta.json +1 -1
  87. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +65 -0
  88. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +7 -0
  89. package/dist/lib/node-esm/react/index.mjs +47 -0
  90. package/dist/lib/node-esm/react/index.mjs.map +7 -0
  91. package/dist/lib/node-esm/testing/index.mjs +68 -22
  92. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  93. package/dist/types/src/cli.d.ts +39 -0
  94. package/dist/types/src/cli.d.ts.map +1 -0
  95. package/dist/types/src/common/activation-event.d.ts +66 -0
  96. package/dist/types/src/common/activation-event.d.ts.map +1 -0
  97. package/dist/types/src/common/capability.d.ts +265 -0
  98. package/dist/types/src/common/capability.d.ts.map +1 -0
  99. package/dist/types/src/common/collaboration.d.ts +23 -17
  100. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  101. package/dist/types/src/common/graph.d.ts +2 -2
  102. package/dist/types/src/common/graph.d.ts.map +1 -1
  103. package/dist/types/src/common/index.d.ts +4 -3
  104. package/dist/types/src/common/index.d.ts.map +1 -1
  105. package/dist/types/src/common/operations.d.ts +380 -0
  106. package/dist/types/src/common/operations.d.ts.map +1 -0
  107. package/dist/types/src/common/plugin.d.ts +201 -0
  108. package/dist/types/src/common/plugin.d.ts.map +1 -0
  109. package/dist/types/src/common/surface.d.ts +48 -13
  110. package/dist/types/src/common/surface.d.ts.map +1 -1
  111. package/dist/types/src/common/translations.d.ts +9 -0
  112. package/dist/types/src/common/translations.d.ts.map +1 -1
  113. package/dist/types/src/context.d.ts +5 -0
  114. package/dist/types/src/context.d.ts.map +1 -0
  115. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +6 -6
  116. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  117. package/dist/types/src/core/capability-manager.d.ts +43 -0
  118. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  119. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  120. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  121. package/dist/types/src/core/capability.d.ts +150 -0
  122. package/dist/types/src/core/capability.d.ts.map +1 -0
  123. package/dist/types/src/core/index.d.ts +5 -4
  124. package/dist/types/src/core/index.d.ts.map +1 -1
  125. package/dist/types/src/core/plugin-manager.d.ts +66 -0
  126. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  127. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  128. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  129. package/dist/types/src/core/plugin.d.ts +92 -34
  130. package/dist/types/src/core/plugin.d.ts.map +1 -1
  131. package/dist/types/src/index.d.ts +5 -4
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/playground/debug/Debug.d.ts +4 -2
  134. package/dist/types/src/playground/debug/Debug.d.ts.map +1 -1
  135. package/dist/types/src/playground/debug/plugin.d.ts +2 -1
  136. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  137. package/dist/types/src/playground/generator/Main.d.ts +4 -2
  138. package/dist/types/src/playground/generator/Main.d.ts.map +1 -1
  139. package/dist/types/src/playground/generator/Toolbar.d.ts +4 -2
  140. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  141. package/dist/types/src/playground/generator/generator.d.ts +17 -5
  142. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  143. package/dist/types/src/playground/generator/plugin.d.ts +2 -1
  144. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  145. package/dist/types/src/playground/layout/Layout.d.ts +4 -2
  146. package/dist/types/src/playground/layout/Layout.d.ts.map +1 -1
  147. package/dist/types/src/playground/layout/plugin.d.ts +2 -1
  148. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  149. package/dist/types/src/playground/logger/Toolbar.d.ts +4 -2
  150. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  151. package/dist/types/src/playground/logger/plugin.d.ts +2 -1
  152. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  153. package/dist/types/src/playground/logger/schema.d.ts +14 -0
  154. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  155. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  156. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  157. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  158. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  159. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  161. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  163. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  165. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  167. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  169. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +93 -0
  171. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  173. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  175. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  177. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  178. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  179. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  180. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  181. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  182. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  183. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  184. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  185. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  186. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  187. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  188. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  189. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  190. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  191. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  192. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +2 -1
  193. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  194. package/dist/types/src/plugin-settings/actions.d.ts +36 -0
  195. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  196. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +4 -2
  197. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  198. package/dist/types/src/plugin-settings/meta.d.ts +2 -2
  199. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -1
  200. package/dist/types/src/plugin-settings/operation-resolver.d.ts +6 -0
  201. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +1 -0
  202. package/dist/types/src/react/App.d.ts +8 -0
  203. package/dist/types/src/react/App.d.ts.map +1 -0
  204. package/dist/types/src/react/App.stories.d.ts.map +1 -0
  205. package/dist/types/src/react/DefaultFallback.d.ts.map +1 -0
  206. package/dist/types/src/react/PluginManagerContext.stories.d.ts +13 -0
  207. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +1 -0
  208. package/dist/types/src/react/PluginManagerProvider.d.ts +2 -2
  209. package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -1
  210. package/dist/types/src/react/Surface.d.ts +8 -6
  211. package/dist/types/src/react/Surface.d.ts.map +1 -1
  212. package/dist/types/src/react/Surface.stories.d.ts +3 -6
  213. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  214. package/dist/types/src/react/SurfaceInfo.d.ts +11 -0
  215. package/dist/types/src/react/SurfaceInfo.d.ts.map +1 -0
  216. package/dist/types/src/react/common.d.ts +13 -12
  217. package/dist/types/src/react/common.d.ts.map +1 -1
  218. package/dist/types/src/react/index.d.ts +3 -1
  219. package/dist/types/src/react/index.d.ts.map +1 -1
  220. package/dist/types/src/react/types.d.ts +12 -0
  221. package/dist/types/src/react/types.d.ts.map +1 -0
  222. package/dist/types/src/{components → react}/useApp.d.ts +7 -6
  223. package/dist/types/src/react/useApp.d.ts.map +1 -0
  224. package/dist/types/src/react/useCapabilities.d.ts +16 -3
  225. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  226. package/dist/types/src/{components → react}/useLoading.d.ts +1 -2
  227. package/dist/types/src/react/useLoading.d.ts.map +1 -0
  228. package/dist/types/src/react/useOperationResolver.d.ts +19 -0
  229. package/dist/types/src/react/useOperationResolver.d.ts.map +1 -0
  230. package/dist/types/src/testing/index.d.ts +1 -0
  231. package/dist/types/src/testing/index.d.ts.map +1 -1
  232. package/dist/types/src/testing/service.d.ts +8 -0
  233. package/dist/types/src/testing/service.d.ts.map +1 -0
  234. package/dist/types/src/testing/withPluginManager.d.ts +4 -4
  235. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  236. package/dist/types/tsconfig.tsbuildinfo +1 -1
  237. package/moon.yml +6 -2
  238. package/package.json +101 -45
  239. package/src/cli.ts +107 -0
  240. package/src/common/activation-event.ts +99 -0
  241. package/src/common/capability.ts +343 -0
  242. package/src/common/collaboration.ts +23 -10
  243. package/src/common/graph.ts +2 -2
  244. package/src/common/index.ts +4 -3
  245. package/src/common/operations.ts +412 -0
  246. package/src/common/plugin.ts +364 -0
  247. package/src/common/surface.ts +56 -19
  248. package/src/common/translations.ts +20 -0
  249. package/src/context.ts +9 -0
  250. package/src/core/{events.ts → activation-event.ts} +5 -5
  251. package/src/core/capability-manager.test.ts +151 -0
  252. package/src/core/capability-manager.ts +171 -0
  253. package/src/core/capability.ts +236 -0
  254. package/src/core/index.ts +5 -4
  255. package/src/core/plugin-manager.test.ts +845 -0
  256. package/src/core/plugin-manager.ts +696 -0
  257. package/src/core/plugin.ts +221 -39
  258. package/src/index.ts +5 -4
  259. package/src/playground/debug/Debug.tsx +26 -16
  260. package/src/playground/debug/plugin.ts +8 -8
  261. package/src/playground/generator/Main.tsx +20 -11
  262. package/src/playground/generator/Toolbar.tsx +26 -16
  263. package/src/playground/generator/generator.ts +27 -27
  264. package/src/playground/generator/plugin.ts +11 -12
  265. package/src/playground/layout/Layout.tsx +11 -7
  266. package/src/playground/layout/plugin.ts +8 -8
  267. package/src/playground/logger/Toolbar.tsx +19 -16
  268. package/src/playground/logger/plugin.ts +24 -23
  269. package/src/playground/logger/schema.ts +10 -0
  270. package/src/playground/playground.stories.tsx +14 -6
  271. package/src/plugin-operation/OperationPlugin.ts +25 -0
  272. package/src/plugin-operation/history/capability.ts +37 -0
  273. package/src/plugin-operation/history/errors.ts +11 -0
  274. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  275. package/src/plugin-operation/history/history-tracker.ts +129 -0
  276. package/src/plugin-operation/history/index.ts +9 -0
  277. package/src/plugin-operation/history/types.ts +17 -0
  278. package/src/plugin-operation/history/undo-mapping.ts +132 -0
  279. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  280. package/src/plugin-operation/history/undo-registry.ts +54 -0
  281. package/src/plugin-operation/index.ts +6 -0
  282. package/src/plugin-operation/invoker-capability.ts +40 -0
  283. package/src/plugin-operation/meta.ts +11 -0
  284. package/src/plugin-operation/testing.ts +174 -0
  285. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  286. package/src/plugin-runtime/capability.ts +53 -0
  287. package/src/{components → plugin-runtime}/index.ts +1 -1
  288. package/src/plugin-runtime/meta.ts +11 -0
  289. package/src/plugin-settings/SettingsPlugin.ts +11 -26
  290. package/src/plugin-settings/actions.ts +39 -0
  291. package/src/plugin-settings/app-graph-builder.ts +122 -142
  292. package/src/plugin-settings/meta.ts +2 -2
  293. package/src/plugin-settings/operation-resolver.ts +55 -0
  294. package/src/plugin-settings/translations.ts +1 -1
  295. package/src/react/App.stories.tsx +63 -0
  296. package/src/{components → react}/App.tsx +11 -10
  297. package/src/{components → react}/DefaultFallback.tsx +1 -1
  298. package/src/react/PluginManagerContext.stories.tsx +184 -0
  299. package/src/react/PluginManagerProvider.ts +2 -2
  300. package/src/react/Surface.stories.tsx +91 -51
  301. package/src/react/Surface.tsx +226 -45
  302. package/src/react/SurfaceInfo.tsx +107 -0
  303. package/src/react/common.ts +29 -5
  304. package/src/react/index.ts +5 -1
  305. package/src/react/types.ts +27 -0
  306. package/src/react/useApp.tsx +209 -0
  307. package/src/react/useCapabilities.ts +37 -5
  308. package/src/{components → react}/useLoading.tsx +4 -6
  309. package/src/react/useOperationResolver.ts +40 -0
  310. package/src/testing/index.ts +1 -0
  311. package/src/testing/service.ts +52 -0
  312. package/src/testing/withPluginManager.stories.tsx +5 -5
  313. package/src/testing/withPluginManager.tsx +21 -23
  314. package/tsconfig.json +25 -7
  315. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  316. package/dist/lib/browser/app-graph-builder-PSA3RESL.mjs +0 -138
  317. package/dist/lib/browser/app-graph-builder-PSA3RESL.mjs.map +0 -7
  318. package/dist/lib/browser/chunk-2VZ4RF4A.mjs +0 -1608
  319. package/dist/lib/browser/chunk-2VZ4RF4A.mjs.map +0 -7
  320. package/dist/lib/browser/chunk-CPVYIS24.mjs +0 -451
  321. package/dist/lib/browser/chunk-CPVYIS24.mjs.map +0 -7
  322. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  323. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  324. package/dist/lib/browser/intent-dispatcher-BND6IF4U.mjs +0 -11
  325. package/dist/lib/browser/intent-resolver-27FJAJDE.mjs +0 -39
  326. package/dist/lib/browser/intent-resolver-27FJAJDE.mjs.map +0 -7
  327. package/dist/lib/browser/store-F545UOIR.mjs +0 -30
  328. package/dist/lib/browser/store-F545UOIR.mjs.map +0 -7
  329. package/dist/lib/browser/worker.mjs +0 -77
  330. package/dist/lib/node-esm/app-graph-builder-VJGZ6KH7.mjs +0 -139
  331. package/dist/lib/node-esm/app-graph-builder-VJGZ6KH7.mjs.map +0 -7
  332. package/dist/lib/node-esm/chunk-3RRWO5TD.mjs +0 -1610
  333. package/dist/lib/node-esm/chunk-3RRWO5TD.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-MN37WUJ2.mjs +0 -452
  335. package/dist/lib/node-esm/chunk-MN37WUJ2.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  337. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  338. package/dist/lib/node-esm/intent-dispatcher-254AZ6EE.mjs +0 -12
  339. package/dist/lib/node-esm/intent-resolver-NPMOPNFL.mjs +0 -40
  340. package/dist/lib/node-esm/intent-resolver-NPMOPNFL.mjs.map +0 -7
  341. package/dist/lib/node-esm/store-CINC4R4L.mjs +0 -31
  342. package/dist/lib/node-esm/store-CINC4R4L.mjs.map +0 -7
  343. package/dist/lib/node-esm/worker.mjs +0 -78
  344. package/dist/types/src/common/capabilities.d.ts +0 -201
  345. package/dist/types/src/common/capabilities.d.ts.map +0 -1
  346. package/dist/types/src/common/events.d.ts +0 -52
  347. package/dist/types/src/common/events.d.ts.map +0 -1
  348. package/dist/types/src/common/layout.d.ts +0 -279
  349. package/dist/types/src/common/layout.d.ts.map +0 -1
  350. package/dist/types/src/components/App.d.ts +0 -10
  351. package/dist/types/src/components/App.d.ts.map +0 -1
  352. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  353. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  354. package/dist/types/src/components/index.d.ts +0 -2
  355. package/dist/types/src/components/index.d.ts.map +0 -1
  356. package/dist/types/src/components/useApp.d.ts.map +0 -1
  357. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  358. package/dist/types/src/core/capabilities.d.ts +0 -117
  359. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  360. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  361. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  362. package/dist/types/src/core/events.d.ts.map +0 -1
  363. package/dist/types/src/core/manager.d.ts +0 -126
  364. package/dist/types/src/core/manager.d.ts.map +0 -1
  365. package/dist/types/src/core/manager.test.d.ts +0 -2
  366. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  367. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  368. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  369. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  370. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  371. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  372. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  373. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  374. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  375. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  376. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  377. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  378. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  379. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  380. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  381. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  382. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  383. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  384. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  385. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  386. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  387. package/dist/types/src/react/IntentContext.d.ts +0 -8
  388. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  389. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  390. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  391. package/dist/types/src/worker.d.ts +0 -4
  392. package/dist/types/src/worker.d.ts.map +0 -1
  393. package/src/common/capabilities.ts +0 -217
  394. package/src/common/events.ts +0 -79
  395. package/src/common/layout.ts +0 -277
  396. package/src/components/App.stories.tsx +0 -33
  397. package/src/components/useApp.tsx +0 -164
  398. package/src/core/capabilities.test.ts +0 -136
  399. package/src/core/capabilities.ts +0 -263
  400. package/src/core/manager.test.ts +0 -516
  401. package/src/core/manager.ts +0 -604
  402. package/src/plugin-intent/IntentPlugin.ts +0 -20
  403. package/src/plugin-intent/actions.ts +0 -31
  404. package/src/plugin-intent/errors.ts +0 -40
  405. package/src/plugin-intent/index.ts +0 -9
  406. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  407. package/src/plugin-intent/intent-dispatcher.ts +0 -337
  408. package/src/plugin-intent/intent.ts +0 -154
  409. package/src/plugin-intent/meta.ts +0 -10
  410. package/src/plugin-settings/intent-resolver.ts +0 -35
  411. package/src/plugin-settings/store.ts +0 -33
  412. package/src/react/IntentContext.tsx +0 -35
  413. package/src/react/useIntentResolver.ts +0 -22
  414. package/src/worker.ts +0 -11
  415. /package/dist/lib/browser/{intent-dispatcher-BND6IF4U.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  416. /package/dist/lib/browser/{worker.mjs.map → common/index.mjs.map} +0 -0
  417. /package/dist/lib/{node-esm/intent-dispatcher-254AZ6EE.mjs.map → browser/core/activation-event.mjs.map} +0 -0
  418. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/capability.mjs.map} +0 -0
  419. /package/dist/types/src/{components → react}/App.stories.d.ts +0 -0
  420. /package/dist/types/src/{components → react}/DefaultFallback.d.ts +0 -0
@@ -1,164 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { RegistryContext } from '@effect-rx/rx-react';
6
- import { effect } from '@preact/signals-core';
7
- import React, { type FC, useCallback, useEffect, useMemo } from 'react';
8
-
9
- import { invariant } from '@dxos/invariant';
10
- import { live } from '@dxos/live-object';
11
- import { useAsyncEffect, useDefaultValue } from '@dxos/react-hooks';
12
-
13
- import { Capabilities, Events } from '../common';
14
- import { type Plugin, PluginManager, type PluginManagerOptions } from '../core';
15
- import { ErrorBoundary, PluginManagerProvider } from '../react';
16
-
17
- import { App } from './App';
18
- import { DefaultFallback } from './DefaultFallback';
19
-
20
- const ENABLED_KEY = 'dxos.org/app-framework/enabled';
21
-
22
- export type UseAppOptions = {
23
- pluginManager?: PluginManager;
24
- pluginLoader?: PluginManagerOptions['pluginLoader'];
25
- plugins?: Plugin[];
26
- core?: string[];
27
- defaults?: string[];
28
- placeholder?: FC<{ stage: number }>;
29
- fallback?: ErrorBoundary['props']['fallback'];
30
- cacheEnabled?: boolean;
31
- safeMode?: boolean;
32
- debounce?: number;
33
- };
34
-
35
- /**
36
- * Expected usage is for this to be the entrypoint of the application.
37
- * Initializes plugins and renders the root components.
38
- *
39
- * @example
40
- * const plugins = [LayoutPlugin(), MyPlugin()];
41
- * const core = [LayoutPluginId];
42
- * const default = [MyPluginId];
43
- * const fallback = <div>Initializing Plugins...</div>;
44
- * const App = useApp({ plugins, core, default, fallback });
45
- * createRoot(document.getElementById('root')!).render(
46
- * <StrictMode>
47
- * <App />
48
- * </StrictMode>,
49
- * );
50
- *
51
- * @param params.pluginLoader A function which loads new plugins.
52
- * @param params.plugins All plugins available to the application.
53
- * @param params.core Core plugins which will always be enabled.
54
- * @param params.defaults Default plugins are enabled by default but can be disabled by the user.
55
- * @param params.placeholder Placeholder component to render during startup.
56
- * @param params.fallback Fallback component to render if an error occurs during startup.
57
- * @param params.cacheEnabled Whether to cache enabled plugins in localStorage.
58
- * @param params.safeMode Whether to enable safe mode, which disables optional plugins.
59
- */
60
- export const useApp = ({
61
- pluginManager,
62
- pluginLoader: _pluginLoader,
63
- plugins: _plugins,
64
- core: _core,
65
- defaults: _defaults,
66
- placeholder,
67
- fallback = DefaultFallback,
68
- cacheEnabled = false,
69
- safeMode = false,
70
- debounce = 0,
71
- }: UseAppOptions) => {
72
- const plugins = useDefaultValue(_plugins, () => []);
73
- const core = useDefaultValue(_core, () => plugins.map(({ meta }) => meta.id));
74
- const defaults = useDefaultValue(_defaults, () => []);
75
-
76
- // TODO(wittjosiah): Provide a custom plugin loader which supports loading via url.
77
- const pluginLoader = useMemo(
78
- () =>
79
- _pluginLoader ??
80
- ((id: string) => {
81
- const plugin = plugins.find((plugin) => plugin.meta.id === id);
82
- invariant(plugin, `Plugin not found: ${id}`);
83
- return plugin;
84
- }),
85
- [_pluginLoader, plugins],
86
- );
87
-
88
- const state = useMemo(() => live({ ready: false, error: null }), []);
89
- const cached: string[] = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? '[]'), []);
90
- const enabled = useMemo(
91
- () => (safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults),
92
- [safeMode, cacheEnabled, cached, defaults],
93
- );
94
- const manager = useMemo(
95
- () => pluginManager ?? new PluginManager({ pluginLoader, plugins, core, enabled }),
96
- [pluginManager, pluginLoader, plugins, core, enabled],
97
- );
98
-
99
- useEffect(() => {
100
- return manager.activation.on(({ event, state: _state, error }) => {
101
- // Once the app is ready the first time, don't show the fallback again.
102
- if (!state.ready && event === Events.Startup.id) {
103
- state.ready = _state === 'activated';
104
- }
105
-
106
- if (error && !state.ready && !state.error) {
107
- state.error = error;
108
- }
109
- });
110
- }, [manager, state]);
111
-
112
- useEffect(() => {
113
- effect(() => {
114
- cacheEnabled && localStorage.setItem(ENABLED_KEY, JSON.stringify(manager.enabled));
115
- });
116
- }, [cacheEnabled, manager]);
117
-
118
- useEffect(() => {
119
- setupDevtools(manager);
120
- }, [manager]);
121
-
122
- useAsyncEffect(async () => {
123
- manager.context.contributeCapability({
124
- interface: Capabilities.PluginManager,
125
- implementation: manager,
126
- module: 'dxos.org/app-framework/plugin-manager',
127
- });
128
-
129
- manager.context.contributeCapability({
130
- interface: Capabilities.RxRegistry,
131
- implementation: manager.registry,
132
- module: 'dxos.org/app-framework/rx-registry',
133
- });
134
-
135
- await Promise.all([
136
- // TODO(wittjosiah): Factor out such that this could be called per surface role when attempting to render.
137
- manager.activate(Events.SetupReactSurface),
138
- manager.activate(Events.Startup),
139
- ]);
140
-
141
- return () => {
142
- manager.context.removeCapability(Capabilities.PluginManager, manager);
143
- manager.context.removeCapability(Capabilities.RxRegistry, manager.registry);
144
- };
145
- }, [manager]);
146
-
147
- return useCallback(
148
- () => (
149
- <ErrorBoundary fallback={fallback}>
150
- <PluginManagerProvider value={manager}>
151
- <RegistryContext.Provider value={manager.registry}>
152
- <App placeholder={placeholder} state={state} debounce={debounce} />
153
- </RegistryContext.Provider>
154
- </PluginManagerProvider>
155
- </ErrorBoundary>
156
- ),
157
- [fallback, manager, placeholder, state],
158
- );
159
- };
160
-
161
- const setupDevtools = (manager: PluginManager) => {
162
- (globalThis as any).composer ??= {};
163
- (globalThis as any).composer.manager = manager;
164
- };
@@ -1,136 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Registry } from '@effect-rx/rx-react';
6
- import * as Effect from 'effect/Effect';
7
- import { describe, expect, it, onTestFinished } from 'vitest';
8
-
9
- import { PluginContext, defineCapability } from './capabilities';
10
-
11
- const defaultOptions = {
12
- activate: () => Effect.succeed(false),
13
- reset: () => Effect.succeed(false),
14
- };
15
-
16
- describe('PluginsContext', () => {
17
- it('should return empty array if no capabilities are contributed', () => {
18
- const registry = Registry.make();
19
- const context = new PluginContext({ registry, ...defaultOptions });
20
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
21
- expect(context.getCapabilities(interfaceDef)).toEqual([]);
22
- });
23
-
24
- it('should be able to contribute and request capabilities', () => {
25
- const registry = Registry.make();
26
- const context = new PluginContext({ registry, ...defaultOptions });
27
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
28
- const implementation = { example: 'identifier' };
29
- context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
30
- expect(context.getCapabilities(interfaceDef)).toEqual([implementation]);
31
- });
32
-
33
- it('should be able to remove capabilities', () => {
34
- const registry = Registry.make();
35
- const context = new PluginContext({ registry, ...defaultOptions });
36
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
37
- const implementation = { example: 'identifier' };
38
- context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
39
- expect(context.getCapabilities(interfaceDef)).toEqual([implementation]);
40
- context.removeCapability(interfaceDef, implementation);
41
- expect(context.getCapabilities(interfaceDef)).toEqual([]);
42
- });
43
-
44
- it('should be able to contribute and request multiple implementations', () => {
45
- const registry = Registry.make();
46
- const context = new PluginContext({ registry, ...defaultOptions });
47
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
48
- const implementation1 = { example: 'first' };
49
- const implementation2 = { example: 'second' };
50
- context.contributeCapability({ interface: interfaceDef, implementation: implementation1, module: 'test' });
51
- context.contributeCapability({ interface: interfaceDef, implementation: implementation2, module: 'test' });
52
- expect(context.getCapabilities(interfaceDef)).toEqual([implementation1, implementation2]);
53
- });
54
-
55
- it('should be able to request multiple capabilities', () => {
56
- const registry = Registry.make();
57
- const context = new PluginContext({ registry, ...defaultOptions });
58
- const interfaceDef1 = defineCapability<{ one: number }>('@dxos/app-framework/test/one');
59
- const interfaceDef2 = defineCapability<{ two: number }>('@dxos/app-framework/test/two');
60
- const implementation1 = { one: 1 };
61
- const implementation2 = { two: 2 };
62
- context.contributeCapability({ interface: interfaceDef1, implementation: implementation1, module: 'test' });
63
- context.contributeCapability({ interface: interfaceDef2, implementation: implementation2, module: 'test' });
64
- expect(context.getCapabilities(interfaceDef1)).toEqual([implementation1]);
65
- expect(context.getCapabilities(interfaceDef2)).toEqual([implementation2]);
66
- });
67
-
68
- it('should be reactive', () => {
69
- const registry = Registry.make();
70
- const context = new PluginContext({ registry, ...defaultOptions });
71
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
72
-
73
- let count = 0;
74
- const cancel = registry.subscribe(context.capabilities(interfaceDef), () => {
75
- count++;
76
- });
77
- onTestFinished(() => cancel());
78
- expect(count).toEqual(0);
79
-
80
- registry.get(context.capabilities(interfaceDef));
81
- expect(count).toEqual(1);
82
-
83
- const implementation = { example: 'identifier' };
84
- context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
85
- expect(count).toEqual(2);
86
-
87
- context.removeCapability(interfaceDef, implementation);
88
- expect(count).toEqual(3);
89
- });
90
-
91
- it('should not be reactive to changes within the implementation', () => {
92
- const registry = Registry.make();
93
- const context = new PluginContext({ registry, ...defaultOptions });
94
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
95
-
96
- let count = 0;
97
- const cancel = registry.subscribe(context.capabilities(interfaceDef), () => {
98
- count++;
99
- });
100
- onTestFinished(() => cancel());
101
- expect(count).toEqual(0);
102
-
103
- registry.get(context.capabilities(interfaceDef));
104
- expect(count).toEqual(1);
105
-
106
- const implementation = { example: 'identifier' };
107
- context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
108
- expect(count).toEqual(2);
109
-
110
- implementation.example = 'updated';
111
- expect(count).toEqual(2);
112
-
113
- const capabilities = context.getCapabilities(interfaceDef);
114
- expect(capabilities).toEqual([implementation]);
115
- expect(capabilities[0].example).toEqual('updated');
116
- expect(count).toEqual(2);
117
- });
118
-
119
- it('should be able to wait for a capability', async () => {
120
- const registry = Registry.make();
121
- const context = new PluginContext({ registry, ...defaultOptions });
122
- const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
123
-
124
- let capability: { example: string } | undefined;
125
- const cancel = registry.subscribe(context.capabilities(interfaceDef), (capabilities) => {
126
- capability = capabilities[0];
127
- });
128
- onTestFinished(() => cancel());
129
- registry.get(context.capabilities(interfaceDef));
130
- expect(capability).toBeUndefined();
131
-
132
- const implementation = { example: 'identifier' };
133
- context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
134
- expect(capability).toEqual(implementation);
135
- });
136
- });
@@ -1,263 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type Registry, Rx } from '@effect-rx/rx-react';
6
- import * as Effect from 'effect/Effect';
7
-
8
- import { Trigger } from '@dxos/async';
9
- import { invariant } from '@dxos/invariant';
10
- import { log } from '@dxos/log';
11
- import { type MaybePromise } from '@dxos/util';
12
-
13
- import { type ActivationEvent } from './events';
14
-
15
- const InterfaceDefTypeId: unique symbol = Symbol.for('InterfaceDefTypeId');
16
-
17
- /**
18
- * The interface definition of a capability.
19
- */
20
- export type InterfaceDef<T> = {
21
- [InterfaceDefTypeId]: T;
22
- identifier: string;
23
- };
24
-
25
- export namespace InterfaceDef {
26
- export type Implementation<I extends InterfaceDef<any>> = I extends InterfaceDef<infer T> ? T : never;
27
- }
28
-
29
- /**
30
- * Helper to define the interface of a capability.
31
- */
32
- export const defineCapability = <T>(identifier: string) => {
33
- return { identifier } as InterfaceDef<T>;
34
- };
35
-
36
- /**
37
- * A unique string identifier with a Typescript type associated with it.
38
- * When a capability is contributed to the application an implementation of the interface is provided.
39
- */
40
- export type Capability<T> = {
41
- /**
42
- * The interface definition of the capability.
43
- */
44
- readonly interface: InterfaceDef<T>;
45
-
46
- /**
47
- * The implementation of the capability.
48
- */
49
- readonly implementation: T;
50
-
51
- /**
52
- * Called when the capability is deactivated.
53
- */
54
- deactivate?: () => MaybePromise<void> | Effect.Effect<void, Error>;
55
- };
56
-
57
- export type AnyCapability = Capability<any>;
58
-
59
- type PluginsContextOptions = {
60
- registry: Registry.Registry;
61
- activate: (event: ActivationEvent) => Effect.Effect<boolean, Error>;
62
- reset: (event: ActivationEvent) => Effect.Effect<boolean, Error>;
63
- };
64
-
65
- // NOTE: This is implemented as a class to prevent it from being proxied by PluginManager state.
66
- class CapabilityImpl<T> {
67
- constructor(
68
- readonly moduleId: string,
69
- readonly implementation: T,
70
- ) {}
71
- }
72
-
73
- /**
74
- * Helper to define the implementation of a capability.
75
- */
76
- export const contributes = <I extends InterfaceDef<any>, T = InterfaceDef.Implementation<I>>(
77
- interfaceDef: I,
78
- implementation: T,
79
- deactivate?: Capability<InterfaceDef.Implementation<I>>['deactivate'],
80
- ): Capability<I> => {
81
- return {
82
- interface: interfaceDef,
83
- implementation: implementation as any, // NOTE: Added to allow providing readonly implementation.
84
- deactivate,
85
- } satisfies Capability<I>;
86
- };
87
-
88
- type LoadCapability<T, U> = () => Promise<{ default: (props: T) => MaybePromise<Capability<U>> }>;
89
- type LoadCapabilities<T> = () => Promise<{ default: (props: T) => MaybePromise<AnyCapability[]> }>;
90
-
91
- // TODO(wittjosiah): Not having the array be `any` causes type errors when using the lazy capability.
92
- type LazyCapability<T, U> = (props?: T) => Promise<() => Promise<Capability<U> | AnyCapability[]>>;
93
-
94
- /**
95
- * Helper to define a lazily loaded implementation of a capability.
96
- */
97
- export const lazy =
98
- <T, U>(c: LoadCapability<T, U> | LoadCapabilities<T>): LazyCapability<T, U> =>
99
- async (props?: T) => {
100
- const { default: getCapability } = await c();
101
- return async () => getCapability(props as T);
102
- };
103
-
104
- /**
105
- * Facilitates the dependency injection between [plugin modules](#pluginmodule) by allowing them contribute and request capabilities from each other.
106
- * It tracks the capabilities that are contributed in an in-memory live object.
107
- * This allows the application to subscribe to this state and incorporate plugins which are added dynamically.
108
- */
109
- export class PluginContext {
110
- private readonly _registry: Registry.Registry;
111
-
112
- private readonly _capabilityImpls = Rx.family<string, Rx.Writable<CapabilityImpl<unknown>[]>>(() => {
113
- return Rx.make<CapabilityImpl<unknown>[]>([]).pipe(Rx.keepAlive);
114
- });
115
-
116
- readonly _capabilities = Rx.family<string, Rx.Rx<unknown[]>>((id: string) => {
117
- return Rx.make((get) => {
118
- const current = get(this._capabilityImpls(id));
119
- return current.map((c) => c.implementation);
120
- });
121
- });
122
-
123
- readonly _capability = Rx.family<string, Rx.Rx<unknown>>((id: string) => {
124
- return Rx.make((get) => {
125
- const current = get(this._capabilities(id));
126
- invariant(current.length > 0, `No capability found for ${id}`);
127
- return current[0];
128
- });
129
- });
130
-
131
- /**
132
- * Activates plugins based on the activation event.
133
- * @param event The activation event.
134
- * @returns Whether the activation was successful.
135
- */
136
- readonly activate: PluginsContextOptions['activate'];
137
-
138
- /**
139
- * Re-activates the modules that were activated by the event.
140
- * @param event The activation event.
141
- * @returns Whether the reset was successful.
142
- */
143
- readonly reset: PluginsContextOptions['reset'];
144
-
145
- constructor({ registry, activate, reset }: PluginsContextOptions) {
146
- this._registry = registry;
147
- this.activate = activate;
148
- this.reset = reset;
149
- }
150
-
151
- /**
152
- * @internal
153
- */
154
- contributeCapability<T>({
155
- module: moduleId,
156
- interface: interfaceDef,
157
- implementation,
158
- }: {
159
- module: string;
160
- interface: InterfaceDef<T>;
161
- implementation: T;
162
- }): void {
163
- const current = this._registry.get(this._capabilityImpls(interfaceDef.identifier));
164
- const capability = new CapabilityImpl(moduleId, implementation);
165
- if (current.includes(capability)) {
166
- return;
167
- }
168
-
169
- this._registry.set(this._capabilityImpls(interfaceDef.identifier), [...current, capability]);
170
- log('capability contributed', {
171
- id: interfaceDef.identifier,
172
- moduleId,
173
- count: current.length,
174
- });
175
- }
176
-
177
- /**
178
- * @internal
179
- */
180
- removeCapability<T>(interfaceDef: InterfaceDef<T>, implementation: T): void {
181
- const current = this._registry.get(this._capabilityImpls(interfaceDef.identifier));
182
- if (current.length === 0) {
183
- return;
184
- }
185
-
186
- const next = current.filter((c) => c.implementation !== implementation);
187
- if (next.length !== current.length) {
188
- this._registry.set(this._capabilityImpls(interfaceDef.identifier), next);
189
- log('capability removed', { id: interfaceDef.identifier, count: current.length });
190
- } else {
191
- log.warn('capability not removed', { id: interfaceDef.identifier });
192
- }
193
- }
194
-
195
- /**
196
- * Get the Rx reference to the available capabilities for a given interface.
197
- * Primarily useful for deriving other Rx values based on the capabilities or
198
- * for subscribing to changes in the capabilities.
199
- * @returns An Rx reference to the available capabilities.
200
- */
201
- capabilities<T>(interfaceDef: InterfaceDef<T>): Rx.Rx<T[]> {
202
- // NOTE: This the type-checking for capabilities is done at the time of contribution.
203
- return this._capabilities(interfaceDef.identifier) as Rx.Rx<T[]>;
204
- }
205
-
206
- /**
207
- * Get the Rx reference to the available capabilities for a given interface.
208
- * Primarily useful for deriving other Rx values based on the capability or
209
- * for subscribing to changes in the capability.
210
- * @returns An Rx reference to the available capability.
211
- * @throws If no capability is found.
212
- */
213
- capability<T>(interfaceDef: InterfaceDef<T>): Rx.Rx<T> {
214
- // NOTE: This the type-checking for capabilities is done at the time of contribution.
215
- return this._capability(interfaceDef.identifier) as Rx.Rx<T>;
216
- }
217
-
218
- /**
219
- * Get capabilities from the plugin context.
220
- * @returns An array of capabilities.
221
- */
222
- getCapabilities<T>(interfaceDef: InterfaceDef<T>): T[] {
223
- return this._registry.get(this.capabilities(interfaceDef));
224
- }
225
-
226
- /**
227
- * Requests a single capability from the plugin context.
228
- * @returns The capability.
229
- * @throws If no capability is found.
230
- */
231
- getCapability<T>(interfaceDef: InterfaceDef<T>): T {
232
- return this._registry.get(this.capability(interfaceDef));
233
- }
234
-
235
- /**
236
- * Waits for a capability to be available.
237
- * @returns The capability.
238
- */
239
- async waitForCapability<T>(interfaceDef: InterfaceDef<T>): Promise<T> {
240
- const [capability] = this.getCapabilities(interfaceDef);
241
- if (capability) {
242
- return capability;
243
- }
244
-
245
- const trigger = new Trigger<T>();
246
- const cancel = this._registry.subscribe(this.capabilities(interfaceDef), (capabilities) => {
247
- if (capabilities.length > 0) {
248
- trigger.wake(capabilities[0]);
249
- }
250
- });
251
- const result = await trigger.wait();
252
- cancel();
253
- return result;
254
- }
255
-
256
- async activatePromise(event: ActivationEvent): Promise<boolean> {
257
- return this.activate(event).pipe(Effect.runPromise);
258
- }
259
-
260
- async resetPromise(event: ActivationEvent): Promise<boolean> {
261
- return this.reset(event).pipe(Effect.runPromise);
262
- }
263
- }