@dxos/app-framework 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef
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 +2 -4
- package/.storybook/preview.mts +2 -2
- package/dist/lib/browser/capability-Q5XRXRD2.mjs +38 -0
- package/dist/lib/browser/capability-Q5XRXRD2.mjs.map +7 -0
- package/dist/lib/browser/capability-V7LR4LQN.mjs +35 -0
- package/dist/lib/browser/capability-V7LR4LQN.mjs.map +7 -0
- package/dist/lib/browser/chunk-23D4SJUE.mjs +42 -0
- package/dist/lib/browser/chunk-23D4SJUE.mjs.map +7 -0
- package/dist/lib/browser/chunk-3JWJXGLK.mjs +79 -0
- package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
- package/dist/lib/browser/chunk-3ZS2A3DN.mjs +907 -0
- package/dist/lib/browser/chunk-3ZS2A3DN.mjs.map +7 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
- package/dist/lib/browser/chunk-5LAIGWLU.mjs +467 -0
- package/dist/lib/browser/chunk-5LAIGWLU.mjs.map +7 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
- package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-JXCBZSBJ.mjs +372 -0
- package/dist/lib/browser/chunk-JXCBZSBJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-MX5DKEJH.mjs +584 -0
- package/dist/lib/browser/chunk-MX5DKEJH.mjs.map +7 -0
- package/dist/lib/browser/chunk-WBHCSOBW.mjs +80 -0
- package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
- package/dist/lib/browser/chunk-Z55LVAGN.mjs +213 -0
- package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs +142 -0
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +74 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +24 -0
- package/dist/lib/browser/common/capabilities.mjs +46 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/activation-event.mjs.map +7 -0
- package/dist/lib/browser/core/capability.mjs +30 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +17 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +37 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +20 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +95 -148
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs +44 -0
- package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +227 -41
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/testing/react.mjs +78 -0
- package/dist/lib/browser/testing/react.mjs.map +7 -0
- package/dist/lib/browser/ui/index.mjs +48 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-EW5GJCI6.mjs +39 -0
- package/dist/lib/node-esm/capability-EW5GJCI6.mjs.map +7 -0
- package/dist/lib/node-esm/capability-YKBMMD53.mjs +36 -0
- package/dist/lib/node-esm/capability-YKBMMD53.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-D347W3KO.mjs +143 -0
- package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-D5PO2WXX.mjs +373 -0
- package/dist/lib/node-esm/chunk-D5PO2WXX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs +214 -0
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KM2F6GH6.mjs +468 -0
- package/dist/lib/node-esm/chunk-KM2F6GH6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Q7XBFII4.mjs +908 -0
- package/dist/lib/node-esm/chunk-Q7XBFII4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SBS2YMPT.mjs +43 -0
- package/dist/lib/node-esm/chunk-SBS2YMPT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs +80 -0
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WFSRZKBP.mjs +81 -0
- package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WKTLE7MG.mjs +585 -0
- package/dist/lib/node-esm/chunk-WKTLE7MG.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +75 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +25 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +47 -0
- package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
- package/dist/lib/node-esm/core/activation-event.mjs +21 -0
- package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
- package/dist/lib/node-esm/core/capability.mjs +31 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +18 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +38 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +21 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +95 -148
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs +45 -0
- package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +227 -41
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/testing/react.mjs +79 -0
- package/dist/lib/node-esm/testing/react.mjs.map +7 -0
- package/dist/lib/node-esm/ui/index.mjs +49 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +832 -0
- package/dist/plugin/node-esm/index.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/types/src/cli/cli.d.ts +39 -0
- package/dist/types/src/cli/cli.d.ts.map +1 -0
- package/dist/types/src/cli/index.d.ts +2 -0
- package/dist/types/src/cli/index.d.ts.map +1 -0
- package/dist/types/src/common/activation-events.d.ts +27 -0
- package/dist/types/src/common/activation-events.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +110 -197
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +4 -8
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +19 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/translations.d.ts +8 -8
- package/dist/types/src/common/translations.d.ts.map +1 -1
- package/dist/types/src/context.d.ts +5 -0
- package/dist/types/src/context.d.ts.map +1 -0
- package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
- package/dist/types/src/core/activation-event.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.d.ts +48 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.test.d.ts +2 -0
- package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/capability.d.ts +156 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +8 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
- package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.d.ts +122 -0
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.d.ts +76 -0
- package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin.d.ts +207 -39
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +112 -0
- package/dist/types/src/core/url-loader.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.test.d.ts +2 -0
- package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
- package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
- package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/index.d.ts +3 -0
- package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/meta.d.ts +3 -0
- package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/testing.d.ts +59 -0
- package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
- package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/index.d.ts +2 -0
- package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
- package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +67 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/react.d.ts +27 -0
- package/dist/types/src/testing/react.d.ts.map +1 -0
- package/dist/types/src/testing/react.test.d.ts +2 -0
- package/dist/types/src/testing/react.test.d.ts.map +1 -0
- package/dist/types/src/testing/service.d.ts +8 -0
- package/dist/types/src/testing/service.d.ts.map +1 -0
- package/dist/types/src/testing/withPluginManager.d.ts +7 -6
- 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/src/ui/components/App/App.d.ts +9 -0
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/index.d.ts +2 -0
- package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
- package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
- package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
- package/dist/types/src/ui/components/index.d.ts +5 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
- package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
- package/dist/types/src/ui/index.d.ts +3 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +5 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.d.ts +37 -0
- package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/packages.d.ts +13 -0
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +25 -6
- package/package.json +112 -55
- package/src/cli/cli.ts +107 -0
- package/src/{components → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +169 -210
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +35 -0
- package/src/common/translations.ts +18 -10
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +10 -7
- package/src/core/capability-manager.test.ts +151 -0
- package/src/core/capability-manager.ts +192 -0
- package/src/core/capability.ts +247 -0
- package/src/core/index.ts +8 -4
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1354 -0
- package/src/core/plugin-manager.ts +1025 -0
- package/src/core/plugin-manifest.test.ts +48 -0
- package/src/core/plugin-manifest.ts +102 -0
- package/src/core/plugin.ts +365 -45
- package/src/core/url-loader.test.ts +178 -0
- package/src/core/url-loader.ts +337 -0
- package/src/index.ts +3 -4
- package/src/plugin-operation/OperationPlugin.ts +24 -0
- package/src/plugin-operation/history/capability.ts +36 -0
- package/src/plugin-operation/history/errors.ts +7 -0
- package/src/plugin-operation/history/history-tracker.test.ts +374 -0
- package/src/plugin-operation/history/history-tracker.ts +128 -0
- package/src/plugin-operation/history/index.ts +9 -0
- package/src/plugin-operation/history/types.ts +17 -0
- package/src/plugin-operation/history/undo-mapping.ts +135 -0
- package/src/plugin-operation/history/undo-registry.test.ts +72 -0
- package/src/plugin-operation/history/undo-registry.ts +54 -0
- package/src/plugin-operation/index.ts +6 -0
- package/src/plugin-operation/invoker-capability.ts +55 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +155 -0
- package/src/plugin-runtime/RuntimePlugin.ts +19 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/{playground/layout → plugin-runtime}/index.ts +1 -1
- package/src/plugin-runtime/meta.ts +11 -0
- package/src/testing/harness.ts +229 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/react.test.tsx +48 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +8 -9
- package/src/testing/withPluginManager.tsx +68 -40
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +81 -0
- package/src/{playground/debug → ui/components/App}/index.ts +1 -1
- package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
- package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
- package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
- package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
- package/src/ui/components/PluginManager/index.ts +5 -0
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
- package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
- package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/context.ts +12 -0
- package/src/ui/components/Surface/index.ts +54 -0
- package/src/ui/components/Surface/types.test.ts +126 -0
- package/src/ui/components/Surface/types.ts +269 -0
- package/src/ui/components/index.ts +8 -0
- package/src/ui/hooks/index.ts +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +413 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/{components → ui/hooks}/useLoading.tsx +16 -10
- package/src/ui/hooks/useSettingsState.ts +26 -0
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +6 -0
- package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
- package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
- package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
- package/src/vite-plugin/boot-loader/index.ts +112 -0
- package/src/vite-plugin/composer/index.ts +277 -0
- package/src/vite-plugin/import-map/index.ts +524 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +24 -0
- package/src/vite-plugin/manifest.ts +50 -0
- package/src/vite-plugin/packages.ts +188 -0
- package/tsconfig.json +18 -15
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +1 -1
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +0 -7
- package/dist/lib/browser/chunk-6V54SRFL.mjs +0 -1638
- package/dist/lib/browser/chunk-6V54SRFL.mjs.map +0 -7
- package/dist/lib/browser/chunk-RGKMLI6U.mjs +0 -35
- package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs +0 -467
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-VFMJVO2M.mjs +0 -11
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs +0 -39
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +0 -7
- package/dist/lib/browser/store-7ZGMHOGB.mjs +0 -30
- package/dist/lib/browser/store-7ZGMHOGB.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -77
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs +0 -468
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs +0 -37
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs +0 -1640
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-SAPOKSLZ.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +0 -7
- package/dist/lib/node-esm/store-H4F4RMYD.mjs +0 -31
- package/dist/lib/node-esm/store-H4F4RMYD.mjs.map +0 -7
- package/dist/lib/node-esm/worker.mjs +0 -78
- package/dist/types/src/common/collaboration.d.ts +0 -20
- package/dist/types/src/common/collaboration.d.ts.map +0 -1
- package/dist/types/src/common/events.d.ts +0 -52
- package/dist/types/src/common/events.d.ts.map +0 -1
- package/dist/types/src/common/file.d.ts +0 -14
- package/dist/types/src/common/file.d.ts.map +0 -1
- package/dist/types/src/common/graph.d.ts +0 -21
- package/dist/types/src/common/graph.d.ts.map +0 -1
- package/dist/types/src/common/layout.d.ts +0 -279
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts +0 -59
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/components/App.d.ts +0 -10
- package/dist/types/src/components/App.d.ts.map +0 -1
- package/dist/types/src/components/App.stories.d.ts.map +0 -1
- package/dist/types/src/components/DefaultFallback.d.ts +0 -8
- package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
- package/dist/types/src/components/index.d.ts +0 -2
- package/dist/types/src/components/index.d.ts.map +0 -1
- package/dist/types/src/components/useApp.d.ts +0 -44
- package/dist/types/src/components/useApp.d.ts.map +0 -1
- package/dist/types/src/components/useLoading.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -117
- package/dist/types/src/core/capabilities.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.test.d.ts +0 -2
- package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
- package/dist/types/src/core/events.d.ts.map +0 -1
- package/dist/types/src/core/manager.d.ts +0 -126
- package/dist/types/src/core/manager.d.ts.map +0 -1
- package/dist/types/src/core/manager.test.d.ts +0 -2
- package/dist/types/src/core/manager.test.d.ts.map +0 -1
- package/dist/types/src/playground/debug/Debug.d.ts +0 -6
- package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
- package/dist/types/src/playground/debug/index.d.ts +0 -2
- package/dist/types/src/playground/debug/index.d.ts.map +0 -1
- package/dist/types/src/playground/debug/plugin.d.ts +0 -2
- package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Main.d.ts +0 -6
- package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/generator/generator.d.ts +0 -7
- package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
- package/dist/types/src/playground/generator/index.d.ts +0 -3
- package/dist/types/src/playground/generator/index.d.ts.map +0 -1
- package/dist/types/src/playground/generator/plugin.d.ts +0 -2
- package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/layout/Layout.d.ts +0 -8
- package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
- package/dist/types/src/playground/layout/index.d.ts +0 -2
- package/dist/types/src/playground/layout/index.d.ts.map +0 -1
- package/dist/types/src/playground/layout/plugin.d.ts +0 -2
- package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/logger/index.d.ts +0 -2
- package/dist/types/src/playground/logger/index.d.ts.map +0 -1
- package/dist/types/src/playground/logger/plugin.d.ts +0 -2
- package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/schema.d.ts +0 -13
- package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
- package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/actions.d.ts +0 -36
- package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/errors.d.ts +0 -16
- package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/index.d.ts +0 -6
- package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent.d.ts +0 -63
- package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/meta.d.ts +0 -3
- package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/actions.d.ts +0 -25
- package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/index.d.ts +0 -3
- package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
- package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/meta.d.ts +0 -3
- package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/store.d.ts +0 -5
- package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/translations.d.ts +0 -11
- package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
- package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
- package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
- package/dist/types/src/react/IntentContext.d.ts +0 -8
- package/dist/types/src/react/IntentContext.d.ts.map +0 -1
- package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
- package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
- package/dist/types/src/react/Surface.d.ts +0 -12
- package/dist/types/src/react/Surface.d.ts.map +0 -1
- package/dist/types/src/react/Surface.stories.d.ts +0 -17
- package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
- package/dist/types/src/react/common.d.ts +0 -13
- package/dist/types/src/react/common.d.ts.map +0 -1
- package/dist/types/src/react/index.d.ts +0 -7
- package/dist/types/src/react/index.d.ts.map +0 -1
- package/dist/types/src/react/useCapabilities.d.ts +0 -13
- package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
- package/dist/types/src/react/useIntentResolver.d.ts +0 -3
- package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
- package/dist/types/src/worker.d.ts +0 -4
- package/dist/types/src/worker.d.ts.map +0 -1
- package/src/common/collaboration.ts +0 -18
- package/src/common/events.ts +0 -79
- package/src/common/file.ts +0 -22
- package/src/common/graph.ts +0 -30
- package/src/common/layout.ts +0 -277
- package/src/common/surface.ts +0 -83
- package/src/components/App.stories.tsx +0 -33
- package/src/components/App.tsx +0 -59
- package/src/components/DefaultFallback.tsx +0 -26
- package/src/components/useApp.tsx +0 -164
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -259
- package/src/core/manager.test.ts +0 -516
- package/src/core/manager.ts +0 -597
- package/src/playground/debug/Debug.tsx +0 -39
- package/src/playground/debug/plugin.ts +0 -16
- package/src/playground/generator/Main.tsx +0 -71
- package/src/playground/generator/Toolbar.tsx +0 -47
- package/src/playground/generator/generator.ts +0 -48
- package/src/playground/generator/index.ts +0 -6
- package/src/playground/generator/plugin.ts +0 -22
- package/src/playground/layout/Layout.tsx +0 -33
- package/src/playground/layout/plugin.ts +0 -18
- package/src/playground/logger/Toolbar.tsx +0 -30
- package/src/playground/logger/plugin.ts +0 -41
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -46
- package/src/plugin-intent/IntentPlugin.ts +0 -20
- package/src/plugin-intent/actions.ts +0 -31
- package/src/plugin-intent/errors.ts +0 -40
- package/src/plugin-intent/index.ts +0 -9
- package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
- package/src/plugin-intent/intent-dispatcher.ts +0 -334
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-intent/meta.ts +0 -10
- package/src/plugin-settings/SettingsPlugin.ts +0 -34
- package/src/plugin-settings/actions.ts +0 -25
- package/src/plugin-settings/app-graph-builder.ts +0 -159
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -35
- package/src/plugin-settings/meta.ts +0 -10
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/ErrorBoundary.tsx +0 -54
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/Surface.stories.tsx +0 -101
- package/src/react/Surface.tsx +0 -86
- package/src/react/common.ts +0 -13
- package/src/react/index.ts +0 -10
- package/src/react/useCapabilities.ts +0 -31
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- /package/dist/lib/browser/{intent-dispatcher-VFMJVO2M.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-SAPOKSLZ.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { Compute, HalveCompute } from '../testing';
|
|
8
|
+
import * as UndoMapping from './undo-mapping';
|
|
9
|
+
import * as UndoRegistry from './undo-registry';
|
|
10
|
+
|
|
11
|
+
describe('UndoRegistry', () => {
|
|
12
|
+
test('looks up undo mapping by operation key', ({ expect }) => {
|
|
13
|
+
const undoMapping = UndoMapping.make({
|
|
14
|
+
operation: Compute,
|
|
15
|
+
inverse: HalveCompute,
|
|
16
|
+
deriveContext: (_input, output) => ({ value: output.value }),
|
|
17
|
+
});
|
|
18
|
+
const registry = UndoRegistry.make(() => [undoMapping]);
|
|
19
|
+
|
|
20
|
+
const result = registry.lookup(Compute);
|
|
21
|
+
expect(result).not.toBe(undefined);
|
|
22
|
+
expect(result?.inverse.meta.key).toBe('test.halve-compute');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('returns undefined for unmapped operations', ({ expect }) => {
|
|
26
|
+
const registry = UndoRegistry.make(() => []);
|
|
27
|
+
|
|
28
|
+
const result = registry.lookup(Compute);
|
|
29
|
+
expect(result).toBe(undefined);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('deriveContext extracts correct undo input', ({ expect }) => {
|
|
33
|
+
const undoMapping = UndoMapping.make({
|
|
34
|
+
operation: Compute,
|
|
35
|
+
inverse: HalveCompute,
|
|
36
|
+
// Note: This tests that input and output types are inferred correctly.
|
|
37
|
+
deriveContext: (input, output) => ({ value: output.value + input.value }),
|
|
38
|
+
});
|
|
39
|
+
const registry = UndoRegistry.make(() => [undoMapping]);
|
|
40
|
+
|
|
41
|
+
const result = registry.lookup(Compute);
|
|
42
|
+
const context = result?.deriveContext({ value: 5 }, { value: 10 });
|
|
43
|
+
expect(context).toEqual({ value: 15 });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('resolveMessage', () => {
|
|
48
|
+
test('returns undefined for undefined message', ({ expect }) => {
|
|
49
|
+
const result = UndoMapping.resolveMessage(undefined, { value: 1 }, { value: 2 });
|
|
50
|
+
expect(result).toBe(undefined);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('returns static label as-is', ({ expect }) => {
|
|
54
|
+
const staticMessage: [string, { ns: string }] = ['test.message', { ns: 'test' }];
|
|
55
|
+
const result = UndoMapping.resolveMessage(staticMessage, { value: 1 }, { value: 2 });
|
|
56
|
+
expect(result).toEqual(staticMessage);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('calls function message with input and output', ({ expect }) => {
|
|
60
|
+
const messageFunc = (input: { value: number }, output: { value: number }): [string, { ns: string }] => [
|
|
61
|
+
`input-${input.value}-output-${output.value}`,
|
|
62
|
+
{ ns: 'test' },
|
|
63
|
+
];
|
|
64
|
+
const result = UndoMapping.resolveMessage(messageFunc, { value: 5 }, { value: 10 });
|
|
65
|
+
expect(result).toEqual(['input-5-output-10', { ns: 'test' }]);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('returns string label as-is', ({ expect }) => {
|
|
69
|
+
const result = UndoMapping.resolveMessage('simple string', { value: 1 }, { value: 2 });
|
|
70
|
+
expect(result).toBe('simple string');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { Operation } from '@dxos/compute';
|
|
6
|
+
|
|
7
|
+
import type * as UndoMapping from './undo-mapping';
|
|
8
|
+
|
|
9
|
+
//
|
|
10
|
+
// Public Interface
|
|
11
|
+
//
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Lookup result from UndoRegistry.
|
|
15
|
+
*/
|
|
16
|
+
export type UndoMappingResult = {
|
|
17
|
+
inverse: Operation.Definition<any, any>;
|
|
18
|
+
/** Returns undefined to indicate the operation is not undoable. */
|
|
19
|
+
deriveContext: (input: any, output: any) => any | undefined;
|
|
20
|
+
/** Message provider - may be a static Label or a function. */
|
|
21
|
+
message?: UndoMapping.MessageProvider<Operation.Definition<any, any>>;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* UndoRegistry interface - looks up inverse operations.
|
|
26
|
+
*/
|
|
27
|
+
export interface UndoRegistry {
|
|
28
|
+
lookup: (operation: Operation.Definition<any, any>) => UndoMappingResult | undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//
|
|
32
|
+
// Factory
|
|
33
|
+
//
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Creates an UndoRegistry that looks up inverse operations.
|
|
37
|
+
*/
|
|
38
|
+
export const make = (getMappings: () => UndoMapping.UndoMapping[]): UndoRegistry => {
|
|
39
|
+
const lookup = (operation: Operation.Definition<any, any>): UndoMappingResult | undefined => {
|
|
40
|
+
const mappings = getMappings();
|
|
41
|
+
const mapping = mappings.find((m) => m.operation.meta.key === operation.meta.key);
|
|
42
|
+
if (!mapping) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
inverse: mapping.inverse,
|
|
48
|
+
deriveContext: mapping.deriveContext,
|
|
49
|
+
message: mapping.message,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return { lookup };
|
|
54
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { OperationHandlerSet } from '@dxos/compute';
|
|
8
|
+
import { OperationInvoker } from '@dxos/operation';
|
|
9
|
+
|
|
10
|
+
import { ActivationEvents, Capabilities } from '../common';
|
|
11
|
+
import { Capability, Plugin } from '../core';
|
|
12
|
+
|
|
13
|
+
//
|
|
14
|
+
// Capability Module
|
|
15
|
+
//
|
|
16
|
+
|
|
17
|
+
export default Capability.makeModule(
|
|
18
|
+
Effect.fnUntraced(function* () {
|
|
19
|
+
// Get the services for synchronous access in callbacks.
|
|
20
|
+
const capabilityManager = yield* Capability.Service;
|
|
21
|
+
const pluginManager = yield* Plugin.Service;
|
|
22
|
+
|
|
23
|
+
// Get the ManagedRuntime capability (should be available since we activate after ManagedRuntimeReady).
|
|
24
|
+
const managedRuntime = yield* Capability.get(Capabilities.ManagedRuntime);
|
|
25
|
+
|
|
26
|
+
// Cache the merged handler promise to prevent concurrent module loading.
|
|
27
|
+
// Multiple Effects can invoke getHandlers simultaneously; without caching each
|
|
28
|
+
// creates a new merge() which triggers parallel dynamic imports that race in
|
|
29
|
+
// WebKit's module evaluator, causing TDZ errors on export default bindings.
|
|
30
|
+
let cachedSets: readonly OperationHandlerSet.OperationHandlerSet[] | undefined;
|
|
31
|
+
let cachedHandlers: ReturnType<OperationHandlerSet.OperationHandlerSet['getHandlers']> | undefined;
|
|
32
|
+
|
|
33
|
+
const invoker = OperationInvoker.make(
|
|
34
|
+
() =>
|
|
35
|
+
Effect.gen(function* () {
|
|
36
|
+
yield* Plugin.activate(ActivationEvents.SetupOperationHandler);
|
|
37
|
+
const sets = yield* Capability.getAll(Capabilities.OperationHandler);
|
|
38
|
+
|
|
39
|
+
if (sets !== cachedSets) {
|
|
40
|
+
cachedSets = sets;
|
|
41
|
+
cachedHandlers = OperationHandlerSet.merge(...sets).getHandlers();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return yield* Effect.promise(() => cachedHandlers!);
|
|
45
|
+
}).pipe(
|
|
46
|
+
Effect.provideService(Capability.Service, capabilityManager),
|
|
47
|
+
Effect.provideService(Plugin.Service, pluginManager),
|
|
48
|
+
Effect.orDie,
|
|
49
|
+
),
|
|
50
|
+
managedRuntime,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
return Capability.contributes(Capabilities.OperationInvoker, invoker);
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Plugin } from '../core';
|
|
6
|
+
|
|
7
|
+
export const meta: Plugin.Meta = {
|
|
8
|
+
id: 'org.dxos.plugin.operation',
|
|
9
|
+
name: 'Operation Plugin',
|
|
10
|
+
description: 'Provides operation invocation, undo registry, and history tracking.',
|
|
11
|
+
};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Deferred from 'effect/Deferred';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Fiber from 'effect/Fiber';
|
|
8
|
+
import * as Ref from 'effect/Ref';
|
|
9
|
+
import * as Schema from 'effect/Schema';
|
|
10
|
+
import * as Stream from 'effect/Stream';
|
|
11
|
+
|
|
12
|
+
import { Operation } from '@dxos/compute';
|
|
13
|
+
import { OperationInvoker } from '@dxos/operation';
|
|
14
|
+
|
|
15
|
+
//
|
|
16
|
+
// Test Operations
|
|
17
|
+
//
|
|
18
|
+
|
|
19
|
+
export const Compute = Operation.make({
|
|
20
|
+
input: Schema.Struct({ value: Schema.Number }),
|
|
21
|
+
output: Schema.Struct({ value: Schema.Number }),
|
|
22
|
+
meta: { key: 'test.compute' },
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export const HalveCompute = Operation.make({
|
|
26
|
+
input: Schema.Struct({ value: Schema.Number }),
|
|
27
|
+
output: Schema.Struct({ value: Schema.Number }),
|
|
28
|
+
meta: { key: 'test.halve-compute' },
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const ToString = Operation.make({
|
|
32
|
+
input: Schema.Struct({ value: Schema.Number }),
|
|
33
|
+
output: Schema.Struct({ string: Schema.String }),
|
|
34
|
+
meta: { key: 'test.to-string' },
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export const Add = Operation.make({
|
|
38
|
+
input: Schema.Tuple(Schema.Number, Schema.Number),
|
|
39
|
+
output: Schema.Number,
|
|
40
|
+
meta: { key: 'test.add' },
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export const SideEffect = Operation.make({
|
|
44
|
+
input: Schema.Void,
|
|
45
|
+
output: Schema.Void,
|
|
46
|
+
meta: { key: 'test.side-effect' },
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
//
|
|
50
|
+
// Test Handlers
|
|
51
|
+
//
|
|
52
|
+
|
|
53
|
+
export const computeHandler = Operation.withHandler(Compute, (data) =>
|
|
54
|
+
Effect.gen(function* () {
|
|
55
|
+
yield* Effect.sleep(data.value * 10);
|
|
56
|
+
return { value: data.value * 2 };
|
|
57
|
+
}),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
export const halveComputeHandler = Operation.withHandler(HalveCompute, (data) =>
|
|
61
|
+
Effect.succeed({ value: data.value / 2 }),
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
export const toStringHandler = Operation.withHandler(ToString, (data) =>
|
|
65
|
+
Effect.succeed({ string: data.value.toString() }),
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
export const addHandler = Operation.withHandler(Add, (data) => Effect.succeed(data[0] + data[1]));
|
|
69
|
+
|
|
70
|
+
export const sideEffectHandler = Operation.withHandler(SideEffect, () => Effect.succeed(undefined));
|
|
71
|
+
|
|
72
|
+
//
|
|
73
|
+
// Test Utilities
|
|
74
|
+
//
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Event collector for testing - provides deterministic event collection using Effect primitives.
|
|
78
|
+
*/
|
|
79
|
+
export interface EventCollector {
|
|
80
|
+
/** All collected events. */
|
|
81
|
+
readonly events: OperationInvoker.InvocationEvent[];
|
|
82
|
+
/** Wait until N events have been collected. */
|
|
83
|
+
waitForEvents: (count: number) => Effect.Effect<void>;
|
|
84
|
+
/** Clean up the subscription fiber. */
|
|
85
|
+
dispose: Effect.Effect<void>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Creates an event collector that subscribes to invoker events.
|
|
90
|
+
* Uses Effect primitives for synchronization.
|
|
91
|
+
*/
|
|
92
|
+
export const createEventCollector = (invoker: OperationInvoker.OperationInvoker): Effect.Effect<EventCollector> =>
|
|
93
|
+
Effect.gen(function* () {
|
|
94
|
+
const events: OperationInvoker.InvocationEvent[] = [];
|
|
95
|
+
|
|
96
|
+
// Ref to track current waiter (waiting for N events).
|
|
97
|
+
const waiterRef = yield* Ref.make<{ count: number; deferred: Deferred.Deferred<void> } | null>(null);
|
|
98
|
+
|
|
99
|
+
// Deferred to signal when subscription is ready.
|
|
100
|
+
const subscriptionReady = yield* Deferred.make<void>();
|
|
101
|
+
|
|
102
|
+
const checkWaiter = Effect.gen(function* () {
|
|
103
|
+
const waiter = yield* Ref.get(waiterRef);
|
|
104
|
+
if (waiter && events.length >= waiter.count) {
|
|
105
|
+
yield* Deferred.succeed(waiter.deferred, undefined);
|
|
106
|
+
yield* Ref.set(waiterRef, null);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Fork a fiber to consume the invocation stream.
|
|
111
|
+
const fiber = yield* Effect.fork(
|
|
112
|
+
Effect.gen(function* () {
|
|
113
|
+
// Signal that subscription is about to start.
|
|
114
|
+
yield* Deferred.succeed(subscriptionReady, undefined);
|
|
115
|
+
yield* Stream.fromPubSub(invoker.invocations).pipe(
|
|
116
|
+
Stream.runForEach((event) =>
|
|
117
|
+
Effect.gen(function* () {
|
|
118
|
+
events.push(event);
|
|
119
|
+
yield* checkWaiter;
|
|
120
|
+
}),
|
|
121
|
+
),
|
|
122
|
+
);
|
|
123
|
+
}),
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// Wait for the subscription to be established.
|
|
127
|
+
yield* Deferred.await(subscriptionReady);
|
|
128
|
+
// Additional yield to ensure PubSub subscription is fully registered.
|
|
129
|
+
yield* Effect.yieldNow();
|
|
130
|
+
|
|
131
|
+
const waitForEvents = (count: number): Effect.Effect<void> =>
|
|
132
|
+
Effect.gen(function* () {
|
|
133
|
+
if (events.length >= count) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const deferred = yield* Deferred.make<void>();
|
|
137
|
+
yield* Ref.set(waiterRef, { count, deferred });
|
|
138
|
+
yield* Deferred.await(deferred);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const dispose = Fiber.interrupt(fiber);
|
|
142
|
+
|
|
143
|
+
return { events, waitForEvents, dispose };
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Waits until a condition is true, yielding to the JS event loop between checks.
|
|
148
|
+
* Uses setImmediate to allow other async work to complete.
|
|
149
|
+
*/
|
|
150
|
+
export const waitUntil = (condition: () => boolean): Effect.Effect<void> =>
|
|
151
|
+
Effect.gen(function* () {
|
|
152
|
+
while (!condition()) {
|
|
153
|
+
yield* Effect.promise(() => new Promise((r) => setImmediate(r)));
|
|
154
|
+
}
|
|
155
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { ActivationEvents } from '../common';
|
|
6
|
+
import { Capability, Plugin } from '../core';
|
|
7
|
+
import { meta } from './meta';
|
|
8
|
+
|
|
9
|
+
const ManagedRuntimeCapability = Capability.lazy('ManagedRuntime', () => import('./capability'));
|
|
10
|
+
|
|
11
|
+
export const RuntimePlugin = Plugin.define(meta).pipe(
|
|
12
|
+
Plugin.addModule({
|
|
13
|
+
activatesOn: ActivationEvents.Startup,
|
|
14
|
+
firesBeforeActivation: [ActivationEvents.SetupLayer],
|
|
15
|
+
firesAfterActivation: [ActivationEvents.ManagedRuntimeReady],
|
|
16
|
+
activate: ManagedRuntimeCapability,
|
|
17
|
+
}),
|
|
18
|
+
Plugin.make,
|
|
19
|
+
);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Layer from 'effect/Layer';
|
|
7
|
+
import * as ManagedRuntime from 'effect/ManagedRuntime';
|
|
8
|
+
|
|
9
|
+
import { ActivationEvents, Capabilities } from '../common';
|
|
10
|
+
import { Capability, Plugin } from '../core';
|
|
11
|
+
|
|
12
|
+
//
|
|
13
|
+
// Capability Module
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
export default Capability.makeModule(
|
|
17
|
+
Effect.fnUntraced(function* () {
|
|
18
|
+
// Get the CapabilityManager to create a layer for it.
|
|
19
|
+
const capabilityManager = yield* Capability.Service;
|
|
20
|
+
|
|
21
|
+
// Get the PluginManager to create a layer for it.
|
|
22
|
+
const pluginManager = yield* Plugin.Service;
|
|
23
|
+
|
|
24
|
+
// Trigger setup event so plugins can contribute their layers.
|
|
25
|
+
yield* Plugin.activate(ActivationEvents.SetupLayer);
|
|
26
|
+
|
|
27
|
+
// Gather all contributed layers.
|
|
28
|
+
const layers = yield* Capability.getAll(Capabilities.Layer);
|
|
29
|
+
|
|
30
|
+
// Create layers that provide Capability.Service and Plugin.Service.
|
|
31
|
+
const capabilityServiceLayer = Layer.succeed(Capability.Service, capabilityManager);
|
|
32
|
+
const pluginServiceLayer = Layer.succeed(Plugin.Service, pluginManager);
|
|
33
|
+
|
|
34
|
+
// Merge all layers including service layers.
|
|
35
|
+
// Layer.mergeAll requires a tuple type, so we use a cast for dynamic arrays.
|
|
36
|
+
const composedLayer =
|
|
37
|
+
layers.length > 0
|
|
38
|
+
? (Layer.mergeAll as (...args: Layer.Layer<any, any, any>[]) => Layer.Layer<any, any, never>)(
|
|
39
|
+
capabilityServiceLayer,
|
|
40
|
+
pluginServiceLayer,
|
|
41
|
+
...layers,
|
|
42
|
+
)
|
|
43
|
+
: (Layer.mergeAll as (...args: Layer.Layer<any, any, any>[]) => Layer.Layer<any, any, never>)(
|
|
44
|
+
capabilityServiceLayer,
|
|
45
|
+
pluginServiceLayer,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
// Create the managed runtime from the composed layer.
|
|
49
|
+
const runtime = ManagedRuntime.make(composedLayer) as Capabilities.ManagedRuntime;
|
|
50
|
+
|
|
51
|
+
return Capability.contributes(Capabilities.ManagedRuntime, runtime);
|
|
52
|
+
}),
|
|
53
|
+
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Plugin } from '../core';
|
|
6
|
+
|
|
7
|
+
export const meta: Plugin.Meta = {
|
|
8
|
+
id: 'org.dxos.plugin.runtime',
|
|
9
|
+
name: 'Runtime Plugin',
|
|
10
|
+
description: 'Provides a managed Effect runtime by composing contributed layers.',
|
|
11
|
+
};
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Registry } from '@effect-atom/atom-react';
|
|
6
|
+
import * as Duration from 'effect/Duration';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as PubSub from 'effect/PubSub';
|
|
9
|
+
import * as Queue from 'effect/Queue';
|
|
10
|
+
|
|
11
|
+
import { type Operation } from '@dxos/compute';
|
|
12
|
+
import { runAndForwardErrors } from '@dxos/effect';
|
|
13
|
+
import { invariant } from '@dxos/invariant';
|
|
14
|
+
|
|
15
|
+
import { ActivationEvents, Capabilities } from '../common';
|
|
16
|
+
import { ActivationEvent, type Capability, type CapabilityManager, type Plugin, PluginManager } from '../core';
|
|
17
|
+
|
|
18
|
+
export type TestAppOptions = {
|
|
19
|
+
/** Plugins to register. */
|
|
20
|
+
plugins: Plugin.Plugin[];
|
|
21
|
+
/** Plugin ids that are always enabled. Defaults to all provided plugin ids. */
|
|
22
|
+
core?: string[];
|
|
23
|
+
/** Plugin ids that are enabled by default in addition to core. */
|
|
24
|
+
enabled?: string[];
|
|
25
|
+
/** Additional activation events fired alongside SetupReactSurface. */
|
|
26
|
+
setupEvents?: ActivationEvent.ActivationEvent[];
|
|
27
|
+
/**
|
|
28
|
+
* Whether to automatically fire SetupReactSurface + Startup during setup.
|
|
29
|
+
* Defaults to true.
|
|
30
|
+
*/
|
|
31
|
+
autoStart?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Whether to register the PluginManager + AtomRegistry framework capabilities.
|
|
34
|
+
* Defaults to true.
|
|
35
|
+
*/
|
|
36
|
+
registerFrameworkCapabilities?: boolean;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A running plugin manager plus helpers for driving it in tests.
|
|
41
|
+
*/
|
|
42
|
+
export interface TestHarness {
|
|
43
|
+
readonly manager: PluginManager.PluginManager;
|
|
44
|
+
readonly capabilities: CapabilityManager.CapabilityManager;
|
|
45
|
+
readonly registry: Registry.Registry;
|
|
46
|
+
|
|
47
|
+
/** Activate the given event. Equivalent to `manager.activate(event)`. */
|
|
48
|
+
fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;
|
|
49
|
+
/** Re-activate all modules that were activated by the given event. */
|
|
50
|
+
reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;
|
|
51
|
+
|
|
52
|
+
/** Returns the first contributed capability for the given interface. Throws if none are present. */
|
|
53
|
+
get<T>(iface: Capability.InterfaceDef<T>): T;
|
|
54
|
+
/** Returns all contributed capabilities for the given interface. */
|
|
55
|
+
getAll<T>(iface: Capability.InterfaceDef<T>): T[];
|
|
56
|
+
/** Waits until at least one capability is contributed for the given interface. */
|
|
57
|
+
waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T>;
|
|
58
|
+
/** Waits until the given activation event has completed. */
|
|
59
|
+
waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void>;
|
|
60
|
+
|
|
61
|
+
/** Invokes an operation through the `Capabilities.OperationInvoker` capability. */
|
|
62
|
+
invoke<I, O>(op: Operation.Definition<I, O>, ...args: void extends I ? [input?: I] : [input: I]): Promise<O>;
|
|
63
|
+
|
|
64
|
+
enable(id: string): Promise<boolean>;
|
|
65
|
+
disable(id: string): Promise<boolean>;
|
|
66
|
+
|
|
67
|
+
/** Shuts down the underlying plugin manager. */
|
|
68
|
+
dispose(): Promise<void>;
|
|
69
|
+
|
|
70
|
+
/** Async-disposable support so tests can use `await using harness = ...`. */
|
|
71
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const DEFAULT_TIMEOUT_MS = 5_000;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Creates a TestHarness with the same bootstrap sequence that `useApp` performs,
|
|
78
|
+
* minus the React provider tree.
|
|
79
|
+
*
|
|
80
|
+
* For Node-only tests, this is enough to fire activation events, read
|
|
81
|
+
* capabilities, and invoke operations.
|
|
82
|
+
*
|
|
83
|
+
* For React tests, pass the returned harness to `render` or `renderSurface`
|
|
84
|
+
* from `@dxos/app-framework/testing-react`.
|
|
85
|
+
*/
|
|
86
|
+
export const createTestApp = async (opts: TestAppOptions): Promise<TestHarness> => {
|
|
87
|
+
const {
|
|
88
|
+
plugins,
|
|
89
|
+
core = plugins.map((plugin) => plugin.meta.id),
|
|
90
|
+
enabled,
|
|
91
|
+
setupEvents = [],
|
|
92
|
+
autoStart = true,
|
|
93
|
+
registerFrameworkCapabilities = true,
|
|
94
|
+
} = opts;
|
|
95
|
+
|
|
96
|
+
const pluginLoader = (id: string) =>
|
|
97
|
+
Effect.sync(() => {
|
|
98
|
+
const plugin = plugins.find((plugin) => plugin.meta.id === id);
|
|
99
|
+
invariant(plugin, `Plugin not found: ${id}`);
|
|
100
|
+
return plugin;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const manager = PluginManager.make({ pluginLoader, plugins, core, enabled });
|
|
104
|
+
|
|
105
|
+
if (registerFrameworkCapabilities) {
|
|
106
|
+
manager.capabilities.contribute({
|
|
107
|
+
interface: Capabilities.PluginManager,
|
|
108
|
+
implementation: manager,
|
|
109
|
+
module: 'org.dxos.app-framework.plugin-manager',
|
|
110
|
+
});
|
|
111
|
+
manager.capabilities.contribute({
|
|
112
|
+
interface: Capabilities.AtomRegistry,
|
|
113
|
+
implementation: manager.registry,
|
|
114
|
+
module: 'org.dxos.app-framework.atom-registry',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (autoStart) {
|
|
119
|
+
try {
|
|
120
|
+
await runAndForwardErrors(
|
|
121
|
+
Effect.all([
|
|
122
|
+
...setupEvents.map((event) => manager.activate(event)),
|
|
123
|
+
manager.activate(ActivationEvents.SetupReactSurface),
|
|
124
|
+
manager.activate(ActivationEvents.Startup),
|
|
125
|
+
]),
|
|
126
|
+
);
|
|
127
|
+
} catch (err) {
|
|
128
|
+
await runAndForwardErrors(manager.shutdown()).catch(() => undefined);
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return new TestHarnessImpl(manager);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
class TestHarnessImpl implements TestHarness {
|
|
137
|
+
constructor(readonly manager: PluginManager.PluginManager) {}
|
|
138
|
+
|
|
139
|
+
get capabilities(): CapabilityManager.CapabilityManager {
|
|
140
|
+
return this.manager.capabilities;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
get registry(): Registry.Registry {
|
|
144
|
+
return this.manager.registry;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {
|
|
148
|
+
return runAndForwardErrors(this.manager.activate(event));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {
|
|
152
|
+
return runAndForwardErrors(this.manager.reset(event));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
get<T>(iface: Capability.InterfaceDef<T>): T {
|
|
156
|
+
return this.manager.capabilities.get(iface);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
getAll<T>(iface: Capability.InterfaceDef<T>): T[] {
|
|
160
|
+
return this.manager.capabilities.getAll(iface);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T> {
|
|
164
|
+
const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
165
|
+
return runAndForwardErrors(
|
|
166
|
+
this.manager.capabilities.waitFor(iface).pipe(
|
|
167
|
+
Effect.timeoutFail({
|
|
168
|
+
duration: Duration.millis(timeout),
|
|
169
|
+
onTimeout: () => timeoutError(iface.identifier),
|
|
170
|
+
}),
|
|
171
|
+
),
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void> {
|
|
176
|
+
const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);
|
|
177
|
+
const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
178
|
+
|
|
179
|
+
const program = Effect.gen(this, function* () {
|
|
180
|
+
const queue = yield* PubSub.subscribe(this.manager.activation);
|
|
181
|
+
// Re-check after subscribing to avoid a race where the event fires
|
|
182
|
+
// between the caller invoking this and the subscription being installed.
|
|
183
|
+
if (this.manager.getEventsFired().includes(key)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
while (true) {
|
|
187
|
+
const message = yield* Queue.take(queue);
|
|
188
|
+
if (message.event === key && message.state === 'activated') {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}).pipe(
|
|
193
|
+
Effect.scoped,
|
|
194
|
+
Effect.timeoutFail({
|
|
195
|
+
duration: Duration.millis(timeout),
|
|
196
|
+
onTimeout: () => timeoutError(key),
|
|
197
|
+
}),
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
return runAndForwardErrors(program);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async invoke<I, O>(op: Operation.Definition<I, O>, ...args: [input?: I]): Promise<O> {
|
|
204
|
+
const invoker = await this.waitForCapability(Capabilities.OperationInvoker);
|
|
205
|
+
const result = await invoker.invokePromise(op as any, ...(args as [any]));
|
|
206
|
+
if (result.error) {
|
|
207
|
+
throw result.error;
|
|
208
|
+
}
|
|
209
|
+
return result.data as O;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
enable(id: string): Promise<boolean> {
|
|
213
|
+
return runAndForwardErrors(this.manager.enable(id));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
disable(id: string): Promise<boolean> {
|
|
217
|
+
return runAndForwardErrors(this.manager.disable(id));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async dispose(): Promise<void> {
|
|
221
|
+
await runAndForwardErrors(this.manager.shutdown());
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
[Symbol.asyncDispose](): Promise<void> {
|
|
225
|
+
return this.dispose();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const timeoutError = (id: string) => new Error(`Timed out waiting for ${id}`);
|