@dxos/app-framework 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8
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 +9 -0
- package/.storybook/preview.mts +8 -0
- package/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/browser/capability-BOPAKKWG.mjs +35 -0
- package/dist/lib/browser/capability-BOPAKKWG.mjs.map +7 -0
- package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
- package/dist/lib/browser/chunk-5GY3YOEL.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-CO3XLNUX.mjs +95 -0
- package/dist/lib/browser/chunk-CO3XLNUX.mjs.map +7 -0
- package/dist/lib/browser/chunk-DC3WRPBV.mjs +227 -0
- package/dist/lib/browser/chunk-DC3WRPBV.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-FO3IYSLV.mjs +68 -0
- package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
- package/dist/lib/browser/chunk-HFLKXMT7.mjs +587 -0
- package/dist/lib/browser/chunk-HFLKXMT7.mjs.map +7 -0
- package/dist/lib/browser/chunk-IW44C7UL.mjs +83 -0
- package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-KZUDO43J.mjs +422 -0
- package/dist/lib/browser/chunk-KZUDO43J.mjs.map +7 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
- package/dist/lib/browser/chunk-SYXIYT6T.mjs +143 -0
- package/dist/lib/browser/chunk-SYXIYT6T.mjs.map +7 -0
- package/dist/lib/browser/chunk-XHS5KDNX.mjs +1471 -0
- package/dist/lib/browser/chunk-XHS5KDNX.mjs.map +7 -0
- package/dist/lib/browser/chunk-Y66ELD4U.mjs +476 -0
- package/dist/lib/browser/chunk-Y66ELD4U.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 +20 -0
- package/dist/lib/browser/common/capabilities.mjs +56 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/capability.mjs +32 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +19 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +41 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +24 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +85 -157
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs +132 -0
- package/dist/lib/browser/process-manager-capability-GXNUO7AR.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +321 -56
- 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 +52 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-KZWRTX7R.mjs +36 -0
- package/dist/lib/node-esm/capability-KZWRTX7R.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-A5CHGAZE.mjs +588 -0
- package/dist/lib/node-esm/chunk-A5CHGAZE.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-COHOWGGJ.mjs +144 -0
- package/dist/lib/node-esm/chunk-COHOWGGJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-CTKEZHKF.mjs +84 -0
- package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FSVGKTF6.mjs +477 -0
- package/dist/lib/node-esm/chunk-FSVGKTF6.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-KFZEB6BV.mjs +29 -0
- package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NULBHQYS.mjs +96 -0
- package/dist/lib/node-esm/chunk-NULBHQYS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SX5NVETP.mjs +1472 -0
- package/dist/lib/node-esm/chunk-SX5NVETP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
- package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XGBUKRCK.mjs +423 -0
- package/dist/lib/node-esm/chunk-XGBUKRCK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs +228 -0
- package/dist/lib/node-esm/chunk-XIGPWXCQ.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 +21 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +57 -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 +33 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +20 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +42 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +25 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +85 -157
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs +133 -0
- package/dist/lib/node-esm/process-manager-capability-TX5TA6YN.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +321 -56
- 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 +53 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +977 -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 +37 -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 +24 -0
- package/dist/types/src/common/activation-events.d.ts.map +1 -0
- package/dist/types/src/common/annotations.d.ts +1 -0
- package/dist/types/src/common/annotations.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +214 -195
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +3 -8
- package/dist/types/src/common/index.d.ts.map +1 -1
- 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 +52 -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 +161 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
- package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +11 -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 +297 -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 +101 -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 +308 -41
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/registry.d.ts +107 -0
- package/dist/types/src/core/registry.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.d.ts +127 -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 +2 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +32 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts +2 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/index.d.ts +6 -0
- package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/types.d.ts +13 -0
- package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +101 -0
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts +23 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts +2 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts +10 -0
- package/dist/types/src/plugin-process-manager/idb-key-value-store.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
- package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +79 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +3 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/operationCapture.d.ts +64 -0
- package/dist/types/src/testing/operationCapture.d.ts.map +1 -0
- 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 +9 -10
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.d.ts +41 -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/PluginManager/PluginManagerContext.stories.d.ts +13 -0
- 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/ui/components/Surface/SurfaceComponent.stories.d.ts +14 -0
- 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 +4 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +7 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +80 -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/ui/hooks/useLoading.d.ts +18 -0
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.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/index.d.ts +2 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +59 -0
- package/dist/types/src/vite-plugin/boot-loader/loader.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 +41 -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 +26 -3
- package/package.json +125 -55
- package/src/cli/cli.ts +102 -0
- package/src/{playground/layout → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +39 -0
- package/src/{playground/debug/index.ts → common/annotations.ts} +0 -2
- package/src/common/capabilities.ts +287 -184
- package/src/common/index.ts +3 -8
- 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 +154 -0
- package/src/core/capability-manager.ts +213 -0
- package/src/core/capability.ts +254 -0
- package/src/core/edge-registry-plugin-provider.ts +92 -0
- package/src/core/index.ts +11 -4
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1929 -0
- package/src/core/plugin-manager.ts +1696 -0
- package/src/core/plugin-manifest.test.ts +75 -0
- package/src/core/plugin-manifest.ts +134 -0
- package/src/core/plugin.ts +458 -46
- package/src/core/registry.ts +163 -0
- package/src/core/url-loader.test.ts +222 -0
- package/src/core/url-loader.ts +388 -0
- package/src/index.ts +2 -4
- package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
- package/src/plugin-process-manager/history/capability.ts +36 -0
- package/src/plugin-process-manager/history/errors.ts +7 -0
- package/src/plugin-process-manager/history/history-tracker.test.ts +353 -0
- package/src/plugin-process-manager/history/history-tracker.ts +144 -0
- package/src/plugin-process-manager/history/index.ts +9 -0
- package/src/plugin-process-manager/history/types.ts +17 -0
- package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
- package/src/plugin-process-manager/history/undo-registry.test.ts +74 -0
- package/src/plugin-process-manager/history/undo-registry.ts +54 -0
- package/src/plugin-process-manager/idb-key-value-store.ts +64 -0
- package/src/plugin-process-manager/index.ts +6 -0
- package/src/plugin-process-manager/meta.ts +16 -0
- package/src/plugin-process-manager/process-manager-capability.ts +178 -0
- package/src/plugin-process-manager/testing.ts +156 -0
- package/src/testing/harness.ts +247 -0
- package/src/testing/index.ts +3 -0
- package/src/testing/operationCapture.ts +144 -0
- package/src/testing/react.test.tsx +50 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +15 -13
- package/src/testing/withPluginManager.tsx +81 -56
- package/src/ui/components/App/App.stories.tsx +84 -0
- package/src/ui/components/App/App.tsx +144 -0
- package/src/{playground/logger → ui/components/App}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +179 -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 +106 -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 +290 -0
- package/src/ui/components/index.ts +7 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/ui/hooks/useApp.test.tsx +161 -0
- package/src/ui/hooks/useApp.tsx +404 -0
- package/src/ui/hooks/useCapabilities.ts +68 -0
- package/src/ui/hooks/useLoading.tsx +76 -0
- package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
- 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.solid-stories.tsx +198 -0
- package/src/vite-plugin/boot-loader/index.ts +5 -0
- package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
- package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
- package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
- package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
- package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
- package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
- package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
- package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
- package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
- package/src/vite-plugin/boot-loader/loader.ts +204 -0
- package/src/vite-plugin/composer/index.ts +306 -0
- package/src/vite-plugin/import-map/index.ts +527 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +55 -0
- package/src/vite-plugin/manifest.ts +63 -0
- package/src/vite-plugin/packages.ts +187 -0
- package/tsconfig.json +31 -24
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +8 -6
- package/.swc/plugins/v7_linux_x86_64_13.0.0/c614d7475354583212fbd7669acbae95b9832c305bf51bdaabe2e6de05abb6bf +0 -0
- package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
- package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-MOVKFH3J.mjs.map +0 -7
- package/dist/lib/browser/chunk-NKCIDYDI.mjs +0 -1598
- package/dist/lib/browser/chunk-NKCIDYDI.mjs.map +0 -7
- package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
- package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
- package/dist/lib/browser/chunk-OSBZFKMO.mjs +0 -428
- package/dist/lib/browser/chunk-OSBZFKMO.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-FTTJLVGN.mjs +0 -11
- package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs +0 -39
- package/dist/lib/browser/intent-resolver-ZCGEAG3E.mjs.map +0 -7
- package/dist/lib/browser/store-3QB6Q2BC.mjs +0 -30
- package/dist/lib/browser/store-3QB6Q2BC.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -79
- package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-ODE4B5GT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
- package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WU3QN5B6.mjs +0 -429
- package/dist/lib/node-esm/chunk-WU3QN5B6.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YEN7NKTF.mjs +0 -1600
- package/dist/lib/node-esm/chunk-YEN7NKTF.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-YQIQ55LJ.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-KG27L7EQ.mjs.map +0 -7
- package/dist/lib/node-esm/store-TIJAVO3D.mjs +0 -31
- package/dist/lib/node-esm/store-TIJAVO3D.mjs.map +0 -7
- package/dist/lib/node-esm/worker.mjs +0 -80
- package/dist/types/src/App.d.ts +0 -43
- package/dist/types/src/App.d.ts.map +0 -1
- package/dist/types/src/common/collaboration.d.ts +0 -19
- 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 -281
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts +0 -65
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -114
- 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 +0 -10
- 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 -38
- 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 -5
- 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-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 -27
- 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/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 -10
- 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 -16
- 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/App.tsx +0 -284
- package/src/common/collaboration.ts +0 -21
- 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 -278
- package/src/common/surface.ts +0 -86
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -255
- 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 -17
- 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 -23
- package/src/playground/layout/Layout.tsx +0 -33
- package/src/playground/layout/plugin.ts +0 -17
- package/src/playground/logger/Toolbar.tsx +0 -30
- package/src/playground/logger/plugin.ts +0 -37
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -43
- package/src/plugin-intent/IntentPlugin.ts +0 -21
- package/src/plugin-intent/actions.ts +0 -33
- package/src/plugin-intent/errors.ts +0 -39
- package/src/plugin-intent/index.ts +0 -8
- 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-settings/SettingsPlugin.ts +0 -36
- package/src/plugin-settings/actions.ts +0 -29
- package/src/plugin-settings/app-graph-builder.ts +0 -158
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -35
- 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 -97
- package/src/react/Surface.tsx +0 -78
- 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-FTTJLVGN.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-YQIQ55LJ.mjs.map → browser/common/capabilities.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
|
@@ -2,30 +2,19 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { type Decorator } from '@storybook/react';
|
|
6
|
-
import
|
|
5
|
+
import { type Decorator, type StoryContext } from '@storybook/react';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import React, { useEffect, useState } from 'react';
|
|
7
8
|
|
|
8
9
|
import { raise } from '@dxos/debug';
|
|
10
|
+
import { EffectEx } from '@dxos/effect';
|
|
11
|
+
import { DXN } from '@dxos/keys';
|
|
12
|
+
import { useAsyncEffect } from '@dxos/react-hooks';
|
|
13
|
+
import { type MaybeProvider, getProviderValue } from '@dxos/util';
|
|
9
14
|
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
type ActivationEvent,
|
|
14
|
-
type AnyCapability,
|
|
15
|
-
type PluginContext,
|
|
16
|
-
PluginManager,
|
|
17
|
-
contributes,
|
|
18
|
-
defineModule,
|
|
19
|
-
definePlugin,
|
|
20
|
-
} from '../core';
|
|
21
|
-
|
|
22
|
-
// TODO(burdon): Factor out (use consistently in plugin framework?)
|
|
23
|
-
export type Provider<C, R> = (context: C) => R;
|
|
24
|
-
export type ProviderOrValue<C, R> = Provider<C, R> | R;
|
|
25
|
-
|
|
26
|
-
export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context: C): R => {
|
|
27
|
-
return typeof providerOrValue === 'function' ? (providerOrValue as Provider<C, R>)(context) : providerOrValue;
|
|
28
|
-
};
|
|
15
|
+
import { ActivationEvents, Capabilities } from '../common';
|
|
16
|
+
import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
|
|
17
|
+
import { type UseAppOptions, useApp } from '../ui';
|
|
29
18
|
|
|
30
19
|
/**
|
|
31
20
|
* @internal
|
|
@@ -33,19 +22,21 @@ export const getValue = <C, R>(providerOrValue: ProviderOrValue<C, R>, context:
|
|
|
33
22
|
export const setupPluginManager = ({
|
|
34
23
|
capabilities,
|
|
35
24
|
plugins = [],
|
|
36
|
-
core = plugins.map(({ meta }) => meta.id),
|
|
37
25
|
...options
|
|
38
|
-
}:
|
|
39
|
-
|
|
26
|
+
}: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
|
|
27
|
+
// Auto-enable every non-system plugin so stories don't have to spell out
|
|
28
|
+
// enablement. System-tagged plugins are force-enabled by the manager.
|
|
29
|
+
const enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map(({ meta }) => meta.id);
|
|
30
|
+
const pluginManager = PluginManager.make({
|
|
40
31
|
pluginLoader: () => raise(new Error('Not implemented')),
|
|
41
|
-
plugins: [
|
|
42
|
-
|
|
32
|
+
plugins: [StoryPlugin, ...plugins],
|
|
33
|
+
enabled,
|
|
43
34
|
...options,
|
|
44
35
|
});
|
|
45
36
|
|
|
46
37
|
if (capabilities) {
|
|
47
|
-
|
|
48
|
-
pluginManager.
|
|
38
|
+
getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
|
|
39
|
+
pluginManager.capabilities.contribute({
|
|
49
40
|
interface: capability.interface,
|
|
50
41
|
implementation: capability.implementation,
|
|
51
42
|
module: 'story',
|
|
@@ -56,58 +47,92 @@ export const setupPluginManager = ({
|
|
|
56
47
|
return pluginManager;
|
|
57
48
|
};
|
|
58
49
|
|
|
59
|
-
|
|
50
|
+
type ManagedPluginManagerState = {
|
|
51
|
+
fireEvents?: (ActivationEvent.ActivationEvent | string)[];
|
|
52
|
+
pluginManager: PluginManager.PluginManager;
|
|
53
|
+
setupEvents?: ActivationEvent.ActivationEvent[];
|
|
54
|
+
storyId: string;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export type WithPluginManagerOptions = UseAppOptions & {
|
|
60
58
|
/** @deprecated */
|
|
61
|
-
capabilities?:
|
|
59
|
+
capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;
|
|
62
60
|
/** @deprecated */
|
|
63
|
-
fireEvents?: (ActivationEvent | string)[];
|
|
61
|
+
fireEvents?: (ActivationEvent.ActivationEvent | string)[];
|
|
64
62
|
};
|
|
65
63
|
|
|
64
|
+
export type WithPluginManagerInitializer<Args = void> =
|
|
65
|
+
| WithPluginManagerOptions
|
|
66
|
+
| ((context: StoryContext<Args>) => WithPluginManagerOptions);
|
|
67
|
+
|
|
66
68
|
/**
|
|
67
69
|
* Wraps a story with a plugin manager.
|
|
68
70
|
* NOTE: This builds up and tears down the plugin manager on every render.
|
|
69
71
|
*/
|
|
70
|
-
export const withPluginManager = (
|
|
72
|
+
export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
|
|
71
73
|
return (Story, context) => {
|
|
72
|
-
const
|
|
74
|
+
const storyId = context.id;
|
|
75
|
+
const options = typeof init === 'function' ? init(context as any) : init;
|
|
76
|
+
const [managerState, setManagerState] = useState<ManagedPluginManagerState>();
|
|
73
77
|
|
|
74
|
-
//
|
|
78
|
+
// Storybook replaces the full context object often, so key manager ownership by story id.
|
|
75
79
|
useEffect(() => {
|
|
76
|
-
const
|
|
77
|
-
|
|
80
|
+
const pluginManager = setupPluginManager(options);
|
|
81
|
+
const capability = Capability.contributes(Capabilities.ReactRoot, {
|
|
82
|
+
id: storyId,
|
|
78
83
|
root: () => <Story />,
|
|
79
84
|
});
|
|
80
85
|
|
|
81
|
-
pluginManager.
|
|
86
|
+
pluginManager.capabilities.contribute({
|
|
82
87
|
...capability,
|
|
83
|
-
module: 'dxos.
|
|
88
|
+
module: 'org.dxos.app-framework.with-plugin-manager',
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
setManagerState({
|
|
92
|
+
pluginManager,
|
|
93
|
+
setupEvents: options.setupEvents,
|
|
94
|
+
fireEvents: options.fireEvents,
|
|
95
|
+
storyId,
|
|
84
96
|
});
|
|
85
97
|
|
|
86
98
|
return () => {
|
|
87
|
-
pluginManager.
|
|
99
|
+
pluginManager.capabilities.remove(capability.interface, capability.implementation);
|
|
100
|
+
void EffectEx.runAndForwardErrors(pluginManager.shutdown());
|
|
88
101
|
};
|
|
89
|
-
}, [
|
|
102
|
+
}, [storyId, init]);
|
|
90
103
|
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
104
|
+
// Avoid mounting useApp with a stale manager from the previous story.
|
|
105
|
+
if (!managerState || managerState.storyId !== storyId) {
|
|
106
|
+
return <></>;
|
|
107
|
+
}
|
|
96
108
|
|
|
97
|
-
|
|
98
|
-
|
|
109
|
+
return <WithPluginManagerApp {...managerState} />;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
99
112
|
|
|
100
|
-
|
|
101
|
-
|
|
113
|
+
const WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {
|
|
114
|
+
// Fire deprecated events only after the effect-owned manager for this story exists.
|
|
115
|
+
useAsyncEffect(async () => {
|
|
116
|
+
await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
|
|
117
|
+
}, [fireEvents, pluginManager, storyId]);
|
|
102
118
|
|
|
103
|
-
|
|
104
|
-
|
|
119
|
+
const App = useApp({ pluginManager, setupEvents });
|
|
120
|
+
return <App />;
|
|
105
121
|
};
|
|
106
122
|
|
|
123
|
+
const storyMeta = Plugin.makeMeta({
|
|
124
|
+
key: DXN.make('org.dxos.appFramework.story'),
|
|
125
|
+
name: 'Story',
|
|
126
|
+
tags: ['system'],
|
|
127
|
+
});
|
|
128
|
+
|
|
107
129
|
// No-op plugin to ensure there exists at least one plugin for the startup event.
|
|
108
130
|
// This is necessary because `createApp` expects the startup event to complete before the app is ready.
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
131
|
+
const StoryPlugin = Plugin.define(storyMeta).pipe(
|
|
132
|
+
Plugin.addModule({
|
|
133
|
+
id: 'Story',
|
|
134
|
+
activatesOn: ActivationEvents.Startup,
|
|
135
|
+
activate: () => Effect.succeed([]),
|
|
136
|
+
}),
|
|
137
|
+
Plugin.make,
|
|
138
|
+
)();
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import React, { useEffect } from 'react';
|
|
8
|
+
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
11
|
+
|
|
12
|
+
import { ActivationEvents, Capabilities } from '../../../common';
|
|
13
|
+
import { Capability, Plugin } from '../../../core';
|
|
14
|
+
import { useApp } from '../../hooks';
|
|
15
|
+
|
|
16
|
+
// Minimal plugin that contributes a ReactRoot.
|
|
17
|
+
const TestPlugin = Plugin.define<{ error?: boolean }>(
|
|
18
|
+
Plugin.makeMeta({
|
|
19
|
+
key: DXN.make('org.dxos.plugin.test'),
|
|
20
|
+
name: 'Test Plugin',
|
|
21
|
+
tags: ['system'],
|
|
22
|
+
}),
|
|
23
|
+
).pipe(
|
|
24
|
+
Plugin.addModule(({ error }) => ({
|
|
25
|
+
id: 'TestMain',
|
|
26
|
+
activatesOn: ActivationEvents.Startup,
|
|
27
|
+
activate: () =>
|
|
28
|
+
Effect.succeed([
|
|
29
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
30
|
+
id: 'org.dxos.plugin.test.root',
|
|
31
|
+
root: () => {
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
let t: NodeJS.Timeout;
|
|
34
|
+
if (error) {
|
|
35
|
+
console.log('Ticking...');
|
|
36
|
+
t = setTimeout(() => {
|
|
37
|
+
console.log('Bang!');
|
|
38
|
+
throw new Error('Runtime error');
|
|
39
|
+
}, 3_000);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return () => clearTimeout(t);
|
|
43
|
+
}, [error]);
|
|
44
|
+
|
|
45
|
+
return <h1 className='text-lg'>App Started</h1>;
|
|
46
|
+
},
|
|
47
|
+
}),
|
|
48
|
+
]),
|
|
49
|
+
})),
|
|
50
|
+
Plugin.make,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
type DefaultStoryProps = { plugins?: Plugin.Plugin[] };
|
|
54
|
+
|
|
55
|
+
const DefaultStory = ({ plugins }: DefaultStoryProps) => {
|
|
56
|
+
const App = useApp({ plugins });
|
|
57
|
+
|
|
58
|
+
return <App />;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const meta = {
|
|
62
|
+
title: 'sdk/app-framework/components/App',
|
|
63
|
+
render: DefaultStory,
|
|
64
|
+
decorators: [withTheme()],
|
|
65
|
+
parameters: {
|
|
66
|
+
layout: 'centered',
|
|
67
|
+
},
|
|
68
|
+
} satisfies Meta;
|
|
69
|
+
|
|
70
|
+
export default meta;
|
|
71
|
+
|
|
72
|
+
type Story = StoryObj<typeof meta>;
|
|
73
|
+
|
|
74
|
+
export const Default: Story = {
|
|
75
|
+
args: {
|
|
76
|
+
plugins: [TestPlugin({})],
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const WithError: Story = {
|
|
81
|
+
args: {
|
|
82
|
+
plugins: [TestPlugin({ error: true })],
|
|
83
|
+
},
|
|
84
|
+
};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { type PropsWithChildren, useEffect, useLayoutEffect } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Capabilities } from '../../../common';
|
|
8
|
+
import { topologicalSort } from '../../../helpers';
|
|
9
|
+
import { LoadingState, type StartupProgress, type UseAppOptions, useCapabilities, useLoading } from '../../hooks';
|
|
10
|
+
|
|
11
|
+
declare global {
|
|
12
|
+
interface Window {
|
|
13
|
+
/**
|
|
14
|
+
* Driver injected by `@dxos/app-framework/vite-plugin`'s `bootLoaderPlugin`
|
|
15
|
+
* (a Solid app inlined into `index.html`). Declared here — on a module that
|
|
16
|
+
* is part of the `@dxos/app-framework/ui` export surface — so the React side
|
|
17
|
+
* and host apps (e.g. composer-app) can drive the loader without each
|
|
18
|
+
* re-declaring the type. The canonical definition lives in the plugin's
|
|
19
|
+
* `loader-app/types.ts`; this mirror exists because that source compiles in a
|
|
20
|
+
* separate (Solid) program that doesn't ship its globals to consumers.
|
|
21
|
+
*/
|
|
22
|
+
__bootLoader?: {
|
|
23
|
+
status: (payload: {
|
|
24
|
+
event?: string;
|
|
25
|
+
module?: string;
|
|
26
|
+
humanized: string;
|
|
27
|
+
/**
|
|
28
|
+
* Optional `(index/total)` tick. When present, the loader replaces the
|
|
29
|
+
* current line in place ("Loading plugins (12/80)") instead of appending
|
|
30
|
+
* a new entry — keeps the visible log compact during long counted phases.
|
|
31
|
+
*/
|
|
32
|
+
range?: { index: number; total: number };
|
|
33
|
+
}) => void;
|
|
34
|
+
progress: (fraction?: number) => void;
|
|
35
|
+
ready: () => void;
|
|
36
|
+
dismiss: () => void;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type AppProps = Pick<UseAppOptions, 'debounce'> & {
|
|
42
|
+
ready: boolean;
|
|
43
|
+
error: unknown;
|
|
44
|
+
progress?: StartupProgress;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const FIRST_INTERACTIVE_MARK = 'app-framework:first-interactive';
|
|
48
|
+
|
|
49
|
+
export const App = ({ ready, error, debounce, progress }: AppProps) => {
|
|
50
|
+
const reactContexts = useCapabilities(Capabilities.ReactContext);
|
|
51
|
+
const reactRoots = useCapabilities(Capabilities.ReactRoot);
|
|
52
|
+
const stage = useLoading(ready, debounce);
|
|
53
|
+
const placeholderDismissed = stage >= LoadingState.Done;
|
|
54
|
+
|
|
55
|
+
// Relay the startup lifecycle into the boot loader injected by
|
|
56
|
+
// `@dxos/app-framework/vite-plugin` (a Solid app inlined into `index.html`,
|
|
57
|
+
// the only visible loading UI). Plugin activation fills the `[0.5, 1]` half
|
|
58
|
+
// of the ring; the raw `event` / `module` ids ride along so the loader owns
|
|
59
|
+
// how each transition is rendered and traced. No-op once the outro has
|
|
60
|
+
// started (`FadeOut`), so the dismissal runs uncontended.
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (stage >= LoadingState.FadeOut) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const fraction = progress?.progress ?? 0;
|
|
66
|
+
window.__bootLoader?.progress(0.5 + fraction * 0.5);
|
|
67
|
+
if (progress?.humanizedName) {
|
|
68
|
+
window.__bootLoader?.status({
|
|
69
|
+
event: progress.event,
|
|
70
|
+
module: progress.module,
|
|
71
|
+
humanized: `Activating ${progress.humanizedName}`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}, [stage, progress?.progress, progress?.event, progress?.module, progress?.humanizedName]);
|
|
75
|
+
|
|
76
|
+
// Hand off at fade-out: play the loader's graceful shrink-and-fade outro.
|
|
77
|
+
// `useLayoutEffect` runs before the next paint so the outro begins in the
|
|
78
|
+
// same frame the real shell starts rendering beneath it.
|
|
79
|
+
useLayoutEffect(() => {
|
|
80
|
+
if (stage >= LoadingState.FadeOut) {
|
|
81
|
+
window.__bootLoader?.ready();
|
|
82
|
+
}
|
|
83
|
+
}, [stage]);
|
|
84
|
+
|
|
85
|
+
// Emit a once-per-app `app-framework:first-interactive` mark the first time
|
|
86
|
+
// the loader is dismissed and the real app shell renders. Closes the gap
|
|
87
|
+
// between `Startup` activated and the first interactive paint.
|
|
88
|
+
//
|
|
89
|
+
// Also the framework-owned handoff-complete signal: `dismiss()` removes the
|
|
90
|
+
// loader immediately on the fast-load path (where `useLoading` skips
|
|
91
|
+
// `FadeOut`), and is a no-op once an outro is already in flight, so it never
|
|
92
|
+
// cuts the animation short.
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
if (!placeholderDismissed) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {
|
|
98
|
+
performance.mark(FIRST_INTERACTIVE_MARK);
|
|
99
|
+
}
|
|
100
|
+
window.__bootLoader?.dismiss();
|
|
101
|
+
}, [placeholderDismissed]);
|
|
102
|
+
|
|
103
|
+
// Used in tests to exercise the error boundary & reset dialog (see
|
|
104
|
+
// composer-app's `basic.spec.ts`). Thrown into the surrounding `ErrorBoundary`.
|
|
105
|
+
if (location.search === '?throw') {
|
|
106
|
+
throw new Error('Test error');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (error) {
|
|
110
|
+
// This triggers the error boundary to provide UI feedback for the startup error.
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The boot loader owns the screen until handoff completes; render nothing
|
|
115
|
+
// until then (any DOM here would sit invisibly behind the `z-index: 10`
|
|
116
|
+
// loader anyway).
|
|
117
|
+
// TODO(wittjosiah): Consider using Suspense instead.
|
|
118
|
+
if (!placeholderDismissed) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const ComposedContext = composeContexts(reactContexts);
|
|
123
|
+
return (
|
|
124
|
+
<ComposedContext>
|
|
125
|
+
{reactRoots.map(({ id, root: Component }) => (
|
|
126
|
+
<Component key={id} />
|
|
127
|
+
))}
|
|
128
|
+
</ComposedContext>
|
|
129
|
+
);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const composeContexts = (contexts: Capabilities.ReactContext[]) => {
|
|
133
|
+
if (contexts.length === 0) {
|
|
134
|
+
return ({ children }: PropsWithChildren) => <>{children}</>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return topologicalSort(contexts)
|
|
138
|
+
.map(({ context }) => context)
|
|
139
|
+
.reduce((Acc, Next) => ({ children }) => (
|
|
140
|
+
<Acc>
|
|
141
|
+
<Next>{children}</Next>
|
|
142
|
+
</Acc>
|
|
143
|
+
));
|
|
144
|
+
};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Atom, useAtomValue } from '@effect-atom/atom-react';
|
|
6
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
9
|
+
|
|
10
|
+
import { DXN } from '@dxos/keys';
|
|
11
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
12
|
+
import { useWebComponentContext } from '@dxos/web-context-react';
|
|
13
|
+
|
|
14
|
+
import { ActivationEvents, Capabilities } from '../../../common';
|
|
15
|
+
import { PluginManagerContext } from '../../../context';
|
|
16
|
+
import { Capability, Plugin } from '../../../core';
|
|
17
|
+
import { useApp } from '../../hooks';
|
|
18
|
+
|
|
19
|
+
// Define the Counter capability
|
|
20
|
+
const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
|
|
21
|
+
|
|
22
|
+
const CountStatus = () => {
|
|
23
|
+
const manager = useWebComponentContext(PluginManagerContext);
|
|
24
|
+
const capabilitiesAtom = useMemo(
|
|
25
|
+
() => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
|
|
26
|
+
[manager],
|
|
27
|
+
);
|
|
28
|
+
const capabilities = useAtomValue(capabilitiesAtom);
|
|
29
|
+
const counter = (capabilities as any)[0];
|
|
30
|
+
const [count, setCount] = useState(counter?.count ?? 0);
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (!counter) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setCount(counter.count);
|
|
37
|
+
if ('subscribe' in counter && typeof counter.subscribe === 'function') {
|
|
38
|
+
return counter.subscribe(() => setCount(counter.count));
|
|
39
|
+
}
|
|
40
|
+
}, [counter]);
|
|
41
|
+
|
|
42
|
+
if (!manager) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const isEven = count % 2 === 0;
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div
|
|
50
|
+
className={`mt-4 px-4 py-2 rounded-full text-sm font-medium transition-colors ${
|
|
51
|
+
isEven
|
|
52
|
+
? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
|
|
53
|
+
: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400'
|
|
54
|
+
}`}
|
|
55
|
+
>
|
|
56
|
+
Status: {isEven ? 'Even' : 'Odd'}
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// A component that consumes the PluginManager via web context
|
|
62
|
+
const CounterComponent = () => {
|
|
63
|
+
// Use the web-context hook to get the PluginManager
|
|
64
|
+
const manager = useWebComponentContext(PluginManagerContext);
|
|
65
|
+
const capabilitiesAtom = useMemo(
|
|
66
|
+
() => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
|
|
67
|
+
[manager],
|
|
68
|
+
);
|
|
69
|
+
const capabilities = useAtomValue(capabilitiesAtom);
|
|
70
|
+
const counter = (capabilities as any)[0];
|
|
71
|
+
const [count, setCount] = useState(counter?.count ?? 0);
|
|
72
|
+
|
|
73
|
+
useEffect(() => {
|
|
74
|
+
if (!counter) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
setCount(counter.count);
|
|
78
|
+
if ('subscribe' in counter && typeof counter.subscribe === 'function') {
|
|
79
|
+
return counter.subscribe(() => setCount(counter.count));
|
|
80
|
+
}
|
|
81
|
+
}, [counter]);
|
|
82
|
+
|
|
83
|
+
if (!manager) {
|
|
84
|
+
return <div className='p-4 text-error-text'>Error: Context not found</div>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<div className='flex flex-col items-center justify-center h-screen bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-white'>
|
|
89
|
+
<div className='p-8 bg-white dark:bg-neutral-800 rounded-lg shadow-xl border border-neutral-200 dark:border-neutral-700 max-w-md w-full'>
|
|
90
|
+
<h2 className='text-2xl font-bold mb-6 text-center text-primary-600 dark:text-primary-400'>
|
|
91
|
+
Web Context Counter
|
|
92
|
+
</h2>
|
|
93
|
+
|
|
94
|
+
<div className='flex flex-col items-center gap-6'>
|
|
95
|
+
<div className='text-6xl font-mono font-bold tabular-nums tracking-tighter'>{count}</div>
|
|
96
|
+
|
|
97
|
+
<button
|
|
98
|
+
className='px-6 py-3 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-full transition-colors shadow-md active:transform active:scale-95'
|
|
99
|
+
onClick={() => {
|
|
100
|
+
const counter = manager.capabilities.get(Counter);
|
|
101
|
+
counter.increment();
|
|
102
|
+
}}
|
|
103
|
+
>
|
|
104
|
+
Increment
|
|
105
|
+
</button>
|
|
106
|
+
|
|
107
|
+
<CountStatus />
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
|
|
111
|
+
<p className='text-sm text-neutral-500 dark:text-neutral-400'>
|
|
112
|
+
This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
|
|
113
|
+
</p>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Plugin that provides the Counter capability and renders the UI
|
|
121
|
+
const CounterPlugin = Plugin.define(
|
|
122
|
+
Plugin.makeMeta({
|
|
123
|
+
key: DXN.make('org.dxos.plugin.counter'),
|
|
124
|
+
name: 'Counter Plugin',
|
|
125
|
+
tags: ['system'],
|
|
126
|
+
}),
|
|
127
|
+
).pipe(
|
|
128
|
+
Plugin.addModule({
|
|
129
|
+
id: 'CounterMain',
|
|
130
|
+
activatesOn: ActivationEvents.Startup,
|
|
131
|
+
activate: () => {
|
|
132
|
+
const listeners = new Set<() => void>();
|
|
133
|
+
const counter = {
|
|
134
|
+
count: 0,
|
|
135
|
+
increment: () => {
|
|
136
|
+
counter.count++;
|
|
137
|
+
listeners.forEach((listener) => listener());
|
|
138
|
+
},
|
|
139
|
+
subscribe: (listener: () => void) => {
|
|
140
|
+
listeners.add(listener);
|
|
141
|
+
return () => listeners.delete(listener);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
return Effect.succeed([
|
|
146
|
+
// Contribute the state/logic
|
|
147
|
+
Capability.contributes(Counter, counter),
|
|
148
|
+
|
|
149
|
+
// Contribute the UI
|
|
150
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
151
|
+
id: 'org.dxos.plugin.counter.root',
|
|
152
|
+
root: CounterComponent,
|
|
153
|
+
}),
|
|
154
|
+
]);
|
|
155
|
+
},
|
|
156
|
+
}),
|
|
157
|
+
Plugin.make,
|
|
158
|
+
)();
|
|
159
|
+
|
|
160
|
+
const plugins = [CounterPlugin];
|
|
161
|
+
|
|
162
|
+
const DefaultStory = () => {
|
|
163
|
+
const App = useApp({ plugins });
|
|
164
|
+
|
|
165
|
+
return <App />;
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const meta = {
|
|
169
|
+
title: 'sdk/app-framework/components/PluginManagerContext',
|
|
170
|
+
render: DefaultStory,
|
|
171
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
|
|
172
|
+
parameters: {
|
|
173
|
+
layout: 'fullscreen',
|
|
174
|
+
},
|
|
175
|
+
} satisfies Meta;
|
|
176
|
+
|
|
177
|
+
export default meta;
|
|
178
|
+
|
|
179
|
+
export const Default: StoryObj<typeof meta> = {};
|
|
@@ -6,14 +6,14 @@ import { createContext, useContext } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
8
|
|
|
9
|
-
import { type PluginManager } from '
|
|
9
|
+
import { type PluginManager } from '../../../core';
|
|
10
10
|
|
|
11
|
-
const PluginManagerContext = createContext<PluginManager | undefined>(undefined);
|
|
11
|
+
const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Get the plugin manager.
|
|
15
15
|
*/
|
|
16
|
-
export const usePluginManager = (): PluginManager =>
|
|
16
|
+
export const usePluginManager = (): PluginManager.PluginManager =>
|
|
17
17
|
useContext(PluginManagerContext) ?? raise(new Error('Missing PluginManagerContext'));
|
|
18
18
|
|
|
19
19
|
/**
|