@dxos/app-framework 0.8.4-main.84f28bd → 0.8.4-main.a4bbb77
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.
- package/.storybook/main.mts +11 -0
- package/.storybook/preview.mts +8 -0
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/.swc/plugins/{v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 → linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7} +0 -0
- package/dist/lib/browser/{app-graph-builder-BGGXLD6T.mjs → app-graph-builder-XH4OYQLC.mjs} +25 -25
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-2636QSIK.mjs → chunk-6V54SRFL.mjs} +390 -270
- package/dist/lib/browser/chunk-6V54SRFL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ORWHM7CO.mjs → chunk-RGKMLI6U.mjs} +10 -7
- package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +7 -0
- package/dist/lib/browser/{chunk-DHZB7HG7.mjs → chunk-ZZVFNUHZ.mjs} +189 -135
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +20 -28
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs → intent-dispatcher-VFMJVO2M.mjs} +2 -2
- package/dist/lib/browser/{intent-resolver-O67UANYP.mjs → intent-resolver-ICAPD4JL.mjs} +5 -5
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{store-LFKDWHUQ.mjs → store-7ZGMHOGB.mjs} +4 -4
- package/dist/lib/browser/{store-LFKDWHUQ.mjs.map → store-7ZGMHOGB.mjs.map} +2 -2
- package/dist/lib/browser/testing/index.mjs +14 -19
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/worker.mjs +7 -9
- package/dist/lib/node-esm/{app-graph-builder-QHIJUYYW.mjs → app-graph-builder-C7H22SOL.mjs} +25 -25
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-NJAFK626.mjs → chunk-AXSZKZFD.mjs} +189 -135
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-UMZQERLE.mjs → chunk-LKPMRTRR.mjs} +10 -7
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-VSKRV3NW.mjs → chunk-SOVTUUAY.mjs} +390 -270
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +20 -28
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-dispatcher-5PRM3KGH.mjs → intent-dispatcher-SAPOKSLZ.mjs} +2 -2
- package/dist/lib/node-esm/{intent-resolver-K3D4BXQQ.mjs → intent-resolver-CRNJ6BMD.mjs} +5 -5
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{store-53XDUBMD.mjs → store-H4F4RMYD.mjs} +4 -4
- package/dist/lib/node-esm/{store-53XDUBMD.mjs.map → store-H4F4RMYD.mjs.map} +2 -2
- package/dist/lib/node-esm/testing/index.mjs +14 -19
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/worker.mjs +7 -9
- package/dist/types/src/common/capabilities.d.ts +85 -9
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/collaboration.d.ts +9 -8
- package/dist/types/src/common/collaboration.d.ts.map +1 -1
- package/dist/types/src/common/events.d.ts.map +1 -1
- package/dist/types/src/common/layout.d.ts +0 -2
- package/dist/types/src/common/layout.d.ts.map +1 -1
- package/dist/types/src/common/surface.d.ts +7 -13
- package/dist/types/src/common/surface.d.ts.map +1 -1
- package/dist/types/src/components/App.d.ts +10 -0
- package/dist/types/src/components/App.d.ts.map +1 -0
- package/dist/types/src/components/App.stories.d.ts +14 -0
- package/dist/types/src/components/App.stories.d.ts.map +1 -0
- package/dist/types/src/components/DefaultFallback.d.ts +8 -0
- package/dist/types/src/components/DefaultFallback.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +2 -0
- package/dist/types/src/components/index.d.ts.map +1 -0
- package/dist/types/src/{App.d.ts → components/useApp.d.ts} +7 -6
- package/dist/types/src/components/useApp.d.ts.map +1 -0
- package/dist/types/src/components/useLoading.d.ts +19 -0
- package/dist/types/src/components/useLoading.d.ts.map +1 -0
- package/dist/types/src/core/capabilities.d.ts +4 -1
- package/dist/types/src/core/capabilities.d.ts.map +1 -1
- package/dist/types/src/core/manager.d.ts +6 -2
- package/dist/types/src/core/manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin.d.ts +4 -1
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/playground/debug/Debug.d.ts +1 -1
- package/dist/types/src/playground/debug/plugin.d.ts +1 -1
- package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/generator/Main.d.ts +1 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +1 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
- package/dist/types/src/playground/generator/generator.d.ts +1 -1
- package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
- package/dist/types/src/playground/generator/plugin.d.ts +1 -1
- package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/layout/Layout.d.ts +2 -2
- package/dist/types/src/playground/layout/plugin.d.ts +1 -1
- package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +1 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
- package/dist/types/src/playground/logger/plugin.d.ts +1 -1
- package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/playground.stories.d.ts +5 -4
- package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts +1 -1
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/actions.d.ts +4 -6
- package/dist/types/src/plugin-intent/actions.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/errors.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/index.d.ts +1 -0
- package/dist/types/src/plugin-intent/index.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +3 -3
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/meta.d.ts +3 -0
- package/dist/types/src/plugin-intent/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +1 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/actions.d.ts +4 -6
- package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +1 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/intent-resolver.d.ts +1 -1
- package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/meta.d.ts +3 -0
- package/dist/types/src/plugin-settings/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-settings/store.d.ts +1 -1
- package/dist/types/src/plugin-settings/store.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/translations.d.ts +2 -1
- package/dist/types/src/plugin-settings/translations.d.ts.map +1 -1
- package/dist/types/src/react/ErrorBoundary.d.ts +13 -14
- package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -1
- package/dist/types/src/react/IntentContext.d.ts.map +1 -1
- package/dist/types/src/react/Surface.d.ts +2 -2
- package/dist/types/src/react/Surface.d.ts.map +1 -1
- package/dist/types/src/react/Surface.stories.d.ts +6 -5
- package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
- package/dist/types/src/react/common.d.ts.map +1 -1
- package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts +6 -6
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +4 -0
- package/package.json +34 -29
- package/src/common/capabilities.ts +113 -12
- package/src/common/collaboration.ts +5 -8
- package/src/common/events.ts +3 -1
- package/src/common/layout.ts +2 -3
- package/src/common/surface.ts +15 -18
- package/src/components/App.stories.tsx +33 -0
- package/src/components/App.tsx +59 -0
- package/src/components/DefaultFallback.tsx +26 -0
- package/src/components/index.ts +5 -0
- package/src/{App.tsx → components/useApp.tsx} +24 -136
- package/src/components/useLoading.tsx +70 -0
- package/src/core/capabilities.test.ts +1 -1
- package/src/core/capabilities.ts +11 -6
- package/src/core/manager.test.ts +21 -20
- package/src/core/manager.ts +132 -54
- package/src/core/plugin.ts +8 -2
- package/src/helpers.test.ts +1 -1
- package/src/index.ts +1 -1
- package/src/playground/debug/Debug.tsx +1 -1
- package/src/playground/debug/plugin.ts +7 -8
- package/src/playground/generator/Toolbar.tsx +2 -1
- package/src/playground/generator/generator.ts +3 -3
- package/src/playground/generator/plugin.ts +12 -13
- package/src/playground/layout/plugin.ts +10 -9
- package/src/playground/logger/Toolbar.tsx +2 -1
- package/src/playground/logger/plugin.ts +30 -25
- package/src/playground/playground.stories.tsx +20 -16
- package/src/plugin-intent/IntentPlugin.ts +13 -13
- package/src/plugin-intent/actions.ts +3 -5
- package/src/plugin-intent/errors.ts +1 -0
- package/src/plugin-intent/index.ts +1 -0
- package/src/plugin-intent/intent-dispatcher.test.ts +1 -1
- package/src/plugin-intent/intent-dispatcher.ts +9 -8
- package/src/plugin-intent/meta.ts +10 -0
- package/src/plugin-settings/SettingsPlugin.ts +27 -28
- package/src/plugin-settings/actions.ts +8 -12
- package/src/plugin-settings/app-graph-builder.ts +14 -12
- package/src/plugin-settings/intent-resolver.ts +3 -2
- package/src/plugin-settings/meta.ts +10 -0
- package/src/plugin-settings/store.ts +1 -1
- package/src/plugin-settings/translations.ts +3 -3
- package/src/react/ErrorBoundary.tsx +24 -15
- package/src/react/IntentContext.tsx +3 -2
- package/src/react/Surface.stories.tsx +23 -18
- package/src/react/Surface.tsx +14 -5
- package/src/react/common.ts +2 -1
- package/src/react/useCapabilities.ts +2 -1
- package/src/testing/withPluginManager.stories.tsx +9 -5
- package/src/testing/withPluginManager.tsx +25 -29
- package/tsconfig.json +5 -9
- package/vitest.config.ts +8 -6
- package/.eslintrc.cjs +0 -9
- package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
- package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
- package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
- package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
- package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
- package/dist/types/src/App.d.ts.map +0 -1
- package/typedoc/.nojekyll +0 -1
- package/typedoc/assets/hierarchy.js +0 -1
- package/typedoc/assets/highlight.css +0 -106
- package/typedoc/assets/icons.js +0 -18
- package/typedoc/assets/icons.svg +0 -1
- package/typedoc/assets/main.js +0 -60
- package/typedoc/assets/navigation.js +0 -1
- package/typedoc/assets/search.js +0 -1
- package/typedoc/assets/style.css +0 -1640
- package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
- package/typedoc/classes/ErrorBoundary.html +0 -125
- package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
- package/typedoc/classes/IntentAction.Track.html +0 -266
- package/typedoc/classes/LayoutAction.AddToast.html +0 -265
- package/typedoc/classes/LayoutAction.Close.html +0 -382
- package/typedoc/classes/LayoutAction.Expose.html +0 -265
- package/typedoc/classes/LayoutAction.Open.html +0 -1123
- package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
- package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
- package/typedoc/classes/LayoutAction.Set.html +0 -460
- package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
- package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
- package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
- package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
- package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
- package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
- package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
- package/typedoc/classes/Plugin.html +0 -6
- package/typedoc/classes/PluginContext.html +0 -38
- package/typedoc/classes/PluginManager.html +0 -43
- package/typedoc/classes/PluginModule.html +0 -18
- package/typedoc/classes/SettingsAction.Open.html +0 -226
- package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
- package/typedoc/functions/Events.createStateEvent.html +0 -2
- package/typedoc/functions/IntentPlugin.html +0 -1
- package/typedoc/functions/SettingsPlugin.html +0 -1
- package/typedoc/functions/allOf.html +0 -2
- package/typedoc/functions/chain.html +0 -3
- package/typedoc/functions/contributes.html +0 -2
- package/typedoc/functions/createDispatcher.html +0 -3
- package/typedoc/functions/createIntent.html +0 -6
- package/typedoc/functions/createResolver.html +0 -2
- package/typedoc/functions/createSurface.html +0 -2
- package/typedoc/functions/defineCapability.html +0 -2
- package/typedoc/functions/defineEvent.html +0 -2
- package/typedoc/functions/defineModule.html +0 -2
- package/typedoc/functions/definePlugin.html +0 -2
- package/typedoc/functions/eventKey.html +0 -2
- package/typedoc/functions/getEvents.html +0 -2
- package/typedoc/functions/isAllOf.html +0 -2
- package/typedoc/functions/isOneOf.html +0 -2
- package/typedoc/functions/isSurfaceAvailable.html +0 -2
- package/typedoc/functions/lazy.html +0 -2
- package/typedoc/functions/oneOf.html +0 -2
- package/typedoc/functions/useApp.html +0 -6
- package/typedoc/functions/useAppGraph.html +0 -1
- package/typedoc/functions/useCapabilities.html +0 -3
- package/typedoc/functions/useCapability.html +0 -4
- package/typedoc/functions/useIntentDispatcher.html +0 -1
- package/typedoc/functions/useIntentResolver.html +0 -1
- package/typedoc/functions/useLayout.html +0 -1
- package/typedoc/functions/usePluginManager.html +0 -2
- package/typedoc/hierarchy.html +0 -1
- package/typedoc/index.html +0 -12
- package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
- package/typedoc/media/LICENSE +0 -8
- package/typedoc/modules/Capabilities.html +0 -1
- package/typedoc/modules/CollaborationActions.html +0 -1
- package/typedoc/modules/Events.html +0 -1
- package/typedoc/modules/IntentAction.html +0 -1
- package/typedoc/modules/LayoutAction.html +0 -2
- package/typedoc/modules/SettingsAction.html +0 -1
- package/typedoc/modules.html +0 -1
- package/typedoc/types/ActivationEvent.html +0 -8
- package/typedoc/types/ActivationEvents.html +0 -2
- package/typedoc/types/AnyCapability.html +0 -1
- package/typedoc/types/AnyIntent.html +0 -1
- package/typedoc/types/AnyIntentChain.html +0 -1
- package/typedoc/types/AnyIntentEffectResult.html +0 -1
- package/typedoc/types/AnyIntentResolver.html +0 -1
- package/typedoc/types/AnyIntentResult.html +0 -1
- package/typedoc/types/Capabilities.FileUploader.html +0 -1
- package/typedoc/types/Capabilities.IntentResolver.html +0 -1
- package/typedoc/types/Capabilities.Layout.html +0 -1
- package/typedoc/types/Capabilities.Metadata.html +0 -1
- package/typedoc/types/Capabilities.ReactContext.html +0 -1
- package/typedoc/types/Capabilities.ReactRoot.html +0 -1
- package/typedoc/types/Capabilities.ReactSurface.html +0 -1
- package/typedoc/types/Capabilities.Settings.html +0 -4
- package/typedoc/types/Capability.html +0 -9
- package/typedoc/types/CreateAppOptions.html +0 -10
- package/typedoc/types/FileInfo.html +0 -1
- package/typedoc/types/Intent.html +0 -10
- package/typedoc/types/IntentChain.html +0 -6
- package/typedoc/types/IntentContext.html +0 -5
- package/typedoc/types/IntentData.html +0 -1
- package/typedoc/types/IntentDispatcher.html +0 -2
- package/typedoc/types/IntentDispatcherResult.html +0 -2
- package/typedoc/types/IntentEffectDefinition.html +0 -2
- package/typedoc/types/IntentEffectResult.html +0 -15
- package/typedoc/types/IntentParams.html +0 -3
- package/typedoc/types/IntentResolver.html +0 -2
- package/typedoc/types/IntentResultData.html +0 -1
- package/typedoc/types/IntentSchema.html +0 -1
- package/typedoc/types/IntentUndo.html +0 -2
- package/typedoc/types/InterfaceDef.html +0 -4
- package/typedoc/types/Label.html +0 -1
- package/typedoc/types/NodeSerializer.html +0 -8
- package/typedoc/types/PluginManagerOptions.html +0 -6
- package/typedoc/types/PluginMeta.html +0 -21
- package/typedoc/types/PromiseIntentDispatcher.html +0 -2
- package/typedoc/types/PromiseIntentUndo.html +0 -2
- package/typedoc/types/Resource.html +0 -1
- package/typedoc/types/ResourceKey.html +0 -1
- package/typedoc/types/ResourceLanguage.html +0 -1
- package/typedoc/types/SerializedNode.html +0 -4
- package/typedoc/types/SurfaceComponent.html +0 -2
- package/typedoc/types/SurfaceDefinition.html +0 -2
- package/typedoc/types/SurfaceProps.html +0 -4
- package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
- package/typedoc/variables/Capabilities.AppGraph.html +0 -1
- package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
- package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
- package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
- package/typedoc/variables/Capabilities.FileUploader.html +0 -1
- package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
- package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
- package/typedoc/variables/Capabilities.Layout.html +0 -1
- package/typedoc/variables/Capabilities.Metadata.html +0 -1
- package/typedoc/variables/Capabilities.Null.html +0 -1
- package/typedoc/variables/Capabilities.PluginManager.html +0 -1
- package/typedoc/variables/Capabilities.ReactContext.html +0 -1
- package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
- package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
- package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
- package/typedoc/variables/Capabilities.Settings.html +0 -1
- package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
- package/typedoc/variables/Capabilities.Tools.html +0 -1
- package/typedoc/variables/Capabilities.Translations.html +0 -1
- package/typedoc/variables/Events.AppGraphReady.html +0 -2
- package/typedoc/variables/Events.DispatcherReady.html +0 -2
- package/typedoc/variables/Events.LayoutReady.html +0 -1
- package/typedoc/variables/Events.SettingsReady.html +0 -2
- package/typedoc/variables/Events.SetupAppGraph.html +0 -2
- package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
- package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
- package/typedoc/variables/Events.SetupMetadata.html +0 -2
- package/typedoc/variables/Events.SetupReactSurface.html +0 -2
- package/typedoc/variables/Events.SetupSettings.html +0 -2
- package/typedoc/variables/Events.SetupTranslations.html +0 -2
- package/typedoc/variables/Events.Startup.html +0 -2
- package/typedoc/variables/FileInfoSchema.html +0 -1
- package/typedoc/variables/INTENT_ACTION.html +0 -1
- package/typedoc/variables/INTENT_PLUGIN.html +0 -1
- package/typedoc/variables/LAYOUT_ACTION.html +0 -1
- package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
- package/typedoc/variables/Label.html +0 -1
- package/typedoc/variables/LayoutAction.Toast.html +0 -1
- package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
- package/typedoc/variables/PluginManagerProvider.html +0 -2
- package/typedoc/variables/Resource.html +0 -2
- package/typedoc/variables/ResourceKey.html +0 -1
- package/typedoc/variables/ResourceLanguage.html +0 -1
- package/typedoc/variables/SETTINGS_ACTION.html +0 -1
- package/typedoc/variables/SETTINGS_ID.html +0 -1
- package/typedoc/variables/SETTINGS_KEY.html +0 -1
- package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
- package/typedoc/variables/Surface.html +0 -2
- package/typedoc/variables/defaultFileTypes.html +0 -1
- /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → intent-dispatcher-VFMJVO2M.mjs.map} +0 -0
- /package/dist/lib/node-esm/{intent-dispatcher-5PRM3KGH.mjs.map → intent-dispatcher-SAPOKSLZ.mjs.map} +0 -0
package/src/core/manager.ts
CHANGED
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
import { Registry } from '@effect-rx/rx-react';
|
|
6
6
|
import { untracked } from '@preact/signals-core';
|
|
7
|
-
import { Array
|
|
7
|
+
import { Array, Duration, Effect, Fiber, HashSet, Match, Ref, pipe } from 'effect';
|
|
8
8
|
|
|
9
9
|
import { Event } from '@dxos/async';
|
|
10
|
-
import {
|
|
10
|
+
import { type Live, live } from '@dxos/live-object';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
import { type MaybePromise } from '@dxos/util';
|
|
13
13
|
|
|
14
14
|
import { type AnyCapability, PluginContext } from './capabilities';
|
|
15
15
|
import { type ActivationEvent, eventKey, getEvents, isAllOf } from './events';
|
|
16
|
-
import { type
|
|
16
|
+
import { type Plugin, type PluginModule } from './plugin';
|
|
17
17
|
|
|
18
18
|
// TODO(wittjosiah): Factor out?
|
|
19
19
|
const isPromise = (value: unknown): value is Promise<unknown> => {
|
|
@@ -52,6 +52,9 @@ export class PluginManager {
|
|
|
52
52
|
private readonly _state: Live<PluginManagerState>;
|
|
53
53
|
private readonly _pluginLoader: PluginManagerOptions['pluginLoader'];
|
|
54
54
|
private readonly _capabilities = new Map<string, AnyCapability[]>();
|
|
55
|
+
private readonly _moduleMemoMap = new Map<PluginModule['id'], Promise<AnyCapability[]>>();
|
|
56
|
+
private readonly _activatingEvents = Effect.runSync(Ref.make<string[]>([]));
|
|
57
|
+
private readonly _activatingModules = Effect.runSync(Ref.make<string[]>([]));
|
|
55
58
|
|
|
56
59
|
constructor({
|
|
57
60
|
pluginLoader,
|
|
@@ -74,8 +77,8 @@ export class PluginManager {
|
|
|
74
77
|
enabled,
|
|
75
78
|
modules: [],
|
|
76
79
|
active: [],
|
|
77
|
-
pendingReset: [],
|
|
78
80
|
eventsFired: [],
|
|
81
|
+
pendingReset: [],
|
|
79
82
|
});
|
|
80
83
|
plugins.forEach((plugin) => this._addPlugin(plugin));
|
|
81
84
|
core.forEach((id) => this.enable(id));
|
|
@@ -268,6 +271,7 @@ export class PluginManager {
|
|
|
268
271
|
private _addPlugin(plugin: Plugin): void {
|
|
269
272
|
untracked(() => {
|
|
270
273
|
log('add plugin', { id: plugin.meta.id });
|
|
274
|
+
// TODO(wittjosiah): Find a way to add a warning for duplicate plugins that doesn't cause log spam.
|
|
271
275
|
if (!this._state.plugins.includes(plugin)) {
|
|
272
276
|
this._state.plugins.push(plugin);
|
|
273
277
|
}
|
|
@@ -287,6 +291,7 @@ export class PluginManager {
|
|
|
287
291
|
private _addModule(module: PluginModule): void {
|
|
288
292
|
untracked(() => {
|
|
289
293
|
log('add module', { id: module.id });
|
|
294
|
+
// TODO(wittjosiah): Find a way to add a warning for duplicate modules that doesn't cause log spam.
|
|
290
295
|
if (!this._state.modules.includes(module)) {
|
|
291
296
|
this._state.modules.push(module);
|
|
292
297
|
}
|
|
@@ -329,7 +334,7 @@ export class PluginManager {
|
|
|
329
334
|
.map(eventKey)
|
|
330
335
|
.filter((key) => this._state.eventsFired.includes(key));
|
|
331
336
|
|
|
332
|
-
const pendingReset = Array.
|
|
337
|
+
const pendingReset = Array.fromIterable(new Set(activationEvents)).filter(
|
|
333
338
|
(event) => !this._state.pendingReset.includes(event),
|
|
334
339
|
);
|
|
335
340
|
if (pendingReset.length > 0) {
|
|
@@ -343,24 +348,42 @@ export class PluginManager {
|
|
|
343
348
|
* @internal
|
|
344
349
|
*/
|
|
345
350
|
// TODO(wittjosiah): Improve error typing.
|
|
346
|
-
_activate(
|
|
351
|
+
_activate(
|
|
352
|
+
event: ActivationEvent | string,
|
|
353
|
+
params?: { before?: string; after?: string },
|
|
354
|
+
): Effect.Effect<boolean, Error> {
|
|
347
355
|
return Effect.gen(this, function* () {
|
|
348
356
|
const key = typeof event === 'string' ? event : eventKey(event);
|
|
349
|
-
log('activating', { key });
|
|
357
|
+
log('activating', { key, ...params });
|
|
358
|
+
yield* Ref.update(this._activatingEvents, (activating) => Array.append(activating, key));
|
|
350
359
|
const pendingIndex = this._state.pendingReset.findIndex((event) => event === key);
|
|
351
360
|
if (pendingIndex !== -1) {
|
|
352
361
|
this._state.pendingReset.splice(pendingIndex, 1);
|
|
353
362
|
}
|
|
354
363
|
|
|
364
|
+
const activatingEvents = yield* this._activatingEvents;
|
|
365
|
+
const activatingModules = yield* this._activatingModules;
|
|
355
366
|
const modules = this._getInactiveModulesByEvent(key).filter((module) => {
|
|
356
367
|
const allOf = isAllOf(module.activatesOn);
|
|
357
368
|
if (!allOf) {
|
|
358
369
|
return true;
|
|
359
370
|
}
|
|
360
371
|
|
|
372
|
+
// Check to see if all of the events in the `allOf` have been fired.
|
|
373
|
+
// An event can be considered "fired" if it is in the `eventsFired` list or if it is currently being activated.
|
|
361
374
|
const events = module.activatesOn.events.filter((event) => eventKey(event) !== key);
|
|
362
|
-
return
|
|
375
|
+
return (
|
|
376
|
+
events.every(
|
|
377
|
+
(event) => this._state.eventsFired.includes(eventKey(event)) || activatingEvents.includes(eventKey(event)),
|
|
378
|
+
) && !activatingModules.includes(module.id)
|
|
379
|
+
);
|
|
363
380
|
});
|
|
381
|
+
yield* Ref.update(this._activatingModules, (activating) =>
|
|
382
|
+
Array.appendAll(
|
|
383
|
+
activating,
|
|
384
|
+
modules.map((module) => module.id),
|
|
385
|
+
),
|
|
386
|
+
);
|
|
364
387
|
if (modules.length === 0) {
|
|
365
388
|
log('no modules to activate', { key });
|
|
366
389
|
if (!this._state.eventsFired.includes(key)) {
|
|
@@ -372,31 +395,53 @@ export class PluginManager {
|
|
|
372
395
|
log('activating modules', { key, modules: modules.map((module) => module.id) });
|
|
373
396
|
this.activation.emit({ event: key, state: 'activating' });
|
|
374
397
|
|
|
398
|
+
// Fire activatesBefore events.
|
|
399
|
+
yield* pipe(
|
|
400
|
+
modules,
|
|
401
|
+
Array.flatMap((module) => module.activatesBefore ?? []),
|
|
402
|
+
HashSet.fromIterable,
|
|
403
|
+
HashSet.toValues,
|
|
404
|
+
Array.filter((event) => !activatingEvents.includes(eventKey(event))),
|
|
405
|
+
Array.map((event) => this._activate(event, { before: key })),
|
|
406
|
+
Effect.allWith({ concurrency: 'unbounded' }),
|
|
407
|
+
);
|
|
408
|
+
|
|
375
409
|
// Concurrently triggers loading of lazy capabilities.
|
|
376
|
-
const getCapabilities = yield*
|
|
377
|
-
modules
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
})
|
|
382
|
-
|
|
383
|
-
|
|
410
|
+
const getCapabilities = yield* pipe(
|
|
411
|
+
modules,
|
|
412
|
+
Array.map((mod) => this._loadModule(mod)),
|
|
413
|
+
Effect.allWith({ concurrency: 'unbounded' }),
|
|
414
|
+
Effect.catchAll((error) => {
|
|
415
|
+
this.activation.emit({ event: key, state: 'error', error });
|
|
416
|
+
return Effect.fail(error);
|
|
417
|
+
}),
|
|
384
418
|
);
|
|
385
419
|
|
|
386
|
-
|
|
420
|
+
// Contribute the capabilities from the activated modules.
|
|
421
|
+
yield* pipe(
|
|
387
422
|
modules,
|
|
388
|
-
|
|
389
|
-
|
|
423
|
+
Array.zip(getCapabilities),
|
|
424
|
+
Array.map(([module, capabilities]) => this._contributeCapabilities(module, capabilities)),
|
|
390
425
|
// TODO(wittjosiah): This currently can't be run in parallel.
|
|
391
426
|
// Running this with concurrency causes races with `allOf` activation events.
|
|
392
427
|
Effect.all,
|
|
393
|
-
Effect.either,
|
|
394
428
|
);
|
|
395
429
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
430
|
+
// Fire activatesAfter events.
|
|
431
|
+
yield* pipe(
|
|
432
|
+
modules,
|
|
433
|
+
Array.flatMap((module) => module.activatesAfter ?? []),
|
|
434
|
+
HashSet.fromIterable,
|
|
435
|
+
HashSet.toValues,
|
|
436
|
+
Array.filter((event) => !activatingEvents.includes(eventKey(event))),
|
|
437
|
+
Array.map((event) => this._activate(event, { after: key })),
|
|
438
|
+
Effect.allWith({ concurrency: 'unbounded' }),
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
yield* Ref.update(this._activatingEvents, (activating) => Array.filter(activating, (event) => event !== key));
|
|
442
|
+
yield* Ref.update(this._activatingModules, (activating) =>
|
|
443
|
+
Array.filter(activating, (module) => !modules.map((module) => module.id).includes(module)),
|
|
444
|
+
);
|
|
400
445
|
|
|
401
446
|
if (!this._state.eventsFired.includes(key)) {
|
|
402
447
|
this._state.eventsFired.push(key);
|
|
@@ -409,43 +454,60 @@ export class PluginManager {
|
|
|
409
454
|
});
|
|
410
455
|
}
|
|
411
456
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
457
|
+
// Memoized with _moduleMemoMap
|
|
458
|
+
private _loadModule = (mod: PluginModule): Effect.Effect<AnyCapability[], Error> =>
|
|
459
|
+
Effect.tryPromise({
|
|
460
|
+
try: async () => {
|
|
461
|
+
const entry = this._moduleMemoMap.get(mod.id);
|
|
462
|
+
if (entry) {
|
|
463
|
+
return entry;
|
|
464
|
+
}
|
|
420
465
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
466
|
+
const promise = (async () => {
|
|
467
|
+
const start = performance.now();
|
|
468
|
+
let failed = false;
|
|
469
|
+
try {
|
|
470
|
+
log('loading module', { module: mod.id });
|
|
471
|
+
// TODO(wittjosiah): Support activation with an effect.
|
|
472
|
+
let activationResult = await mod.activate(this.context);
|
|
473
|
+
if (typeof activationResult === 'function') {
|
|
474
|
+
activationResult = await activationResult();
|
|
475
|
+
}
|
|
476
|
+
return Array.isArray(activationResult) ? activationResult : [activationResult];
|
|
477
|
+
} catch (error) {
|
|
478
|
+
failed = true;
|
|
479
|
+
throw error;
|
|
480
|
+
} finally {
|
|
481
|
+
performance.measure('activate-module', {
|
|
482
|
+
start,
|
|
483
|
+
end: performance.now(),
|
|
484
|
+
detail: {
|
|
485
|
+
module: mod.id,
|
|
486
|
+
},
|
|
487
|
+
});
|
|
488
|
+
log('loaded module', { module: mod.id, elapsed: performance.now() - start, failed });
|
|
489
|
+
}
|
|
490
|
+
})();
|
|
491
|
+
this._moduleMemoMap.set(mod.id, promise);
|
|
492
|
+
return promise;
|
|
493
|
+
},
|
|
494
|
+
catch: (error) => error as Error,
|
|
495
|
+
}).pipe(
|
|
496
|
+
Effect.withSpan('PluginManager._loadModule'),
|
|
497
|
+
together(
|
|
498
|
+
Effect.sleep(Duration.seconds(10)).pipe(
|
|
499
|
+
Effect.andThen(Effect.sync(() => log.warn(`module is taking a long time to activate`, { module: mod.id }))),
|
|
432
500
|
),
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
);
|
|
501
|
+
),
|
|
502
|
+
);
|
|
503
|
+
|
|
504
|
+
private _contributeCapabilities(module: PluginModule, capabilities: AnyCapability[]): Effect.Effect<void, Error> {
|
|
505
|
+
return Effect.gen(this, function* () {
|
|
439
506
|
capabilities.forEach((capability) => {
|
|
440
507
|
this.context.contributeCapability({ module: module.id, ...capability });
|
|
441
508
|
});
|
|
442
509
|
this._state.active.push(module.id);
|
|
443
510
|
this._capabilities.set(module.id, capabilities);
|
|
444
|
-
log('activated module', { module: module.id });
|
|
445
|
-
|
|
446
|
-
yield* Effect.all(module.activatesAfter?.map((event) => this._activate(event)) ?? [], {
|
|
447
|
-
concurrency: 'unbounded',
|
|
448
|
-
});
|
|
449
511
|
});
|
|
450
512
|
}
|
|
451
513
|
|
|
@@ -469,6 +531,7 @@ export class PluginManager {
|
|
|
469
531
|
return Effect.gen(this, function* () {
|
|
470
532
|
const id = module.id;
|
|
471
533
|
log('deactivating', { id });
|
|
534
|
+
this._moduleMemoMap.delete(id);
|
|
472
535
|
|
|
473
536
|
const capabilities = this._capabilities.get(id);
|
|
474
537
|
if (capabilities) {
|
|
@@ -517,3 +580,18 @@ export class PluginManager {
|
|
|
517
580
|
});
|
|
518
581
|
}
|
|
519
582
|
}
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* Runs an effect concurrently with another effect.
|
|
586
|
+
* If the first effect completes, the second effect is interrupted.
|
|
587
|
+
*/
|
|
588
|
+
// TODO(dmaretskyi): Effect.race > Effect.asVoid
|
|
589
|
+
const together =
|
|
590
|
+
<R1>(togetherEffect: Effect.Effect<void, never, R1>) =>
|
|
591
|
+
<A, E, R2>(effect: Effect.Effect<A, E, R2>): Effect.Effect<A, E, R1 | R2> =>
|
|
592
|
+
Effect.gen(function* () {
|
|
593
|
+
const togetherFiber = yield* Effect.fork(togetherEffect);
|
|
594
|
+
const result = yield* effect;
|
|
595
|
+
yield* Fiber.interrupt(togetherFiber);
|
|
596
|
+
return result;
|
|
597
|
+
});
|
package/src/core/plugin.ts
CHANGED
|
@@ -124,9 +124,15 @@ export class Plugin {
|
|
|
124
124
|
) {}
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
export type PluginFactory<T = void> = ((args: T) => Plugin) & { meta: PluginMeta };
|
|
128
|
+
|
|
127
129
|
/**
|
|
128
130
|
* Helper to define a plugin.
|
|
129
131
|
*/
|
|
130
|
-
export const definePlugin = (meta: PluginMeta,
|
|
131
|
-
|
|
132
|
+
export const definePlugin = <T = void>(meta: PluginMeta, provider: (args: T) => PluginModule[]): PluginFactory<T> => {
|
|
133
|
+
const factory = (args: T) => {
|
|
134
|
+
return new Plugin(meta, provider(args));
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return Object.assign(factory, { meta });
|
|
132
138
|
};
|
package/src/helpers.test.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -22,7 +22,7 @@ export const Debug = () => {
|
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
return (
|
|
25
|
-
<SyntaxHighlighter language='json' classNames='
|
|
25
|
+
<SyntaxHighlighter language='json' classNames='text-xs opacity-75 rounded'>
|
|
26
26
|
{JSON.stringify(object, undefined, 2)}
|
|
27
27
|
</SyntaxHighlighter>
|
|
28
28
|
);
|
|
@@ -7,11 +7,10 @@ import { defineModule, definePlugin, lazy } from '../../core';
|
|
|
7
7
|
|
|
8
8
|
const Debug = lazy(() => import('./Debug'));
|
|
9
9
|
|
|
10
|
-
export const DebugPlugin = () =>
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
]);
|
|
10
|
+
export const DebugPlugin = definePlugin({ id: 'dxos.org/test/plugin-debug', name: 'Debug' }, () => [
|
|
11
|
+
defineModule({
|
|
12
|
+
id: 'dxos.org/test/debug/main',
|
|
13
|
+
activatesOn: Events.Startup,
|
|
14
|
+
activate: Debug,
|
|
15
|
+
}),
|
|
16
|
+
]);
|
|
@@ -6,12 +6,13 @@ import React, { useCallback } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { Button } from '@dxos/react-ui';
|
|
8
8
|
|
|
9
|
-
import { createGeneratorIntent, createPluginId, Number } from './generator';
|
|
10
9
|
import { Capabilities } from '../../common';
|
|
11
10
|
import { contributes } from '../../core';
|
|
12
11
|
import { createIntent } from '../../plugin-intent';
|
|
13
12
|
import { useCapabilities, useIntentDispatcher, usePluginManager } from '../../react';
|
|
14
13
|
|
|
14
|
+
import { Number, createGeneratorIntent, createPluginId } from './generator';
|
|
15
|
+
|
|
15
16
|
export const Toolbar = () => {
|
|
16
17
|
const manager = usePluginManager();
|
|
17
18
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
import { Schema } from 'effect';
|
|
6
6
|
|
|
7
7
|
import { Capabilities, Events } from '../../common';
|
|
8
|
-
import { contributes,
|
|
9
|
-
import {
|
|
8
|
+
import { contributes, defineCapability, defineEvent, defineModule, definePlugin } from '../../core';
|
|
9
|
+
import { type IntentSchema, createResolver } from '../../plugin-intent';
|
|
10
10
|
|
|
11
11
|
export const Number = defineCapability<number>('dxos.org/test/generator/number');
|
|
12
12
|
|
|
@@ -26,7 +26,7 @@ export const createGeneratorIntent = (id: string) => {
|
|
|
26
26
|
export const createNumberPlugin = (id: string) => {
|
|
27
27
|
const number = Math.floor(Math.random() * 100);
|
|
28
28
|
|
|
29
|
-
return definePlugin({ id, name: `Plugin ${id}` }, [
|
|
29
|
+
return definePlugin({ id, name: `Plugin ${id}` }, () => [
|
|
30
30
|
defineModule({
|
|
31
31
|
id: `${id}/main`,
|
|
32
32
|
activatesOn: CountEvent,
|
|
@@ -8,16 +8,15 @@ import { defineModule, definePlugin, lazy } from '../../core';
|
|
|
8
8
|
const Main = lazy(() => import('./Main'));
|
|
9
9
|
const Toolbar = lazy(() => import('./Toolbar'));
|
|
10
10
|
|
|
11
|
-
export const GeneratorPlugin = () =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
]);
|
|
11
|
+
export const GeneratorPlugin = definePlugin({ id: 'dxos.org/test/generator', name: 'Generator' }, () => [
|
|
12
|
+
defineModule({
|
|
13
|
+
id: 'dxos.org/test/generator/main',
|
|
14
|
+
activatesOn: Events.Startup,
|
|
15
|
+
activate: Main,
|
|
16
|
+
}),
|
|
17
|
+
defineModule({
|
|
18
|
+
id: 'dxos.org/test/generator/toolbar',
|
|
19
|
+
activatesOn: Events.Startup,
|
|
20
|
+
activate: Toolbar,
|
|
21
|
+
}),
|
|
22
|
+
]);
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Events } from '../../common';
|
|
6
|
-
import { definePlugin, lazy
|
|
6
|
+
import { defineModule, definePlugin, lazy } from '../../core';
|
|
7
7
|
|
|
8
8
|
const Layout = lazy(() => import('./Layout'));
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
const meta = { id: 'dxos.org/test/layout', name: 'Layout' };
|
|
11
|
+
|
|
12
|
+
export const LayoutPlugin = definePlugin(meta, () => [
|
|
13
|
+
defineModule({
|
|
14
|
+
id: 'dxos.org/test/layout/root',
|
|
15
|
+
activatesOn: Events.Startup,
|
|
16
|
+
activate: Layout,
|
|
17
|
+
}),
|
|
18
|
+
]);
|
|
@@ -6,12 +6,13 @@ import React, { useCallback } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { Button } from '@dxos/react-ui';
|
|
8
8
|
|
|
9
|
-
import { Log } from './schema';
|
|
10
9
|
import { Capabilities, createSurface } from '../../common';
|
|
11
10
|
import { contributes } from '../../core';
|
|
12
11
|
import { createIntent } from '../../plugin-intent';
|
|
13
12
|
import { useIntentDispatcher } from '../../react';
|
|
14
13
|
|
|
14
|
+
import { Log } from './schema';
|
|
15
|
+
|
|
15
16
|
export const Logger = () => {
|
|
16
17
|
const { dispatchPromise } = useIntentDispatcher();
|
|
17
18
|
const handleClick = useCallback(() => dispatchPromise(createIntent(Log, { message: 'Hello, world!' })), []);
|
|
@@ -4,33 +4,38 @@
|
|
|
4
4
|
|
|
5
5
|
import { log } from '@dxos/log';
|
|
6
6
|
|
|
7
|
-
import { Log } from './schema';
|
|
8
7
|
import { Capabilities, Events } from '../../common';
|
|
9
|
-
import { contributes, defineModule,
|
|
8
|
+
import { contributes, defineModule, definePlugin, lazy } from '../../core';
|
|
10
9
|
import { createResolver } from '../../plugin-intent';
|
|
11
10
|
|
|
11
|
+
import { Log } from './schema';
|
|
12
|
+
|
|
12
13
|
const Toolbar = lazy(() => import('./Toolbar'));
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
15
|
+
const meta = {
|
|
16
|
+
id: 'dxos.org/test/logger',
|
|
17
|
+
name: 'Logger',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const LoggerPlugin = definePlugin(meta, () => [
|
|
21
|
+
defineModule({
|
|
22
|
+
id: 'dxos.org/test/logger/intents',
|
|
23
|
+
activatesOn: Events.SetupIntentResolver,
|
|
24
|
+
activate: () => [
|
|
25
|
+
contributes(
|
|
26
|
+
Capabilities.IntentResolver,
|
|
27
|
+
createResolver({
|
|
28
|
+
intent: Log,
|
|
29
|
+
resolve: ({ message }) => {
|
|
30
|
+
log.info(message);
|
|
31
|
+
},
|
|
32
|
+
}),
|
|
33
|
+
),
|
|
34
|
+
],
|
|
35
|
+
}),
|
|
36
|
+
defineModule({
|
|
37
|
+
id: 'dxos.org/test/logger/surfaces',
|
|
38
|
+
activatesOn: Events.Startup,
|
|
39
|
+
activate: Toolbar,
|
|
40
|
+
}),
|
|
41
|
+
]);
|
|
@@ -2,41 +2,45 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React from 'react';
|
|
8
7
|
|
|
9
|
-
import {
|
|
8
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
9
|
+
|
|
10
|
+
import { useApp } from '../components';
|
|
11
|
+
import { IntentPlugin } from '../plugin-intent';
|
|
10
12
|
|
|
11
13
|
import { DebugPlugin } from './debug';
|
|
12
|
-
import {
|
|
14
|
+
import { GeneratorPlugin, createNumberPlugin } from './generator';
|
|
13
15
|
import { LayoutPlugin } from './layout';
|
|
14
16
|
import { LoggerPlugin } from './logger';
|
|
15
|
-
import { useApp } from '../App';
|
|
16
|
-
import { IntentPlugin } from '../plugin-intent';
|
|
17
17
|
|
|
18
|
-
const
|
|
18
|
+
const pluginFactories = [IntentPlugin, LayoutPlugin, DebugPlugin(), LoggerPlugin(), GeneratorPlugin()];
|
|
19
|
+
const plugins = pluginFactories.map((factory) => (typeof factory === 'function' ? factory() : factory));
|
|
19
20
|
|
|
20
21
|
const Placeholder = () => {
|
|
21
22
|
return <div>Loading...</div>;
|
|
22
23
|
};
|
|
23
24
|
|
|
24
|
-
const
|
|
25
|
+
const DefaultStory = () => {
|
|
25
26
|
const App = useApp({
|
|
26
|
-
pluginLoader: (id) => createNumberPlugin(id),
|
|
27
|
+
pluginLoader: (id) => createNumberPlugin(id)(),
|
|
27
28
|
plugins,
|
|
28
29
|
core: plugins.map((plugin) => plugin.meta.id),
|
|
29
|
-
// Having a non-empty placeholder makes it clear if it's taking a while to load.
|
|
30
30
|
placeholder: Placeholder,
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
return <App />;
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
export default {
|
|
36
|
+
const meta = {
|
|
39
37
|
title: 'sdk/app-framework/playground',
|
|
40
|
-
render:
|
|
41
|
-
decorators: [withTheme
|
|
42
|
-
}
|
|
38
|
+
render: DefaultStory,
|
|
39
|
+
decorators: [withTheme],
|
|
40
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
41
|
+
|
|
42
|
+
export default meta;
|
|
43
|
+
|
|
44
|
+
type Story = StoryObj<typeof meta>;
|
|
45
|
+
|
|
46
|
+
export const Playground: Story = {};
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { INTENT_PLUGIN } from './actions';
|
|
6
5
|
import { Events } from '../common';
|
|
7
6
|
import { defineModule, definePlugin, lazy } from '../core';
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
8
|
+
import { meta } from './meta';
|
|
9
|
+
|
|
10
|
+
export const IntentPlugin = definePlugin(meta, () => [
|
|
11
|
+
defineModule({
|
|
12
|
+
id: `${meta.id}/module/dispatcher`,
|
|
13
|
+
// TODO(wittjosiah): This will mean that startup needs to be reset when intents are added or removed.
|
|
14
|
+
// This is fine for now because it's how it worked prior to capabilities api anyways.
|
|
15
|
+
// In the future, the intent dispatcher should be able to be reset without resetting the entire app.
|
|
16
|
+
activatesOn: Events.Startup,
|
|
17
|
+
activatesAfter: [Events.DispatcherReady],
|
|
18
|
+
activate: lazy(() => import('./intent-dispatcher')),
|
|
19
|
+
}),
|
|
20
|
+
]);
|