@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,126 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { type CapabilityManager } from '../../../core';
|
|
8
|
+
import { isSurfaceAvailable } from './SurfaceComponent';
|
|
9
|
+
import { type RoleToken, type SurfaceFilter, create, isSurfaceFilter, makeType } from './types';
|
|
10
|
+
|
|
11
|
+
describe('Surface.makeType', () => {
|
|
12
|
+
test('creates a role token carrying the role string', ({ expect }) => {
|
|
13
|
+
const token = makeType<{ subject: string }>('test-role');
|
|
14
|
+
expect(token.role).toBe('test-role');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('tokens with the same role are independent objects (identity-by-role)', ({ expect }) => {
|
|
18
|
+
const a = makeType<{ x: number }>('shared');
|
|
19
|
+
const b = makeType<{ x: number }>('shared');
|
|
20
|
+
expect(a).not.toBe(b);
|
|
21
|
+
expect(a.role).toBe(b.role);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('isSurfaceFilter', () => {
|
|
26
|
+
test('distinguishes filter objects from predicate functions', ({ expect }) => {
|
|
27
|
+
const filter: SurfaceFilter<Record<string, any>> = { bindings: [{ role: 'r', guard: () => true }] };
|
|
28
|
+
expect(isSurfaceFilter(filter)).toBe(true);
|
|
29
|
+
expect(isSurfaceFilter(() => true)).toBe(false);
|
|
30
|
+
expect(isSurfaceFilter({})).toBe(false);
|
|
31
|
+
expect(isSurfaceFilter(null)).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('create', () => {
|
|
36
|
+
test('accepts the legacy { role, filter } shape', ({ expect }) => {
|
|
37
|
+
const def = create({
|
|
38
|
+
id: 'legacy',
|
|
39
|
+
role: 'article',
|
|
40
|
+
filter: (data): data is { x: number } => typeof (data as any).x === 'number',
|
|
41
|
+
component: () => null,
|
|
42
|
+
});
|
|
43
|
+
expect(def.kind).toBe('react');
|
|
44
|
+
expect(def.role).toBe('article');
|
|
45
|
+
expect(def.filter!({ x: 1 })).toBe(true);
|
|
46
|
+
expect(def.filter!({})).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('expands a single-binding SurfaceFilter into a role string', ({ expect }) => {
|
|
50
|
+
const filter: SurfaceFilter<Record<string, any>> = {
|
|
51
|
+
bindings: [{ role: 'article', guard: (d) => (d as any).subject === 'ok' }],
|
|
52
|
+
};
|
|
53
|
+
const def = create({ id: 'typed-single', filter, component: () => null });
|
|
54
|
+
expect(def.role).toBe('article');
|
|
55
|
+
expect(def.filter!({ subject: 'ok' }, 'article')).toBe(true);
|
|
56
|
+
expect(def.filter!({ subject: 'no' }, 'article')).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('expands a multi-binding SurfaceFilter into a role array with role-scoped guards', ({ expect }) => {
|
|
60
|
+
const filter: SurfaceFilter<Record<string, any>> = {
|
|
61
|
+
bindings: [
|
|
62
|
+
{ role: 'article', guard: (d) => (d as any).subject === 'a' },
|
|
63
|
+
{ role: 'section', guard: (d) => (d as any).subject === 's' },
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
const def = create({ id: 'typed-multi', filter, component: () => null });
|
|
67
|
+
expect(def.role).toEqual(['article', 'section']);
|
|
68
|
+
// Role-specific guard.
|
|
69
|
+
expect(def.filter!({ subject: 'a' }, 'article')).toBe(true);
|
|
70
|
+
expect(def.filter!({ subject: 'a' }, 'section')).toBe(false);
|
|
71
|
+
expect(def.filter!({ subject: 's' }, 'section')).toBe(true);
|
|
72
|
+
expect(def.filter!({ subject: 's' }, 'article')).toBe(false);
|
|
73
|
+
// Without role, any binding may match.
|
|
74
|
+
expect(def.filter!({ subject: 'a' })).toBe(true);
|
|
75
|
+
expect(def.filter!({ subject: 'unknown' })).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('passes position through untouched', ({ expect }) => {
|
|
79
|
+
const filter: SurfaceFilter<Record<string, any>> = { bindings: [{ role: 'r', guard: () => true }] };
|
|
80
|
+
const def = create({ id: 'pos', filter, component: () => null, position: 'fallback' });
|
|
81
|
+
expect(def.position).toBe('fallback');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe('role token typing', () => {
|
|
86
|
+
test('makeType preserves TData through token use-sites', ({ expect }) => {
|
|
87
|
+
// Type-level smoke test: if TS compiles, we're fine. The `RoleToken<T>`
|
|
88
|
+
// phantom should not impose a runtime constraint.
|
|
89
|
+
const token: RoleToken<{ subject: number }> = makeType('numeric');
|
|
90
|
+
expect(token.role).toBe('numeric');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('isSurfaceAvailable typing', () => {
|
|
95
|
+
// These tests double as static assertions: the `@ts-expect-error` comments
|
|
96
|
+
// fail to compile if the surrounding expression typechecks, so they verify
|
|
97
|
+
// the typed overload narrows `data` to the token's declared contract.
|
|
98
|
+
const sectionToken = makeType<{ attendableId: string; subject: string }>('section');
|
|
99
|
+
const capabilityManager = { getAll: () => [] } as unknown as CapabilityManager.CapabilityManager;
|
|
100
|
+
|
|
101
|
+
test('typed overload accepts data matching the token contract', () => {
|
|
102
|
+
// No error — data has all required fields.
|
|
103
|
+
isSurfaceAvailable(capabilityManager, {
|
|
104
|
+
type: sectionToken,
|
|
105
|
+
data: { attendableId: 'id', subject: 'x' },
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('typed overload rejects data missing required fields', () => {
|
|
110
|
+
// @ts-expect-error — `data` is missing `attendableId` required by the token.
|
|
111
|
+
isSurfaceAvailable(capabilityManager, { type: sectionToken, data: { subject: 'x' } });
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('typed overload rejects data with wrong field type', () => {
|
|
115
|
+
// @ts-expect-error — `attendableId` must be a string, not a number.
|
|
116
|
+
isSurfaceAvailable(capabilityManager, { type: sectionToken, data: { attendableId: 123, subject: 'x' } });
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('legacy overload accepts loose data when `role` is a string', () => {
|
|
120
|
+
// No error — legacy overload's `data` is untyped (`Record<string, unknown>`).
|
|
121
|
+
isSurfaceAvailable(capabilityManager, {
|
|
122
|
+
role: 'article',
|
|
123
|
+
data: { anything: 'goes' },
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { FC, PropsWithChildren, ReactNode, RefCallback } from 'react';
|
|
6
|
+
|
|
7
|
+
import type { MakeOptional, Position } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A typed role token. Carries a role string for runtime dispatch plus a phantom
|
|
11
|
+
* data type so consumers using `type={SomeToken}` and providers using
|
|
12
|
+
* `AppSurface.object(SomeToken, ...)` share a single type-level contract.
|
|
13
|
+
*
|
|
14
|
+
* Mint via {@link makeType}.
|
|
15
|
+
*/
|
|
16
|
+
export type RoleToken<TData> = {
|
|
17
|
+
readonly role: string;
|
|
18
|
+
/** Covariant phantom; never accessed at runtime. */
|
|
19
|
+
readonly _phantom?: TData;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* One entry in a {@link SurfaceFilter} — a role plus the guard that validates
|
|
24
|
+
* the data shape when the Surface dispatcher is matching that role.
|
|
25
|
+
*/
|
|
26
|
+
export type SurfaceBinding = {
|
|
27
|
+
readonly role: string;
|
|
28
|
+
readonly guard: (data: unknown) => boolean;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Typed filter binding for {@link create}. Combines one or more `(role, guard)`
|
|
33
|
+
* pairs so a provider can register against multiple roles while keeping the
|
|
34
|
+
* role and its data shape in a single expression.
|
|
35
|
+
*/
|
|
36
|
+
export type SurfaceFilter<TData> = {
|
|
37
|
+
readonly bindings: ReadonlyArray<SurfaceBinding>;
|
|
38
|
+
/** Covariant phantom; never accessed at runtime. */
|
|
39
|
+
readonly _phantom?: TData;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Narrow data type carried by a role token.
|
|
44
|
+
*/
|
|
45
|
+
export type TokenData<T> = T extends RoleToken<infer D> ? D : never;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Runtime guard for {@link SurfaceFilter}. Distinguishes new-style filter
|
|
49
|
+
* bindings from legacy predicate filters.
|
|
50
|
+
*/
|
|
51
|
+
export const isSurfaceFilter = (value: unknown): value is SurfaceFilter<any> =>
|
|
52
|
+
typeof value === 'object' && value !== null && Array.isArray((value as { bindings?: unknown }).bindings);
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Mints a typed role token. Identity is structural; all tokens with the same
|
|
56
|
+
* `role` string are interchangeable at runtime.
|
|
57
|
+
*/
|
|
58
|
+
export const makeType = <TData>(role: string): RoleToken<TData> => ({ role });
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Props that are passed to the Surface component.
|
|
62
|
+
*
|
|
63
|
+
* The role can be provided either as a string via `role` or as a typed
|
|
64
|
+
* {@link RoleToken} via `type`. The typed form narrows `data` to the token's
|
|
65
|
+
* declared shape.
|
|
66
|
+
*/
|
|
67
|
+
export type Props<T extends Record<string, any> = Record<string, unknown>> = {
|
|
68
|
+
/**
|
|
69
|
+
* If specified, the Surface will be wrapped in an error boundary.
|
|
70
|
+
* The fallback component will be rendered if an error occurs.
|
|
71
|
+
*/
|
|
72
|
+
fallback?: FC<{ error: Error; data?: any }>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* If specified, the Surface will be wrapped in a suspense boundary.
|
|
76
|
+
* The placeholder component will be rendered while the surface component is loading.
|
|
77
|
+
*/
|
|
78
|
+
placeholder?: ReactNode;
|
|
79
|
+
} & MakeOptional<CoreProps<T>, 'id' | 'data' | 'role'> & {
|
|
80
|
+
/**
|
|
81
|
+
* Explicitly disallow `type` on the untyped Props overload — if the caller
|
|
82
|
+
* provides `type={AppSurface.X}`, TypeScript must route to the typed
|
|
83
|
+
* overload (where `data` is narrowed by the token). Without this, the
|
|
84
|
+
* catch-all index signature below would accept any `type` value and mask
|
|
85
|
+
* the typed overload entirely.
|
|
86
|
+
*/
|
|
87
|
+
type?: undefined;
|
|
88
|
+
} /**
|
|
89
|
+
* Additional props to pass to the component.
|
|
90
|
+
* These props are not used by Surface itself but may be used by components which resolve the surface.
|
|
91
|
+
* Exclude known prop names to prevent overriding well-defined props.
|
|
92
|
+
*/ & {
|
|
93
|
+
[K in keyof Record<string, any>]: K extends keyof CoreProps<T> | 'fallback' | 'placeholder' | 'type' ? never : any;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Typed Surface consumer props — carries the role/data-shape contract via a
|
|
98
|
+
* {@link RoleToken}. Available as a typed overload of the Surface component so
|
|
99
|
+
* ad-hoc `type` fields on arbitrary spread props don't conflict with the
|
|
100
|
+
* untyped consumer form.
|
|
101
|
+
*/
|
|
102
|
+
export type TypedProps<TToken extends RoleToken<any>> = {
|
|
103
|
+
fallback?: FC<{ error: Error; data?: any }>;
|
|
104
|
+
placeholder?: ReactNode;
|
|
105
|
+
id?: string;
|
|
106
|
+
type: TToken;
|
|
107
|
+
data?: TokenData<TToken>;
|
|
108
|
+
limit?: number | undefined;
|
|
109
|
+
} & {
|
|
110
|
+
/**
|
|
111
|
+
* Additional pass-through props. Known prop names are excluded so the
|
|
112
|
+
* catch-all doesn't widen `data` / `type` / etc. to `any` at the intersection.
|
|
113
|
+
*/
|
|
114
|
+
[K in keyof Record<string, any>]: K extends 'fallback' | 'placeholder' | 'id' | 'type' | 'data' | 'limit'
|
|
115
|
+
? never
|
|
116
|
+
: any;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* NOTE: If `[key: string]: unknown` is included in shared types, when re-used other fields become unknown as well.
|
|
121
|
+
*/
|
|
122
|
+
export type CoreProps<T extends Record<string, any> = Record<string, unknown>> = PropsWithChildren<{
|
|
123
|
+
/**
|
|
124
|
+
* ID for debugging.
|
|
125
|
+
*/
|
|
126
|
+
id: string;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Role defines how the data should be rendered. For new code, prefer the
|
|
130
|
+
* typed overload of the Surface component which takes a {@link RoleToken}
|
|
131
|
+
* via the `type` prop instead — it enforces a role/data contract at compile
|
|
132
|
+
* time.
|
|
133
|
+
*/
|
|
134
|
+
role: string;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The data to be rendered by the surface.
|
|
138
|
+
* NOTE: This must be a stable value.
|
|
139
|
+
*/
|
|
140
|
+
data: T;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* If more than one component is resolved, the limit determines how many are rendered.
|
|
144
|
+
*/
|
|
145
|
+
limit?: number | undefined;
|
|
146
|
+
}>;
|
|
147
|
+
|
|
148
|
+
// TODO(burdon): Remove ref since relying on this would be error prone.
|
|
149
|
+
export type ComponentProps<T extends Record<string, any> = Record<string, any>> = CoreProps<T> & {
|
|
150
|
+
ref?: RefCallback<HTMLElement>;
|
|
151
|
+
} & Record<string, any>;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* React component used to render a surface once is has matched.
|
|
155
|
+
*/
|
|
156
|
+
export type ComponentFunction<T extends Record<string, any> = Record<string, any>> = (
|
|
157
|
+
props: ComponentProps<T>,
|
|
158
|
+
) => ReactNode;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Definition of when a React component surface should be rendered.
|
|
162
|
+
*
|
|
163
|
+
* The optional `filter` receives the consumer-supplied `role` as its second
|
|
164
|
+
* argument so a single definition can encode role-specific guards (used by the
|
|
165
|
+
* {@link SurfaceFilter}-based `create` overload).
|
|
166
|
+
*/
|
|
167
|
+
export type ReactDefinition<T extends Record<string, any> = any> = Readonly<{
|
|
168
|
+
kind: 'react';
|
|
169
|
+
id: string;
|
|
170
|
+
role: string | string[];
|
|
171
|
+
position?: Position;
|
|
172
|
+
component: ComponentFunction<T>;
|
|
173
|
+
filter?: (data: Record<string, unknown>, role?: string) => data is T;
|
|
174
|
+
}>;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Definition of when a Web Component surface should be rendered.
|
|
178
|
+
*/
|
|
179
|
+
export type WebComponentDefinition<T extends Record<string, any> = any> = Readonly<{
|
|
180
|
+
kind: 'web-component';
|
|
181
|
+
id: string;
|
|
182
|
+
role: string | string[];
|
|
183
|
+
position?: Position;
|
|
184
|
+
/**
|
|
185
|
+
* The tag name of the Web Component to render.
|
|
186
|
+
* The Web Component will receive the same props as React surfaces via properties/attributes.
|
|
187
|
+
*/
|
|
188
|
+
tagName: string;
|
|
189
|
+
filter?: (data: Record<string, unknown>, role?: string) => data is T;
|
|
190
|
+
}>;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Definition of when a surface (React or Web Component) should be rendered.
|
|
194
|
+
*/
|
|
195
|
+
export type Definition<T extends Record<string, any> = any> = ReactDefinition<T> | WebComponentDefinition<T>;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Typed React surface definition — role is derived from the filter's bindings.
|
|
199
|
+
*/
|
|
200
|
+
export type TypedReactDefinition<T extends Record<string, any> = any> = Readonly<{
|
|
201
|
+
id: string;
|
|
202
|
+
filter: SurfaceFilter<T>;
|
|
203
|
+
component: ComponentFunction<T>;
|
|
204
|
+
position?: Position;
|
|
205
|
+
}>;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Typed Web Component surface definition.
|
|
209
|
+
*/
|
|
210
|
+
export type TypedWebComponentDefinition<T extends Record<string, any> = any> = Readonly<{
|
|
211
|
+
id: string;
|
|
212
|
+
filter: SurfaceFilter<T>;
|
|
213
|
+
tagName: string;
|
|
214
|
+
position?: Position;
|
|
215
|
+
}>;
|
|
216
|
+
|
|
217
|
+
const expandBindings = <T extends Record<string, any>>(
|
|
218
|
+
filter: SurfaceFilter<T>,
|
|
219
|
+
): { role: string | string[]; guard: (data: Record<string, unknown>, role?: string) => data is T } => {
|
|
220
|
+
const bindings = filter.bindings;
|
|
221
|
+
const roles = Array.from(new Set(bindings.map((binding) => binding.role)));
|
|
222
|
+
const guard = (data: Record<string, unknown>, role?: string): data is T => {
|
|
223
|
+
if (role != null) {
|
|
224
|
+
// Multiple bindings may share a role (e.g. via `oneOf` of same-role filters);
|
|
225
|
+
// the role matches if ANY of them passes.
|
|
226
|
+
return bindings.some((entry) => entry.role === role && entry.guard(data));
|
|
227
|
+
}
|
|
228
|
+
return bindings.some((entry) => entry.guard(data));
|
|
229
|
+
};
|
|
230
|
+
return { role: roles.length === 1 ? roles[0] : roles, guard };
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Creates a React surface definition.
|
|
235
|
+
*/
|
|
236
|
+
export function create<T extends Record<string, any> = any>(definition: TypedReactDefinition<T>): ReactDefinition<T>;
|
|
237
|
+
export function create<T extends Record<string, any> = any>(
|
|
238
|
+
definition: Omit<ReactDefinition<T>, 'kind'>,
|
|
239
|
+
): ReactDefinition<T>;
|
|
240
|
+
export function create<T extends Record<string, any> = any>(
|
|
241
|
+
definition: TypedReactDefinition<T> | Omit<ReactDefinition<T>, 'kind'>,
|
|
242
|
+
): ReactDefinition<T> {
|
|
243
|
+
if (isSurfaceFilter(definition.filter)) {
|
|
244
|
+
const { id, filter, component, position } = definition as TypedReactDefinition<T>;
|
|
245
|
+
const { role, guard } = expandBindings(filter);
|
|
246
|
+
return { kind: 'react', id, role, position, component, filter: guard };
|
|
247
|
+
}
|
|
248
|
+
return { ...(definition as Omit<ReactDefinition<T>, 'kind'>), kind: 'react' };
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Creates a Web Component surface definition.
|
|
253
|
+
*/
|
|
254
|
+
export function createWeb<T extends Record<string, any> = any>(
|
|
255
|
+
definition: TypedWebComponentDefinition<T>,
|
|
256
|
+
): WebComponentDefinition<T>;
|
|
257
|
+
export function createWeb<T extends Record<string, any> = any>(
|
|
258
|
+
definition: Omit<WebComponentDefinition<T>, 'kind'>,
|
|
259
|
+
): WebComponentDefinition<T>;
|
|
260
|
+
export function createWeb<T extends Record<string, any> = any>(
|
|
261
|
+
definition: TypedWebComponentDefinition<T> | Omit<WebComponentDefinition<T>, 'kind'>,
|
|
262
|
+
): WebComponentDefinition<T> {
|
|
263
|
+
if (isSurfaceFilter(definition.filter)) {
|
|
264
|
+
const { id, filter, tagName, position } = definition as TypedWebComponentDefinition<T>;
|
|
265
|
+
const { role, guard } = expandBindings(filter);
|
|
266
|
+
return { kind: 'web-component', id, role, position, tagName, filter: guard };
|
|
267
|
+
}
|
|
268
|
+
return { ...(definition as Omit<WebComponentDefinition<T>, 'kind'>), kind: 'web-component' };
|
|
269
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assert, describe, it } from '@effect/vitest';
|
|
6
|
+
import { render, waitFor } from '@testing-library/react';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import React from 'react';
|
|
9
|
+
|
|
10
|
+
import { ActivationEvents, Capabilities } from '../../common';
|
|
11
|
+
import { Capability, Plugin, PluginManager } from '../../core';
|
|
12
|
+
import { useApp } from './useApp';
|
|
13
|
+
|
|
14
|
+
const String = Capability.make<{ string: string }>('org.dxos.test.string');
|
|
15
|
+
const testMeta = { id: 'org.dxos.plugin.test', name: 'Test' };
|
|
16
|
+
|
|
17
|
+
const pluginLoader = (plugins: Plugin.Plugin[]) =>
|
|
18
|
+
Effect.fn(function* (id: string) {
|
|
19
|
+
const plugin = plugins.find((plugin) => plugin.meta.id === id);
|
|
20
|
+
if (!plugin) {
|
|
21
|
+
return yield* Effect.fail(new Error(`Plugin not found: ${id}`));
|
|
22
|
+
}
|
|
23
|
+
return plugin;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const TestHost = ({ manager }: { manager: PluginManager.PluginManager }) => {
|
|
27
|
+
const App = useApp({ pluginManager: manager });
|
|
28
|
+
return <App />;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
describe('useApp cleanup integration', () => {
|
|
32
|
+
it.effect('external manager is not shut down when useApp does not own it', () =>
|
|
33
|
+
Effect.gen(function* () {
|
|
34
|
+
const plugin = Plugin.define(testMeta).pipe(
|
|
35
|
+
Plugin.addModule({
|
|
36
|
+
id: 'Hello',
|
|
37
|
+
activatesOn: ActivationEvents.Startup,
|
|
38
|
+
activate: () => Effect.succeed(Capability.contributes(String, { string: 'hello' })),
|
|
39
|
+
}),
|
|
40
|
+
Plugin.make,
|
|
41
|
+
)();
|
|
42
|
+
|
|
43
|
+
const manager = PluginManager.make({
|
|
44
|
+
pluginLoader: pluginLoader([plugin]),
|
|
45
|
+
plugins: [plugin],
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
manager.capabilities.contribute({
|
|
49
|
+
interface: Capabilities.PluginManager,
|
|
50
|
+
implementation: manager,
|
|
51
|
+
module: 'org.dxos.app-framework.plugin-manager',
|
|
52
|
+
});
|
|
53
|
+
manager.capabilities.contribute({
|
|
54
|
+
interface: Capabilities.AtomRegistry,
|
|
55
|
+
implementation: manager.registry,
|
|
56
|
+
module: 'org.dxos.app-framework.atom-registry',
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const view = yield* Effect.promise(() => Promise.resolve(render(<TestHost manager={manager} />)));
|
|
60
|
+
yield* Effect.promise(() =>
|
|
61
|
+
waitFor(() => {
|
|
62
|
+
assert.strictEqual(manager.capabilities.getAll(Capabilities.PluginManager).length, 1);
|
|
63
|
+
assert.strictEqual(manager.capabilities.getAll(Capabilities.AtomRegistry).length, 1);
|
|
64
|
+
assert.strictEqual(manager.capabilities.getAll(String).length, 1);
|
|
65
|
+
assert.isTrue(manager.getActive().length > 0);
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
yield* Effect.promise(() => Promise.resolve(view.unmount()));
|
|
70
|
+
yield* Effect.promise(() =>
|
|
71
|
+
waitFor(() => {
|
|
72
|
+
assert.strictEqual(manager.capabilities.getAll(Capabilities.PluginManager).length, 1);
|
|
73
|
+
assert.strictEqual(manager.capabilities.getAll(Capabilities.AtomRegistry).length, 1);
|
|
74
|
+
assert.strictEqual(manager.capabilities.getAll(String).length, 1);
|
|
75
|
+
assert.isTrue(manager.getActive().length > 0);
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
yield* manager.shutdown();
|
|
80
|
+
|
|
81
|
+
assert.strictEqual(manager.capabilities.getAll(Capabilities.PluginManager).length, 1);
|
|
82
|
+
assert.strictEqual(manager.capabilities.getAll(Capabilities.AtomRegistry).length, 1);
|
|
83
|
+
assert.strictEqual(manager.capabilities.getAll(String).length, 0);
|
|
84
|
+
assert.deepStrictEqual(manager.getActive(), []);
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
it.effect('shutdown deactivates modules and clears bookkeeping', () =>
|
|
89
|
+
Effect.gen(function* () {
|
|
90
|
+
const plugin = Plugin.define(testMeta).pipe(
|
|
91
|
+
Plugin.addModule({
|
|
92
|
+
id: 'Hello',
|
|
93
|
+
activatesOn: ActivationEvents.Startup,
|
|
94
|
+
activate: () => Effect.succeed(Capability.contributes(String, { string: 'hello' })),
|
|
95
|
+
}),
|
|
96
|
+
Plugin.make,
|
|
97
|
+
)();
|
|
98
|
+
|
|
99
|
+
const manager = PluginManager.make({
|
|
100
|
+
pluginLoader: pluginLoader([plugin]),
|
|
101
|
+
plugins: [plugin],
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
manager.capabilities.contribute({
|
|
105
|
+
interface: Capabilities.PluginManager,
|
|
106
|
+
implementation: manager,
|
|
107
|
+
module: 'org.dxos.app-framework.plugin-manager',
|
|
108
|
+
});
|
|
109
|
+
manager.capabilities.contribute({
|
|
110
|
+
interface: Capabilities.AtomRegistry,
|
|
111
|
+
implementation: manager.registry,
|
|
112
|
+
module: 'org.dxos.app-framework.atom-registry',
|
|
113
|
+
});
|
|
114
|
+
yield* manager.activate(ActivationEvents.Startup);
|
|
115
|
+
|
|
116
|
+
assert.strictEqual(manager.capabilities.getAll(String).length, 1);
|
|
117
|
+
assert.isTrue(manager.getActive().length > 0);
|
|
118
|
+
|
|
119
|
+
yield* manager.shutdown();
|
|
120
|
+
|
|
121
|
+
assert.strictEqual(manager.capabilities.getAll(String).length, 0);
|
|
122
|
+
assert.deepStrictEqual(manager.getActive(), []);
|
|
123
|
+
assert.deepStrictEqual(manager.getEventsFired(), []);
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
it.effect('shutdown is idempotent when called multiple times', () =>
|
|
128
|
+
Effect.gen(function* () {
|
|
129
|
+
const plugin = Plugin.define(testMeta).pipe(
|
|
130
|
+
Plugin.addModule({
|
|
131
|
+
id: 'Hello',
|
|
132
|
+
activatesOn: ActivationEvents.Startup,
|
|
133
|
+
activate: () => Effect.succeed(Capability.contributes(String, { string: 'hello' })),
|
|
134
|
+
}),
|
|
135
|
+
Plugin.make,
|
|
136
|
+
)();
|
|
137
|
+
|
|
138
|
+
const manager = PluginManager.make({
|
|
139
|
+
pluginLoader: pluginLoader([plugin]),
|
|
140
|
+
plugins: [plugin],
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
manager.capabilities.contribute({
|
|
144
|
+
interface: Capabilities.PluginManager,
|
|
145
|
+
implementation: manager,
|
|
146
|
+
module: 'org.dxos.app-framework.plugin-manager',
|
|
147
|
+
});
|
|
148
|
+
yield* manager.activate(ActivationEvents.Startup);
|
|
149
|
+
|
|
150
|
+
yield* manager.shutdown();
|
|
151
|
+
assert.deepStrictEqual(manager.getActive(), []);
|
|
152
|
+
|
|
153
|
+
// Second shutdown should succeed without error.
|
|
154
|
+
const result = yield* manager.shutdown();
|
|
155
|
+
assert.isTrue(result);
|
|
156
|
+
assert.deepStrictEqual(manager.getActive(), []);
|
|
157
|
+
}),
|
|
158
|
+
);
|
|
159
|
+
});
|