@dxos/app-framework 0.8.4-main.f9ba587 → 0.8.4-main.fcfe5033a5
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/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/dist/lib/browser/capability-EYY7KYU5.mjs +35 -0
- package/dist/lib/browser/capability-EYY7KYU5.mjs.map +7 -0
- package/dist/lib/browser/capability-W7NPZR6A.mjs +38 -0
- package/dist/lib/browser/capability-W7NPZR6A.mjs.map +7 -0
- package/dist/lib/browser/chunk-2CKCJ6PN.mjs +79 -0
- package/dist/lib/browser/chunk-2CKCJ6PN.mjs.map +7 -0
- package/dist/lib/browser/chunk-4D6YAWLP.mjs +393 -0
- package/dist/lib/browser/chunk-4D6YAWLP.mjs.map +7 -0
- package/dist/lib/browser/chunk-56CEL32L.mjs +963 -0
- package/dist/lib/browser/chunk-56CEL32L.mjs.map +7 -0
- package/dist/lib/browser/chunk-F7FW2RK2.mjs +167 -0
- package/dist/lib/browser/chunk-F7FW2RK2.mjs.map +7 -0
- package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
- package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-JKWMHZP6.mjs +80 -0
- package/dist/lib/browser/chunk-JKWMHZP6.mjs.map +7 -0
- package/dist/lib/browser/chunk-QRTB4Q3U.mjs +594 -0
- package/dist/lib/browser/chunk-QRTB4Q3U.mjs.map +7 -0
- package/dist/lib/browser/chunk-QSXYHXCE.mjs +48 -0
- package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
- package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -0
- package/dist/lib/browser/chunk-RHQGPRWN.mjs +174 -0
- package/dist/lib/browser/chunk-RHQGPRWN.mjs.map +7 -0
- package/dist/lib/browser/chunk-T3Y4AEKX.mjs +42 -0
- package/dist/lib/browser/chunk-T3Y4AEKX.mjs.map +7 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZBA6IH6L.mjs +148 -0
- package/dist/lib/browser/chunk-ZBA6IH6L.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +90 -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 +15 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +29 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +16 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +91 -156
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-35BJSGXJ.mjs +43 -0
- package/dist/lib/browser/invoker-capability-35BJSGXJ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +248 -51
- 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 +46 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-IY3YIHIO.mjs +39 -0
- package/dist/lib/node-esm/capability-IY3YIHIO.mjs.map +7 -0
- package/dist/lib/node-esm/capability-RDCTCARS.mjs +36 -0
- package/dist/lib/node-esm/capability-RDCTCARS.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-42KBWDE4.mjs +80 -0
- package/dist/lib/node-esm/chunk-42KBWDE4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DAYWQOOQ.mjs +149 -0
- package/dist/lib/node-esm/chunk-DAYWQOOQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DER2JDBT.mjs +175 -0
- package/dist/lib/node-esm/chunk-DER2JDBT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
- package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
- package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-G3RTFSNG.mjs +81 -0
- package/dist/lib/node-esm/chunk-G3RTFSNG.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-JPWVIQ5I.mjs +595 -0
- package/dist/lib/node-esm/chunk-JPWVIQ5I.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-LX6YJOSO.mjs +394 -0
- package/dist/lib/node-esm/chunk-LX6YJOSO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-URWHJQT2.mjs +168 -0
- package/dist/lib/node-esm/chunk-URWHJQT2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VKHGNEDB.mjs +43 -0
- package/dist/lib/node-esm/chunk-VKHGNEDB.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-W4K4RU4S.mjs +964 -0
- package/dist/lib/node-esm/chunk-W4K4RU4S.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
- package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs +49 -0
- package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +91 -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 +16 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +30 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +17 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +91 -156
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-3QWBSM5Q.mjs +44 -0
- package/dist/lib/node-esm/invoker-capability-3QWBSM5Q.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +248 -51
- 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 +47 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +730 -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 +109 -121
- 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} +7 -7
- 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 +6 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts +73 -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.d.ts +124 -37
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +42 -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/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 +58 -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 +11 -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 +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/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 +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +62 -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/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/composer-plugin.d.ts +34 -0
- package/dist/types/src/vite-plugin/composer-plugin.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map-plugin.d.ts +16 -0
- package/dist/types/src/vite-plugin/import-map-plugin.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +4 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.d.ts +16 -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 +144 -44
- package/src/cli/cli.ts +107 -0
- package/src/{playground/layout → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +168 -109
- 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 +6 -4
- package/src/core/plugin-manager.test.ts +1113 -0
- package/src/core/plugin-manager.ts +883 -0
- package/src/core/plugin.ts +261 -43
- package/src/core/url-loader.test.ts +112 -0
- package/src/core/url-loader.ts +178 -0
- package/src/helpers.test.ts +1 -1
- 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 +373 -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 +54 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +154 -0
- package/src/plugin-runtime/RuntimePlugin.ts +19 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/{playground/debug → 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 +14 -11
- package/src/testing/withPluginManager.tsx +78 -54
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +58 -0
- package/src/{playground/logger → ui/components/App}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -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 +7 -0
- package/src/ui/hooks/index.ts +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +289 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/ui/hooks/useLoading.tsx +68 -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/composer-plugin.ts +284 -0
- package/src/vite-plugin/import-map-plugin.ts +490 -0
- package/src/vite-plugin/index.ts +7 -0
- package/src/vite-plugin/manifest.test.ts +23 -0
- package/src/vite-plugin/manifest.ts +20 -0
- package/src/vite-plugin/packages.ts +181 -0
- package/tsconfig.json +15 -25
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +8 -6
- package/.eslintrc.cjs +0 -9
- package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
- package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
- package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
- package/dist/lib/browser/chunk-2636QSIK.mjs +0 -1518
- package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
- package/dist/lib/browser/chunk-DHZB7HG7.mjs +0 -413
- package/dist/lib/browser/chunk-DHZB7HG7.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/intent-dispatcher-TWKB22NI.mjs +0 -11
- package/dist/lib/browser/intent-resolver-O67UANYP.mjs +0 -39
- package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
- package/dist/lib/browser/store-LFKDWHUQ.mjs +0 -30
- package/dist/lib/browser/store-LFKDWHUQ.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -79
- package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NJAFK626.mjs +0 -414
- package/dist/lib/node-esm/chunk-NJAFK626.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-VSKRV3NW.mjs +0 -1520
- package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-5PRM3KGH.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
- package/dist/lib/node-esm/store-53XDUBMD.mjs +0 -31
- package/dist/lib/node-esm/store-53XDUBMD.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 -122
- 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 -31
- 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 -276
- package/src/common/collaboration.ts +0 -21
- package/src/common/events.ts +0 -77
- 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 -254
- package/src/core/manager.test.ts +0 -515
- package/src/core/manager.ts +0 -519
- 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 -46
- 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 -29
- package/src/playground/logger/plugin.ts +0 -36
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -42
- package/src/plugin-intent/IntentPlugin.ts +0 -20
- 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 -333
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-settings/SettingsPlugin.ts +0 -35
- package/src/plugin-settings/actions.ts +0 -29
- package/src/plugin-settings/app-graph-builder.ts +0 -157
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -34
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/ErrorBoundary.tsx +0 -45
- package/src/react/IntentContext.tsx +0 -34
- package/src/react/Surface.stories.tsx +0 -96
- package/src/react/Surface.tsx +0 -77
- package/src/react/common.ts +0 -12
- package/src/react/index.ts +0 -10
- package/src/react/useCapabilities.ts +0 -30
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- package/typedoc/.nojekyll +0 -1
- package/typedoc/assets/hierarchy.js +0 -1
- package/typedoc/assets/highlight.css +0 -106
- package/typedoc/assets/icons.js +0 -18
- package/typedoc/assets/icons.svg +0 -1
- package/typedoc/assets/main.js +0 -60
- package/typedoc/assets/navigation.js +0 -1
- package/typedoc/assets/search.js +0 -1
- package/typedoc/assets/style.css +0 -1640
- package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
- package/typedoc/classes/ErrorBoundary.html +0 -125
- package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
- package/typedoc/classes/IntentAction.Track.html +0 -266
- package/typedoc/classes/LayoutAction.AddToast.html +0 -265
- package/typedoc/classes/LayoutAction.Close.html +0 -382
- package/typedoc/classes/LayoutAction.Expose.html +0 -265
- package/typedoc/classes/LayoutAction.Open.html +0 -1123
- package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
- package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
- package/typedoc/classes/LayoutAction.Set.html +0 -460
- package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
- package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
- package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
- package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
- package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
- package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
- package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
- package/typedoc/classes/Plugin.html +0 -6
- package/typedoc/classes/PluginContext.html +0 -38
- package/typedoc/classes/PluginManager.html +0 -43
- package/typedoc/classes/PluginModule.html +0 -18
- package/typedoc/classes/SettingsAction.Open.html +0 -226
- package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
- package/typedoc/functions/Events.createStateEvent.html +0 -2
- package/typedoc/functions/IntentPlugin.html +0 -1
- package/typedoc/functions/SettingsPlugin.html +0 -1
- package/typedoc/functions/allOf.html +0 -2
- package/typedoc/functions/chain.html +0 -3
- package/typedoc/functions/contributes.html +0 -2
- package/typedoc/functions/createDispatcher.html +0 -3
- package/typedoc/functions/createIntent.html +0 -6
- package/typedoc/functions/createResolver.html +0 -2
- package/typedoc/functions/createSurface.html +0 -2
- package/typedoc/functions/defineCapability.html +0 -2
- package/typedoc/functions/defineEvent.html +0 -2
- package/typedoc/functions/defineModule.html +0 -2
- package/typedoc/functions/definePlugin.html +0 -2
- package/typedoc/functions/eventKey.html +0 -2
- package/typedoc/functions/getEvents.html +0 -2
- package/typedoc/functions/isAllOf.html +0 -2
- package/typedoc/functions/isOneOf.html +0 -2
- package/typedoc/functions/isSurfaceAvailable.html +0 -2
- package/typedoc/functions/lazy.html +0 -2
- package/typedoc/functions/oneOf.html +0 -2
- package/typedoc/functions/useApp.html +0 -6
- package/typedoc/functions/useAppGraph.html +0 -1
- package/typedoc/functions/useCapabilities.html +0 -3
- package/typedoc/functions/useCapability.html +0 -4
- package/typedoc/functions/useIntentDispatcher.html +0 -1
- package/typedoc/functions/useIntentResolver.html +0 -1
- package/typedoc/functions/useLayout.html +0 -1
- package/typedoc/functions/usePluginManager.html +0 -2
- package/typedoc/hierarchy.html +0 -1
- package/typedoc/index.html +0 -12
- package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
- package/typedoc/media/LICENSE +0 -8
- package/typedoc/modules/Capabilities.html +0 -1
- package/typedoc/modules/CollaborationActions.html +0 -1
- package/typedoc/modules/Events.html +0 -1
- package/typedoc/modules/IntentAction.html +0 -1
- package/typedoc/modules/LayoutAction.html +0 -2
- package/typedoc/modules/SettingsAction.html +0 -1
- package/typedoc/modules.html +0 -1
- package/typedoc/types/ActivationEvent.html +0 -8
- package/typedoc/types/ActivationEvents.html +0 -2
- package/typedoc/types/AnyCapability.html +0 -1
- package/typedoc/types/AnyIntent.html +0 -1
- package/typedoc/types/AnyIntentChain.html +0 -1
- package/typedoc/types/AnyIntentEffectResult.html +0 -1
- package/typedoc/types/AnyIntentResolver.html +0 -1
- package/typedoc/types/AnyIntentResult.html +0 -1
- package/typedoc/types/Capabilities.FileUploader.html +0 -1
- package/typedoc/types/Capabilities.IntentResolver.html +0 -1
- package/typedoc/types/Capabilities.Layout.html +0 -1
- package/typedoc/types/Capabilities.Metadata.html +0 -1
- package/typedoc/types/Capabilities.ReactContext.html +0 -1
- package/typedoc/types/Capabilities.ReactRoot.html +0 -1
- package/typedoc/types/Capabilities.ReactSurface.html +0 -1
- package/typedoc/types/Capabilities.Settings.html +0 -4
- package/typedoc/types/Capability.html +0 -9
- package/typedoc/types/CreateAppOptions.html +0 -10
- package/typedoc/types/FileInfo.html +0 -1
- package/typedoc/types/Intent.html +0 -10
- package/typedoc/types/IntentChain.html +0 -6
- package/typedoc/types/IntentContext.html +0 -5
- package/typedoc/types/IntentData.html +0 -1
- package/typedoc/types/IntentDispatcher.html +0 -2
- package/typedoc/types/IntentDispatcherResult.html +0 -2
- package/typedoc/types/IntentEffectDefinition.html +0 -2
- package/typedoc/types/IntentEffectResult.html +0 -15
- package/typedoc/types/IntentParams.html +0 -3
- package/typedoc/types/IntentResolver.html +0 -2
- package/typedoc/types/IntentResultData.html +0 -1
- package/typedoc/types/IntentSchema.html +0 -1
- package/typedoc/types/IntentUndo.html +0 -2
- package/typedoc/types/InterfaceDef.html +0 -4
- package/typedoc/types/Label.html +0 -1
- package/typedoc/types/NodeSerializer.html +0 -8
- package/typedoc/types/PluginManagerOptions.html +0 -6
- package/typedoc/types/PluginMeta.html +0 -21
- package/typedoc/types/PromiseIntentDispatcher.html +0 -2
- package/typedoc/types/PromiseIntentUndo.html +0 -2
- package/typedoc/types/Resource.html +0 -1
- package/typedoc/types/ResourceKey.html +0 -1
- package/typedoc/types/ResourceLanguage.html +0 -1
- package/typedoc/types/SerializedNode.html +0 -4
- package/typedoc/types/SurfaceComponent.html +0 -2
- package/typedoc/types/SurfaceDefinition.html +0 -2
- package/typedoc/types/SurfaceProps.html +0 -4
- package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
- package/typedoc/variables/Capabilities.AppGraph.html +0 -1
- package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
- package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
- package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
- package/typedoc/variables/Capabilities.FileUploader.html +0 -1
- package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
- package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
- package/typedoc/variables/Capabilities.Layout.html +0 -1
- package/typedoc/variables/Capabilities.Metadata.html +0 -1
- package/typedoc/variables/Capabilities.Null.html +0 -1
- package/typedoc/variables/Capabilities.PluginManager.html +0 -1
- package/typedoc/variables/Capabilities.ReactContext.html +0 -1
- package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
- package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
- package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
- package/typedoc/variables/Capabilities.Settings.html +0 -1
- package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
- package/typedoc/variables/Capabilities.Tools.html +0 -1
- package/typedoc/variables/Capabilities.Translations.html +0 -1
- package/typedoc/variables/Events.AppGraphReady.html +0 -2
- package/typedoc/variables/Events.DispatcherReady.html +0 -2
- package/typedoc/variables/Events.LayoutReady.html +0 -1
- package/typedoc/variables/Events.SettingsReady.html +0 -2
- package/typedoc/variables/Events.SetupAppGraph.html +0 -2
- package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
- package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
- package/typedoc/variables/Events.SetupMetadata.html +0 -2
- package/typedoc/variables/Events.SetupReactSurface.html +0 -2
- package/typedoc/variables/Events.SetupSettings.html +0 -2
- package/typedoc/variables/Events.SetupTranslations.html +0 -2
- package/typedoc/variables/Events.Startup.html +0 -2
- package/typedoc/variables/FileInfoSchema.html +0 -1
- package/typedoc/variables/INTENT_ACTION.html +0 -1
- package/typedoc/variables/INTENT_PLUGIN.html +0 -1
- package/typedoc/variables/LAYOUT_ACTION.html +0 -1
- package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
- package/typedoc/variables/Label.html +0 -1
- package/typedoc/variables/LayoutAction.Toast.html +0 -1
- package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
- package/typedoc/variables/PluginManagerProvider.html +0 -2
- package/typedoc/variables/Resource.html +0 -2
- package/typedoc/variables/ResourceKey.html +0 -1
- package/typedoc/variables/ResourceLanguage.html +0 -1
- package/typedoc/variables/SETTINGS_ACTION.html +0 -1
- package/typedoc/variables/SETTINGS_ID.html +0 -1
- package/typedoc/variables/SETTINGS_KEY.html +0 -1
- package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
- package/typedoc/variables/Surface.html +0 -2
- package/typedoc/variables/defaultFileTypes.html +0 -1
- /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → chunk-RFSO3JRG.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-5PRM3KGH.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
package/src/core/plugin.ts
CHANGED
|
@@ -2,12 +2,82 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Context from 'effect/Context';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Option from 'effect/Option';
|
|
8
|
+
import * as Pipeable from 'effect/Pipeable';
|
|
6
9
|
|
|
7
|
-
import {
|
|
8
|
-
import { type ActivationEvent, type ActivationEvents } from './events';
|
|
10
|
+
import { invariant } from '@dxos/invariant';
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
import type * as ActivationEvent from './activation-event';
|
|
13
|
+
import * as Capability from './capability';
|
|
14
|
+
import type * as PluginManager from './plugin-manager';
|
|
15
|
+
|
|
16
|
+
//
|
|
17
|
+
// Plugin Service Layer
|
|
18
|
+
//
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Effect Context.Tag for accessing PluginManager via the Effect layer system.
|
|
22
|
+
* This allows lifecycle operations to access the plugin manager without having it passed as an argument.
|
|
23
|
+
*/
|
|
24
|
+
export class Service extends Context.Tag('@dxos/app-framework/PluginManager')<Service, PluginManager.PluginManager>() {}
|
|
25
|
+
|
|
26
|
+
//
|
|
27
|
+
// Lifecycle Functions
|
|
28
|
+
//
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Activates plugins based on the activation event.
|
|
32
|
+
* Accesses the PluginManager via the Effect layer system.
|
|
33
|
+
* @param event The activation event.
|
|
34
|
+
* @returns Whether the activation was successful.
|
|
35
|
+
*/
|
|
36
|
+
export const activate = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>
|
|
37
|
+
Effect.flatMap(Service, (manager) => manager.activate(event));
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Re-activates the modules that were activated by the event.
|
|
41
|
+
* Accesses the PluginManager via the Effect layer system.
|
|
42
|
+
* @param event The activation event.
|
|
43
|
+
* @returns Whether the reset was successful.
|
|
44
|
+
*/
|
|
45
|
+
export const reset = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>
|
|
46
|
+
Effect.flatMap(Service, (manager) => manager.reset(event));
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Shuts down the plugin manager, deactivating all active modules and clearing lifecycle state.
|
|
50
|
+
* Accesses the PluginManager via the Effect layer system.
|
|
51
|
+
*/
|
|
52
|
+
export const shutdown = (): Effect.Effect<boolean, Error, Service> =>
|
|
53
|
+
Effect.flatMap(Service, (manager) => manager.shutdown());
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Computes a module ID from plugin ID and export name.
|
|
57
|
+
*/
|
|
58
|
+
const computeModuleId = (pluginId: string, moduleName: string): string => {
|
|
59
|
+
return `${pluginId}.module.${moduleName}`;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Identifier denoting a PluginModule.
|
|
64
|
+
*/
|
|
65
|
+
export const PluginModuleTypeId: unique symbol = Symbol.for('@dxos/app-framework/PluginModule');
|
|
66
|
+
export type PluginModuleTypeId = typeof PluginModuleTypeId;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Type guard to check if a value is a PluginModule.
|
|
70
|
+
*/
|
|
71
|
+
export const isPluginModule = (value: unknown): value is PluginModule => {
|
|
72
|
+
return typeof value === 'object' && value !== null && PluginModuleTypeId in value;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A unit of containment of modular functionality that can be provided to an application.
|
|
77
|
+
* Activation of a module is async allowing for code to split and loaded lazily.
|
|
78
|
+
*/
|
|
79
|
+
export interface PluginModule {
|
|
80
|
+
readonly [PluginModuleTypeId]: PluginModuleTypeId;
|
|
11
81
|
/**
|
|
12
82
|
* Unique id of the module.
|
|
13
83
|
*/
|
|
@@ -16,63 +86,73 @@ interface PluginModuleInterface {
|
|
|
16
86
|
/**
|
|
17
87
|
* Events for which the module will be activated.
|
|
18
88
|
*/
|
|
19
|
-
activatesOn:
|
|
89
|
+
activatesOn: ActivationEvent.Events;
|
|
20
90
|
|
|
21
91
|
/**
|
|
22
|
-
* Events
|
|
23
|
-
*
|
|
24
|
-
*
|
|
92
|
+
* Events that this module fires *before* its own activation runs.
|
|
93
|
+
*
|
|
94
|
+
* When this module is asked to activate (via {@link activatesOn}), the
|
|
95
|
+
* plugin manager first activates every event listed here, ensuring any
|
|
96
|
+
* other modules that contribute to those events have completed before
|
|
97
|
+
* this module's {@link activate} body executes. These events are fired
|
|
98
|
+
* by the framework on this module's behalf — the module does not need
|
|
99
|
+
* to wait for some other code to fire them.
|
|
100
|
+
*
|
|
101
|
+
* The module is marked as needing reset if a module activated by one
|
|
102
|
+
* of these events is later removed.
|
|
103
|
+
*
|
|
104
|
+
* Read as: "this module fires these events before [its] activation".
|
|
25
105
|
*/
|
|
26
|
-
|
|
106
|
+
firesBeforeActivation?: ActivationEvent.ActivationEvent[];
|
|
27
107
|
|
|
28
108
|
/**
|
|
29
|
-
* Events
|
|
109
|
+
* Events that this module fires *after* its own activation completes.
|
|
110
|
+
*
|
|
111
|
+
* Once this module's {@link activate} body has finished executing, the
|
|
112
|
+
* plugin manager activates every event listed here, causing any modules
|
|
113
|
+
* listening on those events to run. These events are fired by the
|
|
114
|
+
* framework on this module's behalf as part of this module's lifecycle.
|
|
115
|
+
*
|
|
116
|
+
* Read as: "this module fires these events after [its] activation".
|
|
30
117
|
*/
|
|
31
|
-
|
|
118
|
+
firesAfterActivation?: ActivationEvent.ActivationEvent[];
|
|
32
119
|
|
|
33
120
|
/**
|
|
34
121
|
* Called when the module is activated.
|
|
35
|
-
*
|
|
122
|
+
* CapabilityManager is accessed via the Effect layer system (Capability.Service).
|
|
123
|
+
* PluginManager is accessed via Plugin.Service.
|
|
124
|
+
* @param props Optional props passed to the module.
|
|
36
125
|
* @returns The capabilities of the module.
|
|
37
126
|
*/
|
|
38
|
-
activate: (
|
|
39
|
-
context: PluginContext,
|
|
40
|
-
) => MaybePromise<AnyCapability | AnyCapability[]> | Promise<() => Promise<AnyCapability | AnyCapability[]>>;
|
|
127
|
+
activate: (props?: any) => Effect.Effect<Capability.ModuleReturn, Error, Capability.Service | Service | never>;
|
|
41
128
|
}
|
|
42
129
|
|
|
43
|
-
|
|
44
|
-
* A unit of containment of modular functionality that can be provided to an application.
|
|
45
|
-
* Activation of a module is async allowing for code to split and loaded lazily.
|
|
46
|
-
*/
|
|
47
|
-
// NOTE: This is implemented as a class to prevent it from being proxied by PluginManager state.
|
|
48
|
-
export class PluginModule implements PluginModuleInterface {
|
|
49
|
-
readonly id: PluginModuleInterface['id'];
|
|
50
|
-
readonly activatesOn: PluginModuleInterface['activatesOn'];
|
|
51
|
-
readonly activatesBefore?: PluginModuleInterface['activatesBefore'];
|
|
52
|
-
readonly activatesAfter?: PluginModuleInterface['activatesAfter'];
|
|
53
|
-
readonly activate: PluginModuleInterface['activate'];
|
|
130
|
+
export type PluginModuleOptions = Omit<PluginModule, 'id' | typeof PluginModuleTypeId> & { id?: string };
|
|
54
131
|
|
|
55
|
-
|
|
132
|
+
class PluginModuleImpl implements PluginModule {
|
|
133
|
+
readonly [PluginModuleTypeId]: PluginModuleTypeId = PluginModuleTypeId;
|
|
134
|
+
readonly id: PluginModule['id'];
|
|
135
|
+
readonly activatesOn: PluginModule['activatesOn'];
|
|
136
|
+
readonly firesBeforeActivation?: PluginModule['firesBeforeActivation'];
|
|
137
|
+
readonly firesAfterActivation?: PluginModule['firesAfterActivation'];
|
|
138
|
+
readonly activate: PluginModule['activate'];
|
|
139
|
+
|
|
140
|
+
constructor(options: Omit<PluginModule, typeof PluginModuleTypeId>) {
|
|
56
141
|
this.id = options.id;
|
|
57
142
|
this.activatesOn = options.activatesOn;
|
|
58
|
-
this.
|
|
59
|
-
this.
|
|
143
|
+
this.firesBeforeActivation = options.firesBeforeActivation;
|
|
144
|
+
this.firesAfterActivation = options.firesAfterActivation;
|
|
60
145
|
this.activate = options.activate;
|
|
61
146
|
}
|
|
62
147
|
}
|
|
63
148
|
|
|
64
|
-
|
|
65
|
-
* Helper to define a module.
|
|
66
|
-
*/
|
|
67
|
-
export const defineModule = (options: PluginModuleInterface) => new PluginModule(options);
|
|
68
|
-
|
|
69
|
-
export type PluginMeta = {
|
|
149
|
+
export type Meta = {
|
|
70
150
|
/**
|
|
71
151
|
* Globally unique ID.
|
|
72
152
|
*
|
|
73
153
|
* Expected to be in the form of a valid URL.
|
|
74
154
|
*
|
|
75
|
-
* @example dxos.
|
|
155
|
+
* @example org.dxos.plugin.example
|
|
76
156
|
*/
|
|
77
157
|
id: string;
|
|
78
158
|
|
|
@@ -110,23 +190,161 @@ export type PluginMeta = {
|
|
|
110
190
|
* A grep-able symbol string which can be resolved to an icon asset by @ch-ui/icons, via @ch-ui/vite-plugin-icons.
|
|
111
191
|
*/
|
|
112
192
|
icon?: string;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Icon hue (ChromaticPalette).
|
|
196
|
+
*/
|
|
197
|
+
iconHue?: string;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Identifier denoting a Plugin.
|
|
202
|
+
*/
|
|
203
|
+
export const PluginTypeId: unique symbol = Symbol.for('@dxos/app-framework/Plugin');
|
|
204
|
+
export type PluginTypeId = typeof PluginTypeId;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Type guard to check if a value is a Plugin.
|
|
208
|
+
*/
|
|
209
|
+
export const isPlugin = (value: unknown): value is Plugin => {
|
|
210
|
+
return typeof value === 'object' && value !== null && PluginTypeId in value;
|
|
113
211
|
};
|
|
114
212
|
|
|
115
213
|
/**
|
|
116
214
|
* A collection of modules that are be enabled/disabled as a unit.
|
|
117
215
|
* Plugins provide things such as components, state, actions, etc. to the application.
|
|
118
216
|
*/
|
|
119
|
-
//
|
|
120
|
-
export
|
|
217
|
+
// TODO(burdon): Convert to ECHO schema.
|
|
218
|
+
export interface Plugin {
|
|
219
|
+
readonly [PluginTypeId]: PluginTypeId;
|
|
220
|
+
readonly meta: Readonly<Meta>;
|
|
221
|
+
readonly modules: ReadonlyArray<PluginModule>;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Internal implementation of Plugin.
|
|
226
|
+
* @internal
|
|
227
|
+
*/
|
|
228
|
+
class PluginImpl implements Plugin {
|
|
229
|
+
readonly [PluginTypeId]: PluginTypeId = PluginTypeId;
|
|
230
|
+
|
|
121
231
|
constructor(
|
|
122
|
-
readonly
|
|
123
|
-
readonly
|
|
232
|
+
private readonly _meta: Meta,
|
|
233
|
+
private readonly _modules: PluginModule[],
|
|
124
234
|
) {}
|
|
235
|
+
|
|
236
|
+
get meta(): Readonly<Meta> {
|
|
237
|
+
return this._meta;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
get modules(): ReadonlyArray<PluginModule> {
|
|
241
|
+
return this._modules;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Builder interface for creating plugins incrementally.
|
|
247
|
+
*/
|
|
248
|
+
export interface PluginBuilder<T = void> extends Pipeable.Pipeable {
|
|
249
|
+
readonly meta: Meta;
|
|
250
|
+
readonly modules: ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)>;
|
|
251
|
+
addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T>;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Builder implementation for creating plugins incrementally.
|
|
256
|
+
*/
|
|
257
|
+
class PluginBuilderImpl<T = void> implements PluginBuilder<T> {
|
|
258
|
+
readonly meta: Meta;
|
|
259
|
+
private readonly _modules: Array<PluginModuleOptions | ((options: T) => PluginModuleOptions)> = [];
|
|
260
|
+
|
|
261
|
+
constructor(meta: Meta) {
|
|
262
|
+
this.meta = meta;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
get modules(): ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)> {
|
|
266
|
+
return this._modules;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T> {
|
|
270
|
+
this._modules.push(moduleOptions);
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
pipe() {
|
|
275
|
+
// eslint-disable-next-line prefer-rest-params
|
|
276
|
+
return Pipeable.pipeArguments(this, arguments);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Creates a new PluginBuilder to start building a plugin.
|
|
282
|
+
*/
|
|
283
|
+
export const define = <T = void>(meta: Meta): PluginBuilder<T> => new PluginBuilderImpl<T>(meta);
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Adds a module to a plugin builder.
|
|
287
|
+
* Supports both pipeline and direct call styles.
|
|
288
|
+
* Modules can be either PluginModuleOptions or functions that receive options.
|
|
289
|
+
*/
|
|
290
|
+
export function addModule<T>(
|
|
291
|
+
moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),
|
|
292
|
+
): (builder: PluginBuilder<T>) => PluginBuilder<T>;
|
|
293
|
+
export function addModule<T>(
|
|
294
|
+
builder: PluginBuilder<T>,
|
|
295
|
+
moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),
|
|
296
|
+
): PluginBuilder<T>;
|
|
297
|
+
export function addModule<T>(
|
|
298
|
+
moduleOptionsOrBuilder: PluginModuleOptions | ((options: T) => PluginModuleOptions) | PluginBuilder<T>,
|
|
299
|
+
moduleOptions?: PluginModuleOptions | ((options: T) => PluginModuleOptions),
|
|
300
|
+
): ((builder: PluginBuilder<T>) => PluginBuilder<T>) | PluginBuilder<T> {
|
|
301
|
+
// If second arg is provided, it's the direct call style: addModule(builder, moduleOptions)
|
|
302
|
+
if (moduleOptions !== undefined) {
|
|
303
|
+
return (moduleOptionsOrBuilder as PluginBuilder<T>).addModule(moduleOptions);
|
|
304
|
+
}
|
|
305
|
+
// Otherwise it's pipeline style: addModule(moduleOptions) returns a function
|
|
306
|
+
const moduleOpts = moduleOptionsOrBuilder as PluginModuleOptions | ((options: T) => PluginModuleOptions);
|
|
307
|
+
return (builder: PluginBuilder<T>) => builder.addModule(moduleOpts);
|
|
125
308
|
}
|
|
126
309
|
|
|
310
|
+
export type PluginFactory<T = void> = ((options: T) => Plugin) & { meta: Meta };
|
|
311
|
+
|
|
127
312
|
/**
|
|
128
|
-
*
|
|
313
|
+
* Resolves a module from either PluginModuleOptions or a function that returns PluginModuleOptions.
|
|
129
314
|
*/
|
|
130
|
-
|
|
131
|
-
|
|
315
|
+
const resolveModule = (
|
|
316
|
+
meta: Meta,
|
|
317
|
+
module: PluginModuleOptions | ((options: any) => PluginModuleOptions),
|
|
318
|
+
options?: any,
|
|
319
|
+
): PluginModuleImpl => {
|
|
320
|
+
const moduleOptions = typeof module === 'function' ? module(options) : module;
|
|
321
|
+
const id = Option.fromNullable(moduleOptions.id).pipe(
|
|
322
|
+
Option.match({
|
|
323
|
+
onNone: () => {
|
|
324
|
+
const exportName = Capability.getModuleTag(moduleOptions.activate);
|
|
325
|
+
invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`);
|
|
326
|
+
return computeModuleId(meta.id, exportName);
|
|
327
|
+
},
|
|
328
|
+
onSome: (id) => computeModuleId(meta.id, id),
|
|
329
|
+
}),
|
|
330
|
+
);
|
|
331
|
+
return new PluginModuleImpl({ ...moduleOptions, id });
|
|
132
332
|
};
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Creates a Plugin from a builder.
|
|
336
|
+
* Supports both pipeline and direct call styles.
|
|
337
|
+
* Always returns a factory function (options: T) => Plugin.
|
|
338
|
+
* When T is void, the function takes no arguments: () => Plugin.
|
|
339
|
+
*/
|
|
340
|
+
export function make<T>(builder: PluginBuilder<T>): PluginFactory<T>;
|
|
341
|
+
export function make<T>(builder: PluginBuilder<T>): PluginFactory<T> {
|
|
342
|
+
const meta = builder.meta;
|
|
343
|
+
|
|
344
|
+
const factory = (options: T) => {
|
|
345
|
+
const modules = builder.modules.map((module) => resolveModule(meta, module, options));
|
|
346
|
+
return new PluginImpl(meta, modules);
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
return Object.assign(factory, { meta });
|
|
350
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assert, describe, it } from '@effect/vitest';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
|
|
8
|
+
import * as Plugin from './plugin';
|
|
9
|
+
import * as UrlLoader from './url-loader';
|
|
10
|
+
|
|
11
|
+
const testMeta = { id: 'org.dxos.plugin.test', name: 'Test' };
|
|
12
|
+
|
|
13
|
+
describe('UrlLoader', () => {
|
|
14
|
+
describe('isLocalUrl', () => {
|
|
15
|
+
it('matches localhost, 127.0.0.1, and ::1', ({ expect }) => {
|
|
16
|
+
expect(UrlLoader.isLocalUrl('http://localhost:5173/plugin.mjs')).toBe(true);
|
|
17
|
+
expect(UrlLoader.isLocalUrl('https://LOCALHOST/plugin.mjs')).toBe(true);
|
|
18
|
+
expect(UrlLoader.isLocalUrl('http://127.0.0.1:8080/plugin.mjs')).toBe(true);
|
|
19
|
+
expect(UrlLoader.isLocalUrl('http://[::1]:8080/plugin.mjs')).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('rejects public and malformed URLs', ({ expect }) => {
|
|
23
|
+
expect(UrlLoader.isLocalUrl('https://example.com/plugin.mjs')).toBe(false);
|
|
24
|
+
expect(UrlLoader.isLocalUrl('https://192.168.1.10/plugin.mjs')).toBe(false);
|
|
25
|
+
expect(UrlLoader.isLocalUrl('not a url')).toBe(false);
|
|
26
|
+
expect(UrlLoader.isLocalUrl('')).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('getRemoteEntries', () => {
|
|
31
|
+
it('returns persisted entries from storage', ({ expect }) => {
|
|
32
|
+
const storage: UrlLoader.Storage = {
|
|
33
|
+
get: () => '[{"id":"p1","url":"http://localhost:5173/p.mjs"}]',
|
|
34
|
+
set: () => {},
|
|
35
|
+
};
|
|
36
|
+
expect(UrlLoader.getRemoteEntries({ storage })).toEqual([{ id: 'p1', url: 'http://localhost:5173/p.mjs' }]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('returns an empty array when storage is empty or malformed', ({ expect }) => {
|
|
40
|
+
const empty: UrlLoader.Storage = { get: () => null, set: () => {} };
|
|
41
|
+
const malformed: UrlLoader.Storage = { get: () => '{not json', set: () => {} };
|
|
42
|
+
expect(UrlLoader.getRemoteEntries({ storage: empty })).toEqual([]);
|
|
43
|
+
expect(UrlLoader.getRemoteEntries({ storage: malformed })).toEqual([]);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('make', () => {
|
|
48
|
+
it.effect('resolves built-in plugins by meta.id', () =>
|
|
49
|
+
Effect.gen(function* () {
|
|
50
|
+
const testPlugin = Plugin.make(Plugin.define(testMeta))();
|
|
51
|
+
const loader = UrlLoader.make([testPlugin]);
|
|
52
|
+
const result = yield* loader(testMeta.id);
|
|
53
|
+
assert.strictEqual(result.meta.id, testMeta.id);
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
it.effect('fails for unknown non-URL locator', () =>
|
|
58
|
+
Effect.gen(function* () {
|
|
59
|
+
const loader = UrlLoader.make([]);
|
|
60
|
+
const exit = yield* Effect.exit(loader('not-a-url'));
|
|
61
|
+
assert.isTrue(exit._tag === 'Failure');
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('preload', () => {
|
|
67
|
+
it('returns empty array when storage has no entries', async ({ expect }) => {
|
|
68
|
+
const storage: UrlLoader.Storage = {
|
|
69
|
+
get: () => null,
|
|
70
|
+
set: () => {},
|
|
71
|
+
};
|
|
72
|
+
const result = await UrlLoader.preload({ storage });
|
|
73
|
+
expect(result).toEqual([]);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('returns empty array when storage has invalid JSON', async ({ expect }) => {
|
|
77
|
+
const storage: UrlLoader.Storage = {
|
|
78
|
+
get: () => '{{invalid json',
|
|
79
|
+
set: () => {},
|
|
80
|
+
};
|
|
81
|
+
const result = await UrlLoader.preload({ storage });
|
|
82
|
+
expect(result).toEqual([]);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('returns empty array when storage contains null', async ({ expect }) => {
|
|
86
|
+
const storage: UrlLoader.Storage = {
|
|
87
|
+
get: () => 'null',
|
|
88
|
+
set: () => {},
|
|
89
|
+
};
|
|
90
|
+
const result = await UrlLoader.preload({ storage });
|
|
91
|
+
expect(result).toEqual([]);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('returns empty array when storage contains an object', async ({ expect }) => {
|
|
95
|
+
const storage: UrlLoader.Storage = {
|
|
96
|
+
get: () => '{}',
|
|
97
|
+
set: () => {},
|
|
98
|
+
};
|
|
99
|
+
const result = await UrlLoader.preload({ storage });
|
|
100
|
+
expect(result).toEqual([]);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('returns empty array when entries are missing required fields', async ({ expect }) => {
|
|
104
|
+
const storage: UrlLoader.Storage = {
|
|
105
|
+
get: () => '[{"title":"no url"}]',
|
|
106
|
+
set: () => {},
|
|
107
|
+
};
|
|
108
|
+
const result = await UrlLoader.preload({ storage });
|
|
109
|
+
expect(result).toEqual([]);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { log } from '@dxos/log';
|
|
8
|
+
|
|
9
|
+
import * as Plugin from './plugin';
|
|
10
|
+
|
|
11
|
+
const DEFAULT_KEY = 'org.dxos.composer.remote-plugins';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Abstraction over key-value storage (defaults to localStorage).
|
|
15
|
+
*/
|
|
16
|
+
export type Storage = {
|
|
17
|
+
get(key: string): string | null;
|
|
18
|
+
set(key: string, value: string): void;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Options for configuring the URL loader.
|
|
23
|
+
*/
|
|
24
|
+
export type Options = {
|
|
25
|
+
storage?: Storage;
|
|
26
|
+
key?: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Persisted record of a remote plugin that has been loaded previously.
|
|
31
|
+
*/
|
|
32
|
+
export type RemotePluginEntry = {
|
|
33
|
+
id: string;
|
|
34
|
+
url: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const defaultStorage = (): Storage => ({
|
|
38
|
+
get: (key) => localStorage.getItem(key),
|
|
39
|
+
set: (key, value) => localStorage.setItem(key, value),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const getPersistedRemotePlugins = (storage: Storage, key: string): RemotePluginEntry[] => {
|
|
43
|
+
try {
|
|
44
|
+
const parsed: unknown = JSON.parse(storage.get(key) ?? '[]');
|
|
45
|
+
if (!Array.isArray(parsed)) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return parsed.filter(
|
|
49
|
+
(entry): entry is RemotePluginEntry =>
|
|
50
|
+
typeof entry === 'object' && entry !== null && typeof entry.id === 'string' && typeof entry.url === 'string',
|
|
51
|
+
);
|
|
52
|
+
} catch {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const persistRemotePlugin = (storage: Storage, key: string, entry: RemotePluginEntry): void => {
|
|
58
|
+
try {
|
|
59
|
+
const entries = getPersistedRemotePlugins(storage, key).filter((existing) => existing.id !== entry.id);
|
|
60
|
+
entries.push(entry);
|
|
61
|
+
storage.set(key, JSON.stringify(entries));
|
|
62
|
+
} catch (error) {
|
|
63
|
+
log.warn('failed to persist remote plugin entry', { entry, error });
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const isUrl = (locator: string): boolean => {
|
|
68
|
+
try {
|
|
69
|
+
const url = new URL(locator);
|
|
70
|
+
return url.protocol === 'http:' || url.protocol === 'https:';
|
|
71
|
+
} catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Returns true when the URL's hostname is the local host (localhost, 127.0.0.1, or ::1).
|
|
78
|
+
*/
|
|
79
|
+
export const isLocalUrl = (locator: string): boolean => {
|
|
80
|
+
try {
|
|
81
|
+
const hostname = new URL(locator).hostname.toLowerCase();
|
|
82
|
+
// WHATWG URL returns '::1' without brackets in Node; some browsers return '[::1]'.
|
|
83
|
+
return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';
|
|
84
|
+
} catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Returns the list of remote plugin entries previously persisted by {@link make}.
|
|
91
|
+
* Useful for UI code that needs to know which loaded plugins were installed from a URL
|
|
92
|
+
* (e.g. to surface a tag on remote or localhost-hosted plugins).
|
|
93
|
+
*/
|
|
94
|
+
export const getRemoteEntries = (options: Options = {}): readonly RemotePluginEntry[] => {
|
|
95
|
+
const storage = options.storage ?? defaultStorage();
|
|
96
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
97
|
+
return getPersistedRemotePlugins(storage, key);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const normalizePluginExport = (mod: Record<string, unknown>): Plugin.Plugin => {
|
|
101
|
+
const exported = mod.default;
|
|
102
|
+
if (Plugin.isPlugin(exported)) {
|
|
103
|
+
return exported;
|
|
104
|
+
}
|
|
105
|
+
if (typeof exported === 'function') {
|
|
106
|
+
const result = (exported as () => unknown)();
|
|
107
|
+
if (Plugin.isPlugin(result)) {
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
throw new Error('Remote module default export is not a Plugin or a zero-arg plugin factory.');
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const loadRemotePlugin = async (url: string): Promise<Plugin.Plugin> => {
|
|
115
|
+
log.info('loading remote plugin', { url });
|
|
116
|
+
const mod = await import(/* @vite-ignore */ url);
|
|
117
|
+
const plugin = normalizePluginExport(mod);
|
|
118
|
+
if (!plugin.meta.id || !plugin.meta.name) {
|
|
119
|
+
throw new Error(`Remote plugin at ${url} is missing required meta.id or meta.name.`);
|
|
120
|
+
}
|
|
121
|
+
return plugin;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Preloads previously persisted remote plugins from storage.
|
|
126
|
+
*/
|
|
127
|
+
export const preload = async (options: Options = {}): Promise<Plugin.Plugin[]> => {
|
|
128
|
+
const storage = options.storage ?? defaultStorage();
|
|
129
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
130
|
+
|
|
131
|
+
const entries = getPersistedRemotePlugins(storage, key);
|
|
132
|
+
if (entries.length === 0) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
log.info('preloading remote plugins', { count: entries.length });
|
|
136
|
+
const results = await Promise.allSettled(entries.map((entry) => loadRemotePlugin(entry.url)));
|
|
137
|
+
const plugins: Plugin.Plugin[] = [];
|
|
138
|
+
for (let index = 0; index < results.length; index++) {
|
|
139
|
+
const result = results[index];
|
|
140
|
+
if (result.status === 'fulfilled') {
|
|
141
|
+
plugins.push(result.value);
|
|
142
|
+
} else {
|
|
143
|
+
log.warn('failed to preload remote plugin', { entry: entries[index], error: result.reason });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return plugins;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Creates a plugin loader that resolves built-in plugins by ID or loads remote plugins from URLs.
|
|
151
|
+
*/
|
|
152
|
+
export const make = (builtinPlugins: Plugin.Plugin[], options: Options = {}) => {
|
|
153
|
+
const storage = options.storage ?? defaultStorage();
|
|
154
|
+
const key = options.key ?? DEFAULT_KEY;
|
|
155
|
+
|
|
156
|
+
return (locator: string): Effect.Effect<Plugin.Plugin, Error> =>
|
|
157
|
+
Effect.gen(function* () {
|
|
158
|
+
const builtin = builtinPlugins.find((plugin) => plugin.meta.id === locator);
|
|
159
|
+
if (builtin) {
|
|
160
|
+
return builtin;
|
|
161
|
+
}
|
|
162
|
+
if (!isUrl(locator)) {
|
|
163
|
+
return yield* Effect.fail(new Error(`Plugin not found and locator is not a URL: ${locator}`));
|
|
164
|
+
}
|
|
165
|
+
const plugin = yield* Effect.tryPromise({
|
|
166
|
+
try: () => loadRemotePlugin(locator),
|
|
167
|
+
catch: (error) => new Error(`Failed to load remote plugin from ${locator}: ${error}`),
|
|
168
|
+
});
|
|
169
|
+
const duplicate = builtinPlugins.find((existing) => existing.meta.id === plugin.meta.id);
|
|
170
|
+
if (duplicate) {
|
|
171
|
+
return yield* Effect.fail(
|
|
172
|
+
new Error(`Remote plugin ${plugin.meta.id} conflicts with built-in plugin of the same id.`),
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
persistRemotePlugin(storage, key, { id: plugin.meta.id, url: locator });
|
|
176
|
+
return plugin;
|
|
177
|
+
});
|
|
178
|
+
};
|
package/src/helpers.test.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
export * from './App';
|
|
6
5
|
export * from './common';
|
|
6
|
+
export * from './context';
|
|
7
7
|
export * from './core';
|
|
8
|
-
export * from './plugin-
|
|
9
|
-
export * from './plugin-
|
|
10
|
-
export * from './react';
|
|
8
|
+
export * from './plugin-operation';
|
|
9
|
+
export * from './plugin-runtime';
|