@dxos/app-framework 0.8.4-main.d05673bc65 → 0.8.4-main.dfabb4ec29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{capability-LF3OXSCV.mjs → capability-5RRH3WIB.mjs} +11 -10
- package/dist/lib/browser/capability-5RRH3WIB.mjs.map +7 -0
- package/dist/lib/browser/{capability-6YMUBS54.mjs → capability-LUKGKUQH.mjs} +10 -9
- package/dist/lib/browser/{chunk-TIEBZMTF.mjs → chunk-23D4SJUE.mjs} +9 -11
- package/dist/lib/browser/{chunk-TIEBZMTF.mjs.map → chunk-23D4SJUE.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-YNFPIQGB.mjs → chunk-3JWJXGLK.mjs} +5 -2
- package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-M5IC326L.mjs → chunk-45CHLTBV.mjs} +5 -5
- package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-272IPLHQ.mjs → chunk-66IXTIVK.mjs} +3 -2
- package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-7VZJR2OA.mjs +581 -0
- package/dist/lib/browser/chunk-7VZJR2OA.mjs.map +7 -0
- package/dist/lib/browser/chunk-CZ4BIAHH.mjs +422 -0
- package/dist/lib/browser/chunk-CZ4BIAHH.mjs.map +7 -0
- package/dist/lib/browser/{chunk-TGX63LTL.mjs → chunk-FJ4765WW.mjs} +1 -1
- package/dist/lib/browser/{chunk-TGX63LTL.mjs.map → chunk-FJ4765WW.mjs.map} +2 -2
- package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
- package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
- package/dist/lib/browser/chunk-JD3Z5NEF.mjs +469 -0
- package/dist/lib/browser/chunk-JD3Z5NEF.mjs.map +7 -0
- package/dist/lib/browser/chunk-NBXPP7JR.mjs +1174 -0
- package/dist/lib/browser/chunk-NBXPP7JR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-WEBSGU5L.mjs → chunk-WBHCSOBW.mjs} +5 -5
- package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-7M4467QR.mjs → chunk-Z55LVAGN.mjs} +84 -16
- package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JGWCBVKJ.mjs → chunk-ZGJAZSNE.mjs} +9 -37
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +14 -27
- package/dist/lib/browser/cli/index.mjs.map +3 -3
- package/dist/lib/browser/common/activation-events.mjs +9 -8
- package/dist/lib/browser/common/capabilities.mjs +9 -8
- package/dist/lib/browser/core/activation-event.mjs +1 -1
- package/dist/lib/browser/core/capability.mjs +3 -1
- package/dist/lib/browser/core/plugin-manager.mjs +8 -4
- package/dist/lib/browser/core/plugin.mjs +14 -4
- package/dist/lib/browser/core/url-loader.mjs +24 -0
- package/dist/lib/browser/index.mjs +43 -22
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{invoker-capability-4AUGUMM5.mjs → invoker-capability-K4GHUFXF.mjs} +22 -14
- package/dist/lib/browser/invoker-capability-K4GHUFXF.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +180 -45
- 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 +18 -15
- package/dist/lib/node-esm/{capability-R5O2OYX4.mjs → capability-FCGZVIEG.mjs} +10 -9
- package/dist/lib/{browser/capability-6YMUBS54.mjs.map → node-esm/capability-FCGZVIEG.mjs.map} +1 -1
- package/dist/lib/node-esm/{capability-SA6LPYGL.mjs → capability-JOIQ2MQE.mjs} +11 -10
- package/dist/lib/node-esm/capability-JOIQ2MQE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FKE4Z3D6.mjs → chunk-37Z53PXZ.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-FKE4Z3D6.mjs.map → chunk-37Z53PXZ.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-NHXBSAQR.mjs → chunk-6XW6LET6.mjs} +5 -5
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-3D66SZHP.mjs → chunk-D347W3KO.mjs} +9 -37
- package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DRZKO5UZ.mjs +470 -0
- package/dist/lib/node-esm/chunk-DRZKO5UZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JHFY3HTS.mjs → chunk-HTBJU5FX.mjs} +84 -16
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-M3HKPRPO.mjs +423 -0
- package/dist/lib/node-esm/chunk-M3HKPRPO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-MUVUQC3G.mjs +1175 -0
- package/dist/lib/node-esm/chunk-MUVUQC3G.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SCDGIGGU.mjs → chunk-SBS2YMPT.mjs} +9 -11
- package/dist/lib/node-esm/{chunk-SCDGIGGU.mjs.map → chunk-SBS2YMPT.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-SB5ODNPX.mjs → chunk-SDJ4B2LU.mjs} +5 -2
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-V24UWT36.mjs +582 -0
- package/dist/lib/node-esm/chunk-V24UWT36.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SQICGJBW.mjs → chunk-WFSRZKBP.mjs} +5 -5
- package/dist/lib/node-esm/chunk-WFSRZKBP.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-6REV5DE7.mjs → chunk-XOCUANHO.mjs} +3 -2
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +14 -27
- package/dist/lib/node-esm/cli/index.mjs.map +3 -3
- package/dist/lib/node-esm/common/activation-events.mjs +9 -8
- package/dist/lib/node-esm/common/capabilities.mjs +9 -8
- package/dist/lib/node-esm/core/activation-event.mjs +1 -1
- package/dist/lib/node-esm/core/capability.mjs +3 -1
- package/dist/lib/node-esm/core/plugin-manager.mjs +8 -4
- package/dist/lib/node-esm/core/plugin.mjs +14 -4
- package/dist/lib/node-esm/core/url-loader.mjs +25 -0
- package/dist/lib/node-esm/index.mjs +43 -22
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{invoker-capability-3YDIVDWV.mjs → invoker-capability-XEPW5LMJ.mjs} +22 -14
- package/dist/lib/node-esm/invoker-capability-XEPW5LMJ.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +180 -45
- 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 +18 -15
- package/dist/plugin/node-esm/index.mjs +893 -0
- package/dist/plugin/node-esm/index.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/types/src/common/activation-events.d.ts +1 -1
- package/dist/types/src/common/activation-events.d.ts.map +1 -1
- 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 +4 -8
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +8 -22
- package/dist/types/src/common/operations.d.ts.map +1 -1
- package/dist/types/src/core/activation-event.d.ts +4 -4
- package/dist/types/src/core/activation-event.d.ts.map +1 -1
- package/dist/types/src/core/capability-manager.d.ts +5 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -1
- package/dist/types/src/core/capability.d.ts +8 -2
- package/dist/types/src/core/capability.d.ts.map +1 -1
- 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 +6 -0
- 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 +177 -4
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
- 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 +112 -6
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/registry.d.ts +101 -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/plugin-operation/OperationPlugin.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/errors.d.ts +30 -3
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts +1 -1
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/types.d.ts +1 -1
- package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +1 -1
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts +1 -1
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +1 -1
- package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/meta.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/testing.d.ts +27 -77
- package/dist/types/src/plugin-operation/testing.d.ts.map +1 -1
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -1
- package/dist/types/src/plugin-runtime/capability.d.ts +1 -1
- package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -1
- package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -1
- 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 +1 -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.map +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.d.ts +3 -2
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.stories.d.ts +2 -2
- package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +16 -4
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -1
- 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/index.d.ts +22 -6
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/types.d.ts +110 -9
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -1
- 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 +1 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/index.d.ts +0 -1
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useApp.d.ts +43 -4
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
- 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.map +1 -1
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -1
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts +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 +51 -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 +15 -0
- package/package.json +48 -53
- package/src/cli/cli.ts +1 -1
- package/src/common/activation-events.ts +1 -1
- package/src/common/annotations.ts +3 -0
- package/src/common/capabilities.ts +5 -10
- package/src/common/operations.ts +5 -8
- package/src/core/activation-event.ts +4 -1
- package/src/core/capability-manager.test.ts +1 -1
- package/src/core/capability-manager.ts +22 -1
- package/src/core/capability.ts +13 -2
- package/src/core/edge-registry-plugin-provider.ts +92 -0
- package/src/core/index.ts +6 -0
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +833 -7
- package/src/core/plugin-manager.ts +808 -188
- package/src/core/plugin-manifest.test.ts +75 -0
- package/src/core/plugin-manifest.ts +134 -0
- package/src/core/plugin.ts +142 -10
- package/src/core/registry.ts +157 -0
- package/src/core/url-loader.test.ts +221 -0
- package/src/core/url-loader.ts +388 -0
- package/src/plugin-operation/OperationPlugin.ts +2 -3
- package/src/plugin-operation/history/capability.ts +1 -2
- package/src/plugin-operation/history/errors.ts +2 -6
- package/src/plugin-operation/history/history-tracker.test.ts +37 -43
- package/src/plugin-operation/history/history-tracker.ts +1 -2
- package/src/plugin-operation/history/types.ts +1 -1
- package/src/plugin-operation/history/undo-mapping.ts +1 -1
- package/src/plugin-operation/history/undo-registry.test.ts +3 -4
- package/src/plugin-operation/history/undo-registry.ts +1 -1
- package/src/plugin-operation/invoker-capability.ts +19 -4
- package/src/plugin-operation/meta.ts +1 -0
- package/src/plugin-operation/testing.ts +26 -45
- package/src/plugin-runtime/RuntimePlugin.ts +2 -3
- package/src/plugin-runtime/meta.ts +1 -0
- package/src/testing/harness.ts +229 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/react.test.tsx +48 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +1 -1
- package/src/testing/withPluginManager.stories.tsx +1 -2
- package/src/testing/withPluginManager.tsx +38 -16
- package/src/ui/components/App/App.stories.tsx +4 -8
- package/src/ui/components/App/App.tsx +29 -5
- package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
- package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
- package/src/ui/components/Placeholder/index.ts +5 -0
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +4 -2
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +16 -15
- package/src/ui/components/Surface/SurfaceComponent.tsx +111 -55
- package/src/ui/components/Surface/SurfaceInfo.tsx +0 -1
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/index.ts +35 -1
- package/src/ui/components/Surface/types.test.ts +126 -0
- package/src/ui/components/Surface/types.ts +164 -12
- package/src/ui/components/index.ts +1 -0
- package/src/ui/hooks/index.ts +0 -1
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +223 -12
- package/src/ui/hooks/useLoading.tsx +14 -6
- package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +270 -0
- package/src/vite-plugin/boot-loader/boot-loader.css +320 -0
- package/src/vite-plugin/boot-loader/boot-loader.js +325 -0
- package/src/vite-plugin/boot-loader/index.ts +5 -0
- package/src/vite-plugin/boot-loader/loader.ts +123 -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 +46 -0
- package/src/vite-plugin/manifest.ts +57 -0
- package/src/vite-plugin/packages.ts +187 -0
- package/tsconfig.json +19 -1
- package/tsconfig.node.json +1 -1
- package/vitest.config.ts +1 -1
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/dist/lib/browser/capability-LF3OXSCV.mjs.map +0 -7
- package/dist/lib/browser/chunk-272IPLHQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-2UI6ACB5.mjs +0 -824
- package/dist/lib/browser/chunk-2UI6ACB5.mjs.map +0 -7
- package/dist/lib/browser/chunk-7M4467QR.mjs.map +0 -7
- package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-M5IC326L.mjs.map +0 -7
- package/dist/lib/browser/chunk-NQPYE365.mjs +0 -703
- package/dist/lib/browser/chunk-NQPYE365.mjs.map +0 -7
- package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +0 -7
- package/dist/lib/browser/chunk-YAFEA4GV.mjs +0 -1
- package/dist/lib/browser/chunk-YNFPIQGB.mjs.map +0 -7
- package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs.map +0 -7
- package/dist/lib/node-esm/capability-SA6LPYGL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6REV5DE7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs +0 -704
- package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JHFY3HTS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs +0 -825
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SQICGJBW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +0 -2
- package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs.map +0 -7
- package/dist/types/src/ui/hooks/useOperationResolver.d.ts +0 -19
- package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +0 -1
- package/src/ui/hooks/useOperationResolver.ts +0 -40
- /package/dist/lib/{node-esm/capability-R5O2OYX4.mjs.map → browser/capability-LUKGKUQH.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-YAFEA4GV.mjs.map → core/url-loader.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-Z4TJPSMP.mjs.map → core/url-loader.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ui/components/App/App.tsx", "../../../src/ui/hooks/useApp.tsx", "../../../src/ui/hooks/useCapabilities.ts", "../../../src/ui/hooks/useLoading.tsx", "../../../src/ui/hooks/useSettingsState.ts", "../../../src/ui/components/Placeholder/Placeholder.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useEffect } from 'react';\n\nimport { Capabilities } from '../../../common';\nimport { topologicalSort } from '../../../helpers';\nimport { LoadingState, type StartupProgress, type UseAppOptions, useCapabilities, useLoading } from '../../hooks';\n\nexport type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {\n ready: boolean;\n error: unknown;\n progress?: StartupProgress;\n};\n\nconst FIRST_INTERACTIVE_MARK = 'app-framework:first-interactive';\n\nexport const App = ({ placeholder: Placeholder, ready, error, debounce, progress }: AppProps) => {\n const reactContexts = useCapabilities(Capabilities.ReactContext);\n const reactRoots = useCapabilities(Capabilities.ReactRoot);\n const stage = useLoading(ready, debounce);\n const placeholderDismissed = stage >= LoadingState.Done;\n\n // Emit a once-per-app `app-framework:first-interactive` mark the first time\n // the placeholder is dismissed and the real app shell renders. Closes the\n // gap between `Startup` activated and the first interactive paint.\n //\n // Also dismisses the native-DOM boot loader from\n // `@dxos/app-framework/vite-plugin` here — the framework owns the\n // handoff-complete signal, so dismissing in `App` covers both hosts that\n // wire in a `Placeholder` (which may have its own dismiss path) and hosts\n // that don't (the loader would otherwise sit forever as a `z-index: 10`\n // overlay covering the rendered shell).\n useEffect(() => {\n if (!placeholderDismissed) {\n return;\n }\n if (performance.getEntriesByName(FIRST_INTERACTIVE_MARK).length === 0) {\n performance.mark(FIRST_INTERACTIVE_MARK);\n }\n (window as { __bootLoader?: { dismiss?: () => void } }).__bootLoader?.dismiss?.();\n }, [placeholderDismissed]);\n\n if (error) {\n // This triggers the error boundary to provide UI feedback for the startup error.\n throw error;\n }\n\n // TODO(wittjosiah): Consider using Suspense instead.\n if (!placeholderDismissed) {\n if (!Placeholder) {\n return null;\n }\n\n return <Placeholder stage={stage} progress={progress} />;\n }\n\n const ComposedContext = composeContexts(reactContexts);\n return (\n <ComposedContext>\n {reactRoots.map(({ id, root: Component }) => (\n <Component key={id} />\n ))}\n </ComposedContext>\n );\n};\n\nconst composeContexts = (contexts: Capabilities.ReactContext[]) => {\n if (contexts.length === 0) {\n return ({ children }: PropsWithChildren) => <>{children}</>;\n }\n\n return topologicalSort(contexts)\n .map(({ context }) => context)\n .reduce((Acc, Next) => ({ children }) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as PubSub from 'effect/PubSub';\nimport * as Queue from 'effect/Queue';\nimport React, { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ErrorBoundary, ErrorFallback, type FallbackProps } from '@dxos/react-error-boundary';\nimport { useAsyncEffect, useDefaultValue } from '@dxos/react-hooks';\nimport { ContextProtocolProvider } from '@dxos/web-context-react';\n\nimport { ActivationEvents, Capabilities } from '../../common';\nimport { PluginManagerContext } from '../../context';\nimport { type ActivationEvent, type Plugin, PluginManager } from '../../core';\nimport { App, PluginManagerProvider } from '../components';\n\nconst ENABLED_KEY = 'org.dxos.app-framework.enabled';\n\nexport type StartupProgress = {\n /** Number of modules that have been activated. */\n activated: number;\n /** Total number of modules registered. */\n total: number;\n /** Fractional progress (0-1). */\n progress: number;\n /**\n * Raw activation event key (e.g. `org.dxos.app-framework.event.startup`).\n * Set on event-level transitions, *and* on module-level transitions where\n * it carries the parent activation event that first triggered the\n * module's load (plumbed through `_loadCapabilitiesForModules` →\n * `_loadModule`). Consumers can use this either as the primary id (when\n * {@link module} is absent) or as an extra \"context\" field alongside\n * {@link module}.\n */\n event?: string;\n /**\n * Raw module id (e.g. `org.dxos.plugin.observability.module.ReactSurface`)\n * when the in-flight activation is module-level. When present,\n * {@link event} may also be set, identifying the parent activation that\n * triggered this module's load.\n */\n module?: string;\n /**\n * Pre-humanized label for the currently surfaced transition (module\n * label if {@link module} is set, otherwise the event label), supplied\n * for consumers that want a sensible default. Hosts that prefer to\n * render their own label can read the raw {@link event}/{@link module}\n * fields and ignore this — the framework leaves the policy choice\n * (which transitions to surface, how to format them, whether to drop\n * sub-modules entirely) to the host's `Placeholder`.\n */\n humanizedName?: string;\n};\n\nexport type PlaceholderProps = {\n stage?: number;\n progress?: StartupProgress;\n};\n\nexport type UseAppOptions = {\n pluginManager?: PluginManager.PluginManager;\n pluginLoader?: PluginManager.ManagerOptions['pluginLoader'];\n onPluginRemove?: PluginManager.ManagerOptions['onRemove'];\n pluginRegistryProvider?: PluginManager.ManagerOptions['pluginRegistryProvider'];\n plugins?: Plugin.Plugin[];\n core?: string[];\n defaults?: string[];\n /**\n * Additional activation events to fire before startup.\n * These are fired alongside SetupReactSurface before the Startup event.\n */\n setupEvents?: ActivationEvent.ActivationEvent[];\n cacheEnabled?: boolean;\n safeMode?: boolean;\n debounce?: number;\n timeout?: number;\n fallback?: FC<FallbackProps>;\n placeholder?: FC<PlaceholderProps>;\n};\n\n/**\n * Expected usage is for this to be the entrypoint of the application.\n * Initializes plugins and renders the root components.\n *\n * @example\n * const plugins = [LayoutPlugin(), MyPlugin()];\n * const core = [LayoutPluginId];\n * const default = [MyPluginId];\n * const fallback = <div>Initializing Plugins...</div>;\n * const App = useApp({ plugins, core, default, fallback });\n * createRoot(document.getElementById('root')!).render(\n * <StrictMode>\n * <App />\n * </StrictMode>,\n * );\n *\n * @param params.pluginLoader A function which loads new plugins.\n * @param params.plugins All plugins available to the application.\n * @param params.core Core plugins which will always be enabled.\n * @param params.defaults Default plugins are enabled by default but can be disabled by the user.\n * @param params.cacheEnabled Whether to cache enabled plugins in localStorage.\n * @param params.safeMode Whether to enable safe mode, which disables optional plugins.\n * @param params.fallback Fallback component to render if an error occurs during startup.\n * @param params.placeholder Placeholder component to render during startup.\n */\nexport const useApp = ({\n pluginManager,\n pluginLoader: pluginLoaderProp,\n onPluginRemove,\n pluginRegistryProvider,\n plugins: pluginsProp,\n core: coreProp,\n defaults: defaultsProp,\n setupEvents: setupEventsProp,\n placeholder,\n fallback = ErrorFallback,\n cacheEnabled = false,\n safeMode = false,\n debounce = 0,\n timeout = 30_000,\n}: UseAppOptions) => {\n const plugins = useDefaultValue(pluginsProp, () => []);\n const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));\n const defaults = useDefaultValue(defaultsProp, () => []);\n const setupEvents = useDefaultValue(setupEventsProp, () => []);\n\n const pluginLoader = useMemo(\n () =>\n pluginLoaderProp ??\n ((id: string) =>\n Effect.sync(() => {\n const plugin = plugins.find((plugin) => plugin.meta.id === id);\n invariant(plugin, `Plugin not found: ${id}`);\n return { plugin };\n })),\n [pluginLoaderProp, plugins],\n );\n\n const readyRef = useRef(false);\n const [ready, setReady] = useState(false);\n const errorRef = useRef<unknown>(null);\n const [error, setError] = useState<unknown>(null);\n const [startupProgress, setStartupProgress] = useState<StartupProgress>({\n activated: 0,\n total: 0,\n progress: 0,\n });\n // TODO(wittjosiah): Migrate to Atom.kvs for isomorphic storage.\n const cached: string[] = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? '[]'), []);\n const enabled = useMemo(\n () => (safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults),\n [safeMode, cacheEnabled, cached, defaults],\n );\n const isExternalManager = !!pluginManager;\n const manager = useMemo(() => {\n const mgr =\n pluginManager ??\n PluginManager.make({\n pluginLoader,\n plugins,\n core,\n enabled,\n onRemove: onPluginRemove,\n pluginRegistryProvider,\n });\n log('useApp: useMemo created/reused manager', { provided: !!pluginManager });\n return mgr;\n }, [pluginManager, pluginLoader, plugins, core, enabled, onPluginRemove, pluginRegistryProvider]);\n\n useEffect(() => {\n if (!cacheEnabled) {\n return;\n }\n return manager.registry.subscribe(manager.enabled, (value) => {\n localStorage.setItem(ENABLED_KEY, JSON.stringify(value));\n });\n }, [cacheEnabled, manager]);\n\n useEffect(() => {\n setupDevtools(manager);\n }, [manager]);\n\n useAsyncEffect(async () => {\n log('useApp: effect mount');\n\n manager.capabilities.contribute({\n interface: Capabilities.PluginManager,\n implementation: manager,\n module: 'org.dxos.app-framework.plugin-manager',\n });\n\n manager.capabilities.contribute({\n interface: Capabilities.AtomRegistry,\n implementation: manager.registry,\n module: 'org.dxos.app-framework.atom-registry',\n });\n\n const fiber = Effect.gen(function* () {\n const queue = yield* PubSub.subscribe(manager.activation);\n const listener = yield* Effect.forkDaemon(\n Queue.take(queue).pipe(\n Effect.tap(({ event, state, module, error: error$ }) =>\n Effect.sync(() => {\n // Event-level Startup activated (no `module` field) fires once,\n // after every module triggered by Startup has finished. Module\n // activations now also carry their parent event id (so the trace\n // can attribute a module to its triggering event), which means\n // each module activated under Startup publishes\n // `{ event: 'startup', state: 'activated', module: <id> }`. Without\n // the `!module` guard the listener would mark the app ready on\n // the *first* such module rather than waiting for the event-level\n // completion — leaving downstream capabilities (operation-invoker,\n // app-graph, …) un-registered when the placeholder dismisses.\n if (event === ActivationEvents.Startup.id && state === 'activated' && !module) {\n clearTimeout(timeoutId);\n setReady(true);\n readyRef.current = true;\n // Trigger startup profiler dump if available.\n (globalThis as any).composer?.profiler?.dump();\n // Notify any host observability layer that startup completed.\n // A `CustomEvent` keeps this generic — app-framework doesn't\n // import a provider, and consumers can capture the startup\n // summary without us picking one.\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('app-framework:startup-activated'));\n }\n return;\n }\n // `activating` is the start-of-load signal. Surface the raw\n // `module` (or `event`) plus a pre-humanized label so the\n // host placeholder can decide what to render — show\n // everything, suppress noisy sub-modules, group by plugin,\n // or apply its own formatting. We intentionally do NOT touch\n // these fields on `activated`: pairing the two would cause\n // back-to-back identical updates to the host's effect, which\n // the boot loader treats as a re-trigger because\n // `progress.progress` moved. Leaving the label alone on\n // completion keeps it accurate (\"now activating X\") until\n // the next module starts.\n if (module && state === 'activating' && !readyRef.current) {\n setStartupProgress((current) => ({\n ...current,\n // `event` here is the activation event that first\n // triggered this module load (plumbed through\n // `_loadCapabilitiesForModules` → `_loadModule`).\n // Falsy/empty falls back to undefined so consumers can\n // tell \"no parent context\" from \"parent context: <X>\".\n event: event || undefined,\n module,\n humanizedName: humanizeModuleId(module),\n }));\n }\n // Update the activation count when a module commits. The\n // ring's fraction comes from this; `event`/`module`/\n // `humanizedName` were set by the matching `activating`\n // message above and are left alone so the count can advance\n // without re-firing the host's status callback.\n if (module && state === 'activated' && !readyRef.current) {\n const active = manager.getActive();\n const total = manager.getModules().length;\n setStartupProgress((current) => ({\n ...current,\n activated: active.length,\n total,\n progress: total > 0 ? active.length / total : 0,\n }));\n }\n // Event-level `activating` (no `module`) — fired at the start\n // of `_activateModulesForEvent` and recursively for each\n // before/after event. Surfaces a label during the gap before\n // the first module-level message lands; subsequent module\n // updates immediately overwrite this with a more specific\n // label.\n if (event && !module && state === 'activating' && !readyRef.current) {\n setStartupProgress((current) => ({\n ...current,\n event,\n module: undefined,\n humanizedName: humanizeEventKey(event),\n }));\n }\n if (error$ && !readyRef.current) {\n setError(error$);\n errorRef.current = error$;\n }\n }),\n ),\n Effect.forever,\n ),\n );\n\n yield* Effect.all([\n ...setupEvents.map((event) => manager.activate(event)),\n manager.activate(ActivationEvents.SetupReactSurface),\n manager.activate(ActivationEvents.Startup),\n ]);\n\n return yield* Fiber.join(listener);\n }).pipe(Effect.scoped, Effect.runFork);\n\n // Set up a timeout for startup.\n const timeoutId = setTimeout(() => {\n if (!readyRef.current && !errorRef.current) {\n log.warn('startup timeout diagnostic', {\n eventsFired: manager.getEventsFired(),\n activeModules: manager.getActive(),\n pendingReset: manager.getPendingReset(),\n });\n void runAndForwardErrors(Fiber.interrupt(fiber));\n setError(new Error(`Startup timed out after ${timeout}ms`));\n }\n }, timeout);\n\n return () => {\n log('useApp: effect cleanup');\n clearTimeout(timeoutId);\n void runAndForwardErrors(Fiber.interrupt(fiber));\n if (!isExternalManager) {\n void runAndForwardErrors(manager.shutdown());\n }\n };\n }, [manager]);\n\n const progressRef = useRef(startupProgress);\n progressRef.current = startupProgress;\n\n return useCallback(\n () => (\n <ErrorBoundary name='app' FallbackComponent={fallback}>\n <PluginManagerProvider value={manager}>\n <ContextProtocolProvider value={manager} context={PluginManagerContext}>\n <RegistryContext.Provider value={manager.registry}>\n <App\n placeholder={placeholder}\n ready={ready}\n error={error}\n debounce={debounce}\n progress={progressRef.current}\n />\n </RegistryContext.Provider>\n </ContextProtocolProvider>\n </PluginManagerProvider>\n </ErrorBoundary>\n ),\n [fallback, manager, placeholder, ready, error],\n );\n};\n\nconst setupDevtools = (manager: PluginManager.PluginManager) => {\n (globalThis as any).composer ??= {};\n (globalThis as any).composer.manager = manager;\n};\n\n/**\n * Extracts a human-readable label from a module ID.\n *\n * Module IDs follow `org.dxos.plugin.<plugin-slug>.module.<module-name>`,\n * where `<plugin-slug>` is kebab-case and `<module-name>` is either an\n * explicit string (often kebab-case, e.g. `'observability'`, `'namespace'`)\n * or a capability tag in PascalCase from `Capability.getModuleTag(...)`\n * (e.g. `'ReactSurface'`, `'AppGraphBuilder'`). The output is\n * `\"Title Case Plugin: kebab-module\"` so the visible status names both the\n * plugin and the aspect being activated, helping disambiguate the multiple\n * modules a plugin contributes.\n *\n * Examples:\n * - \"org.dxos.plugin.markdown.module.ReactSurface\" → \"Markdown: react-surface\"\n * - \"org.dxos.plugin.observability.module.AppGraphBuilder\" → \"Observability: app-graph-builder\"\n * - \"org.dxos.plugin.observability.module.observability\" → \"Observability\"\n * (the module name matches the plugin slug — collapsed to avoid\n * \"Observability: observability\" noise.)\n */\nconst humanizeModuleId = (moduleId: string): string => {\n const match = moduleId.match(/\\.plugin\\.([^.]+)\\.module\\.(.+)$/);\n if (!match) {\n // Fallback: use the last segment.\n const parts = moduleId.split('.');\n return parts[parts.length - 1];\n }\n const [, pluginSlug, moduleName] = match;\n const pluginLabel = pluginSlug\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n // Normalise the module name to kebab-case so PascalCase capability tags\n // (\"ReactSurface\") read consistently with explicit kebab IDs\n // (\"operation-handler\"). The two-step substitution handles consecutive\n // uppercase runs (`URLLoader` → `url-loader`) without splitting them\n // mid-acronym.\n const moduleLabel = moduleName\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n // Capability modules whose name matches the plugin slug (e.g. the\n // observability plugin's `observability` capability module) would render\n // as \"Observability: observability\" — drop the redundant suffix.\n if (moduleLabel === pluginSlug) {\n return pluginLabel;\n }\n return `${pluginLabel}: ${moduleLabel}`;\n};\n\n/**\n * Extracts a human-readable label from an activation event key.\n * E.g., \"org.dxos.app-framework.event.setup-react-surface\" → \"Setup React Surface\".\n */\nconst humanizeEventKey = (eventKey: string): string => {\n // Strip a leading specifier (composite key form: \"<id>:<specifier>\").\n const id = eventKey.split(':')[0];\n // Match the trailing segment after `.event.`.\n const match = id.match(/\\.event\\.(.+)$/);\n const slug = match ? match[1] : (id.split('.').pop() ?? id);\n return slug\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback } from 'react';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { Capabilities } from '../../common';\nimport { type Capability } from '../../core';\nimport { usePluginManager } from '../components';\n\n/**\n * Hook to request capabilities from the plugin context.\n * @returns An array of capabilities.\n */\nexport const useCapabilities = <T>(interfaceDef: Capability.InterfaceDef<T>) => {\n const manager = usePluginManager();\n return useAtomValue(manager.capabilities.atom(interfaceDef));\n};\n\n/**\n * Hook to request a capability from the plugin context.\n * @returns The capability.\n * @throws If no capability is found.\n */\nexport const useCapability = <T>(interfaceDef: Capability.InterfaceDef<T>) => {\n const capabilities = useCapabilities(interfaceDef);\n invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`);\n return capabilities[0];\n};\n\n/**\n * Hook to get the current value of an atom capability.\n * Automatically subscribes to changes.\n * @example const settings = useAtomCapability(ThreadCapabilities.Settings);\n */\nexport const useAtomCapability = <T>(atomCapability: Capability.InterfaceDef<Atom.Atom<T>>): T => {\n const atom = useCapability(atomCapability);\n return useAtomValue(atom);\n};\n\n/**\n * Hook to get value and updater for an atom capability.\n * Returns [currentValue, updateFn] similar to useState.\n * @example const [settings, updateSettings] = useAtomCapabilityState(ThreadCapabilities.Settings);\n */\nexport const useAtomCapabilityState = <T>(\n atomCapability: Capability.InterfaceDef<Atom.Writable<T>>,\n): [T, (fn: (current: T) => T) => void] => {\n const registry = useCapability(Capabilities.AtomRegistry);\n const atom = useCapability(atomCapability);\n const value = useAtomValue(atom);\n const update = useCallback(\n (fn: (current: T) => T) => {\n registry.set(atom, fn(registry.get(atom)));\n },\n [registry, atom],\n );\n return [value, update];\n};\n\n/**\n * Hook to get the operation invoker capability.\n */\nexport const useOperationInvoker = (): Capabilities.OperationInvoker => useCapability(Capabilities.OperationInvoker);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useRef, useState } from 'react';\n\nexport enum LoadingState {\n Loading = 0,\n FadeIn = 1,\n FadeOut = 2,\n Done = 3,\n}\n\n/**\n * To avoid \"flashing\" the placeholder, we wait a period of time before starting the loading animation.\n * If loading completes during this time the placehoder is not shown, otherwise is it displayed for a minimum period of time.\n *\n * States:\n * 0: Loading - Wait for a period of time before starting the loading animation.\n * 1: Fade-in - Display a loading animation.\n * 2: Fade-out - Fade out the loading animation.\n * 3: Done - Remove the placeholder.\n */\nexport const useLoading = (ready: boolean, debounce = 0) => {\n const [stage, setStage] = useState<LoadingState>(LoadingState.Loading);\n // Mirror `ready` into a ref so the interval's `setStage` callback can read\n // the latest value without depending on the effect re-running. The pure\n // closure-capture pattern (with `ready` in deps) sticks the FSM at\n // `FadeIn` whenever HMR doesn't propagate the dep change end-to-end —\n // a ref sidesteps that entirely and fires the read on every tick.\n const readyRef = useRef(ready);\n readyRef.current = ready;\n\n useEffect(() => {\n if (!debounce) {\n return;\n }\n\n const i = setInterval(() => {\n setStage((stage) => {\n const isReady = readyRef.current;\n switch (stage) {\n case LoadingState.Loading: {\n if (!isReady) {\n return LoadingState.FadeIn;\n }\n clearInterval(i);\n return LoadingState.Done;\n }\n\n case LoadingState.FadeIn: {\n if (isReady) {\n return LoadingState.FadeOut;\n }\n break;\n }\n\n case LoadingState.FadeOut: {\n clearInterval(i);\n return LoadingState.Done;\n }\n }\n\n return stage;\n });\n }, debounce);\n\n return () => clearInterval(i);\n }, [debounce]);\n\n if (!debounce) {\n return ready ? LoadingState.Done : LoadingState.Loading;\n }\n\n return stage;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport { useCallback, useContext } from 'react';\n\n/**\n * Hook to read and update a settings atom.\n * Returns the current value and an update function.\n */\nexport const useSettingsState = <T>(\n atom: Atom.Writable<T>,\n): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {\n const registry = useContext(RegistryContext);\n const settings = useAtomValue(atom);\n\n const updateSettings = useCallback(\n (fn: (current: T) => T) => {\n registry.set(atom, fn(registry.get(atom)));\n },\n [registry, atom],\n );\n\n return { settings, updateSettings };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ReactNode, useEffect, useLayoutEffect, useRef } from 'react';\n\nimport { ThemeProvider } from '@dxos/react-ui';\nimport { defaultTx, mx } from '@dxos/ui-theme';\n\nimport { type PlaceholderProps as PlaceholderSlotProps } from '../../hooks';\n\ndeclare global {\n interface Window {\n /**\n * Driver injected by `@dxos/app-framework/vite-plugin`'s `bootLoaderPlugin`.\n * Declared here so the {@link Placeholder} can dismiss the native-DOM\n * loader once the React placeholder commits without each host having to\n * re-declare the type.\n */\n __bootLoader?: {\n status: (payload: {\n event?: string;\n module?: string;\n humanized: string;\n /**\n * Optional `(index/total)` tick. When present, the loader replaces the\n * current line in place (\"Loading plugins (12/80)\") instead of\n * appending a new entry — keeps the visible log compact during long\n * counted phases like plugin chunk-loading or module activation.\n */\n range?: { index: number; total: number };\n }) => void;\n progress: (fraction?: number) => void;\n dismiss: () => void;\n };\n }\n}\n\nexport type PlaceholderComponentProps = PlaceholderSlotProps & {\n /**\n * Brand mark rendered while the React tree settles. Pass either a static\n * `ReactNode` (the framework wraps it in a sizing/animation div) or a\n * render function that receives the precomputed `className` so the host\n * can apply it directly to its logo (e.g. an SVG that accepts `className`\n * — `composer-app` passes `(p) => <Composer {...p} />` from `@dxos/brand`).\n */\n logo?: ReactNode | ((props: { className: string }) => ReactNode);\n};\n\n/**\n * React placeholder. The native-DOM boot loader is the visible UI through\n * stages 0 (Loading) and 1 (FadeIn): we render `null` until `stage >= 2`\n * (FadeOut) and instead feed activation progress + status into the still-\n * alive boot loader. At stage 2 the loader dismisses and the React mark\n * appears for the cross-fade to the real shell:\n *\n * - composer-app fills `0 → 50%` from `getPlugins`'s per-chunk counter.\n * - this component fills `50 → 100%` from `useApp`'s\n * `startupProgress.progress` (`activated / total` modules) and pushes\n * the per-module status text to the loader's status line.\n * - at `stage >= 2` the boot loader is dismissed and the React mark\n * starts its `FadeOut → Done` shrink-and-fade.\n *\n * Stage progression (driven by `useApp`):\n * - `0` — Loading: native-DOM boot loader visible. Placeholder renders nothing.\n * - `1` — FadeIn: same — boot loader still owns the screen.\n * - `2` — FadeOut: boot loader dismissed, React mark visible at full opacity then shrinks.\n */\nexport const Placeholder = ({ stage = 1, progress, logo }: PlaceholderComponentProps) => {\n // Used in tests to exercise the error boundary & reset dialog.\n if (location.search === '?throw') {\n throw new Error('Test error');\n }\n\n // Phase B: feed activation progress + status to the still-visible boot\n // loader. Maps `[0, 1]` activation → `[0.5, 1]` of the ring; forwards\n // the raw activation source (`event` / `module`) plus the pre-humanised\n // label to `__bootLoader.status` so the loader gets to decide how to\n // render and trace each transition (current default policy: \"Activating\n // <humanizedName>\"; trace mode and timings track the structured fields).\n // No-op once the loader has been dismissed (its `status()` early-returns\n // when the boot DOM is gone). Skipping `stage >= 2` lets the dismissal\n // run uncontended.\n useEffect(() => {\n if (stage >= 2) {\n return;\n }\n const fraction = progress?.progress ?? 0;\n window.__bootLoader?.progress(0.5 + fraction * 0.5);\n if (progress?.humanizedName) {\n window.__bootLoader?.status({\n event: progress.event,\n module: progress.module,\n humanized: `Activating ${progress.humanizedName}`,\n });\n }\n }, [stage, progress?.progress, progress?.event, progress?.module, progress?.humanizedName]);\n\n // Hand off from the native-DOM boot loader once the placeholder starts\n // fading out — keeping the loader visible through `stage 0` and `stage 1`\n // means the ring stays the visible source of truth for activation\n // progress. `useLayoutEffect` runs before the next paint so the loader\n // DOM is removed in the same frame the cross-fade begins.\n useLayoutEffect(() => {\n if (stage >= 2) {\n window.__bootLoader?.dismiss();\n }\n }, [stage]);\n\n // Backstop for the fast-load path where `useLoading` can skip straight\n // from stage 0 to `Done` (ready=true at the first debounce tick) — the\n // stage-driven effect above never sees `stage >= 2`, so dismiss on\n // unmount instead. The `stageRef` guard is what keeps StrictMode's\n // synthetic mount → cleanup → remount cycle from prematurely dismissing\n // the loader: the synthetic cleanup runs while `stageRef.current === 0`,\n // skips the dismiss, and the real unmount (later, at stage `Done`)\n // performs it.\n const stageRef = useRef(stage);\n stageRef.current = stage;\n useEffect(() => {\n return () => {\n if (stageRef.current >= 3 /* Done */) {\n window.__bootLoader?.dismiss();\n }\n };\n }, []);\n\n // Defer rendering anything until the FadeOut stage. The boot loader owns\n // the screen during stages 0 and 1, so any DOM we render here would just\n // sit invisibly behind it — and rendering null avoids paint cost during\n // the longest part of the loading sequence (plugin activation).\n if (stage < 2) {\n return null;\n }\n\n const logoClassName = mx(\n 'h-[300px] w-[300px] scale-600 transition-all duration-500 ease-in-out filter grayscale opacity-0',\n stage >= 1 && 'scale-100 grayscale-0 opacity-70',\n stage >= 2 && 'scale-50 opacity-0',\n );\n\n return (\n <ThemeProvider tx={defaultTx}>\n <div className='relative dx-container h-dvh flex flex-col'>\n <div className='flex flex-col grow justify-center items-center'>\n {typeof logo === 'function' ? (\n logo({ className: logoClassName })\n ) : logo ? (\n <div className={logoClassName}>{logo}</div>\n ) : null}\n </div>\n </div>\n </ThemeProvider>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useEffect", "RegistryContext", "Effect", "Fiber", "PubSub", "Queue", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "runAndForwardErrors", "invariant", "log", "ErrorBoundary", "ErrorFallback", "useAsyncEffect", "useDefaultValue", "ContextProtocolProvider", "ENABLED_KEY", "core", "useDefaultValue", "id", "defaults", "defaultsProp", "setupEvents", "setupEventsProp", "pluginLoader", "pluginLoaderProp", "plugin", "find", "meta", "invariant", "plugins", "errorRef", "useRef", "error", "setError", "useState", "startupProgress", "setStartupProgress", "activated", "total", "progress", "safeMode", "cacheEnabled", "cached", "pluginManager", "enabled", "onRemove", "pluginRegistryProvider", "mgr", "onPluginRemove", "useEffect", "manager", "useAsyncEffect", "capabilities", "contribute", "interface", "Capabilities", "PluginManager", "implementation", "module", "registry", "fiber", "forkDaemon", "setReady", "readyRef", "current", "globalThis", "humanizedName", "humanizeModuleId", "length", "active", "event", "error$", "Effect", "forever", "activate", "ActivationEvents", "Startup", "join", "listener", "pipe", "timeoutId", "eventsFired", "getEventsFired", "activeModules", "pendingReset", "getPendingReset", "runAndForwardErrors", "Fiber", "Error", "timeout", "clearTimeout", "interrupt", "isExternalManager", "shutdown", "progressRef", "name", "FallbackComponent", "fallback", "value", "ContextProtocolProvider", "PluginManagerContext", "App", "placeholder", "ready", "debounce", "composer", "match", "parts", "pluginSlug", "moduleName", "pluginLabel", "split", "map", "word", "useAtomValue", "useCallback", "invariant", "__dxlog_file", "useAtomValue", "capabilities", "interfaceDef", "invariant", "atom", "useCapability", "atomCapability", "value", "update", "fn", "registry", "set", "useCallback", "useEffect", "useRef", "useState", "LoadingState", "useLoading", "ready", "debounce", "stage", "setStage", "readyRef", "current", "i", "setInterval", "isReady", "clearInterval", "RegistryContext", "useAtomValue", "useCallback", "useContext", "useSettingsState", "atom", "registry", "settings", "updateSettings", "fn", "set", "get", "FIRST_INTERACTIVE_MARK", "App", "placeholder", "Placeholder", "ready", "error", "debounce", "progress", "reactContexts", "useCapabilities", "Capabilities", "ReactContext", "reactRoots", "ReactRoot", "stage", "useLoading", "placeholderDismissed", "LoadingState", "Done", "useEffect", "performance", "getEntriesByName", "length", "mark", "window", "__bootLoader", "dismiss", "React", "ComposedContext", "composeContexts", "map", "id", "root", "Component", "key", "contexts", "children", "topologicalSort", "context", "reduce", "Acc", "Next", "React", "useEffect", "useLayoutEffect", "useRef", "ThemeProvider", "defaultTx", "mx", "Placeholder", "stage", "progress", "logo", "location", "search", "Error", "fraction", "window", "__bootLoader", "humanizedName", "status", "event", "module", "humanized", "dismiss", "stageRef", "current", "logoClassName", "tx", "div", "className"]
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
getModuleTag
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SDJ4B2LU.mjs";
|
|
5
5
|
import {
|
|
6
6
|
__export
|
|
7
7
|
} from "./chunk-HSLMI22Q.mjs";
|
|
@@ -9,27 +9,34 @@ import {
|
|
|
9
9
|
// src/core/plugin.ts
|
|
10
10
|
var plugin_exports = {};
|
|
11
11
|
__export(plugin_exports, {
|
|
12
|
+
LazyPluginError: () => LazyPluginError,
|
|
12
13
|
PluginModuleTypeId: () => PluginModuleTypeId,
|
|
13
14
|
PluginTypeId: () => PluginTypeId,
|
|
14
15
|
Service: () => Service,
|
|
15
16
|
activate: () => activate,
|
|
16
17
|
addModule: () => addModule,
|
|
17
18
|
define: () => define,
|
|
19
|
+
isLazy: () => isLazy,
|
|
18
20
|
isPlugin: () => isPlugin,
|
|
19
21
|
isPluginModule: () => isPluginModule,
|
|
22
|
+
lazy: () => lazy,
|
|
20
23
|
make: () => make,
|
|
21
|
-
reset: () => reset
|
|
24
|
+
reset: () => reset,
|
|
25
|
+
resolveLazy: () => resolveLazy,
|
|
26
|
+
shutdown: () => shutdown
|
|
22
27
|
});
|
|
23
28
|
import * as Context from "effect/Context";
|
|
24
29
|
import * as Effect from "effect/Effect";
|
|
25
30
|
import * as Option from "effect/Option";
|
|
26
31
|
import * as Pipeable from "effect/Pipeable";
|
|
32
|
+
import { BaseError } from "@dxos/errors";
|
|
27
33
|
import { invariant } from "@dxos/invariant";
|
|
28
34
|
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/plugin.ts";
|
|
29
35
|
var Service = class extends Context.Tag("@dxos/app-framework/PluginManager")() {
|
|
30
36
|
};
|
|
31
37
|
var activate = (event) => Effect.flatMap(Service, (manager) => manager.activate(event));
|
|
32
38
|
var reset = (event) => Effect.flatMap(Service, (manager) => manager.reset(event));
|
|
39
|
+
var shutdown = () => Effect.flatMap(Service, (manager) => manager.shutdown());
|
|
33
40
|
var computeModuleId = (pluginId, moduleName) => {
|
|
34
41
|
return `${pluginId}.module.${moduleName}`;
|
|
35
42
|
};
|
|
@@ -41,14 +48,14 @@ var PluginModuleImpl = class {
|
|
|
41
48
|
[PluginModuleTypeId] = PluginModuleTypeId;
|
|
42
49
|
id;
|
|
43
50
|
activatesOn;
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
firesBeforeActivation;
|
|
52
|
+
firesAfterActivation;
|
|
46
53
|
activate;
|
|
47
54
|
constructor(options) {
|
|
48
55
|
this.id = options.id;
|
|
49
56
|
this.activatesOn = options.activatesOn;
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
57
|
+
this.firesBeforeActivation = options.firesBeforeActivation;
|
|
58
|
+
this.firesAfterActivation = options.firesAfterActivation;
|
|
52
59
|
this.activate = options.activate;
|
|
53
60
|
}
|
|
54
61
|
};
|
|
@@ -101,15 +108,7 @@ var resolveModule = (meta, module, options) => {
|
|
|
101
108
|
const id = Option.fromNullable(moduleOptions.id).pipe(Option.match({
|
|
102
109
|
onNone: () => {
|
|
103
110
|
const exportName = getModuleTag(moduleOptions.activate);
|
|
104
|
-
invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`, {
|
|
105
|
-
F: __dxlog_file,
|
|
106
|
-
L: 301,
|
|
107
|
-
S: void 0,
|
|
108
|
-
A: [
|
|
109
|
-
"exportName",
|
|
110
|
-
"`Plugin module missing name. Plugin: ${meta.id}`"
|
|
111
|
-
]
|
|
112
|
-
});
|
|
111
|
+
invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 131, S: void 0, A: ["exportName", "`Plugin module missing name. Plugin: ${meta.id}`"] });
|
|
113
112
|
return computeModuleId(meta.id, exportName);
|
|
114
113
|
},
|
|
115
114
|
onSome: (id2) => computeModuleId(meta.id, id2)
|
|
@@ -129,11 +128,76 @@ function make(builder) {
|
|
|
129
128
|
meta
|
|
130
129
|
});
|
|
131
130
|
}
|
|
131
|
+
var LazyTag = /* @__PURE__ */ Symbol.for("@dxos/app-framework/Plugin/Lazy");
|
|
132
|
+
var lazy = (meta, loader) => {
|
|
133
|
+
const factory = (options) => {
|
|
134
|
+
const stub = new PluginImpl(meta, []);
|
|
135
|
+
Object.defineProperty(stub, LazyTag, {
|
|
136
|
+
value: {
|
|
137
|
+
loader,
|
|
138
|
+
options
|
|
139
|
+
},
|
|
140
|
+
enumerable: false
|
|
141
|
+
});
|
|
142
|
+
return stub;
|
|
143
|
+
};
|
|
144
|
+
return Object.assign(factory, {
|
|
145
|
+
meta
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
var isLazy = (plugin) => LazyTag in plugin;
|
|
149
|
+
var LazyPluginError = class extends BaseError.extend("LazyPluginError", "Failed to resolve lazy plugin") {
|
|
150
|
+
};
|
|
151
|
+
var resolveLazy = (plugin) => Effect.gen(function* () {
|
|
152
|
+
if (!isLazy(plugin)) {
|
|
153
|
+
return plugin;
|
|
154
|
+
}
|
|
155
|
+
const id = plugin.meta.id;
|
|
156
|
+
const { loader, options } = plugin[LazyTag];
|
|
157
|
+
const mod = yield* Effect.tryPromise({
|
|
158
|
+
try: loader,
|
|
159
|
+
catch: (error) => new LazyPluginError({
|
|
160
|
+
context: {
|
|
161
|
+
id,
|
|
162
|
+
reason: "load-failed"
|
|
163
|
+
},
|
|
164
|
+
cause: error
|
|
165
|
+
})
|
|
166
|
+
});
|
|
167
|
+
if (!mod || typeof mod.default !== "function") {
|
|
168
|
+
return yield* Effect.fail(new LazyPluginError({
|
|
169
|
+
context: {
|
|
170
|
+
id,
|
|
171
|
+
reason: "missing-default"
|
|
172
|
+
}
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
const result = mod.default(options);
|
|
176
|
+
if (!isPlugin(result)) {
|
|
177
|
+
return yield* Effect.fail(new LazyPluginError({
|
|
178
|
+
context: {
|
|
179
|
+
id,
|
|
180
|
+
reason: "invalid-plugin"
|
|
181
|
+
}
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
if (result.meta.id !== id) {
|
|
185
|
+
return yield* Effect.fail(new LazyPluginError({
|
|
186
|
+
context: {
|
|
187
|
+
id,
|
|
188
|
+
reason: "meta-mismatch",
|
|
189
|
+
returnedId: result.meta.id
|
|
190
|
+
}
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
});
|
|
132
195
|
|
|
133
196
|
export {
|
|
134
197
|
Service,
|
|
135
198
|
activate,
|
|
136
199
|
reset,
|
|
200
|
+
shutdown,
|
|
137
201
|
PluginModuleTypeId,
|
|
138
202
|
isPluginModule,
|
|
139
203
|
PluginTypeId,
|
|
@@ -141,6 +205,10 @@ export {
|
|
|
141
205
|
define,
|
|
142
206
|
addModule,
|
|
143
207
|
make,
|
|
208
|
+
lazy,
|
|
209
|
+
isLazy,
|
|
210
|
+
LazyPluginError,
|
|
211
|
+
resolveLazy,
|
|
144
212
|
plugin_exports
|
|
145
213
|
};
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
214
|
+
//# sourceMappingURL=chunk-HTBJU5FX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/core/plugin.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\nimport * as Pipeable from 'effect/Pipeable';\n\nimport { BaseError } from '@dxos/errors';\nimport { invariant } from '@dxos/invariant';\n\nimport type * as ActivationEvent from './activation-event';\nimport * as Capability from './capability';\nimport type * as PluginManager from './plugin-manager';\n\n//\n// Plugin Service Layer\n//\n\n/**\n * Effect Context.Tag for accessing PluginManager via the Effect layer system.\n * This allows lifecycle operations to access the plugin manager without having it passed as an argument.\n */\nexport class Service extends Context.Tag('@dxos/app-framework/PluginManager')<Service, PluginManager.PluginManager>() {}\n\n//\n// Lifecycle Functions\n//\n\n/**\n * Activates plugins based on the activation event.\n * Accesses the PluginManager via the Effect layer system.\n * @param event The activation event.\n * @returns Whether the activation was successful.\n */\nexport const activate = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>\n Effect.flatMap(Service, (manager) => manager.activate(event));\n\n/**\n * Re-activates the modules that were activated by the event.\n * Accesses the PluginManager via the Effect layer system.\n * @param event The activation event.\n * @returns Whether the reset was successful.\n */\nexport const reset = (event: ActivationEvent.ActivationEvent): Effect.Effect<boolean, Error, Service> =>\n Effect.flatMap(Service, (manager) => manager.reset(event));\n\n/**\n * Shuts down the plugin manager, deactivating all active modules and clearing lifecycle state.\n * Accesses the PluginManager via the Effect layer system.\n */\nexport const shutdown = (): Effect.Effect<boolean, Error, Service> =>\n Effect.flatMap(Service, (manager) => manager.shutdown());\n\n/**\n * Computes a module ID from plugin ID and export name.\n */\nconst computeModuleId = (pluginId: string, moduleName: string): string => {\n return `${pluginId}.module.${moduleName}`;\n};\n\n/**\n * Identifier denoting a PluginModule.\n */\nexport const PluginModuleTypeId: unique symbol = Symbol.for('@dxos/app-framework/PluginModule');\nexport type PluginModuleTypeId = typeof PluginModuleTypeId;\n\n/**\n * Type guard to check if a value is a PluginModule.\n */\nexport const isPluginModule = (value: unknown): value is PluginModule => {\n return typeof value === 'object' && value !== null && PluginModuleTypeId in value;\n};\n\n/**\n * A unit of containment of modular functionality that can be provided to an application.\n * Activation of a module is async allowing for code to split and loaded lazily.\n */\nexport interface PluginModule {\n readonly [PluginModuleTypeId]: PluginModuleTypeId;\n /**\n * Unique id of the module.\n */\n id: string;\n\n /**\n * Events for which the module will be activated.\n */\n activatesOn: ActivationEvent.Events;\n\n /**\n * Events that this module fires *before* its own activation runs.\n *\n * When this module is asked to activate (via {@link activatesOn}), the\n * plugin manager first activates every event listed here, ensuring any\n * other modules that contribute to those events have completed before\n * this module's {@link activate} body executes. These events are fired\n * by the framework on this module's behalf — the module does not need\n * to wait for some other code to fire them.\n *\n * The module is marked as needing reset if a module activated by one\n * of these events is later removed.\n *\n * Read as: \"this module fires these events before [its] activation\".\n */\n firesBeforeActivation?: ActivationEvent.ActivationEvent[];\n\n /**\n * Events that this module fires *after* its own activation completes.\n *\n * Once this module's {@link activate} body has finished executing, the\n * plugin manager activates every event listed here, causing any modules\n * listening on those events to run. These events are fired by the\n * framework on this module's behalf as part of this module's lifecycle.\n *\n * Read as: \"this module fires these events after [its] activation\".\n */\n firesAfterActivation?: ActivationEvent.ActivationEvent[];\n\n /**\n * Called when the module is activated.\n * CapabilityManager is accessed via the Effect layer system (Capability.Service).\n * PluginManager is accessed via Plugin.Service.\n * @param props Optional props passed to the module.\n * @returns The capabilities of the module.\n */\n activate: (props?: any) => Effect.Effect<Capability.ModuleReturn, Error, Capability.Service | Service | never>;\n}\n\nexport type PluginModuleOptions = Omit<PluginModule, 'id' | typeof PluginModuleTypeId> & { id?: string };\n\nclass PluginModuleImpl implements PluginModule {\n readonly [PluginModuleTypeId]: PluginModuleTypeId = PluginModuleTypeId;\n readonly id: PluginModule['id'];\n readonly activatesOn: PluginModule['activatesOn'];\n readonly firesBeforeActivation?: PluginModule['firesBeforeActivation'];\n readonly firesAfterActivation?: PluginModule['firesAfterActivation'];\n readonly activate: PluginModule['activate'];\n\n constructor(options: Omit<PluginModule, typeof PluginModuleTypeId>) {\n this.id = options.id;\n this.activatesOn = options.activatesOn;\n this.firesBeforeActivation = options.firesBeforeActivation;\n this.firesAfterActivation = options.firesAfterActivation;\n this.activate = options.activate;\n }\n}\n\nexport type Meta = {\n /**\n * Globally unique ID.\n *\n * Expected to be in the form of a valid URL.\n *\n * @example org.dxos.plugin.example\n */\n id: string;\n\n /**\n * Human-readable name.\n */\n name: string;\n\n /**\n * Short description of plugin functionality.\n */\n description?: string;\n\n /**\n * Name of the author or organization that created the plugin.\n */\n author?: string;\n\n /**\n * URL of home page.\n */\n homePage?: string;\n\n /**\n * URL of source code.\n */\n source?: string;\n\n /**\n * URL of screenshot.\n */\n screenshots?: string[];\n\n /**\n * Tags to help categorize the plugin.\n */\n tags?: string[];\n\n /**\n * A grep-able symbol string which can be resolved to an icon asset by @ch-ui/icons, via @ch-ui/vite-plugin-icons.\n */\n icon?: string;\n\n /**\n * Icon hue (ChromaticPalette).\n */\n iconHue?: string;\n};\n\n/**\n * Identifier denoting a Plugin.\n */\nexport const PluginTypeId: unique symbol = Symbol.for('@dxos/app-framework/Plugin');\nexport type PluginTypeId = typeof PluginTypeId;\n\n/**\n * Type guard to check if a value is a Plugin.\n */\nexport const isPlugin = (value: unknown): value is Plugin => {\n return typeof value === 'object' && value !== null && PluginTypeId in value;\n};\n\n/**\n * A collection of modules that are be enabled/disabled as a unit.\n * Plugins provide things such as components, state, actions, etc. to the application.\n */\n// TODO(burdon): Convert to ECHO schema.\nexport interface Plugin {\n readonly [PluginTypeId]: PluginTypeId;\n readonly meta: Readonly<Meta>;\n readonly modules: ReadonlyArray<PluginModule>;\n}\n\n/**\n * Internal implementation of Plugin.\n * @internal\n */\nclass PluginImpl implements Plugin {\n readonly [PluginTypeId]: PluginTypeId = PluginTypeId;\n\n constructor(\n private readonly _meta: Meta,\n private readonly _modules: PluginModule[],\n ) {}\n\n get meta(): Readonly<Meta> {\n return this._meta;\n }\n\n get modules(): ReadonlyArray<PluginModule> {\n return this._modules;\n }\n}\n\n/**\n * Builder interface for creating plugins incrementally.\n */\nexport interface PluginBuilder<T = void> extends Pipeable.Pipeable {\n readonly meta: Meta;\n readonly modules: ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)>;\n addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T>;\n}\n\n/**\n * Builder implementation for creating plugins incrementally.\n */\nclass PluginBuilderImpl<T = void> implements PluginBuilder<T> {\n readonly meta: Meta;\n private readonly _modules: Array<PluginModuleOptions | ((options: T) => PluginModuleOptions)> = [];\n\n constructor(meta: Meta) {\n this.meta = meta;\n }\n\n get modules(): ReadonlyArray<PluginModuleOptions | ((options: T) => PluginModuleOptions)> {\n return this._modules;\n }\n\n addModule(moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions)): PluginBuilder<T> {\n this._modules.push(moduleOptions);\n return this;\n }\n\n pipe() {\n // eslint-disable-next-line prefer-rest-params\n return Pipeable.pipeArguments(this, arguments);\n }\n}\n\n/**\n * Creates a new PluginBuilder to start building a plugin.\n */\nexport const define = <T = void>(meta: Meta): PluginBuilder<T> => new PluginBuilderImpl<T>(meta);\n\n/**\n * Adds a module to a plugin builder.\n * Supports both pipeline and direct call styles.\n * Modules can be either PluginModuleOptions or functions that receive options.\n */\nexport function addModule<T>(\n moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),\n): (builder: PluginBuilder<T>) => PluginBuilder<T>;\nexport function addModule<T>(\n builder: PluginBuilder<T>,\n moduleOptions: PluginModuleOptions | ((options: T) => PluginModuleOptions),\n): PluginBuilder<T>;\nexport function addModule<T>(\n moduleOptionsOrBuilder: PluginModuleOptions | ((options: T) => PluginModuleOptions) | PluginBuilder<T>,\n moduleOptions?: PluginModuleOptions | ((options: T) => PluginModuleOptions),\n): ((builder: PluginBuilder<T>) => PluginBuilder<T>) | PluginBuilder<T> {\n // If second arg is provided, it's the direct call style: addModule(builder, moduleOptions)\n if (moduleOptions !== undefined) {\n return (moduleOptionsOrBuilder as PluginBuilder<T>).addModule(moduleOptions);\n }\n // Otherwise it's pipeline style: addModule(moduleOptions) returns a function\n const moduleOpts = moduleOptionsOrBuilder as PluginModuleOptions | ((options: T) => PluginModuleOptions);\n return (builder: PluginBuilder<T>) => builder.addModule(moduleOpts);\n}\n\nexport type PluginFactory<T = void> = ((options: T) => Plugin) & { meta: Meta };\n\n/**\n * Resolves a module from either PluginModuleOptions or a function that returns PluginModuleOptions.\n */\nconst resolveModule = (\n meta: Meta,\n module: PluginModuleOptions | ((options: any) => PluginModuleOptions),\n options?: any,\n): PluginModuleImpl => {\n const moduleOptions = typeof module === 'function' ? module(options) : module;\n const id = Option.fromNullable(moduleOptions.id).pipe(\n Option.match({\n onNone: () => {\n const exportName = Capability.getModuleTag(moduleOptions.activate);\n invariant(exportName, `Plugin module missing name. Plugin: ${meta.id}`);\n return computeModuleId(meta.id, exportName);\n },\n onSome: (id) => computeModuleId(meta.id, id),\n }),\n );\n return new PluginModuleImpl({ ...moduleOptions, id });\n};\n\n/**\n * Creates a Plugin from a builder.\n * Supports both pipeline and direct call styles.\n * Always returns a factory function (options: T) => Plugin.\n * When T is void, the function takes no arguments: () => Plugin.\n */\nexport function make<T>(builder: PluginBuilder<T>): PluginFactory<T>;\nexport function make<T>(builder: PluginBuilder<T>): PluginFactory<T> {\n const meta = builder.meta;\n\n const factory = (options: T) => {\n const modules = builder.modules.map((module) => resolveModule(meta, module, options));\n return new PluginImpl(meta, modules);\n };\n\n return Object.assign(factory, { meta });\n}\n\n//\n// Lazy plugin loading\n//\n\n/**\n * Symbol used to tag lazy plugin stubs with their loader closure.\n * Hidden from enumeration so plugin manager iteration / serialization paths\n * don't trip over it.\n */\nconst LazyTag: unique symbol = Symbol.for('@dxos/app-framework/Plugin/Lazy');\n\n/**\n * Async loader for a lazy plugin's real implementation.\n * The default export of the loaded module must be a `PluginFactory<T>` —\n * i.e. the same shape `Plugin.make` produces.\n */\nexport type LazyLoader<T = void> = () => Promise<{ default: PluginFactory<T> }>;\n\n/** Internal: payload carried on a lazy stub. */\ntype LazyPayload = { loader: LazyLoader<any>; options: unknown };\n\n/**\n * Defines a lazy plugin whose body is loaded on first enable.\n *\n * The returned factory produces a stub `Plugin` that exposes `meta`\n * synchronously (so callers can read `Plugin.meta.id` for free) but defers\n * loading the real plugin's modules until the manager calls\n * `Plugin.resolveLazy`. This lets the plugin's main entry point ship as a\n * tiny meta-only chunk — the heavy capabilities, schema, React surfaces,\n * etc. live behind the dynamic `import()` and become a separate Rollup\n * chunk that is only fetched when the plugin is enabled.\n *\n * @example\n * ```ts\n * // plugin-markdown/src/index.ts\n * import { Plugin } from '@dxos/app-framework';\n * import { meta } from './meta';\n *\n * export const MarkdownPlugin = Plugin.lazy(meta, () => import('./MarkdownPlugin'));\n *\n * // plugin-markdown/src/MarkdownPlugin.tsx\n * export const MarkdownPlugin = Plugin.define(meta).pipe(...heavy modules..., Plugin.make);\n * export default MarkdownPlugin;\n * ```\n */\nexport const lazy = <T = void>(meta: Meta, loader: LazyLoader<T>): PluginFactory<T> => {\n const factory = (options: T): Plugin => {\n const stub = new PluginImpl(meta, []);\n Object.defineProperty(stub, LazyTag, {\n value: { loader, options } satisfies LazyPayload,\n enumerable: false,\n });\n return stub;\n };\n return Object.assign(factory, { meta });\n};\n\n/**\n * Type guard for lazy plugin stubs produced by {@link lazy}.\n */\nexport const isLazy = (plugin: Plugin): boolean => LazyTag in plugin;\n\n/**\n * Tagged error for failures during lazy plugin resolution. `context.id` is\n * the lazy plugin's `meta.id`; `context.reason` discriminates the failure\n * mode (`'load-failed' | 'missing-default' | 'invalid-plugin' |\n * 'meta-mismatch'`) so callers can route on it.\n */\nexport class LazyPluginError extends BaseError.extend('LazyPluginError', 'Failed to resolve lazy plugin') {}\n\n/**\n * Resolves a lazy plugin stub to its real plugin.\n * Returns the plugin unchanged if it is not lazy. Failures surface as\n * {@link LazyPluginError} with `context.reason` indicating the failure mode\n * and (for loader failures) `cause` set to the original error.\n */\nexport const resolveLazy = (plugin: Plugin): Effect.Effect<Plugin, LazyPluginError> =>\n Effect.gen(function* () {\n if (!isLazy(plugin)) {\n return plugin;\n }\n const id = plugin.meta.id;\n const { loader, options } = (plugin as unknown as { [LazyTag]: LazyPayload })[LazyTag];\n const mod = yield* Effect.tryPromise({\n try: loader,\n catch: (error) => new LazyPluginError({ context: { id, reason: 'load-failed' }, cause: error }),\n });\n if (!mod || typeof mod.default !== 'function') {\n return yield* Effect.fail(new LazyPluginError({ context: { id, reason: 'missing-default' } }));\n }\n const result = mod.default(options);\n if (!isPlugin(result)) {\n return yield* Effect.fail(new LazyPluginError({ context: { id, reason: 'invalid-plugin' } }));\n }\n if (result.meta.id !== id) {\n return yield* Effect.fail(\n new LazyPluginError({ context: { id, reason: 'meta-mismatch', returnedId: result.meta.id } }),\n );\n }\n return result;\n });\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Context", "Effect", "Option", "Pipeable", "BaseError", "invariant", "PluginModuleImpl", "id", "activatesOn", "firesBeforeActivation", "firesAfterActivation", "activate", "_meta", "_modules", "meta", "modules", "addModule", "moduleOptions", "pipe", "undefined", "fromNullable", "onNone", "exportName", "Capability", "getModuleTag", "invariant", "onSome", "computeModuleId", "factory", "options", "builder", "PluginImpl", "Object", "assign", "stub", "defineProperty", "value", "loader", "enumerable", "plugin", "mod", "Effect", "try", "catch", "error", "LazyPluginError", "reason", "cause", "context", "result", "fail", "returnedId"]
|
|
7
|
+
}
|