@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.
- package/dist/lib/browser/{app-graph-builder-OHM2Z6YQ.mjs → app-graph-builder-6E7NCZ77.mjs} +23 -23
- package/dist/lib/browser/app-graph-builder-6E7NCZ77.mjs.map +7 -0
- package/dist/lib/browser/{chunk-DVNSCQJ5.mjs → chunk-2KSDY3EZ.mjs} +297 -270
- package/dist/lib/browser/chunk-2KSDY3EZ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-X2YC645Z.mjs → chunk-K3HOLGVH.mjs} +38 -26
- package/dist/lib/browser/chunk-K3HOLGVH.mjs.map +7 -0
- package/dist/lib/browser/{chunk-SFPT4Z2C.mjs → chunk-KPRHX73H.mjs} +9 -9
- package/dist/lib/browser/chunk-KPRHX73H.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +8 -8
- package/dist/lib/browser/{intent-dispatcher-J7QIFHLO.mjs → intent-dispatcher-VGUJBPPN.mjs} +2 -2
- package/dist/lib/browser/{intent-resolver-QV5MDMDV.mjs → intent-resolver-QLFZY5R5.mjs} +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{store-XMPVLJOQ.mjs → store-QGVXOY4T.mjs} +7 -6
- package/dist/lib/browser/store-QGVXOY4T.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +7 -3
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/worker.mjs +3 -3
- package/dist/lib/node/app-graph-builder-4IWMG67O.cjs +146 -0
- package/dist/lib/node/app-graph-builder-4IWMG67O.cjs.map +7 -0
- package/dist/lib/node/{chunk-I3CJYEBC.cjs → chunk-2EBZ2ICH.cjs} +137 -110
- package/dist/lib/node/chunk-2EBZ2ICH.cjs.map +7 -0
- package/dist/lib/node/{chunk-5UOVF3OR.cjs → chunk-7J66KH2T.cjs} +78 -66
- package/dist/lib/node/chunk-7J66KH2T.cjs.map +7 -0
- package/dist/lib/node/{chunk-JUSEAFDU.cjs → chunk-JQMNABMK.cjs} +4 -4
- package/dist/lib/node/chunk-JQMNABMK.cjs.map +7 -0
- package/dist/lib/node/index.cjs +80 -80
- package/dist/lib/node/{intent-dispatcher-FQPJNKIZ.cjs → intent-dispatcher-TASJBG5M.cjs} +8 -8
- package/dist/lib/node/{intent-dispatcher-FQPJNKIZ.cjs.map → intent-dispatcher-TASJBG5M.cjs.map} +2 -2
- package/dist/lib/node/{intent-resolver-PBAOGJS6.cjs → intent-resolver-5CG5NIJY.cjs} +12 -12
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{store-N7JLYYDI.cjs → store-IF3UR2KA.cjs} +10 -9
- package/dist/lib/node/store-IF3UR2KA.cjs.map +7 -0
- package/dist/lib/node/testing/index.cjs +14 -9
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/lib/node/worker.cjs +39 -39
- package/dist/lib/node/worker.cjs.map +1 -1
- package/dist/lib/node-esm/{app-graph-builder-OMH534A4.mjs → app-graph-builder-LYCG5CO3.mjs} +23 -23
- package/dist/lib/node-esm/app-graph-builder-LYCG5CO3.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-GSDBF2CK.mjs → chunk-BOEJMAVK.mjs} +297 -270
- package/dist/lib/node-esm/chunk-BOEJMAVK.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-QHXUTJHE.mjs → chunk-ISNBS46Y.mjs} +38 -26
- package/dist/lib/node-esm/chunk-ISNBS46Y.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PHOUQACM.mjs → chunk-JUJF5L4G.mjs} +9 -9
- package/dist/lib/node-esm/chunk-JUJF5L4G.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +8 -8
- package/dist/lib/node-esm/{intent-dispatcher-QDUGA7NT.mjs → intent-dispatcher-ZUSNX2OY.mjs} +2 -2
- package/dist/lib/node-esm/{intent-resolver-P7TC5RBD.mjs → intent-resolver-NGDHUKDD.mjs} +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{store-M2BYJL6K.mjs → store-NCRSE25X.mjs} +7 -6
- package/dist/lib/node-esm/store-NCRSE25X.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +7 -3
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/worker.mjs +3 -3
- package/dist/types/src/App.d.ts +3 -1
- package/dist/types/src/App.d.ts.map +1 -1
- package/dist/types/src/common/capabilities.d.ts +6 -196
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/collaboration.d.ts +14 -7
- 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/file.d.ts +7 -7
- package/dist/types/src/common/file.d.ts.map +1 -1
- package/dist/types/src/common/layout.d.ts +163 -163
- package/dist/types/src/common/layout.d.ts.map +1 -1
- package/dist/types/src/common/surface.d.ts.map +1 -1
- package/dist/types/src/common/translations.d.ts +7 -7
- package/dist/types/src/common/translations.d.ts.map +1 -1
- package/dist/types/src/core/capabilities.d.ts +28 -13
- package/dist/types/src/core/capabilities.d.ts.map +1 -1
- package/dist/types/src/core/events.d.ts.map +1 -1
- package/dist/types/src/core/manager.d.ts +6 -3
- package/dist/types/src/core/manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin.d.ts +2 -2
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
- package/dist/types/src/playground/logger/schema.d.ts +6 -6
- package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
- package/dist/types/src/plugin-intent/actions.d.ts +14 -14
- package/dist/types/src/plugin-intent/actions.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/intent.d.ts +14 -20
- package/dist/types/src/plugin-intent/intent.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/actions.d.ts +10 -10
- package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +2 -195
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/store.d.ts +2 -2
- package/dist/types/src/plugin-settings/store.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/useCapabilities.d.ts +2 -2
- package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
- package/dist/types/src/react/useIntentResolver.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts +5 -2
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -20
- package/src/App.tsx +14 -2
- package/src/common/capabilities.ts +7 -4
- package/src/common/collaboration.ts +11 -8
- package/src/common/file.ts +7 -7
- package/src/common/layout.ts +148 -136
- package/src/common/translations.ts +7 -7
- package/src/core/capabilities.test.ts +55 -36
- package/src/core/capabilities.ts +77 -57
- package/src/core/manager.test.ts +19 -19
- package/src/core/manager.ts +14 -6
- package/src/core/plugin.ts +2 -2
- package/src/playground/generator/generator.ts +4 -4
- package/src/playground/logger/schema.ts +5 -5
- package/src/playground/playground.stories.tsx +1 -1
- package/src/plugin-intent/actions.ts +9 -9
- package/src/plugin-intent/intent-dispatcher.test.ts +23 -42
- package/src/plugin-intent/intent-dispatcher.ts +7 -11
- package/src/plugin-intent/intent.ts +22 -20
- package/src/plugin-settings/actions.ts +8 -8
- package/src/plugin-settings/app-graph-builder.ts +129 -94
- package/src/plugin-settings/store.ts +20 -17
- package/src/react/Surface.stories.tsx +1 -1
- package/src/react/Surface.tsx +3 -3
- package/src/react/useCapabilities.ts +9 -19
- package/src/testing/withPluginManager.stories.tsx +0 -1
- package/src/testing/withPluginManager.tsx +11 -3
- package/tsconfig.json +3 -0
- package/typedoc/assets/navigation.js +1 -1
- package/typedoc/assets/search.js +1 -1
- package/typedoc/classes/CollaborationActions.InsertContent.html +280 -241
- package/typedoc/classes/ErrorBoundary.html +6 -6
- package/typedoc/classes/IntentAction.ShowUndo.html +125 -125
- package/typedoc/classes/IntentAction.Track.html +239 -239
- package/typedoc/classes/LayoutAction.AddToast.html +163 -163
- package/typedoc/classes/LayoutAction.Close.html +352 -352
- package/typedoc/classes/LayoutAction.Expose.html +238 -238
- package/typedoc/classes/LayoutAction.Open.html +904 -748
- package/typedoc/classes/LayoutAction.RevertWorkspace.html +241 -241
- package/typedoc/classes/LayoutAction.ScrollIntoView.html +280 -280
- package/typedoc/classes/LayoutAction.Set.html +436 -358
- package/typedoc/classes/LayoutAction.SetLayoutMode.html +469 -391
- package/typedoc/classes/LayoutAction.SwitchWorkspace.html +238 -238
- package/typedoc/classes/LayoutAction.UpdateComplementary.html +358 -358
- package/typedoc/classes/LayoutAction.UpdateDialog.html +553 -475
- package/typedoc/classes/LayoutAction.UpdateLayout.html +281 -281
- package/typedoc/classes/LayoutAction.UpdatePopover.html +826 -826
- package/typedoc/classes/LayoutAction.UpdateSidebar.html +397 -319
- package/typedoc/classes/Plugin.html +3 -3
- package/typedoc/classes/PluginContext.html +38 -0
- package/typedoc/classes/PluginManager.html +17 -16
- package/typedoc/classes/PluginModule.html +9 -9
- package/typedoc/classes/SettingsAction.Open.html +199 -199
- package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +124 -124
- package/typedoc/functions/Events.createStateEvent.html +2 -2
- package/typedoc/functions/IntentPlugin.html +1 -1
- package/typedoc/functions/SettingsPlugin.html +1 -1
- package/typedoc/functions/allOf.html +2 -2
- package/typedoc/functions/chain.html +2 -2
- package/typedoc/functions/contributes.html +2 -2
- package/typedoc/functions/createApp.html +2 -2
- package/typedoc/functions/createDispatcher.html +3 -3
- package/typedoc/functions/createIntent.html +3 -3
- package/typedoc/functions/createResolver.html +2 -2
- package/typedoc/functions/createSurface.html +2 -2
- package/typedoc/functions/defineCapability.html +2 -2
- package/typedoc/functions/defineEvent.html +2 -2
- package/typedoc/functions/defineModule.html +2 -2
- package/typedoc/functions/definePlugin.html +2 -2
- package/typedoc/functions/eventKey.html +2 -2
- package/typedoc/functions/getEvents.html +2 -2
- package/typedoc/functions/isAllOf.html +2 -2
- package/typedoc/functions/isOneOf.html +2 -2
- package/typedoc/functions/isSurfaceAvailable.html +2 -2
- package/typedoc/functions/lazy.html +2 -2
- package/typedoc/functions/oneOf.html +2 -2
- package/typedoc/functions/useAppGraph.html +1 -1
- package/typedoc/functions/useCapabilities.html +3 -3
- package/typedoc/functions/useCapability.html +3 -3
- package/typedoc/functions/useIntentDispatcher.html +1 -1
- package/typedoc/functions/useIntentResolver.html +1 -1
- package/typedoc/functions/useLayout.html +1 -1
- package/typedoc/functions/usePluginManager.html +2 -2
- package/typedoc/hierarchy.html +1 -1
- package/typedoc/index.html +2 -2
- package/typedoc/interfaces/LayoutAction.Toast.html +2 -2
- package/typedoc/modules/Capabilities.html +1 -1
- package/typedoc/modules/CollaborationActions.html +1 -1
- package/typedoc/modules/Events.html +1 -1
- package/typedoc/modules/IntentAction.html +1 -1
- package/typedoc/modules/LayoutAction.html +2 -2
- package/typedoc/modules/SettingsAction.html +1 -1
- package/typedoc/modules.html +1 -1
- package/typedoc/types/ActivationEvent.html +3 -3
- package/typedoc/types/ActivationEvents.html +2 -2
- package/typedoc/types/AnyCapability.html +1 -1
- package/typedoc/types/AnyIntent.html +1 -1
- package/typedoc/types/AnyIntentChain.html +1 -1
- package/typedoc/types/AnyIntentEffectResult.html +1 -1
- package/typedoc/types/AnyIntentResolver.html +1 -1
- package/typedoc/types/AnyIntentResult.html +1 -1
- package/typedoc/types/Capabilities.FileUploader.html +1 -1
- package/typedoc/types/Capabilities.IntentResolver.html +1 -1
- package/typedoc/types/Capabilities.Layout.html +1 -1
- package/typedoc/types/Capabilities.Metadata.html +1 -1
- package/typedoc/types/Capabilities.ReactContext.html +1 -1
- package/typedoc/types/Capabilities.ReactRoot.html +1 -1
- package/typedoc/types/Capabilities.ReactSurface.html +1 -1
- package/typedoc/types/Capabilities.Settings.html +2 -2
- package/typedoc/types/Capability.html +5 -5
- package/typedoc/types/CreateAppOptions.html +3 -2
- package/typedoc/types/FileInfo.html +1 -1
- package/typedoc/types/Intent.html +6 -10
- package/typedoc/types/IntentChain.html +3 -3
- package/typedoc/types/IntentContext.html +2 -2
- package/typedoc/types/IntentData.html +1 -1
- package/typedoc/types/IntentDispatcher.html +2 -2
- package/typedoc/types/IntentDispatcherResult.html +2 -2
- package/typedoc/types/IntentEffectDefinition.html +2 -2
- package/typedoc/types/IntentEffectResult.html +6 -6
- package/typedoc/types/IntentParams.html +2 -2
- package/typedoc/types/IntentResolver.html +2 -2
- package/typedoc/types/IntentResultData.html +1 -1
- package/typedoc/types/IntentSchema.html +1 -1
- package/typedoc/types/IntentUndo.html +2 -2
- package/typedoc/types/InterfaceDef.html +3 -3
- package/typedoc/types/Label.html +1 -1
- package/typedoc/types/NodeSerializer.html +3 -3
- package/typedoc/types/PluginManagerOptions.html +3 -2
- package/typedoc/types/PluginMeta.html +9 -9
- package/typedoc/types/PromiseIntentDispatcher.html +2 -2
- package/typedoc/types/PromiseIntentUndo.html +2 -2
- package/typedoc/types/Resource.html +1 -1
- package/typedoc/types/ResourceKey.html +1 -1
- package/typedoc/types/ResourceLanguage.html +1 -1
- package/typedoc/types/SerializedNode.html +2 -2
- package/typedoc/types/SurfaceComponent.html +2 -2
- package/typedoc/types/SurfaceDefinition.html +2 -2
- package/typedoc/types/SurfaceProps.html +2 -2
- package/typedoc/variables/Capabilities.AppGraph.html +1 -1
- package/typedoc/variables/Capabilities.AppGraphBuilder.html +1 -1
- package/typedoc/variables/Capabilities.AppGraphSerializer.html +1 -1
- package/typedoc/variables/Capabilities.ArtifactDefinition.html +1 -1
- package/typedoc/variables/Capabilities.FileUploader.html +1 -1
- package/typedoc/variables/Capabilities.IntentDispatcher.html +1 -1
- package/typedoc/variables/Capabilities.IntentResolver.html +1 -1
- package/typedoc/variables/Capabilities.Layout.html +1 -1
- package/typedoc/variables/Capabilities.Metadata.html +1 -1
- package/typedoc/variables/Capabilities.Null.html +1 -1
- package/typedoc/variables/Capabilities.PluginManager.html +1 -1
- package/typedoc/variables/Capabilities.ReactContext.html +1 -1
- package/typedoc/variables/Capabilities.ReactRoot.html +1 -1
- package/typedoc/variables/Capabilities.ReactSurface.html +1 -1
- package/typedoc/variables/Capabilities.RxRegistry.html +1 -0
- package/typedoc/variables/Capabilities.Settings.html +1 -1
- package/typedoc/variables/Capabilities.SettingsStore.html +1 -1
- package/typedoc/variables/Capabilities.Tools.html +1 -1
- package/typedoc/variables/Capabilities.Translations.html +1 -1
- package/typedoc/variables/Events.AppGraphReady.html +2 -2
- package/typedoc/variables/Events.DispatcherReady.html +2 -2
- package/typedoc/variables/Events.LayoutReady.html +1 -1
- package/typedoc/variables/Events.SettingsReady.html +2 -2
- package/typedoc/variables/Events.SetupAppGraph.html +2 -2
- package/typedoc/variables/Events.SetupArtifactDefinition.html +2 -2
- package/typedoc/variables/Events.SetupIntentResolver.html +2 -2
- package/typedoc/variables/Events.SetupMetadata.html +2 -2
- package/typedoc/variables/Events.SetupReactSurface.html +2 -2
- package/typedoc/variables/Events.SetupSettings.html +2 -2
- package/typedoc/variables/Events.SetupTranslations.html +2 -2
- package/typedoc/variables/Events.Startup.html +2 -2
- package/typedoc/variables/FileInfoSchema.html +1 -1
- package/typedoc/variables/INTENT_ACTION.html +1 -1
- package/typedoc/variables/INTENT_PLUGIN.html +1 -1
- package/typedoc/variables/LAYOUT_ACTION.html +1 -1
- package/typedoc/variables/LAYOUT_PLUGIN.html +1 -1
- package/typedoc/variables/Label.html +1 -1
- package/typedoc/variables/LayoutAction.Toast.html +1 -1
- package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +1 -1
- package/typedoc/variables/PluginManagerProvider.html +2 -2
- package/typedoc/variables/Resource.html +2 -2
- package/typedoc/variables/ResourceKey.html +1 -1
- package/typedoc/variables/ResourceLanguage.html +1 -1
- package/typedoc/variables/SETTINGS_ACTION.html +1 -1
- package/typedoc/variables/SETTINGS_ID.html +1 -1
- package/typedoc/variables/SETTINGS_KEY.html +1 -1
- package/typedoc/variables/SETTINGS_PLUGIN.html +1 -1
- package/typedoc/variables/Surface.html +2 -2
- package/typedoc/variables/defaultFileTypes.html +1 -1
- package/dist/lib/browser/app-graph-builder-OHM2Z6YQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-DVNSCQJ5.mjs.map +0 -7
- package/dist/lib/browser/chunk-SFPT4Z2C.mjs.map +0 -7
- package/dist/lib/browser/chunk-X2YC645Z.mjs.map +0 -7
- package/dist/lib/browser/store-XMPVLJOQ.mjs.map +0 -7
- package/dist/lib/node/app-graph-builder-Z45FKS52.cjs +0 -146
- package/dist/lib/node/app-graph-builder-Z45FKS52.cjs.map +0 -7
- package/dist/lib/node/chunk-5UOVF3OR.cjs.map +0 -7
- package/dist/lib/node/chunk-I3CJYEBC.cjs.map +0 -7
- package/dist/lib/node/chunk-JUSEAFDU.cjs.map +0 -7
- package/dist/lib/node/store-N7JLYYDI.cjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-OMH534A4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GSDBF2CK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PHOUQACM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QHXUTJHE.mjs.map +0 -7
- package/dist/lib/node-esm/store-M2BYJL6K.mjs.map +0 -7
- package/typedoc/classes/PluginsContext.html +0 -25
- /package/dist/lib/browser/{intent-dispatcher-J7QIFHLO.mjs.map → intent-dispatcher-VGUJBPPN.mjs.map} +0 -0
- /package/dist/lib/browser/{intent-resolver-QV5MDMDV.mjs.map → intent-resolver-QLFZY5R5.mjs.map} +0 -0
- /package/dist/lib/node/{intent-resolver-PBAOGJS6.cjs.map → intent-resolver-5CG5NIJY.cjs.map} +0 -0
- /package/dist/lib/node-esm/{intent-dispatcher-QDUGA7NT.mjs.map → intent-dispatcher-ZUSNX2OY.mjs.map} +0 -0
- /package/dist/lib/node-esm/{intent-resolver-P7TC5RBD.mjs.map → intent-resolver-NGDHUKDD.mjs.map} +0 -0
package/src/common/layout.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Schema
|
|
5
|
+
import { Schema } from 'effect';
|
|
6
6
|
|
|
7
7
|
import { Label } from '../plugin-intent';
|
|
8
8
|
|
|
@@ -18,17 +18,17 @@ export namespace LayoutAction {
|
|
|
18
18
|
/**
|
|
19
19
|
* Generic layout action.
|
|
20
20
|
*/
|
|
21
|
-
export class UpdateLayout extends
|
|
22
|
-
input:
|
|
23
|
-
part:
|
|
24
|
-
subject:
|
|
25
|
-
options:
|
|
26
|
-
|
|
21
|
+
export class UpdateLayout extends Schema.TaggedClass<UpdateLayout>()(UPDATE_LAYOUT, {
|
|
22
|
+
input: Schema.Struct({
|
|
23
|
+
part: Schema.String.annotations({ description: 'The part of the layout to mutate.' }),
|
|
24
|
+
subject: Schema.optional(Schema.Any.annotations({ description: 'The subject of the layout update.' })),
|
|
25
|
+
options: Schema.optional(
|
|
26
|
+
Schema.Record({ key: Schema.String, value: Schema.Any }).annotations({
|
|
27
27
|
description: 'Additional options for the layout action.',
|
|
28
28
|
}),
|
|
29
29
|
),
|
|
30
30
|
}),
|
|
31
|
-
output:
|
|
31
|
+
output: Schema.Void,
|
|
32
32
|
}) {}
|
|
33
33
|
|
|
34
34
|
//
|
|
@@ -41,98 +41,104 @@ export namespace LayoutAction {
|
|
|
41
41
|
// This allows for plugins to update the layout without depending on a specific layout plugin.
|
|
42
42
|
// The expectation is that other norms other than these will emerge over time.
|
|
43
43
|
|
|
44
|
-
export class SetLayoutMode extends
|
|
45
|
-
input:
|
|
46
|
-
part:
|
|
47
|
-
subject:
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
export class SetLayoutMode extends Schema.TaggedClass<SetLayoutMode>()(UPDATE_LAYOUT, {
|
|
45
|
+
input: Schema.Struct({
|
|
46
|
+
part: Schema.Literal('mode').annotations({ description: 'Setting the layout mode.' }),
|
|
47
|
+
subject: Schema.optional(
|
|
48
|
+
Schema.String.annotations({ description: 'Item which is the subject of the new layout mode.' }),
|
|
49
|
+
),
|
|
50
|
+
options: Schema.Union(
|
|
51
|
+
Schema.Struct({ mode: Schema.String.annotations({ description: 'The new layout mode.' }) }),
|
|
52
|
+
Schema.Struct({ revert: Schema.Boolean.annotations({ description: 'Revert to the previous layout mode.' }) }),
|
|
51
53
|
),
|
|
52
54
|
}),
|
|
53
|
-
output:
|
|
55
|
+
output: Schema.Void,
|
|
54
56
|
}) {}
|
|
55
57
|
|
|
56
|
-
export class UpdateSidebar extends
|
|
57
|
-
input:
|
|
58
|
-
part:
|
|
59
|
-
subject:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
export class UpdateSidebar extends Schema.TaggedClass<UpdateSidebar>()(UPDATE_LAYOUT, {
|
|
59
|
+
input: Schema.Struct({
|
|
60
|
+
part: Schema.Literal('sidebar').annotations({ description: 'Updating the sidebar.' }),
|
|
61
|
+
subject: Schema.optional(
|
|
62
|
+
Schema.String.annotations({ description: 'URI of the component to display in the sidebar.' }),
|
|
63
|
+
),
|
|
64
|
+
options: Schema.optional(
|
|
65
|
+
Schema.Struct({
|
|
66
|
+
state: Schema.Literal('closed', 'collapsed', 'expanded').annotations({
|
|
63
67
|
description: 'Whether the sidebar is closed, collapsed, or expanded.',
|
|
64
68
|
}),
|
|
65
69
|
}),
|
|
66
70
|
),
|
|
67
71
|
}),
|
|
68
|
-
output:
|
|
72
|
+
output: Schema.Void,
|
|
69
73
|
}) {}
|
|
70
74
|
|
|
71
|
-
export class UpdateComplementary extends
|
|
72
|
-
input:
|
|
73
|
-
part:
|
|
74
|
-
subject:
|
|
75
|
-
|
|
75
|
+
export class UpdateComplementary extends Schema.TaggedClass<UpdateComplementary>()(UPDATE_LAYOUT, {
|
|
76
|
+
input: Schema.Struct({
|
|
77
|
+
part: Schema.Literal('complementary').annotations({ description: 'Updating the complementary sidebar.' }),
|
|
78
|
+
subject: Schema.optional(
|
|
79
|
+
Schema.String.annotations({ description: 'URI of the component to display in the complementary area.' }),
|
|
76
80
|
),
|
|
77
|
-
options:
|
|
78
|
-
|
|
79
|
-
state:
|
|
81
|
+
options: Schema.optional(
|
|
82
|
+
Schema.Struct({
|
|
83
|
+
state: Schema.Literal('closed', 'collapsed', 'expanded').annotations({
|
|
80
84
|
description: 'Whether the complementary sidebar is closed, collapsed, or expanded.',
|
|
81
85
|
}),
|
|
82
86
|
}),
|
|
83
87
|
),
|
|
84
88
|
}),
|
|
85
|
-
output:
|
|
89
|
+
output: Schema.Void,
|
|
86
90
|
}) {}
|
|
87
91
|
|
|
88
|
-
export class UpdateDialog extends
|
|
89
|
-
input:
|
|
90
|
-
part:
|
|
91
|
-
subject:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
export class UpdateDialog extends Schema.TaggedClass<UpdateDialog>()(UPDATE_LAYOUT, {
|
|
93
|
+
input: Schema.Struct({
|
|
94
|
+
part: Schema.Literal('dialog').annotations({ description: 'Updating the dialog.' }),
|
|
95
|
+
subject: Schema.optional(
|
|
96
|
+
Schema.String.annotations({ description: 'URI of the component to display in the dialog.' }),
|
|
97
|
+
),
|
|
98
|
+
options: Schema.Struct({
|
|
99
|
+
state: Schema.optional(Schema.Boolean.annotations({ description: 'Whether the dialog is open or closed.' })),
|
|
100
|
+
blockAlign: Schema.optional(
|
|
101
|
+
Schema.Literal('start', 'center', 'end').annotations({ description: 'The alignment of the dialog.' }),
|
|
96
102
|
),
|
|
97
|
-
type:
|
|
98
|
-
props:
|
|
99
|
-
|
|
103
|
+
type: Schema.optional(Schema.Literal('default', 'alert').annotations({ description: 'The type of dialog.' })),
|
|
104
|
+
props: Schema.optional(
|
|
105
|
+
Schema.Record({ key: Schema.String, value: Schema.Any }).annotations({
|
|
100
106
|
description: 'Additional props for the dialog.',
|
|
101
107
|
}),
|
|
102
108
|
),
|
|
103
109
|
}),
|
|
104
110
|
}),
|
|
105
|
-
output:
|
|
111
|
+
output: Schema.Void,
|
|
106
112
|
}) {}
|
|
107
113
|
|
|
108
|
-
export class UpdatePopover extends
|
|
109
|
-
input:
|
|
110
|
-
part:
|
|
111
|
-
subject:
|
|
112
|
-
|
|
114
|
+
export class UpdatePopover extends Schema.TaggedClass<UpdatePopover>()(UPDATE_LAYOUT, {
|
|
115
|
+
input: Schema.Struct({
|
|
116
|
+
part: Schema.Literal('popover').annotations({ description: 'Updating the popover.' }),
|
|
117
|
+
subject: Schema.optional(
|
|
118
|
+
Schema.Any.annotations({
|
|
113
119
|
description: 'URI of the component to display in the popover or data to pass to the popover.',
|
|
114
120
|
}),
|
|
115
121
|
),
|
|
116
|
-
options:
|
|
117
|
-
side:
|
|
118
|
-
|
|
122
|
+
options: Schema.Struct({
|
|
123
|
+
side: Schema.optional(
|
|
124
|
+
Schema.Literal('top', 'right', 'bottom', 'left').annotations({ description: 'The side of the anchor.' }),
|
|
119
125
|
),
|
|
120
|
-
state:
|
|
121
|
-
props:
|
|
122
|
-
|
|
126
|
+
state: Schema.optional(Schema.Boolean.annotations({ description: 'Whether the popover is open or closed.' })),
|
|
127
|
+
props: Schema.optional(
|
|
128
|
+
Schema.Record({ key: Schema.String, value: Schema.Any }).annotations({
|
|
123
129
|
description: 'Additional props for the popover.',
|
|
124
130
|
}),
|
|
125
131
|
),
|
|
126
132
|
}).pipe(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
variant:
|
|
131
|
-
anchor:
|
|
133
|
+
Schema.extend(
|
|
134
|
+
Schema.Union(
|
|
135
|
+
Schema.Struct({
|
|
136
|
+
variant: Schema.Literal('virtual'),
|
|
137
|
+
anchor: Schema.Any.annotations({ description: 'The DOM element to anchor the popover to.' }),
|
|
132
138
|
}),
|
|
133
|
-
|
|
134
|
-
variant:
|
|
135
|
-
anchorId:
|
|
139
|
+
Schema.Struct({
|
|
140
|
+
variant: Schema.optional(Schema.Literal('react')),
|
|
141
|
+
anchorId: Schema.String.annotations({
|
|
136
142
|
description: 'An id that can be used to determine whether to render the anchor subcomponent.',
|
|
137
143
|
}),
|
|
138
144
|
}),
|
|
@@ -140,119 +146,125 @@ export namespace LayoutAction {
|
|
|
140
146
|
),
|
|
141
147
|
),
|
|
142
148
|
}),
|
|
143
|
-
output:
|
|
149
|
+
output: Schema.Void,
|
|
144
150
|
}) {}
|
|
145
151
|
|
|
146
|
-
export const Toast =
|
|
147
|
-
id:
|
|
148
|
-
title:
|
|
149
|
-
description:
|
|
150
|
-
icon:
|
|
151
|
-
duration:
|
|
152
|
-
closeLabel:
|
|
153
|
-
actionLabel:
|
|
154
|
-
actionAlt:
|
|
155
|
-
onAction:
|
|
156
|
-
|
|
152
|
+
export const Toast = Schema.Struct({
|
|
153
|
+
id: Schema.String.annotations({ description: 'The id of the toast.' }),
|
|
154
|
+
title: Schema.optional(Label.annotations({ description: 'The title of the toast.' })),
|
|
155
|
+
description: Schema.optional(Label.annotations({ description: 'The description of the toast.' })),
|
|
156
|
+
icon: Schema.optional(Schema.String.annotations({ description: 'The icon of the toast.' })),
|
|
157
|
+
duration: Schema.optional(Schema.Number.annotations({ description: 'The duration of the toast.' })),
|
|
158
|
+
closeLabel: Schema.optional(Label.annotations({ description: 'The label of the close button.' })),
|
|
159
|
+
actionLabel: Schema.optional(Label.annotations({ description: 'The label of the action button.' })),
|
|
160
|
+
actionAlt: Schema.optional(Label.annotations({ description: 'The alt text of the action button.' })),
|
|
161
|
+
onAction: Schema.optional(
|
|
162
|
+
Schema.Any.annotations({ description: 'The action to perform when the action button is clicked.' }),
|
|
157
163
|
),
|
|
158
164
|
});
|
|
159
165
|
|
|
160
|
-
export interface Toast extends Omit<
|
|
166
|
+
export interface Toast extends Omit<Schema.Schema.Type<typeof Toast>, 'onAction'> {
|
|
161
167
|
onAction?: () => void;
|
|
162
168
|
}
|
|
163
169
|
|
|
164
|
-
export class AddToast extends
|
|
165
|
-
input:
|
|
166
|
-
part:
|
|
170
|
+
export class AddToast extends Schema.TaggedClass<AddToast>()(UPDATE_LAYOUT, {
|
|
171
|
+
input: Schema.Struct({
|
|
172
|
+
part: Schema.Literal('toast').annotations({ description: 'Adding a toast.' }),
|
|
167
173
|
subject: Toast.annotations({ description: 'The toast to add.' }),
|
|
168
174
|
}),
|
|
169
|
-
output:
|
|
175
|
+
output: Schema.Void,
|
|
170
176
|
}) {}
|
|
171
177
|
|
|
172
|
-
export class SwitchWorkspace extends
|
|
173
|
-
input:
|
|
174
|
-
part:
|
|
175
|
-
subject:
|
|
178
|
+
export class SwitchWorkspace extends Schema.TaggedClass<SwitchWorkspace>()(UPDATE_LAYOUT, {
|
|
179
|
+
input: Schema.Struct({
|
|
180
|
+
part: Schema.Literal('workspace').annotations({ description: 'Switching the workspace.' }),
|
|
181
|
+
subject: Schema.String.annotations({ description: 'The id of the workspace to switch to.' }),
|
|
176
182
|
}),
|
|
177
|
-
output:
|
|
183
|
+
output: Schema.Void,
|
|
178
184
|
}) {}
|
|
179
185
|
|
|
180
|
-
export class RevertWorkspace extends
|
|
181
|
-
input:
|
|
182
|
-
part:
|
|
183
|
-
options:
|
|
184
|
-
revert:
|
|
186
|
+
export class RevertWorkspace extends Schema.TaggedClass<RevertWorkspace>()(UPDATE_LAYOUT, {
|
|
187
|
+
input: Schema.Struct({
|
|
188
|
+
part: Schema.Literal('workspace').annotations({ description: 'Switching the workspace.' }),
|
|
189
|
+
options: Schema.Struct({
|
|
190
|
+
revert: Schema.Literal(true).annotations({ description: 'Revert to the previous workspace.' }),
|
|
185
191
|
}),
|
|
186
192
|
}),
|
|
187
|
-
output:
|
|
193
|
+
output: Schema.Void,
|
|
188
194
|
}) {}
|
|
189
195
|
|
|
190
|
-
export class Open extends
|
|
191
|
-
input:
|
|
192
|
-
part:
|
|
193
|
-
subject:
|
|
194
|
-
options:
|
|
195
|
-
|
|
196
|
-
state:
|
|
197
|
-
variant:
|
|
198
|
-
key:
|
|
199
|
-
|
|
196
|
+
export class Open extends Schema.TaggedClass<Open>()(UPDATE_LAYOUT, {
|
|
197
|
+
input: Schema.Struct({
|
|
198
|
+
part: Schema.Literal('main').annotations({ description: 'Opening an item in the main content area.' }),
|
|
199
|
+
subject: Schema.Array(Schema.String.annotations({ description: 'Ids of the items to open.' })),
|
|
200
|
+
options: Schema.optional(
|
|
201
|
+
Schema.Struct({
|
|
202
|
+
state: Schema.optional(Schema.Literal(true).annotations({ description: 'The items are being added.' })),
|
|
203
|
+
variant: Schema.optional(Schema.String.annotations({ description: 'The variant of the item to open.' })),
|
|
204
|
+
key: Schema.optional(
|
|
205
|
+
Schema.String.annotations({
|
|
206
|
+
description: 'If provided, will replace item with a matching key (id prefix).',
|
|
207
|
+
}),
|
|
208
|
+
),
|
|
209
|
+
workspace: Schema.optional(Schema.String.annotations({ description: 'The workspace to open the items in.' })),
|
|
210
|
+
scrollIntoView: Schema.optional(Schema.Boolean.annotations({ description: 'Scroll the items into view.' })),
|
|
211
|
+
pivotId: Schema.optional(
|
|
212
|
+
Schema.String.annotations({ description: 'The id of the item to place new items next to.' }),
|
|
200
213
|
),
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
S.Union(
|
|
206
|
-
S.Literal('start').annotations({ description: 'The items are being added before the pivot item.' }),
|
|
207
|
-
S.Literal('end').annotations({ description: 'The items are being added after the pivot item.' }),
|
|
214
|
+
positioning: Schema.optional(
|
|
215
|
+
Schema.Union(
|
|
216
|
+
Schema.Literal('start').annotations({ description: 'The items are being added before the pivot item.' }),
|
|
217
|
+
Schema.Literal('end').annotations({ description: 'The items are being added after the pivot item.' }),
|
|
208
218
|
),
|
|
209
219
|
),
|
|
210
220
|
}),
|
|
211
221
|
),
|
|
212
222
|
}),
|
|
213
|
-
output:
|
|
223
|
+
output: Schema.Void,
|
|
214
224
|
}) {}
|
|
215
225
|
|
|
216
|
-
export class Set extends
|
|
217
|
-
input:
|
|
218
|
-
part:
|
|
219
|
-
subject:
|
|
220
|
-
options:
|
|
221
|
-
override:
|
|
226
|
+
export class Set extends Schema.TaggedClass<Set>()(UPDATE_LAYOUT, {
|
|
227
|
+
input: Schema.Struct({
|
|
228
|
+
part: Schema.Literal('main').annotations({ description: 'Setting items in the main content area.' }),
|
|
229
|
+
subject: Schema.Array(Schema.String.annotations({ description: 'Ids of the items to set.' })),
|
|
230
|
+
options: Schema.Struct({
|
|
231
|
+
override: Schema.Literal(true).annotations({
|
|
232
|
+
description: 'Override the current items in the main content area.',
|
|
233
|
+
}),
|
|
222
234
|
}),
|
|
223
235
|
}),
|
|
224
|
-
output:
|
|
236
|
+
output: Schema.Void,
|
|
225
237
|
}) {}
|
|
226
238
|
|
|
227
|
-
export class Close extends
|
|
228
|
-
input:
|
|
229
|
-
part:
|
|
230
|
-
subject:
|
|
231
|
-
options:
|
|
232
|
-
state:
|
|
239
|
+
export class Close extends Schema.TaggedClass<Close>()(UPDATE_LAYOUT, {
|
|
240
|
+
input: Schema.Struct({
|
|
241
|
+
part: Schema.Literal('main').annotations({ description: 'Closing items in the main content area.' }),
|
|
242
|
+
subject: Schema.Array(Schema.String.annotations({ description: 'Ids of the items to close.' })),
|
|
243
|
+
options: Schema.Struct({
|
|
244
|
+
state: Schema.Literal(false).annotations({ description: 'The items are being removed.' }),
|
|
233
245
|
}),
|
|
234
246
|
}),
|
|
235
|
-
output:
|
|
247
|
+
output: Schema.Void,
|
|
236
248
|
}) {}
|
|
237
249
|
|
|
238
|
-
export class ScrollIntoView extends
|
|
239
|
-
input:
|
|
240
|
-
part:
|
|
241
|
-
subject:
|
|
242
|
-
options:
|
|
243
|
-
|
|
250
|
+
export class ScrollIntoView extends Schema.TaggedClass<ScrollIntoView>()(UPDATE_LAYOUT, {
|
|
251
|
+
input: Schema.Struct({
|
|
252
|
+
part: Schema.Literal('current').annotations({ description: 'Setting the current item' }),
|
|
253
|
+
subject: Schema.optional(Schema.String.annotations({ description: 'The id of the item to set as current.' })),
|
|
254
|
+
options: Schema.optional(
|
|
255
|
+
Schema.Record({ key: Schema.String, value: Schema.Any }).annotations({
|
|
244
256
|
description: 'Additional options for the scroll into view.',
|
|
245
257
|
}),
|
|
246
258
|
),
|
|
247
259
|
}),
|
|
248
|
-
output:
|
|
260
|
+
output: Schema.Void,
|
|
249
261
|
}) {}
|
|
250
262
|
|
|
251
|
-
export class Expose extends
|
|
252
|
-
input:
|
|
253
|
-
part:
|
|
254
|
-
subject:
|
|
263
|
+
export class Expose extends Schema.TaggedClass<Expose>()(UPDATE_LAYOUT, {
|
|
264
|
+
input: Schema.Struct({
|
|
265
|
+
part: Schema.Literal('navigation').annotations({ description: 'Exposing an item in the navigation area.' }),
|
|
266
|
+
subject: Schema.String.annotations({ description: 'The id of the item to expose.' }),
|
|
255
267
|
}),
|
|
256
|
-
output:
|
|
268
|
+
output: Schema.Void,
|
|
257
269
|
}) {}
|
|
258
270
|
}
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { Schema
|
|
5
|
+
import { Schema } from 'effect';
|
|
6
6
|
|
|
7
|
-
export const ResourceKey =
|
|
8
|
-
export type ResourceKey =
|
|
7
|
+
export const ResourceKey = Schema.Union(Schema.String, Schema.Record({ key: Schema.String, value: Schema.Any }));
|
|
8
|
+
export type ResourceKey = Schema.Schema.Type<typeof ResourceKey>;
|
|
9
9
|
|
|
10
|
-
export const ResourceLanguage =
|
|
11
|
-
export type ResourceLanguage =
|
|
10
|
+
export const ResourceLanguage = Schema.Record({ key: Schema.String, value: ResourceKey });
|
|
11
|
+
export type ResourceLanguage = Schema.Schema.Type<typeof ResourceLanguage>;
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* A resource is a collection of translations for a language.
|
|
15
15
|
*/
|
|
16
|
-
export const Resource =
|
|
17
|
-
export type Resource =
|
|
16
|
+
export const Resource = Schema.Record({ key: Schema.String, value: ResourceLanguage });
|
|
17
|
+
export type Resource = Schema.Schema.Type<typeof Resource>;
|
|
@@ -2,15 +2,11 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { Registry } from '@effect-rx/rx-react';
|
|
5
6
|
import { Effect } from 'effect';
|
|
6
|
-
import { describe, expect, it } from 'vitest';
|
|
7
|
+
import { describe, expect, it, onTestFinished } from 'vitest';
|
|
7
8
|
|
|
8
|
-
import {
|
|
9
|
-
import { registerSignalsRuntime } from '@dxos/echo-signals';
|
|
10
|
-
|
|
11
|
-
import { defineCapability, PluginsContext } from './capabilities';
|
|
12
|
-
|
|
13
|
-
registerSignalsRuntime();
|
|
9
|
+
import { defineCapability, PluginContext } from './capabilities';
|
|
14
10
|
|
|
15
11
|
const defaultOptions = {
|
|
16
12
|
activate: () => Effect.succeed(false),
|
|
@@ -19,99 +15,122 @@ const defaultOptions = {
|
|
|
19
15
|
|
|
20
16
|
describe('PluginsContext', () => {
|
|
21
17
|
it('should return empty array if no capabilities are contributed', () => {
|
|
22
|
-
const
|
|
18
|
+
const registry = Registry.make();
|
|
19
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
23
20
|
const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
|
|
24
|
-
expect(context.
|
|
21
|
+
expect(context.getCapabilities(interfaceDef)).toEqual([]);
|
|
25
22
|
});
|
|
26
23
|
|
|
27
24
|
it('should be able to contribute and request capabilities', () => {
|
|
28
|
-
const
|
|
25
|
+
const registry = Registry.make();
|
|
26
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
29
27
|
const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
|
|
30
28
|
const implementation = { example: 'identifier' };
|
|
31
29
|
context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
|
|
32
|
-
expect(context.
|
|
30
|
+
expect(context.getCapabilities(interfaceDef)).toEqual([implementation]);
|
|
33
31
|
});
|
|
34
32
|
|
|
35
33
|
it('should be able to remove capabilities', () => {
|
|
36
|
-
const
|
|
34
|
+
const registry = Registry.make();
|
|
35
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
37
36
|
const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
|
|
38
37
|
const implementation = { example: 'identifier' };
|
|
39
38
|
context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
|
|
40
|
-
expect(context.
|
|
39
|
+
expect(context.getCapabilities(interfaceDef)).toEqual([implementation]);
|
|
41
40
|
context.removeCapability(interfaceDef, implementation);
|
|
42
|
-
expect(context.
|
|
41
|
+
expect(context.getCapabilities(interfaceDef)).toEqual([]);
|
|
43
42
|
});
|
|
44
43
|
|
|
45
44
|
it('should be able to contribute and request multiple implementations', () => {
|
|
46
|
-
const
|
|
45
|
+
const registry = Registry.make();
|
|
46
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
47
47
|
const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
|
|
48
48
|
const implementation1 = { example: 'first' };
|
|
49
49
|
const implementation2 = { example: 'second' };
|
|
50
50
|
context.contributeCapability({ interface: interfaceDef, implementation: implementation1, module: 'test' });
|
|
51
51
|
context.contributeCapability({ interface: interfaceDef, implementation: implementation2, module: 'test' });
|
|
52
|
-
expect(context.
|
|
52
|
+
expect(context.getCapabilities(interfaceDef)).toEqual([implementation1, implementation2]);
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
it('should be able to request multiple capabilities', () => {
|
|
56
|
-
const
|
|
56
|
+
const registry = Registry.make();
|
|
57
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
57
58
|
const interfaceDef1 = defineCapability<{ one: number }>('@dxos/app-framework/test/one');
|
|
58
59
|
const interfaceDef2 = defineCapability<{ two: number }>('@dxos/app-framework/test/two');
|
|
59
60
|
const implementation1 = { one: 1 };
|
|
60
61
|
const implementation2 = { two: 2 };
|
|
61
62
|
context.contributeCapability({ interface: interfaceDef1, implementation: implementation1, module: 'test' });
|
|
62
63
|
context.contributeCapability({ interface: interfaceDef2, implementation: implementation2, module: 'test' });
|
|
63
|
-
expect(context.
|
|
64
|
-
expect(context.
|
|
64
|
+
expect(context.getCapabilities(interfaceDef1)).toEqual([implementation1]);
|
|
65
|
+
expect(context.getCapabilities(interfaceDef2)).toEqual([implementation2]);
|
|
65
66
|
});
|
|
66
67
|
|
|
67
68
|
it('should be reactive', () => {
|
|
68
|
-
const
|
|
69
|
+
const registry = Registry.make();
|
|
70
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
69
71
|
const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
|
|
70
72
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
let count = 0;
|
|
74
|
+
const cancel = registry.subscribe(context.capabilities(interfaceDef), () => {
|
|
75
|
+
count++;
|
|
73
76
|
});
|
|
77
|
+
onTestFinished(() => cancel());
|
|
78
|
+
expect(count).toEqual(0);
|
|
74
79
|
|
|
75
|
-
|
|
80
|
+
registry.get(context.capabilities(interfaceDef));
|
|
81
|
+
expect(count).toEqual(1);
|
|
76
82
|
|
|
77
83
|
const implementation = { example: 'identifier' };
|
|
78
84
|
context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
|
|
79
|
-
expect(
|
|
85
|
+
expect(count).toEqual(2);
|
|
80
86
|
|
|
81
87
|
context.removeCapability(interfaceDef, implementation);
|
|
82
|
-
expect(
|
|
88
|
+
expect(count).toEqual(3);
|
|
83
89
|
});
|
|
84
90
|
|
|
85
91
|
it('should not be reactive to changes within the implementation', () => {
|
|
86
|
-
const
|
|
92
|
+
const registry = Registry.make();
|
|
93
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
87
94
|
const interfaceDef = defineCapability<{ example: string }>('@dxos/app-framework/test/example');
|
|
88
95
|
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
let count = 0;
|
|
97
|
+
const cancel = registry.subscribe(context.capabilities(interfaceDef), () => {
|
|
98
|
+
count++;
|
|
91
99
|
});
|
|
100
|
+
onTestFinished(() => cancel());
|
|
101
|
+
expect(count).toEqual(0);
|
|
92
102
|
|
|
93
|
-
|
|
103
|
+
registry.get(context.capabilities(interfaceDef));
|
|
104
|
+
expect(count).toEqual(1);
|
|
94
105
|
|
|
95
106
|
const implementation = { example: 'identifier' };
|
|
96
107
|
context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
|
|
97
|
-
expect(
|
|
108
|
+
expect(count).toEqual(2);
|
|
98
109
|
|
|
99
110
|
implementation.example = 'updated';
|
|
100
|
-
expect(
|
|
111
|
+
expect(count).toEqual(2);
|
|
101
112
|
|
|
102
|
-
const capabilities = context.
|
|
113
|
+
const capabilities = context.getCapabilities(interfaceDef);
|
|
103
114
|
expect(capabilities).toEqual([implementation]);
|
|
104
115
|
expect(capabilities[0].example).toEqual('updated');
|
|
105
|
-
expect(
|
|
116
|
+
expect(count).toEqual(2);
|
|
106
117
|
});
|
|
107
118
|
|
|
108
119
|
it('should be able to wait for a capability', async () => {
|
|
109
|
-
const
|
|
120
|
+
const registry = Registry.make();
|
|
121
|
+
const context = new PluginContext({ registry, ...defaultOptions });
|
|
110
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
|
+
|
|
111
132
|
const implementation = { example: 'identifier' };
|
|
112
|
-
const promise = context.waitForCapability(interfaceDef);
|
|
113
133
|
context.contributeCapability({ interface: interfaceDef, implementation, module: 'test' });
|
|
114
|
-
const capability = await promise;
|
|
115
134
|
expect(capability).toEqual(implementation);
|
|
116
135
|
});
|
|
117
136
|
});
|