@dxos/app-framework 0.8.2-main.f11618f → 0.8.2-main.fbd8ed0

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 (310) hide show
  1. package/dist/lib/browser/{app-graph-builder-OHM2Z6YQ.mjs → app-graph-builder-6E7NCZ77.mjs} +23 -23
  2. package/dist/lib/browser/app-graph-builder-6E7NCZ77.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-DVNSCQJ5.mjs → chunk-2KSDY3EZ.mjs} +297 -270
  4. package/dist/lib/browser/chunk-2KSDY3EZ.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-X2YC645Z.mjs → chunk-K3HOLGVH.mjs} +38 -26
  6. package/dist/lib/browser/chunk-K3HOLGVH.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-SFPT4Z2C.mjs → chunk-KPRHX73H.mjs} +9 -9
  8. package/dist/lib/browser/chunk-KPRHX73H.mjs.map +7 -0
  9. package/dist/lib/browser/index.mjs +8 -8
  10. package/dist/lib/browser/{intent-dispatcher-J7QIFHLO.mjs → intent-dispatcher-VGUJBPPN.mjs} +2 -2
  11. package/dist/lib/browser/{intent-resolver-QV5MDMDV.mjs → intent-resolver-QLFZY5R5.mjs} +3 -3
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/{store-XMPVLJOQ.mjs → store-QGVXOY4T.mjs} +7 -6
  14. package/dist/lib/browser/store-QGVXOY4T.mjs.map +7 -0
  15. package/dist/lib/browser/testing/index.mjs +7 -3
  16. package/dist/lib/browser/testing/index.mjs.map +3 -3
  17. package/dist/lib/browser/worker.mjs +3 -3
  18. package/dist/lib/node/app-graph-builder-4IWMG67O.cjs +146 -0
  19. package/dist/lib/node/app-graph-builder-4IWMG67O.cjs.map +7 -0
  20. package/dist/lib/node/{chunk-I3CJYEBC.cjs → chunk-2EBZ2ICH.cjs} +137 -110
  21. package/dist/lib/node/chunk-2EBZ2ICH.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-5UOVF3OR.cjs → chunk-7J66KH2T.cjs} +78 -66
  23. package/dist/lib/node/chunk-7J66KH2T.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-JUSEAFDU.cjs → chunk-JQMNABMK.cjs} +4 -4
  25. package/dist/lib/node/chunk-JQMNABMK.cjs.map +7 -0
  26. package/dist/lib/node/index.cjs +80 -80
  27. package/dist/lib/node/{intent-dispatcher-FQPJNKIZ.cjs → intent-dispatcher-TASJBG5M.cjs} +8 -8
  28. package/dist/lib/node/{intent-dispatcher-FQPJNKIZ.cjs.map → intent-dispatcher-TASJBG5M.cjs.map} +2 -2
  29. package/dist/lib/node/{intent-resolver-PBAOGJS6.cjs → intent-resolver-5CG5NIJY.cjs} +12 -12
  30. package/dist/lib/node/meta.json +1 -1
  31. package/dist/lib/node/{store-N7JLYYDI.cjs → store-IF3UR2KA.cjs} +10 -9
  32. package/dist/lib/node/store-IF3UR2KA.cjs.map +7 -0
  33. package/dist/lib/node/testing/index.cjs +14 -9
  34. package/dist/lib/node/testing/index.cjs.map +3 -3
  35. package/dist/lib/node/worker.cjs +39 -39
  36. package/dist/lib/node/worker.cjs.map +1 -1
  37. package/dist/lib/node-esm/{app-graph-builder-OMH534A4.mjs → app-graph-builder-LYCG5CO3.mjs} +23 -23
  38. package/dist/lib/node-esm/app-graph-builder-LYCG5CO3.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-GSDBF2CK.mjs → chunk-BOEJMAVK.mjs} +297 -270
  40. package/dist/lib/node-esm/chunk-BOEJMAVK.mjs.map +7 -0
  41. package/dist/lib/node-esm/{chunk-QHXUTJHE.mjs → chunk-ISNBS46Y.mjs} +38 -26
  42. package/dist/lib/node-esm/chunk-ISNBS46Y.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-PHOUQACM.mjs → chunk-JUJF5L4G.mjs} +9 -9
  44. package/dist/lib/node-esm/chunk-JUJF5L4G.mjs.map +7 -0
  45. package/dist/lib/node-esm/index.mjs +8 -8
  46. package/dist/lib/node-esm/{intent-dispatcher-QDUGA7NT.mjs → intent-dispatcher-ZUSNX2OY.mjs} +2 -2
  47. package/dist/lib/node-esm/{intent-resolver-P7TC5RBD.mjs → intent-resolver-NGDHUKDD.mjs} +3 -3
  48. package/dist/lib/node-esm/meta.json +1 -1
  49. package/dist/lib/node-esm/{store-M2BYJL6K.mjs → store-NCRSE25X.mjs} +7 -6
  50. package/dist/lib/node-esm/store-NCRSE25X.mjs.map +7 -0
  51. package/dist/lib/node-esm/testing/index.mjs +7 -3
  52. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  53. package/dist/lib/node-esm/worker.mjs +3 -3
  54. package/dist/types/src/App.d.ts +3 -1
  55. package/dist/types/src/App.d.ts.map +1 -1
  56. package/dist/types/src/common/capabilities.d.ts +6 -196
  57. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  58. package/dist/types/src/common/collaboration.d.ts +14 -7
  59. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  60. package/dist/types/src/common/events.d.ts.map +1 -1
  61. package/dist/types/src/common/file.d.ts +7 -7
  62. package/dist/types/src/common/file.d.ts.map +1 -1
  63. package/dist/types/src/common/layout.d.ts +163 -163
  64. package/dist/types/src/common/layout.d.ts.map +1 -1
  65. package/dist/types/src/common/surface.d.ts.map +1 -1
  66. package/dist/types/src/common/translations.d.ts +7 -7
  67. package/dist/types/src/common/translations.d.ts.map +1 -1
  68. package/dist/types/src/core/capabilities.d.ts +28 -13
  69. package/dist/types/src/core/capabilities.d.ts.map +1 -1
  70. package/dist/types/src/core/events.d.ts.map +1 -1
  71. package/dist/types/src/core/manager.d.ts +6 -3
  72. package/dist/types/src/core/manager.d.ts.map +1 -1
  73. package/dist/types/src/core/plugin.d.ts +2 -2
  74. package/dist/types/src/core/plugin.d.ts.map +1 -1
  75. package/dist/types/src/helpers.d.ts.map +1 -1
  76. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  77. package/dist/types/src/playground/logger/schema.d.ts +6 -6
  78. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  79. package/dist/types/src/plugin-intent/actions.d.ts +14 -14
  80. package/dist/types/src/plugin-intent/actions.d.ts.map +1 -1
  81. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +3 -3
  82. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -1
  83. package/dist/types/src/plugin-intent/intent.d.ts +14 -20
  84. package/dist/types/src/plugin-intent/intent.d.ts.map +1 -1
  85. package/dist/types/src/plugin-settings/actions.d.ts +10 -10
  86. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  87. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +2 -195
  88. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  89. package/dist/types/src/plugin-settings/store.d.ts +2 -2
  90. package/dist/types/src/plugin-settings/store.d.ts.map +1 -1
  91. package/dist/types/src/react/IntentContext.d.ts.map +1 -1
  92. package/dist/types/src/react/Surface.d.ts +2 -2
  93. package/dist/types/src/react/Surface.d.ts.map +1 -1
  94. package/dist/types/src/react/useCapabilities.d.ts +2 -2
  95. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  96. package/dist/types/src/react/useIntentResolver.d.ts.map +1 -1
  97. package/dist/types/src/testing/withPluginManager.d.ts +5 -2
  98. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  99. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  100. package/dist/types/tsconfig.tsbuildinfo +1 -1
  101. package/package.json +25 -20
  102. package/src/App.tsx +14 -2
  103. package/src/common/capabilities.ts +7 -4
  104. package/src/common/collaboration.ts +11 -8
  105. package/src/common/file.ts +7 -7
  106. package/src/common/layout.ts +148 -136
  107. package/src/common/translations.ts +7 -7
  108. package/src/core/capabilities.test.ts +55 -36
  109. package/src/core/capabilities.ts +77 -57
  110. package/src/core/manager.test.ts +19 -19
  111. package/src/core/manager.ts +14 -6
  112. package/src/core/plugin.ts +2 -2
  113. package/src/playground/generator/generator.ts +4 -4
  114. package/src/playground/logger/schema.ts +5 -5
  115. package/src/playground/playground.stories.tsx +1 -1
  116. package/src/plugin-intent/actions.ts +9 -9
  117. package/src/plugin-intent/intent-dispatcher.test.ts +23 -42
  118. package/src/plugin-intent/intent-dispatcher.ts +7 -11
  119. package/src/plugin-intent/intent.ts +22 -20
  120. package/src/plugin-settings/actions.ts +8 -8
  121. package/src/plugin-settings/app-graph-builder.ts +129 -94
  122. package/src/plugin-settings/store.ts +20 -17
  123. package/src/react/Surface.stories.tsx +1 -1
  124. package/src/react/Surface.tsx +3 -3
  125. package/src/react/useCapabilities.ts +9 -19
  126. package/src/testing/withPluginManager.stories.tsx +0 -1
  127. package/src/testing/withPluginManager.tsx +11 -3
  128. package/tsconfig.json +3 -0
  129. package/typedoc/assets/navigation.js +1 -1
  130. package/typedoc/assets/search.js +1 -1
  131. package/typedoc/classes/CollaborationActions.InsertContent.html +280 -241
  132. package/typedoc/classes/ErrorBoundary.html +6 -6
  133. package/typedoc/classes/IntentAction.ShowUndo.html +125 -125
  134. package/typedoc/classes/IntentAction.Track.html +239 -239
  135. package/typedoc/classes/LayoutAction.AddToast.html +163 -163
  136. package/typedoc/classes/LayoutAction.Close.html +352 -352
  137. package/typedoc/classes/LayoutAction.Expose.html +238 -238
  138. package/typedoc/classes/LayoutAction.Open.html +904 -748
  139. package/typedoc/classes/LayoutAction.RevertWorkspace.html +241 -241
  140. package/typedoc/classes/LayoutAction.ScrollIntoView.html +280 -280
  141. package/typedoc/classes/LayoutAction.Set.html +436 -358
  142. package/typedoc/classes/LayoutAction.SetLayoutMode.html +469 -391
  143. package/typedoc/classes/LayoutAction.SwitchWorkspace.html +238 -238
  144. package/typedoc/classes/LayoutAction.UpdateComplementary.html +358 -358
  145. package/typedoc/classes/LayoutAction.UpdateDialog.html +553 -475
  146. package/typedoc/classes/LayoutAction.UpdateLayout.html +281 -281
  147. package/typedoc/classes/LayoutAction.UpdatePopover.html +826 -826
  148. package/typedoc/classes/LayoutAction.UpdateSidebar.html +397 -319
  149. package/typedoc/classes/Plugin.html +3 -3
  150. package/typedoc/classes/PluginContext.html +38 -0
  151. package/typedoc/classes/PluginManager.html +17 -16
  152. package/typedoc/classes/PluginModule.html +9 -9
  153. package/typedoc/classes/SettingsAction.Open.html +199 -199
  154. package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +124 -124
  155. package/typedoc/functions/Events.createStateEvent.html +2 -2
  156. package/typedoc/functions/IntentPlugin.html +1 -1
  157. package/typedoc/functions/SettingsPlugin.html +1 -1
  158. package/typedoc/functions/allOf.html +2 -2
  159. package/typedoc/functions/chain.html +2 -2
  160. package/typedoc/functions/contributes.html +2 -2
  161. package/typedoc/functions/createApp.html +2 -2
  162. package/typedoc/functions/createDispatcher.html +3 -3
  163. package/typedoc/functions/createIntent.html +3 -3
  164. package/typedoc/functions/createResolver.html +2 -2
  165. package/typedoc/functions/createSurface.html +2 -2
  166. package/typedoc/functions/defineCapability.html +2 -2
  167. package/typedoc/functions/defineEvent.html +2 -2
  168. package/typedoc/functions/defineModule.html +2 -2
  169. package/typedoc/functions/definePlugin.html +2 -2
  170. package/typedoc/functions/eventKey.html +2 -2
  171. package/typedoc/functions/getEvents.html +2 -2
  172. package/typedoc/functions/isAllOf.html +2 -2
  173. package/typedoc/functions/isOneOf.html +2 -2
  174. package/typedoc/functions/isSurfaceAvailable.html +2 -2
  175. package/typedoc/functions/lazy.html +2 -2
  176. package/typedoc/functions/oneOf.html +2 -2
  177. package/typedoc/functions/useAppGraph.html +1 -1
  178. package/typedoc/functions/useCapabilities.html +3 -3
  179. package/typedoc/functions/useCapability.html +3 -3
  180. package/typedoc/functions/useIntentDispatcher.html +1 -1
  181. package/typedoc/functions/useIntentResolver.html +1 -1
  182. package/typedoc/functions/useLayout.html +1 -1
  183. package/typedoc/functions/usePluginManager.html +2 -2
  184. package/typedoc/hierarchy.html +1 -1
  185. package/typedoc/index.html +2 -2
  186. package/typedoc/interfaces/LayoutAction.Toast.html +2 -2
  187. package/typedoc/modules/Capabilities.html +1 -1
  188. package/typedoc/modules/CollaborationActions.html +1 -1
  189. package/typedoc/modules/Events.html +1 -1
  190. package/typedoc/modules/IntentAction.html +1 -1
  191. package/typedoc/modules/LayoutAction.html +2 -2
  192. package/typedoc/modules/SettingsAction.html +1 -1
  193. package/typedoc/modules.html +1 -1
  194. package/typedoc/types/ActivationEvent.html +3 -3
  195. package/typedoc/types/ActivationEvents.html +2 -2
  196. package/typedoc/types/AnyCapability.html +1 -1
  197. package/typedoc/types/AnyIntent.html +1 -1
  198. package/typedoc/types/AnyIntentChain.html +1 -1
  199. package/typedoc/types/AnyIntentEffectResult.html +1 -1
  200. package/typedoc/types/AnyIntentResolver.html +1 -1
  201. package/typedoc/types/AnyIntentResult.html +1 -1
  202. package/typedoc/types/Capabilities.FileUploader.html +1 -1
  203. package/typedoc/types/Capabilities.IntentResolver.html +1 -1
  204. package/typedoc/types/Capabilities.Layout.html +1 -1
  205. package/typedoc/types/Capabilities.Metadata.html +1 -1
  206. package/typedoc/types/Capabilities.ReactContext.html +1 -1
  207. package/typedoc/types/Capabilities.ReactRoot.html +1 -1
  208. package/typedoc/types/Capabilities.ReactSurface.html +1 -1
  209. package/typedoc/types/Capabilities.Settings.html +2 -2
  210. package/typedoc/types/Capability.html +5 -5
  211. package/typedoc/types/CreateAppOptions.html +3 -2
  212. package/typedoc/types/FileInfo.html +1 -1
  213. package/typedoc/types/Intent.html +6 -10
  214. package/typedoc/types/IntentChain.html +3 -3
  215. package/typedoc/types/IntentContext.html +2 -2
  216. package/typedoc/types/IntentData.html +1 -1
  217. package/typedoc/types/IntentDispatcher.html +2 -2
  218. package/typedoc/types/IntentDispatcherResult.html +2 -2
  219. package/typedoc/types/IntentEffectDefinition.html +2 -2
  220. package/typedoc/types/IntentEffectResult.html +6 -6
  221. package/typedoc/types/IntentParams.html +2 -2
  222. package/typedoc/types/IntentResolver.html +2 -2
  223. package/typedoc/types/IntentResultData.html +1 -1
  224. package/typedoc/types/IntentSchema.html +1 -1
  225. package/typedoc/types/IntentUndo.html +2 -2
  226. package/typedoc/types/InterfaceDef.html +3 -3
  227. package/typedoc/types/Label.html +1 -1
  228. package/typedoc/types/NodeSerializer.html +3 -3
  229. package/typedoc/types/PluginManagerOptions.html +3 -2
  230. package/typedoc/types/PluginMeta.html +9 -9
  231. package/typedoc/types/PromiseIntentDispatcher.html +2 -2
  232. package/typedoc/types/PromiseIntentUndo.html +2 -2
  233. package/typedoc/types/Resource.html +1 -1
  234. package/typedoc/types/ResourceKey.html +1 -1
  235. package/typedoc/types/ResourceLanguage.html +1 -1
  236. package/typedoc/types/SerializedNode.html +2 -2
  237. package/typedoc/types/SurfaceComponent.html +2 -2
  238. package/typedoc/types/SurfaceDefinition.html +2 -2
  239. package/typedoc/types/SurfaceProps.html +2 -2
  240. package/typedoc/variables/Capabilities.AppGraph.html +1 -1
  241. package/typedoc/variables/Capabilities.AppGraphBuilder.html +1 -1
  242. package/typedoc/variables/Capabilities.AppGraphSerializer.html +1 -1
  243. package/typedoc/variables/Capabilities.ArtifactDefinition.html +1 -1
  244. package/typedoc/variables/Capabilities.FileUploader.html +1 -1
  245. package/typedoc/variables/Capabilities.IntentDispatcher.html +1 -1
  246. package/typedoc/variables/Capabilities.IntentResolver.html +1 -1
  247. package/typedoc/variables/Capabilities.Layout.html +1 -1
  248. package/typedoc/variables/Capabilities.Metadata.html +1 -1
  249. package/typedoc/variables/Capabilities.Null.html +1 -1
  250. package/typedoc/variables/Capabilities.PluginManager.html +1 -1
  251. package/typedoc/variables/Capabilities.ReactContext.html +1 -1
  252. package/typedoc/variables/Capabilities.ReactRoot.html +1 -1
  253. package/typedoc/variables/Capabilities.ReactSurface.html +1 -1
  254. package/typedoc/variables/Capabilities.RxRegistry.html +1 -0
  255. package/typedoc/variables/Capabilities.Settings.html +1 -1
  256. package/typedoc/variables/Capabilities.SettingsStore.html +1 -1
  257. package/typedoc/variables/Capabilities.Tools.html +1 -1
  258. package/typedoc/variables/Capabilities.Translations.html +1 -1
  259. package/typedoc/variables/Events.AppGraphReady.html +2 -2
  260. package/typedoc/variables/Events.DispatcherReady.html +2 -2
  261. package/typedoc/variables/Events.LayoutReady.html +1 -1
  262. package/typedoc/variables/Events.SettingsReady.html +2 -2
  263. package/typedoc/variables/Events.SetupAppGraph.html +2 -2
  264. package/typedoc/variables/Events.SetupArtifactDefinition.html +2 -2
  265. package/typedoc/variables/Events.SetupIntentResolver.html +2 -2
  266. package/typedoc/variables/Events.SetupMetadata.html +2 -2
  267. package/typedoc/variables/Events.SetupReactSurface.html +2 -2
  268. package/typedoc/variables/Events.SetupSettings.html +2 -2
  269. package/typedoc/variables/Events.SetupTranslations.html +2 -2
  270. package/typedoc/variables/Events.Startup.html +2 -2
  271. package/typedoc/variables/FileInfoSchema.html +1 -1
  272. package/typedoc/variables/INTENT_ACTION.html +1 -1
  273. package/typedoc/variables/INTENT_PLUGIN.html +1 -1
  274. package/typedoc/variables/LAYOUT_ACTION.html +1 -1
  275. package/typedoc/variables/LAYOUT_PLUGIN.html +1 -1
  276. package/typedoc/variables/Label.html +1 -1
  277. package/typedoc/variables/LayoutAction.Toast.html +1 -1
  278. package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +1 -1
  279. package/typedoc/variables/PluginManagerProvider.html +2 -2
  280. package/typedoc/variables/Resource.html +2 -2
  281. package/typedoc/variables/ResourceKey.html +1 -1
  282. package/typedoc/variables/ResourceLanguage.html +1 -1
  283. package/typedoc/variables/SETTINGS_ACTION.html +1 -1
  284. package/typedoc/variables/SETTINGS_ID.html +1 -1
  285. package/typedoc/variables/SETTINGS_KEY.html +1 -1
  286. package/typedoc/variables/SETTINGS_PLUGIN.html +1 -1
  287. package/typedoc/variables/Surface.html +2 -2
  288. package/typedoc/variables/defaultFileTypes.html +1 -1
  289. package/dist/lib/browser/app-graph-builder-OHM2Z6YQ.mjs.map +0 -7
  290. package/dist/lib/browser/chunk-DVNSCQJ5.mjs.map +0 -7
  291. package/dist/lib/browser/chunk-SFPT4Z2C.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-X2YC645Z.mjs.map +0 -7
  293. package/dist/lib/browser/store-XMPVLJOQ.mjs.map +0 -7
  294. package/dist/lib/node/app-graph-builder-Z45FKS52.cjs +0 -146
  295. package/dist/lib/node/app-graph-builder-Z45FKS52.cjs.map +0 -7
  296. package/dist/lib/node/chunk-5UOVF3OR.cjs.map +0 -7
  297. package/dist/lib/node/chunk-I3CJYEBC.cjs.map +0 -7
  298. package/dist/lib/node/chunk-JUSEAFDU.cjs.map +0 -7
  299. package/dist/lib/node/store-N7JLYYDI.cjs.map +0 -7
  300. package/dist/lib/node-esm/app-graph-builder-OMH534A4.mjs.map +0 -7
  301. package/dist/lib/node-esm/chunk-GSDBF2CK.mjs.map +0 -7
  302. package/dist/lib/node-esm/chunk-PHOUQACM.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-QHXUTJHE.mjs.map +0 -7
  304. package/dist/lib/node-esm/store-M2BYJL6K.mjs.map +0 -7
  305. package/typedoc/classes/PluginsContext.html +0 -25
  306. /package/dist/lib/browser/{intent-dispatcher-J7QIFHLO.mjs.map → intent-dispatcher-VGUJBPPN.mjs.map} +0 -0
  307. /package/dist/lib/browser/{intent-resolver-QV5MDMDV.mjs.map → intent-resolver-QLFZY5R5.mjs.map} +0 -0
  308. /package/dist/lib/node/{intent-resolver-PBAOGJS6.cjs.map → intent-resolver-5CG5NIJY.cjs.map} +0 -0
  309. /package/dist/lib/node-esm/{intent-dispatcher-QDUGA7NT.mjs.map → intent-dispatcher-ZUSNX2OY.mjs.map} +0 -0
  310. /package/dist/lib/node-esm/{intent-resolver-P7TC5RBD.mjs.map → intent-resolver-NGDHUKDD.mjs.map} +0 -0
@@ -24,7 +24,7 @@ import {
24
24
  type Label,
25
25
  } from './intent';
26
26
  import { Events, Capabilities } from '../common';
27
- import { contributes, type PluginsContext } from '../core';
27
+ import { contributes, type PluginContext } from '../core';
28
28
 
29
29
  const EXECUTION_LIMIT = 100;
30
30
  const HISTORY_LIMIT = 100;
@@ -184,14 +184,14 @@ export type IntentContext = {
184
184
  * @param params.executionLimit The maximum recursion depth of intent chains.
185
185
  */
186
186
  export const createDispatcher = (
187
- getResolvers: (module?: string) => AnyIntentResolver[],
187
+ getResolvers: () => AnyIntentResolver[],
188
188
  { executionLimit = EXECUTION_LIMIT, historyLimit = HISTORY_LIMIT } = {},
189
189
  ): IntentContext => {
190
190
  const historyRef = Effect.runSync(Ref.make<AnyIntentResult[][]>([]));
191
191
 
192
192
  const handleIntent = (intent: AnyIntent) =>
193
193
  Effect.gen(function* () {
194
- const candidates = getResolvers(intent.module)
194
+ const candidates = getResolvers()
195
195
  .filter((resolver) => resolver.intent._tag === intent.id)
196
196
  .filter((resolver) => !resolver.filter || resolver.filter(intent.data))
197
197
  .toSorted(byPosition);
@@ -302,7 +302,7 @@ export const createDispatcher = (
302
302
  const defaultEffect = () => Effect.fail(new Error('Intent runtime not ready'));
303
303
  const defaultPromise = () => Effect.runPromise(defaultEffect());
304
304
 
305
- export default (context: PluginsContext) => {
305
+ export default (context: PluginContext) => {
306
306
  const state = live<IntentContext>({
307
307
  dispatch: defaultEffect,
308
308
  dispatchPromise: defaultPromise,
@@ -311,15 +311,11 @@ export default (context: PluginsContext) => {
311
311
  });
312
312
 
313
313
  // TODO(wittjosiah): Make getResolver callback async and allow resolvers to be requested on demand.
314
- const { dispatch, dispatchPromise, undo, undoPromise } = createDispatcher((module) =>
315
- context
316
- .requestCapabilities(Capabilities.IntentResolver, (c, moduleId): c is AnyIntentResolver => {
317
- return module ? moduleId === module : true;
318
- })
319
- .flat(),
314
+ const { dispatch, dispatchPromise, undo, undoPromise } = createDispatcher(() =>
315
+ context.getCapabilities(Capabilities.IntentResolver).flat(),
320
316
  );
321
317
 
322
- const manager = context.requestCapability(Capabilities.PluginManager);
318
+ const manager = context.getCapability(Capabilities.PluginManager);
323
319
  state.dispatch = (intentChain, depth) => {
324
320
  return Effect.gen(function* () {
325
321
  yield* manager._activate(Events.SetupIntentResolver);
@@ -2,20 +2,24 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Schema as S } from 'effect';
5
+ import { Schema } from 'effect';
6
6
 
7
7
  export type IntentParams = {
8
- readonly input: S.Schema.All;
9
- readonly output: S.Schema.All;
8
+ readonly input: Schema.Schema.All;
9
+ readonly output: Schema.Schema.All;
10
10
  };
11
11
 
12
12
  export type IntentData<Fields extends IntentParams> =
13
- S.Schema.Type<S.Struct<Fields>> extends { readonly input: any } ? S.Schema.Type<S.Struct<Fields>>['input'] : any;
13
+ Schema.Schema.Type<Schema.Struct<Fields>> extends { readonly input: any }
14
+ ? Schema.Schema.Type<Schema.Struct<Fields>>['input']
15
+ : any;
14
16
 
15
17
  export type IntentResultData<Fields extends IntentParams> =
16
- S.Schema.Type<S.Struct<Fields>> extends { readonly output: any } ? S.Schema.Type<S.Struct<Fields>>['output'] : any;
18
+ Schema.Schema.Type<Schema.Struct<Fields>> extends { readonly output: any }
19
+ ? Schema.Schema.Type<Schema.Struct<Fields>>['output']
20
+ : any;
17
21
 
18
- export type IntentSchema<Tag extends string, Fields extends IntentParams> = S.TaggedClass<any, Tag, Fields>;
22
+ export type IntentSchema<Tag extends string, Fields extends IntentParams> = Schema.TaggedClass<any, Tag, Fields>;
19
23
 
20
24
  /**
21
25
  * An intent is an abstract description of an operation to be performed.
@@ -34,13 +38,6 @@ export type Intent<Tag extends string, Fields extends IntentParams> = {
34
38
  */
35
39
  data: IntentData<Fields>;
36
40
 
37
- /**
38
- * Module ID.
39
- * If specified, the intent will be sent explicitly to the plugin module.
40
- * Otherwise, the intent will be sent to all plugins, in order and the first to resolve a non-null value will be used.
41
- */
42
- module?: string;
43
-
44
41
  /**
45
42
  * Whether or not the intent is being undone.
46
43
  */
@@ -76,11 +73,11 @@ export type AnyIntentChain = IntentChain<any, any, any, any>;
76
73
  export const createIntent = <Tag extends string, Fields extends IntentParams>(
77
74
  schema: IntentSchema<Tag, Fields>,
78
75
  data: IntentData<Fields> = {},
79
- params: Pick<AnyIntent, 'module' | 'undo'> = {},
76
+ params: Pick<AnyIntent, 'undo'> = {},
80
77
  ): IntentChain<Tag, Tag, Fields, Fields> => {
81
78
  // The output of validateSync breaks proxy objects so this is just used for validation.
82
79
  // TODO(wittjosiah): Is there a better way to make theses types align?
83
- const _ = S.validateSync(schema.fields.input as S.Schema<any, any, unknown>)(data);
80
+ const _ = Schema.validateSync(schema.fields.input as Schema.Schema<any, any, unknown>)(data);
84
81
  const intent = {
85
82
  ...params,
86
83
  _schema: schema,
@@ -112,7 +109,7 @@ export const chain =
112
109
  >(
113
110
  schema: IntentSchema<NextTag, NextFields>,
114
111
  data: Omit<IntentData<NextFields>, keyof IntentResultData<LastFields>> = {},
115
- params: Pick<AnyIntent, 'module' | 'undo'> = {},
112
+ params: Pick<AnyIntent, 'undo'> = {},
116
113
  ) =>
117
114
  (
118
115
  intent: IntentChain<FirstTag, any, FirstFields, LastFields>,
@@ -139,8 +136,13 @@ export const chain =
139
136
 
140
137
  // NOTE: Should maintain compatibility with `i18next` (and @dxos/react-ui).
141
138
  // TODO(wittjosiah): Making this immutable breaks type compatibility.
142
- export const Label = S.Union(
143
- S.String,
144
- S.mutable(S.Tuple(S.String, S.mutable(S.Struct({ ns: S.String, count: S.optional(S.Number) })))),
139
+ export const Label = Schema.Union(
140
+ Schema.String,
141
+ Schema.mutable(
142
+ Schema.Tuple(
143
+ Schema.String,
144
+ Schema.mutable(Schema.Struct({ ns: Schema.String, count: Schema.optional(Schema.Number) })),
145
+ ),
146
+ ),
145
147
  );
146
- export type Label = S.Schema.Type<typeof Label>;
148
+ export type Label = Schema.Schema.Type<typeof Label>;
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Schema as S } from 'effect';
5
+ import { Schema } from 'effect';
6
6
 
7
7
  export const SETTINGS_PLUGIN = 'dxos.org/plugin/settings';
8
8
  export const SETTINGS_ACTION = `${SETTINGS_PLUGIN}/action`;
@@ -12,18 +12,18 @@ export const SETTINGS_ID = '!dxos:settings';
12
12
  export const SETTINGS_KEY = 'settings';
13
13
 
14
14
  export namespace SettingsAction {
15
- export class Open extends S.TaggedClass<Open>()(`${SETTINGS_ACTION}/open`, {
16
- input: S.Struct({
17
- plugin: S.optional(S.String),
15
+ export class Open extends Schema.TaggedClass<Open>()(`${SETTINGS_ACTION}/open`, {
16
+ input: Schema.Struct({
17
+ plugin: Schema.optional(Schema.String),
18
18
  }),
19
- output: S.Void,
19
+ output: Schema.Void,
20
20
  }) {}
21
21
 
22
- export class OpenPluginRegistry extends S.TaggedClass<OpenPluginRegistry>()(
22
+ export class OpenPluginRegistry extends Schema.TaggedClass<OpenPluginRegistry>()(
23
23
  `${SETTINGS_ACTION}/open-plugin-registry`,
24
24
  {
25
- input: S.Void,
26
- output: S.Void,
25
+ input: Schema.Void,
26
+ output: Schema.Void,
27
27
  },
28
28
  ) {}
29
29
  }
@@ -2,121 +2,156 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { createExtension, type Node } from '@dxos/app-graph';
5
+ import { Rx } from '@effect-rx/rx-react';
6
+ import { Option, pipe } from 'effect';
7
+
8
+ import { createExtension, ROOT_ID } from '@dxos/app-graph';
6
9
  import { type SettingsStore, type SettingsValue } from '@dxos/local-storage';
7
10
  import { isNonNullable } from '@dxos/util';
8
11
 
9
12
  import { SETTINGS_ID, SETTINGS_KEY, SETTINGS_PLUGIN, SettingsAction } from './actions';
10
13
  import { Capabilities } from '../common';
11
- import { contributes, type PluginMeta, type PluginsContext } from '../core';
14
+ import { contributes, type PluginMeta, type PluginContext } from '../core';
12
15
  import { createIntent } from '../plugin-intent';
13
16
 
14
- export default (context: PluginsContext) =>
17
+ export default (context: PluginContext) =>
15
18
  contributes(Capabilities.AppGraphBuilder, [
16
19
  createExtension({
17
20
  id: `${SETTINGS_PLUGIN}/action`,
18
- filter: (node): node is Node<null> => node.id === 'root',
19
- actions: () => [
20
- {
21
- id: SETTINGS_PLUGIN,
22
- data: async () => {
23
- const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
24
- await dispatch(createIntent(SettingsAction.Open));
25
- },
26
- properties: {
27
- label: ['open settings label', { ns: SETTINGS_PLUGIN }],
28
- icon: 'ph--gear--regular',
29
- keyBinding: {
30
- macos: 'meta+,',
31
- windows: 'alt+,',
32
- },
33
- },
34
- },
35
- ],
21
+ actions: (node) =>
22
+ Rx.make((get) =>
23
+ pipe(
24
+ get(node),
25
+ Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
26
+ Option.map(() => [
27
+ {
28
+ id: SETTINGS_PLUGIN,
29
+ data: async () => {
30
+ const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
31
+ await dispatch(createIntent(SettingsAction.Open));
32
+ },
33
+ properties: {
34
+ label: ['open settings label', { ns: SETTINGS_PLUGIN }],
35
+ icon: 'ph--gear--regular',
36
+ disposition: 'menu',
37
+ keyBinding: {
38
+ macos: 'meta+,',
39
+ windows: 'alt+,',
40
+ },
41
+ },
42
+ },
43
+ ]),
44
+ Option.getOrElse(() => []),
45
+ ),
46
+ ),
36
47
  }),
37
48
  createExtension({
38
49
  id: `${SETTINGS_PLUGIN}/core`,
39
- filter: (node): node is Node<null> => node.id === 'root',
40
- connector: () => [
41
- {
42
- id: SETTINGS_ID,
43
- type: SETTINGS_PLUGIN,
44
- properties: {
45
- label: ['app settings label', { ns: SETTINGS_PLUGIN }],
46
- icon: 'ph--gear--regular',
47
- disposition: 'pin-end',
48
- position: 'hoist',
49
- testId: 'treeView.appSettings',
50
- },
51
- },
52
- ],
50
+ connector: (node) =>
51
+ Rx.make((get) =>
52
+ pipe(
53
+ get(node),
54
+ Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
55
+ Option.map(() => [
56
+ {
57
+ id: SETTINGS_ID,
58
+ type: SETTINGS_PLUGIN,
59
+ properties: {
60
+ label: ['app settings label', { ns: SETTINGS_PLUGIN }],
61
+ icon: 'ph--gear--regular',
62
+ disposition: 'pin-end',
63
+ position: 'hoist',
64
+ testId: 'treeView.appSettings',
65
+ },
66
+ },
67
+ ]),
68
+ Option.getOrElse(() => []),
69
+ ),
70
+ ),
53
71
  }),
54
72
  createExtension({
55
73
  id: `${SETTINGS_PLUGIN}/core-plugins`,
56
- filter: (node): node is Node<null> => node.id === SETTINGS_ID,
57
- connector: () => {
58
- const manager = context.requestCapability(Capabilities.PluginManager);
59
- const [settingsStore] = context.requestCapabilities(Capabilities.SettingsStore);
60
- return [
61
- ...manager.plugins
62
- .filter((plugin) => manager.core.includes(plugin.meta.id))
63
- .map((plugin): [PluginMeta, SettingsStore<SettingsValue>] | null => {
64
- const settings = settingsStore?.getStore(plugin.meta.id);
65
- if (!settings) {
66
- return null;
67
- }
74
+ connector: (node) =>
75
+ Rx.make((get) =>
76
+ pipe(
77
+ get(node),
78
+ Option.flatMap((node) => (node.id !== SETTINGS_ID ? Option.none() : Option.some(node))),
79
+ Option.map(() => {
80
+ const manager = get(context.capability(Capabilities.PluginManager));
81
+ const [settingsStore] = get(context.capabilities(Capabilities.SettingsStore));
82
+ return [
83
+ ...manager.plugins
84
+ .filter((plugin) => manager.core.includes(plugin.meta.id))
85
+ .map((plugin): [PluginMeta, SettingsStore<SettingsValue>] | null => {
86
+ const settings = settingsStore?.getStore(plugin.meta.id);
87
+ if (!settings) {
88
+ return null;
89
+ }
68
90
 
69
- return [plugin.meta, settings];
70
- })
71
- .filter(isNonNullable)
72
- .map(([meta, settings]) => ({
73
- id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,
74
- type: 'category',
75
- data: settings,
76
- properties: {
77
- label: meta.name ?? meta.id,
78
- icon: meta.icon ?? 'ph--circle--regular',
79
- },
80
- })),
91
+ return [plugin.meta, settings];
92
+ })
93
+ .filter(isNonNullable)
94
+ .map(([meta, settings]) => ({
95
+ id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,
96
+ type: 'category',
97
+ data: settings,
98
+ properties: {
99
+ label: meta.name ?? meta.id,
100
+ icon: meta.icon ?? 'ph--circle--regular',
101
+ },
102
+ })),
81
103
 
82
- {
83
- id: `${SETTINGS_KEY}:custom-plugins`,
84
- type: 'collection',
85
- properties: {
86
- label: ['custom plugins label', { ns: SETTINGS_PLUGIN }],
87
- icon: 'ph--squares-four--regular',
88
- role: 'branch',
89
- },
90
- },
91
- ];
92
- },
104
+ {
105
+ id: `${SETTINGS_KEY}:custom-plugins`,
106
+ type: 'category',
107
+ properties: {
108
+ label: ['custom plugins label', { ns: SETTINGS_PLUGIN }],
109
+ icon: 'ph--squares-four--regular',
110
+ role: 'branch',
111
+ disposition: 'collection',
112
+ },
113
+ },
114
+ ];
115
+ }),
116
+ Option.getOrElse(() => []),
117
+ ),
118
+ ),
93
119
  }),
94
120
  createExtension({
95
121
  id: `${SETTINGS_PLUGIN}/custom-plugins`,
96
- filter: (node): node is Node<null> => node.id === `${SETTINGS_KEY}:custom-plugins`,
97
- connector: () => {
98
- const manager = context.requestCapability(Capabilities.PluginManager);
99
- const [settingsStore] = context.requestCapabilities(Capabilities.SettingsStore);
100
- return manager.plugins
101
- .filter((plugin) => !manager.core.includes(plugin.meta.id))
102
- .map((plugin): [PluginMeta, SettingsStore<SettingsValue>] | null => {
103
- const settings = settingsStore?.getStore(plugin.meta.id);
104
- if (!settings) {
105
- return null;
106
- }
122
+ connector: (node) =>
123
+ Rx.make((get) =>
124
+ pipe(
125
+ get(node),
126
+ Option.flatMap((node) =>
127
+ node.id !== `${SETTINGS_KEY}:custom-plugins` ? Option.none() : Option.some(node),
128
+ ),
129
+ Option.map(() => {
130
+ const manager = get(context.capability(Capabilities.PluginManager));
131
+ const [settingsStore] = get(context.capabilities(Capabilities.SettingsStore));
132
+ return manager.plugins
133
+ .filter((plugin) => !manager.core.includes(plugin.meta.id))
134
+ .map((plugin): [PluginMeta, SettingsStore<SettingsValue>] | null => {
135
+ const settings = settingsStore?.getStore(plugin.meta.id);
136
+ if (!settings) {
137
+ return null;
138
+ }
107
139
 
108
- return [plugin.meta, settings];
109
- })
110
- .filter(isNonNullable)
111
- .map(([meta, settings]) => ({
112
- id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,
113
- type: 'category',
114
- data: settings,
115
- properties: {
116
- label: meta.name ?? meta.id,
117
- icon: meta.icon ?? 'ph--circle--regular',
118
- },
119
- }));
120
- },
140
+ return [plugin.meta, settings];
141
+ })
142
+ .filter(isNonNullable)
143
+ .map(([meta, settings]) => ({
144
+ id: `${SETTINGS_KEY}:${meta.id.replaceAll('/', ':')}`,
145
+ type: 'category',
146
+ data: settings,
147
+ properties: {
148
+ label: meta.name ?? meta.id,
149
+ icon: meta.icon ?? 'ph--circle--regular',
150
+ },
151
+ }));
152
+ }),
153
+ Option.getOrElse(() => []),
154
+ ),
155
+ ),
121
156
  }),
122
157
  ]);
@@ -2,29 +2,32 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { effect } from '@preact/signals-core';
6
-
7
5
  import { RootSettingsStore } from '@dxos/local-storage';
8
6
 
9
7
  import { Capabilities } from '../common';
10
- import { contributes, type PluginsContext } from '../core';
8
+ import { contributes, type PluginContext } from '../core';
11
9
 
12
- export default (context: PluginsContext) => {
10
+ export default (context: PluginContext) => {
11
+ // TODO(wittjosiah): Replace with rx?
13
12
  const settingsStore = new RootSettingsStore();
14
13
 
15
14
  let previous: Capabilities.Settings[] = [];
16
- const unsubscribe = effect(() => {
17
- const allSettings = context.requestCapabilities(Capabilities.Settings);
18
- const added = allSettings.filter((setting) => !previous.includes(setting));
19
- const removed = previous.filter((setting) => !allSettings.includes(setting));
20
- previous = allSettings;
21
- added.forEach((setting) => {
22
- settingsStore.createStore(setting as any);
23
- });
24
- removed.forEach((setting) => {
25
- settingsStore.removeStore(setting.prefix);
26
- });
27
- });
15
+ const registry = context.getCapability(Capabilities.RxRegistry);
16
+ const cancel = registry.subscribe(
17
+ context.capabilities(Capabilities.Settings),
18
+ (allSettings) => {
19
+ const added = allSettings.filter((setting) => !previous.includes(setting));
20
+ const removed = previous.filter((setting) => !allSettings.includes(setting));
21
+ previous = allSettings;
22
+ added.forEach((setting) => {
23
+ settingsStore.createStore(setting as any);
24
+ });
25
+ removed.forEach((setting) => {
26
+ settingsStore.removeStore(setting.prefix);
27
+ });
28
+ },
29
+ { immediate: true },
30
+ );
28
31
 
29
- return contributes(Capabilities.SettingsStore, settingsStore, () => unsubscribe());
32
+ return contributes(Capabilities.SettingsStore, settingsStore, () => cancel());
30
33
  };
@@ -87,7 +87,7 @@ export default {
87
87
  );
88
88
  },
89
89
  // NOTE: Intentionally not using withPluginManager to try to reduce surface area of the story.
90
- decorators: [withTheme, withLayout({ tooltips: true })],
90
+ decorators: [withTheme, withLayout()],
91
91
  args: {
92
92
  manager: setupPluginManager(),
93
93
  },
@@ -10,7 +10,7 @@ import { byPosition } from '@dxos/util';
10
10
  import { ErrorBoundary } from './ErrorBoundary';
11
11
  import { useCapabilities } from './useCapabilities';
12
12
  import { Capabilities, type SurfaceDefinition, type SurfaceProps } from '../common';
13
- import { type PluginsContext } from '../core';
13
+ import { type PluginContext } from '../core';
14
14
 
15
15
  const DEFAULT_PLACEHOLDER = <Fragment />;
16
16
 
@@ -34,8 +34,8 @@ const findCandidates = (surfaces: SurfaceDefinition[], { role, data }: Pick<Surf
34
34
  /**
35
35
  * @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
36
36
  */
37
- export const isSurfaceAvailable = (context: PluginsContext, { role, data }: Pick<SurfaceProps, 'role' | 'data'>) => {
38
- const surfaces = context.requestCapabilities(Capabilities.ReactSurface);
37
+ export const isSurfaceAvailable = (context: PluginContext, { role, data }: Pick<SurfaceProps, 'role' | 'data'>) => {
38
+ const surfaces = context.getCapabilities(Capabilities.ReactSurface);
39
39
  const candidates = findCandidates(surfaces.flat(), { role, data });
40
40
  return candidates.length > 0;
41
41
  };
@@ -2,8 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { computed } from '@preact/signals-core';
6
- import { useMemo } from 'react';
5
+ import { useRxValue } from '@effect-rx/rx-react';
6
+
7
+ import { invariant } from '@dxos/invariant';
7
8
 
8
9
  import { usePluginManager } from './PluginManagerProvider';
9
10
  import { type InterfaceDef } from '../core';
@@ -12,17 +13,9 @@ import { type InterfaceDef } from '../core';
12
13
  * Hook to request capabilities from the plugin context.
13
14
  * @returns An array of capabilities.
14
15
  */
15
- export const useCapabilities = <T, U extends T = T>(
16
- interfaceDef: InterfaceDef<T>,
17
- filter?: (capability: T, moduleId: string) => capability is U,
18
- ) => {
16
+ export const useCapabilities = <T>(interfaceDef: InterfaceDef<T>) => {
19
17
  const manager = usePluginManager();
20
- const signal = useMemo(
21
- () => computed(() => manager.context.requestCapabilities(interfaceDef, filter)),
22
- [interfaceDef],
23
- );
24
-
25
- return signal.value;
18
+ return useRxValue(manager.context.capabilities(interfaceDef));
26
19
  };
27
20
 
28
21
  /**
@@ -30,11 +23,8 @@ export const useCapabilities = <T, U extends T = T>(
30
23
  * @returns The capability.
31
24
  * @throws If no capability is found.
32
25
  */
33
- export const useCapability = <T, U extends T = T>(
34
- interfaceDef: InterfaceDef<T>,
35
- filter?: (capability: T, moduleId: string) => capability is U,
36
- ) => {
37
- const manager = usePluginManager();
38
- const signal = useMemo(() => computed(() => manager.context.requestCapability(interfaceDef, filter)), [interfaceDef]);
39
- return signal.value;
26
+ export const useCapability = <T>(interfaceDef: InterfaceDef<T>) => {
27
+ const capabilities = useCapabilities(interfaceDef);
28
+ invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);
29
+ return capabilities[0];
40
30
  };
@@ -1,6 +1,5 @@
1
1
  //
2
2
  // Copyright 2025 DXOS.org
3
-
4
3
  //
5
4
 
6
5
  import React from 'react';
@@ -16,8 +16,16 @@ import {
16
16
  defineModule,
17
17
  definePlugin,
18
18
  PluginManager,
19
+ type PluginContext,
19
20
  } from '../core';
20
21
 
22
+ // TODO(burdon): Factor out (use consistently in plugin framework?)
23
+ export type Provider<C, R> = (context: C) => R;
24
+ export type ProviderOrValue<C, R> = Provider<C, R> | R;
25
+ export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context: C): R => {
26
+ return typeof providerOrValue === 'function' ? (providerOrValue as Provider<C, R>)(context) : providerOrValue;
27
+ };
28
+
21
29
  /**
22
30
  * @internal
23
31
  */
@@ -26,7 +34,7 @@ export const setupPluginManager = ({
26
34
  plugins = [],
27
35
  core = plugins.map(({ meta }) => meta.id),
28
36
  ...options
29
- }: CreateAppOptions & { capabilities?: AnyCapability[] } = {}) => {
37
+ }: CreateAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
30
38
  const pluginManager = new PluginManager({
31
39
  pluginLoader: () => raise(new Error('Not implemented')),
32
40
  plugins: [StoryPlugin(), ...plugins],
@@ -35,7 +43,7 @@ export const setupPluginManager = ({
35
43
  });
36
44
 
37
45
  if (capabilities) {
38
- capabilities.forEach((capability) => {
46
+ getValue(capabilities, pluginManager.context).forEach((capability) => {
39
47
  pluginManager.context.contributeCapability({
40
48
  interface: capability.interface,
41
49
  implementation: capability.implementation,
@@ -48,7 +56,7 @@ export const setupPluginManager = ({
48
56
  };
49
57
 
50
58
  export type WithPluginManagerOptions = CreateAppOptions & {
51
- capabilities?: AnyCapability[];
59
+ capabilities?: ProviderOrValue<PluginContext, AnyCapability[]>;
52
60
  fireEvents?: (ActivationEvent | string)[];
53
61
  };
54
62
 
package/tsconfig.json CHANGED
@@ -17,6 +17,9 @@
17
17
  {
18
18
  "path": "../../common/invariant"
19
19
  },
20
+ {
21
+ "path": "../../common/keys"
22
+ },
20
23
  {
21
24
  "path": "../../common/local-storage"
22
25
  },
@@ -1 +1 @@
1
- window.navigationData = "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"
1
+ window.navigationData = "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"