@dxos/app-framework 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.mts +2 -4
- package/.storybook/preview.mts +2 -2
- package/dist/lib/browser/capability-Q5XRXRD2.mjs +38 -0
- package/dist/lib/browser/capability-Q5XRXRD2.mjs.map +7 -0
- package/dist/lib/browser/capability-V7LR4LQN.mjs +35 -0
- package/dist/lib/browser/capability-V7LR4LQN.mjs.map +7 -0
- package/dist/lib/browser/chunk-23D4SJUE.mjs +42 -0
- package/dist/lib/browser/chunk-23D4SJUE.mjs.map +7 -0
- package/dist/lib/browser/chunk-3JWJXGLK.mjs +79 -0
- package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
- package/dist/lib/browser/chunk-3ZS2A3DN.mjs +907 -0
- package/dist/lib/browser/chunk-3ZS2A3DN.mjs.map +7 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
- package/dist/lib/browser/chunk-5LAIGWLU.mjs +467 -0
- package/dist/lib/browser/chunk-5LAIGWLU.mjs.map +7 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
- package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-JXCBZSBJ.mjs +372 -0
- package/dist/lib/browser/chunk-JXCBZSBJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-MX5DKEJH.mjs +584 -0
- package/dist/lib/browser/chunk-MX5DKEJH.mjs.map +7 -0
- package/dist/lib/browser/chunk-WBHCSOBW.mjs +80 -0
- package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
- package/dist/lib/browser/chunk-Z55LVAGN.mjs +213 -0
- package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs +142 -0
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +74 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +24 -0
- package/dist/lib/browser/common/capabilities.mjs +46 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/activation-event.mjs.map +7 -0
- package/dist/lib/browser/core/capability.mjs +30 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +17 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +37 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +20 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +95 -148
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs +44 -0
- package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +227 -41
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/testing/react.mjs +78 -0
- package/dist/lib/browser/testing/react.mjs.map +7 -0
- package/dist/lib/browser/ui/index.mjs +48 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-EW5GJCI6.mjs +39 -0
- package/dist/lib/node-esm/capability-EW5GJCI6.mjs.map +7 -0
- package/dist/lib/node-esm/capability-YKBMMD53.mjs +36 -0
- package/dist/lib/node-esm/capability-YKBMMD53.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-D347W3KO.mjs +143 -0
- package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-D5PO2WXX.mjs +373 -0
- package/dist/lib/node-esm/chunk-D5PO2WXX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs +214 -0
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KM2F6GH6.mjs +468 -0
- package/dist/lib/node-esm/chunk-KM2F6GH6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Q7XBFII4.mjs +908 -0
- package/dist/lib/node-esm/chunk-Q7XBFII4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SBS2YMPT.mjs +43 -0
- package/dist/lib/node-esm/chunk-SBS2YMPT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs +80 -0
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WFSRZKBP.mjs +81 -0
- package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WKTLE7MG.mjs +585 -0
- package/dist/lib/node-esm/chunk-WKTLE7MG.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +75 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +25 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +47 -0
- package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
- package/dist/lib/node-esm/core/activation-event.mjs +21 -0
- package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
- package/dist/lib/node-esm/core/capability.mjs +31 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +18 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +38 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +21 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +95 -148
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs +45 -0
- package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +227 -41
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/testing/react.mjs +79 -0
- package/dist/lib/node-esm/testing/react.mjs.map +7 -0
- package/dist/lib/node-esm/ui/index.mjs +49 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +832 -0
- package/dist/plugin/node-esm/index.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/types/src/cli/cli.d.ts +39 -0
- package/dist/types/src/cli/cli.d.ts.map +1 -0
- package/dist/types/src/cli/index.d.ts +2 -0
- package/dist/types/src/cli/index.d.ts.map +1 -0
- package/dist/types/src/common/activation-events.d.ts +27 -0
- package/dist/types/src/common/activation-events.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +110 -197
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +4 -8
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +19 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/translations.d.ts +8 -8
- package/dist/types/src/common/translations.d.ts.map +1 -1
- package/dist/types/src/context.d.ts +5 -0
- package/dist/types/src/context.d.ts.map +1 -0
- package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
- package/dist/types/src/core/activation-event.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.d.ts +48 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.test.d.ts +2 -0
- package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/capability.d.ts +156 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +8 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
- package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.d.ts +122 -0
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.d.ts +76 -0
- package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin.d.ts +207 -39
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +112 -0
- package/dist/types/src/core/url-loader.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.test.d.ts +2 -0
- package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
- package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
- package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/index.d.ts +3 -0
- package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/meta.d.ts +3 -0
- package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/testing.d.ts +59 -0
- package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
- package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/index.d.ts +2 -0
- package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
- package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +67 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/react.d.ts +27 -0
- package/dist/types/src/testing/react.d.ts.map +1 -0
- package/dist/types/src/testing/react.test.d.ts +2 -0
- package/dist/types/src/testing/react.test.d.ts.map +1 -0
- package/dist/types/src/testing/service.d.ts +8 -0
- package/dist/types/src/testing/service.d.ts.map +1 -0
- package/dist/types/src/testing/withPluginManager.d.ts +7 -6
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.d.ts +9 -0
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/index.d.ts +2 -0
- package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
- package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
- package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
- package/dist/types/src/ui/components/index.d.ts +5 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
- package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
- package/dist/types/src/ui/index.d.ts +3 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +5 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.d.ts +37 -0
- package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/packages.d.ts +13 -0
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +25 -6
- package/package.json +112 -55
- package/src/cli/cli.ts +107 -0
- package/src/{components → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +169 -210
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +35 -0
- package/src/common/translations.ts +18 -10
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +10 -7
- package/src/core/capability-manager.test.ts +151 -0
- package/src/core/capability-manager.ts +192 -0
- package/src/core/capability.ts +247 -0
- package/src/core/index.ts +8 -4
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1354 -0
- package/src/core/plugin-manager.ts +1025 -0
- package/src/core/plugin-manifest.test.ts +48 -0
- package/src/core/plugin-manifest.ts +102 -0
- package/src/core/plugin.ts +365 -45
- package/src/core/url-loader.test.ts +178 -0
- package/src/core/url-loader.ts +337 -0
- package/src/index.ts +3 -4
- package/src/plugin-operation/OperationPlugin.ts +24 -0
- package/src/plugin-operation/history/capability.ts +36 -0
- package/src/plugin-operation/history/errors.ts +7 -0
- package/src/plugin-operation/history/history-tracker.test.ts +374 -0
- package/src/plugin-operation/history/history-tracker.ts +128 -0
- package/src/plugin-operation/history/index.ts +9 -0
- package/src/plugin-operation/history/types.ts +17 -0
- package/src/plugin-operation/history/undo-mapping.ts +135 -0
- package/src/plugin-operation/history/undo-registry.test.ts +72 -0
- package/src/plugin-operation/history/undo-registry.ts +54 -0
- package/src/plugin-operation/index.ts +6 -0
- package/src/plugin-operation/invoker-capability.ts +55 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +155 -0
- package/src/plugin-runtime/RuntimePlugin.ts +19 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/{playground/layout → plugin-runtime}/index.ts +1 -1
- package/src/plugin-runtime/meta.ts +11 -0
- package/src/testing/harness.ts +229 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/react.test.tsx +48 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +8 -9
- package/src/testing/withPluginManager.tsx +68 -40
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +81 -0
- package/src/{playground/debug → ui/components/App}/index.ts +1 -1
- package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
- package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
- package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
- package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
- package/src/ui/components/PluginManager/index.ts +5 -0
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
- package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
- package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/context.ts +12 -0
- package/src/ui/components/Surface/index.ts +54 -0
- package/src/ui/components/Surface/types.test.ts +126 -0
- package/src/ui/components/Surface/types.ts +269 -0
- package/src/ui/components/index.ts +8 -0
- package/src/ui/hooks/index.ts +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +413 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/{components → ui/hooks}/useLoading.tsx +16 -10
- package/src/ui/hooks/useSettingsState.ts +26 -0
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +6 -0
- package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
- package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
- package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
- package/src/vite-plugin/boot-loader/index.ts +112 -0
- package/src/vite-plugin/composer/index.ts +277 -0
- package/src/vite-plugin/import-map/index.ts +524 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +24 -0
- package/src/vite-plugin/manifest.ts +50 -0
- package/src/vite-plugin/packages.ts +188 -0
- package/tsconfig.json +18 -15
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +1 -1
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +0 -7
- package/dist/lib/browser/chunk-6V54SRFL.mjs +0 -1638
- package/dist/lib/browser/chunk-6V54SRFL.mjs.map +0 -7
- package/dist/lib/browser/chunk-RGKMLI6U.mjs +0 -35
- package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs +0 -467
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-VFMJVO2M.mjs +0 -11
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs +0 -39
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +0 -7
- package/dist/lib/browser/store-7ZGMHOGB.mjs +0 -30
- package/dist/lib/browser/store-7ZGMHOGB.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -77
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs +0 -468
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs +0 -37
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs +0 -1640
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-SAPOKSLZ.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +0 -7
- package/dist/lib/node-esm/store-H4F4RMYD.mjs +0 -31
- package/dist/lib/node-esm/store-H4F4RMYD.mjs.map +0 -7
- package/dist/lib/node-esm/worker.mjs +0 -78
- package/dist/types/src/common/collaboration.d.ts +0 -20
- package/dist/types/src/common/collaboration.d.ts.map +0 -1
- package/dist/types/src/common/events.d.ts +0 -52
- package/dist/types/src/common/events.d.ts.map +0 -1
- package/dist/types/src/common/file.d.ts +0 -14
- package/dist/types/src/common/file.d.ts.map +0 -1
- package/dist/types/src/common/graph.d.ts +0 -21
- package/dist/types/src/common/graph.d.ts.map +0 -1
- package/dist/types/src/common/layout.d.ts +0 -279
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts +0 -59
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/components/App.d.ts +0 -10
- package/dist/types/src/components/App.d.ts.map +0 -1
- package/dist/types/src/components/App.stories.d.ts.map +0 -1
- package/dist/types/src/components/DefaultFallback.d.ts +0 -8
- package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
- package/dist/types/src/components/index.d.ts +0 -2
- package/dist/types/src/components/index.d.ts.map +0 -1
- package/dist/types/src/components/useApp.d.ts +0 -44
- package/dist/types/src/components/useApp.d.ts.map +0 -1
- package/dist/types/src/components/useLoading.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -117
- package/dist/types/src/core/capabilities.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.test.d.ts +0 -2
- package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
- package/dist/types/src/core/events.d.ts.map +0 -1
- package/dist/types/src/core/manager.d.ts +0 -126
- package/dist/types/src/core/manager.d.ts.map +0 -1
- package/dist/types/src/core/manager.test.d.ts +0 -2
- package/dist/types/src/core/manager.test.d.ts.map +0 -1
- package/dist/types/src/playground/debug/Debug.d.ts +0 -6
- package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
- package/dist/types/src/playground/debug/index.d.ts +0 -2
- package/dist/types/src/playground/debug/index.d.ts.map +0 -1
- package/dist/types/src/playground/debug/plugin.d.ts +0 -2
- package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Main.d.ts +0 -6
- package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/generator/generator.d.ts +0 -7
- package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
- package/dist/types/src/playground/generator/index.d.ts +0 -3
- package/dist/types/src/playground/generator/index.d.ts.map +0 -1
- package/dist/types/src/playground/generator/plugin.d.ts +0 -2
- package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/layout/Layout.d.ts +0 -8
- package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
- package/dist/types/src/playground/layout/index.d.ts +0 -2
- package/dist/types/src/playground/layout/index.d.ts.map +0 -1
- package/dist/types/src/playground/layout/plugin.d.ts +0 -2
- package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/logger/index.d.ts +0 -2
- package/dist/types/src/playground/logger/index.d.ts.map +0 -1
- package/dist/types/src/playground/logger/plugin.d.ts +0 -2
- package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/schema.d.ts +0 -13
- package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
- package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/actions.d.ts +0 -36
- package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/errors.d.ts +0 -16
- package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/index.d.ts +0 -6
- package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent.d.ts +0 -63
- package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/meta.d.ts +0 -3
- package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/actions.d.ts +0 -25
- package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/index.d.ts +0 -3
- package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
- package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/meta.d.ts +0 -3
- package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/store.d.ts +0 -5
- package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/translations.d.ts +0 -11
- package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
- package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
- package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
- package/dist/types/src/react/IntentContext.d.ts +0 -8
- package/dist/types/src/react/IntentContext.d.ts.map +0 -1
- package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
- package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
- package/dist/types/src/react/Surface.d.ts +0 -12
- package/dist/types/src/react/Surface.d.ts.map +0 -1
- package/dist/types/src/react/Surface.stories.d.ts +0 -17
- package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
- package/dist/types/src/react/common.d.ts +0 -13
- package/dist/types/src/react/common.d.ts.map +0 -1
- package/dist/types/src/react/index.d.ts +0 -7
- package/dist/types/src/react/index.d.ts.map +0 -1
- package/dist/types/src/react/useCapabilities.d.ts +0 -13
- package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
- package/dist/types/src/react/useIntentResolver.d.ts +0 -3
- package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
- package/dist/types/src/worker.d.ts +0 -4
- package/dist/types/src/worker.d.ts.map +0 -1
- package/src/common/collaboration.ts +0 -18
- package/src/common/events.ts +0 -79
- package/src/common/file.ts +0 -22
- package/src/common/graph.ts +0 -30
- package/src/common/layout.ts +0 -277
- package/src/common/surface.ts +0 -83
- package/src/components/App.stories.tsx +0 -33
- package/src/components/App.tsx +0 -59
- package/src/components/DefaultFallback.tsx +0 -26
- package/src/components/useApp.tsx +0 -164
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -259
- package/src/core/manager.test.ts +0 -516
- package/src/core/manager.ts +0 -597
- package/src/playground/debug/Debug.tsx +0 -39
- package/src/playground/debug/plugin.ts +0 -16
- package/src/playground/generator/Main.tsx +0 -71
- package/src/playground/generator/Toolbar.tsx +0 -47
- package/src/playground/generator/generator.ts +0 -48
- package/src/playground/generator/index.ts +0 -6
- package/src/playground/generator/plugin.ts +0 -22
- package/src/playground/layout/Layout.tsx +0 -33
- package/src/playground/layout/plugin.ts +0 -18
- package/src/playground/logger/Toolbar.tsx +0 -30
- package/src/playground/logger/plugin.ts +0 -41
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -46
- package/src/plugin-intent/IntentPlugin.ts +0 -20
- package/src/plugin-intent/actions.ts +0 -31
- package/src/plugin-intent/errors.ts +0 -40
- package/src/plugin-intent/index.ts +0 -9
- package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
- package/src/plugin-intent/intent-dispatcher.ts +0 -334
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-intent/meta.ts +0 -10
- package/src/plugin-settings/SettingsPlugin.ts +0 -34
- package/src/plugin-settings/actions.ts +0 -25
- package/src/plugin-settings/app-graph-builder.ts +0 -159
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -35
- package/src/plugin-settings/meta.ts +0 -10
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/ErrorBoundary.tsx +0 -54
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/Surface.stories.tsx +0 -101
- package/src/react/Surface.tsx +0 -86
- package/src/react/common.ts +0 -13
- package/src/react/index.ts +0 -10
- package/src/react/useCapabilities.ts +0 -31
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- /package/dist/lib/browser/{intent-dispatcher-VFMJVO2M.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-SAPOKSLZ.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// Inline driver script — injected into the host's `<body>` by `bootLoaderPlugin`.
|
|
6
|
+
// Runs before the module bundle is fetched, so the host can observe `boot:html-parsed`
|
|
7
|
+
// and update the visible status from `main.tsx` between phases.
|
|
8
|
+
//
|
|
9
|
+
// The loader has two host-driven states (plus an unobserved idle state on
|
|
10
|
+
// script entry that's promoted automatically — there's no API to opt out of
|
|
11
|
+
// motion on cold load, by design):
|
|
12
|
+
// - State 1 (slow tick): auto-entered the moment the inline script runs;
|
|
13
|
+
// asymptotic creep toward `STATE_1_ASYMPTOTE`%.
|
|
14
|
+
// - State 2 (progress): host-driven, value supplied to `progress(fraction)`.
|
|
15
|
+
// The creep stays alive in state 2 too, with a
|
|
16
|
+
// ceiling that climbs `STATE_2_BUMP` percent ahead
|
|
17
|
+
// of the most recent `progress()` call (capped at
|
|
18
|
+
// `ABSOLUTE_CEILING`). Between sparse host updates
|
|
19
|
+
// the ring keeps inching forward toward that
|
|
20
|
+
// ceiling, so a long activation gap doesn't read
|
|
21
|
+
// as a frozen disc.
|
|
22
|
+
//
|
|
23
|
+
// `window.__bootLoader.status(text)` updates the visible status line.
|
|
24
|
+
// `window.__bootLoader.progress(fraction)` enter state 2 with `fraction` ∈ [0, 1].
|
|
25
|
+
// `window.__bootLoader.dismiss()` remove the loader DOM (terminal).
|
|
26
|
+
//
|
|
27
|
+
// Kept ES5-flavoured so the bundler never has to touch it.
|
|
28
|
+
|
|
29
|
+
(function () {
|
|
30
|
+
performance.mark('boot:html-parsed');
|
|
31
|
+
|
|
32
|
+
// Asymptotic creep — `next = raw + (ceiling - raw) * creepRate` per tick,
|
|
33
|
+
// so the var eases toward `ceiling` and never quite reaches it.
|
|
34
|
+
var CREEP_TICK_MS = 100;
|
|
35
|
+
// State 1 creep is a "we're alive" hint before any real progress lands,
|
|
36
|
+
// so it eases gently toward a low asymptote.
|
|
37
|
+
var STATE_1_RATE = 0.04;
|
|
38
|
+
var STATE_1_ASYMPTOTE = 20;
|
|
39
|
+
// State 2 creep bridges the gap between sparse `progress()` calls.
|
|
40
|
+
// Tuning is a trade-off:
|
|
41
|
+
// - Larger `STATE_2_RATE` → fills faster, but reaches the ceiling
|
|
42
|
+
// sooner and then sits idle (looks "paused").
|
|
43
|
+
// - Larger `STATE_2_BUMP` → ring leads further ahead of the host's
|
|
44
|
+
// last reported value, so subsequent host updates feel "behind"
|
|
45
|
+
// until they cross the lead.
|
|
46
|
+
// Current values aim for continuous-but-modest motion through a ~5 s
|
|
47
|
+
// activation silence: 50 % → ~64 % over 5 s, ceiling at host + 15 % so
|
|
48
|
+
// real progress can catch up via `Math.max` without big jumps.
|
|
49
|
+
var STATE_2_RATE = 0.05;
|
|
50
|
+
var STATE_2_BUMP = 15;
|
|
51
|
+
// Ring never auto-creeps past this — keeps the user from interpreting the
|
|
52
|
+
// ring as "almost done" while the host hasn't actually said so.
|
|
53
|
+
var ABSOLUTE_CEILING = 90;
|
|
54
|
+
|
|
55
|
+
// 0 = idle (transient — auto-promoted to 1 immediately below),
|
|
56
|
+
// 1 = slow tick, 2 = host-driven progress.
|
|
57
|
+
var state = 0;
|
|
58
|
+
var creepHandle = null;
|
|
59
|
+
var creepCeiling = STATE_1_ASYMPTOTE;
|
|
60
|
+
var creepRate = STATE_1_RATE;
|
|
61
|
+
var trace = /(?:^|[?&])trace=1(?:&|$)/.test(window.location.search);
|
|
62
|
+
var start = Date.now();
|
|
63
|
+
var last = Date.now();
|
|
64
|
+
var timings = [];
|
|
65
|
+
|
|
66
|
+
function ensureCreep() {
|
|
67
|
+
if (creepHandle != null) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
creepHandle = setInterval(function () {
|
|
71
|
+
var element = document.getElementById('boot-loader-disc');
|
|
72
|
+
if (!element) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
var raw = parseFloat(element.style.getPropertyValue('--boot-loader-bar-progress')) || 0;
|
|
76
|
+
// Already at (or above) the ceiling — nothing to do this tick.
|
|
77
|
+
if (raw >= creepCeiling - 0.1) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
var next = raw + (creepCeiling - raw) * creepRate;
|
|
81
|
+
element.style.setProperty('--boot-loader-bar-progress', String(next));
|
|
82
|
+
if (next > 0 && next < 100) {
|
|
83
|
+
element.setAttribute('data-progress-active', '');
|
|
84
|
+
}
|
|
85
|
+
}, CREEP_TICK_MS);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function stopCreep() {
|
|
89
|
+
if (creepHandle != null) {
|
|
90
|
+
clearInterval(creepHandle);
|
|
91
|
+
creepHandle = null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
window.__bootLoader = {
|
|
96
|
+
/**
|
|
97
|
+
* Update the visible status line. The caller owns formatting — the
|
|
98
|
+
* loader just renders `humanized` and records the structured fields
|
|
99
|
+
* for the trace. Idempotent on the full structured payload: equal
|
|
100
|
+
* back-to-back updates are a no-op, but two updates with the same
|
|
101
|
+
* visible text and different `event` / `module` ids still produce a
|
|
102
|
+
* fresh trace entry so the timeline can distinguish those transitions.
|
|
103
|
+
*
|
|
104
|
+
* Payload: `{ event?, module?, humanized, range? }`.
|
|
105
|
+
* - `humanized`: the exact string to display (e.g. "Loading framework…",
|
|
106
|
+
* "Activating Observability: react-surface").
|
|
107
|
+
* - `event` / `module`: optional raw ids for the trace, when the
|
|
108
|
+
* update originates from an activation transition.
|
|
109
|
+
* - `range`: optional `{ index, total }` for ticking progress within
|
|
110
|
+
* a single phase (e.g. "Loading plugins (12/80)"). When present,
|
|
111
|
+
* the loader replaces the current line in place rather than
|
|
112
|
+
* appending a new one — so 80 plugin loads produce one trace
|
|
113
|
+
* entry with an updating suffix instead of 80 separate lines.
|
|
114
|
+
*/
|
|
115
|
+
status: function (payload) {
|
|
116
|
+
if (!payload || typeof payload !== 'object') {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
var humanized = payload.humanized || '';
|
|
120
|
+
var event = payload.event || null;
|
|
121
|
+
var moduleId = payload.module || null;
|
|
122
|
+
var range =
|
|
123
|
+
payload.range && typeof payload.range.index === 'number' && typeof payload.range.total === 'number'
|
|
124
|
+
? payload.range
|
|
125
|
+
: null;
|
|
126
|
+
// Display text appends the (i/n) suffix when a range is provided so
|
|
127
|
+
// the same `humanized` string can tick through a count without the
|
|
128
|
+
// caller having to format it.
|
|
129
|
+
var displayText = range ? humanized + ' (' + range.index + '/' + range.total + ')' : humanized;
|
|
130
|
+
// Compare against the previous entry's structured fields, not the
|
|
131
|
+
// DOM text alone — two different transitions can humanize to the same
|
|
132
|
+
// visible string (e.g. an event-level "Activating Foo" followed by a
|
|
133
|
+
// module-level "Activating Foo: react-surface" reduced to "Activating
|
|
134
|
+
// Foo" by a custom formatter), and the trace should still carry both.
|
|
135
|
+
var previous = timings.length > 0 ? timings[timings.length - 1] : null;
|
|
136
|
+
if (
|
|
137
|
+
previous &&
|
|
138
|
+
previous.text === displayText &&
|
|
139
|
+
(previous.event || null) === event &&
|
|
140
|
+
(previous.module || null) === moduleId
|
|
141
|
+
) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (range && previous) {
|
|
145
|
+
// Range tick — collapse into the previous trace entry instead of
|
|
146
|
+
// appending. The trace timeline records one transition per phase,
|
|
147
|
+
// not one per `(i/n)` step, keeping the boot trace compact.
|
|
148
|
+
previous.text = displayText;
|
|
149
|
+
} else {
|
|
150
|
+
if (previous) {
|
|
151
|
+
previous.duration = Date.now() - last;
|
|
152
|
+
}
|
|
153
|
+
var entry = { text: displayText };
|
|
154
|
+
if (event) {
|
|
155
|
+
entry.event = event;
|
|
156
|
+
}
|
|
157
|
+
if (moduleId) {
|
|
158
|
+
entry.module = moduleId;
|
|
159
|
+
}
|
|
160
|
+
timings.push(entry);
|
|
161
|
+
last = Date.now();
|
|
162
|
+
}
|
|
163
|
+
var element = document.getElementById('boot-loader-status');
|
|
164
|
+
if (!element) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// The track holds every appended status line. On the first
|
|
168
|
+
// `status()` call we hoist any pre-existing lines (the initial
|
|
169
|
+
// status injected by `bootLoaderPlugin`) into the track so the
|
|
170
|
+
// CSS `transform` translation applies uniformly.
|
|
171
|
+
var track = document.getElementById('boot-loader-status-track');
|
|
172
|
+
if (!track) {
|
|
173
|
+
track = document.createElement('div');
|
|
174
|
+
track.id = 'boot-loader-status-track';
|
|
175
|
+
while (element.firstChild) {
|
|
176
|
+
track.appendChild(element.firstChild);
|
|
177
|
+
}
|
|
178
|
+
element.appendChild(track);
|
|
179
|
+
}
|
|
180
|
+
var lastLine = track.lastElementChild;
|
|
181
|
+
if (range && lastLine) {
|
|
182
|
+
// Range tick — replace the current visible line's text in place,
|
|
183
|
+
// no slide. The line keeps its position so the (i/n) counter just
|
|
184
|
+
// updates over the same row.
|
|
185
|
+
lastLine.textContent = displayText;
|
|
186
|
+
} else {
|
|
187
|
+
// Fresh phase (or first line) — append and slide the track up so
|
|
188
|
+
// the new line aligns with the single-line viewport. The CSS
|
|
189
|
+
// `transition` on the track's `transform` eases the move; we
|
|
190
|
+
// measure in pixels (not `em`) because some engines (and headless
|
|
191
|
+
// Chromium) don't reliably interpolate `transform` between
|
|
192
|
+
// `em`-valued translateY's.
|
|
193
|
+
var line = document.createElement('div');
|
|
194
|
+
line.className = 'boot-loader-status-line';
|
|
195
|
+
line.textContent = displayText;
|
|
196
|
+
track.appendChild(line);
|
|
197
|
+
var lineHeight = line.getBoundingClientRect().height || 0;
|
|
198
|
+
track.style.transform = 'translateY(' + (track.children.length - 1) * -lineHeight + 'px)';
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Enter state 2 (host-driven progress) — set the determinate ring to
|
|
204
|
+
* `fraction` ∈ [0, 1]. Invalid / negative / non-finite values clamp to
|
|
205
|
+
* 0 (the empty ring) rather than letting `NaN`/`Infinity` slip into
|
|
206
|
+
* `--boot-loader-bar-progress`, which CSS would treat as invalid and
|
|
207
|
+
* silently reset to the 0% var() default. The state-1 creep timer is
|
|
208
|
+
* left running with a new ceiling so the ring keeps inching forward
|
|
209
|
+
* between host updates.
|
|
210
|
+
*
|
|
211
|
+
* The ring never regresses: if the requested value is below the
|
|
212
|
+
* current var (e.g. the host's first call is `progress(0)` while the
|
|
213
|
+
* creep had already reached ~12%), the existing value is held. The
|
|
214
|
+
* host's progress catches up once it exceeds the held floor, so the
|
|
215
|
+
* ring's motion stays monotonic across the state-1 → state-2 boundary.
|
|
216
|
+
*/
|
|
217
|
+
progress: function (fraction) {
|
|
218
|
+
state = 2;
|
|
219
|
+
// Set the var on the disc so both the masked ring and the orbiting
|
|
220
|
+
// dot (siblings inside `#boot-loader-disc`) inherit the same value.
|
|
221
|
+
var element = document.getElementById('boot-loader-disc');
|
|
222
|
+
if (!element) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
// Flip into "host-driven" mode the first time `progress()` lands —
|
|
226
|
+
// CSS keys the brand mark's grayscale→color transition off this
|
|
227
|
+
// attribute, so the mark eases from monochrome to full palette as
|
|
228
|
+
// real progress starts arriving.
|
|
229
|
+
element.setAttribute('data-host-driven', '');
|
|
230
|
+
var clamped = typeof fraction !== 'number' || !isFinite(fraction) || fraction < 0 ? 0 : Math.min(1, fraction);
|
|
231
|
+
var requestedPct = clamped * 100;
|
|
232
|
+
var currentPct = parseFloat(element.style.getPropertyValue('--boot-loader-bar-progress')) || 0;
|
|
233
|
+
var nextPct = Math.max(currentPct, requestedPct);
|
|
234
|
+
element.style.setProperty('--boot-loader-bar-progress', String(nextPct));
|
|
235
|
+
// Switch the ongoing creep to its state-2 cadence — faster ease and
|
|
236
|
+
// a larger lead bump so the ring keeps moving while the host is
|
|
237
|
+
// silent (e.g. composer-app's "Starting Composer…" stretch while the
|
|
238
|
+
// first slow plugin module activates).
|
|
239
|
+
creepRate = STATE_2_RATE;
|
|
240
|
+
var newCeiling = Math.min(nextPct + STATE_2_BUMP, ABSOLUTE_CEILING);
|
|
241
|
+
if (newCeiling > creepCeiling) {
|
|
242
|
+
creepCeiling = newCeiling;
|
|
243
|
+
}
|
|
244
|
+
ensureCreep();
|
|
245
|
+
// Toggle the leading-edge dot only while progress is strictly in (0, 1).
|
|
246
|
+
if (nextPct > 0 && nextPct < 100) {
|
|
247
|
+
element.setAttribute('data-progress-active', '');
|
|
248
|
+
} else {
|
|
249
|
+
element.removeAttribute('data-progress-active');
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
dismiss: function () {
|
|
254
|
+
stopCreep();
|
|
255
|
+
var element = document.getElementById('boot-loader');
|
|
256
|
+
if (element && element.parentNode) {
|
|
257
|
+
element.parentNode.removeChild(element);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (trace) {
|
|
261
|
+
if (timings.length > 0) {
|
|
262
|
+
timings[timings.length - 1].duration = Date.now() - last;
|
|
263
|
+
}
|
|
264
|
+
console.log(JSON.stringify({ total: Date.now() - start, timings }, null, 2));
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// Auto-promote idle → slow tick the moment this inline script executes,
|
|
270
|
+
// so the disc starts moving on the very first frame the loader paints.
|
|
271
|
+
// The host calls `progress()` later to take over.
|
|
272
|
+
state = 1;
|
|
273
|
+
ensureCreep();
|
|
274
|
+
})();
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Plugin } from 'vite';
|
|
6
|
+
|
|
7
|
+
import css from './boot-loader.css?raw';
|
|
8
|
+
import driverScript from './boot-loader.js?raw';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Options for {@link bootLoaderPlugin}.
|
|
12
|
+
*/
|
|
13
|
+
export type BootLoaderOptions = {
|
|
14
|
+
/**
|
|
15
|
+
* Initial status text rendered by the loader (replaced via
|
|
16
|
+
* `window.__bootLoader.status(...)` once the host starts firing phase callbacks).
|
|
17
|
+
*/
|
|
18
|
+
status?: string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Inline SVG markup for an optional brand mark rendered above the progress bar.
|
|
22
|
+
* The mark renders at full opacity with whatever fills the SVG declares, so
|
|
23
|
+
* pass a colour-palette logo for the strongest visual identity. SVGs that use
|
|
24
|
+
* `fill="currentColor"` still inherit the loader's `prefers-color-scheme`
|
|
25
|
+
* text colour. Leave empty/undefined to render only the bar.
|
|
26
|
+
*/
|
|
27
|
+
markSvg?: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Vite plugin that injects a tiny native-DOM "boot loader" into the host app's
|
|
32
|
+
* `index.html`.
|
|
33
|
+
*
|
|
34
|
+
* The loader paints on the very first frame, before any JS bundle is fetched —
|
|
35
|
+
* so the user sees something immediately on cold load instead of staring at a
|
|
36
|
+
* blank document while the compiled module graph is parsed. The brand mark
|
|
37
|
+
* sits centred inside a thin determinate progress ring; both layers are
|
|
38
|
+
* composited so the ring's fill stays visually smooth even while the JS main
|
|
39
|
+
* thread is busy.
|
|
40
|
+
*
|
|
41
|
+
* The host app drives the loader from `main.tsx`:
|
|
42
|
+
*
|
|
43
|
+
* - `window.__bootLoader.status(text)` updates the status line per phase.
|
|
44
|
+
* - `window.__bootLoader.progress(fraction)` grows the determinate ring (0–1).
|
|
45
|
+
* - `window.__bootLoader.dismiss()` removes the loader once React has mounted.
|
|
46
|
+
*
|
|
47
|
+
* Inject order:
|
|
48
|
+
* - `<style>` → `<head>` (parses before any bundled stylesheet).
|
|
49
|
+
* - `<div id="boot-loader">…</div>` → start of `<body>` (sibling of `#root`).
|
|
50
|
+
* - inline `<script>` defining `window.__bootLoader` → start of `<body>`.
|
|
51
|
+
*
|
|
52
|
+
* Keeping the loader as a sibling of `#root` (rather than a child of it) means
|
|
53
|
+
* `createRoot(document.getElementById('root')).render(...)` does not fight the
|
|
54
|
+
* loader for ownership; the host explicitly calls `dismiss()` after the first
|
|
55
|
+
* React commit, which gives a deterministic handoff.
|
|
56
|
+
*
|
|
57
|
+
* Color tokens are exposed as CSS custom properties (`--boot-loader-bg-light`,
|
|
58
|
+
* `--boot-loader-bg-dark`, etc.) defined in `boot-loader.css`, so consumers can
|
|
59
|
+
* override them at the document level without us re-parameterizing this plugin.
|
|
60
|
+
*/
|
|
61
|
+
export const bootLoaderPlugin = ({ status, markSvg }: BootLoaderOptions = {}): Plugin => {
|
|
62
|
+
return {
|
|
63
|
+
name: 'app-framework:boot-loader',
|
|
64
|
+
transformIndexHtml() {
|
|
65
|
+
// The mark slot uses `children: <raw-svg>` (vite emits string children as
|
|
66
|
+
// raw HTML, not text-escaped) so the host can pass an SVG file's contents
|
|
67
|
+
// straight through. The mark and ring are siblings inside `#boot-loader-disc`
|
|
68
|
+
// so CSS grid-stacking can centre the mark inside the ring without the ring's
|
|
69
|
+
// radial-gradient mask clipping the SVG.
|
|
70
|
+
const markChildren = markSvg ? [{ tag: 'div', attrs: { id: 'boot-loader-mark' }, children: markSvg }] : [];
|
|
71
|
+
|
|
72
|
+
return [
|
|
73
|
+
{
|
|
74
|
+
tag: 'style',
|
|
75
|
+
injectTo: 'head',
|
|
76
|
+
children: css,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
tag: 'div',
|
|
80
|
+
injectTo: 'body-prepend',
|
|
81
|
+
attrs: {
|
|
82
|
+
id: 'boot-loader',
|
|
83
|
+
role: 'status',
|
|
84
|
+
'aria-live': 'polite',
|
|
85
|
+
'aria-label': 'Initializing',
|
|
86
|
+
},
|
|
87
|
+
children: [
|
|
88
|
+
{
|
|
89
|
+
tag: 'div',
|
|
90
|
+
attrs: { id: 'boot-loader-disc' },
|
|
91
|
+
children: [
|
|
92
|
+
{ tag: 'div', attrs: { id: 'boot-loader-bar' }, children: '' },
|
|
93
|
+
{ tag: 'div', attrs: { id: 'boot-loader-dot' }, children: '' },
|
|
94
|
+
...markChildren,
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
tag: 'div',
|
|
99
|
+
attrs: { id: 'boot-loader-status' },
|
|
100
|
+
children: status ? [{ tag: 'div', attrs: { class: 'boot-loader-status-line' }, children: status }] : [],
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
tag: 'script',
|
|
106
|
+
injectTo: 'body-prepend',
|
|
107
|
+
children: driverScript,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
};
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Plugin as VitePlugin } from 'vite';
|
|
6
|
+
|
|
7
|
+
import { type BuildMeta, ENTRY_FILENAME, MANIFEST_ASSET_NAME, serializeManifest } from '../manifest';
|
|
8
|
+
import { DEFAULT_PACKAGES, isSharedPackage } from '../packages';
|
|
9
|
+
|
|
10
|
+
export { ENTRY_FILENAME, MANIFEST_ASSET_NAME, serializeManifest };
|
|
11
|
+
export type { BuildMeta };
|
|
12
|
+
|
|
13
|
+
const JSX_DEV_RUNTIME = 'react/jsx-dev-runtime';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Whether an import should be externalized by the plugin bundle.
|
|
17
|
+
* Uses the shared-package predicate directly so plugins automatically pick up any
|
|
18
|
+
* new `@dxos/*` (non-plugin) package the host provides, without a code change here.
|
|
19
|
+
*/
|
|
20
|
+
const isExternal = (id: string) => id !== JSX_DEV_RUNTIME && isSharedPackage(id);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Banner injected at the top of every plugin bundle.
|
|
24
|
+
*
|
|
25
|
+
* Why: rolldown emits ESM `import` for externalized deps, but when a *bundled* module
|
|
26
|
+
* is CJS and contains `require('react')` (or any other external), rolldown keeps the
|
|
27
|
+
* `require(...)` call in the output and relies on a runtime `require` function. The
|
|
28
|
+
* browser doesn't have `require`, so rolldown's fallback shim throws:
|
|
29
|
+
* `Calling `require` for "react" in an environment that doesn't expose the `require`
|
|
30
|
+
* function`.
|
|
31
|
+
*
|
|
32
|
+
* The full dependency graphs of non-trivial plugins unavoidably drag in CJS-only
|
|
33
|
+
* helpers (`use-sync-external-store` via xstate / zustand / preact-signals / … ),
|
|
34
|
+
* and waiting for every one of those packages to ship ESM isn't realistic. Instead
|
|
35
|
+
* we install a tiny module-local `require` at the top of the bundle that looks up
|
|
36
|
+
* a handful of well-known host-provided modules by name and returns their already
|
|
37
|
+
* ESM-imported namespaces. Rolldown's own shim honours an existing `require`
|
|
38
|
+
* before falling through to the throw path, so this entirely removes the runtime
|
|
39
|
+
* error without changing how externalization itself works.
|
|
40
|
+
*
|
|
41
|
+
* Keep the list aligned with the externals that CJS code actually reaches for;
|
|
42
|
+
* adding entries here is safe (unused imports get tree-shaken), but the list is
|
|
43
|
+
* deliberately small to keep the banner noise-free.
|
|
44
|
+
*/
|
|
45
|
+
const REQUIRE_SHIM_BANNER = [
|
|
46
|
+
'// --- composer-plugin: CJS require shim ---',
|
|
47
|
+
'// See @dxos/app-framework/vite-plugin/composer-plugin.ts for rationale.',
|
|
48
|
+
"import * as __composerReact from 'react';",
|
|
49
|
+
"import * as __composerReactDom from 'react-dom';",
|
|
50
|
+
"import * as __composerReactJsxRuntime from 'react/jsx-runtime';",
|
|
51
|
+
'const __composerRequireShim = new Map([',
|
|
52
|
+
" ['react', __composerReact.default ?? __composerReact],",
|
|
53
|
+
" ['react-dom', __composerReactDom.default ?? __composerReactDom],",
|
|
54
|
+
" ['react/jsx-runtime', __composerReactJsxRuntime],",
|
|
55
|
+
']);',
|
|
56
|
+
"// Module-local binding: rolldown's CJS fallback does a `typeof require` check",
|
|
57
|
+
'// and uses whichever `require` is in lexical scope. Declaring this as `const`',
|
|
58
|
+
"// (instead of `globalThis.require ??=`) keeps each bundle's shim isolated from",
|
|
59
|
+
'// the host page and from other plugins sharing the window.',
|
|
60
|
+
'const require = (id) => {',
|
|
61
|
+
' if (__composerRequireShim.has(id)) return __composerRequireShim.get(id);',
|
|
62
|
+
" throw new Error('composer-plugin: unsupported CJS require at runtime: ' + id);",
|
|
63
|
+
'};',
|
|
64
|
+
'// --- end CJS require shim ---',
|
|
65
|
+
].join('\n');
|
|
66
|
+
|
|
67
|
+
export type ComposerPluginOptions = {
|
|
68
|
+
/** Entry point for the plugin bundle. Defaults to `src/plugin.tsx`. */
|
|
69
|
+
entry?: string;
|
|
70
|
+
/** Dev server port. Defaults to `3967`. */
|
|
71
|
+
port?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Plugin metadata. When provided, a `manifest.json` asset is emitted alongside the bundle
|
|
74
|
+
* listing every emitted file. The host fetches this manifest at install time and persists
|
|
75
|
+
* the declared assets in its offline cache so the plugin works without network. The bundle's
|
|
76
|
+
* entry module is always written as {@link ENTRY_FILENAME} (`index.mjs`).
|
|
77
|
+
*/
|
|
78
|
+
meta?: BuildMeta;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Vite plugin for **external Composer plugin projects**. Configures the build to produce
|
|
83
|
+
* an ESM bundle that externalizes all framework dependencies, which the Composer host app
|
|
84
|
+
* provides at runtime via import map.
|
|
85
|
+
*
|
|
86
|
+
* Handles:
|
|
87
|
+
* 1. Build config — lib mode entry point, ES format output, rollup externals, code-split chunks.
|
|
88
|
+
* 2. Dev externalization — marks shared deps as external during `vite serve` and strips
|
|
89
|
+
* the `/@id/` prefix that Vite's import analysis adds to external bare specifiers.
|
|
90
|
+
* 3. JSX dev runtime shim — bridges `react/jsx-dev-runtime` (used by React refresh in dev)
|
|
91
|
+
* to `react/jsx-runtime` (which is what the externalized React provides).
|
|
92
|
+
* 4. Manifest emit — when `meta` is supplied, writes `manifest.json` next to the bundled
|
|
93
|
+
* module listing every emitted asset (entry, CSS, chunks, etc.) so the host can eagerly
|
|
94
|
+
* cache them for offline use.
|
|
95
|
+
*/
|
|
96
|
+
export const composerPlugin = (options?: ComposerPluginOptions): VitePlugin[] => {
|
|
97
|
+
const entry = options?.entry ?? 'src/plugin.tsx';
|
|
98
|
+
const port = options?.port ?? 3967;
|
|
99
|
+
const meta = options?.meta;
|
|
100
|
+
const resolved = new Set<string>();
|
|
101
|
+
let base = '/';
|
|
102
|
+
|
|
103
|
+
const plugins: VitePlugin[] = [
|
|
104
|
+
// Configure vite for library-mode builds with externalized deps.
|
|
105
|
+
{
|
|
106
|
+
name: 'composer-plugin',
|
|
107
|
+
config: () => ({
|
|
108
|
+
server: {
|
|
109
|
+
port,
|
|
110
|
+
// Allow the Composer host (different origin) to dynamically import plugin modules.
|
|
111
|
+
cors: true,
|
|
112
|
+
},
|
|
113
|
+
preview: { port },
|
|
114
|
+
build: {
|
|
115
|
+
sourcemap: true,
|
|
116
|
+
// Transitively-bundled WASM modules (automerge, tiktoken, …) emit top-level
|
|
117
|
+
// await; `esnext` lets rolldown pass that through without an explicit polyfill.
|
|
118
|
+
target: 'esnext',
|
|
119
|
+
lib: {
|
|
120
|
+
entry,
|
|
121
|
+
formats: ['es'],
|
|
122
|
+
fileName: () => ENTRY_FILENAME,
|
|
123
|
+
},
|
|
124
|
+
rolldownOptions: {
|
|
125
|
+
external: (id: string) => isExternal(id),
|
|
126
|
+
output: {
|
|
127
|
+
chunkFileNames: 'chunks/[name]-[hash].js',
|
|
128
|
+
assetFileNames: 'assets/[name]-[hash][extname]',
|
|
129
|
+
// Install the CJS require shim at the top of plugin.mjs so transitively
|
|
130
|
+
// bundled CJS helpers (that call `require('react')` et al. at runtime) can
|
|
131
|
+
// resolve against the host-provided externals instead of throwing.
|
|
132
|
+
banner: REQUIRE_SHIM_BANNER,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
}),
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
// Dev-time externalization.
|
|
140
|
+
// Vite's dev server doesn't use rollup externals, so we need to handle it manually.
|
|
141
|
+
// We intercept imports of shared deps at resolve time, mark them external, and then
|
|
142
|
+
// strip the `/@id/` prefix that Vite's import analysis injects for external modules.
|
|
143
|
+
{
|
|
144
|
+
name: 'composer-plugin:externalize',
|
|
145
|
+
enforce: 'pre',
|
|
146
|
+
apply: 'serve',
|
|
147
|
+
// Exclude shared packages from Vite's dependency pre-bundling.
|
|
148
|
+
config: () => ({
|
|
149
|
+
optimizeDeps: {
|
|
150
|
+
exclude: DEFAULT_PACKAGES,
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
// Mark shared deps as external so Vite doesn't try to bundle them.
|
|
154
|
+
resolveId: (id) => {
|
|
155
|
+
if (isExternal(id)) {
|
|
156
|
+
resolved.add(id);
|
|
157
|
+
return { id, external: true };
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
// Return a stub for any externalized module that Vite tries to load directly.
|
|
161
|
+
load: (id) => {
|
|
162
|
+
if (resolved.has(id)) {
|
|
163
|
+
return { code: 'export default {};' };
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
// After all plugins are resolved, inject a late-stage transform plugin that strips
|
|
167
|
+
// the `/@id/` prefix from externalized bare specifiers in the output.
|
|
168
|
+
// This must run after Vite's internal import analysis which rewrites bare specifiers.
|
|
169
|
+
configResolved: (config) => {
|
|
170
|
+
base = config.base ?? '/';
|
|
171
|
+
(config.plugins as VitePlugin[]).push({
|
|
172
|
+
name: 'composer-plugin:strip-prefix',
|
|
173
|
+
transform: (code: string) => {
|
|
174
|
+
if (resolved.size === 0) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const escaped = [...resolved].map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
|
|
178
|
+
const pattern = new RegExp(`${base}@id/(${escaped})`, 'g');
|
|
179
|
+
if (pattern.test(code)) {
|
|
180
|
+
return code.replace(pattern, (_: string, dep: string) => dep);
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
// JSX dev runtime shim.
|
|
188
|
+
// React refresh (used by @vitejs/plugin-react) imports from `react/jsx-dev-runtime`,
|
|
189
|
+
// but the externalized React only exposes `react/jsx-runtime`. This virtual module
|
|
190
|
+
// bridges the gap by re-exporting jsx-runtime's functions under jsx-dev-runtime's API.
|
|
191
|
+
{
|
|
192
|
+
name: 'composer-plugin:jsx-dev-shim',
|
|
193
|
+
enforce: 'pre',
|
|
194
|
+
apply: 'serve',
|
|
195
|
+
resolveId: (id) => (id === JSX_DEV_RUNTIME ? `\0${JSX_DEV_RUNTIME}` : undefined),
|
|
196
|
+
load: (id) =>
|
|
197
|
+
id === `\0${JSX_DEV_RUNTIME}`
|
|
198
|
+
? [
|
|
199
|
+
'import { jsx, jsxs, Fragment } from "react/jsx-runtime";',
|
|
200
|
+
'export { Fragment };',
|
|
201
|
+
'export function jsxDEV(type, props, key, isStaticChildren) {',
|
|
202
|
+
' return isStaticChildren ? jsxs(type, props, key) : jsx(type, props, key);',
|
|
203
|
+
'}',
|
|
204
|
+
].join('\n')
|
|
205
|
+
: undefined,
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
// React Refresh preamble stub.
|
|
209
|
+
//
|
|
210
|
+
// @vitejs/plugin-react's JSX transform prepends a runtime check to every module:
|
|
211
|
+
// if (!window.$RefreshReg$) throw new Error("@vitejs/plugin-react can't detect preamble…");
|
|
212
|
+
// In a normal single-origin app, vite injects a `<script type="module">` preamble
|
|
213
|
+
// into `index.html` that sets up `$RefreshReg$` / `$RefreshSig$` on `window` before any
|
|
214
|
+
// app code runs. When a community plugin is dev-served at its own origin and then
|
|
215
|
+
// dynamic-imported into the Composer host at a different origin, the host's window
|
|
216
|
+
// never receives that preamble, so every JSX module throws on first import.
|
|
217
|
+
//
|
|
218
|
+
// Inject a no-op refresh shim on the host's window from the plugin's entrypoint: fast-
|
|
219
|
+
// refresh itself doesn't work cross-origin anyway, so silencing the check lets the
|
|
220
|
+
// plugin load and ordinary page reloads take care of picking up edits. Production
|
|
221
|
+
// builds are untouched (`apply: 'serve'`).
|
|
222
|
+
{
|
|
223
|
+
name: 'composer-plugin:react-refresh-shim',
|
|
224
|
+
enforce: 'pre',
|
|
225
|
+
apply: 'serve',
|
|
226
|
+
transform(code, id) {
|
|
227
|
+
// Only patch the plugin entrypoint (an absolute path ending in the configured entry).
|
|
228
|
+
// Matching by suffix keeps us from prepending the shim to every transformed module,
|
|
229
|
+
// which would both bloat the output and defeat vite's caching.
|
|
230
|
+
if (!id.endsWith(entry.replace(/^\.?\//, '/'))) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const shim = [
|
|
234
|
+
'// composer-plugin: no-op React Refresh shim so cross-origin plugin modules',
|
|
235
|
+
"// don't throw the @vitejs/plugin-react preamble check at dynamic-import time.",
|
|
236
|
+
'if (typeof window !== "undefined") {',
|
|
237
|
+
' window.$RefreshReg$ = window.$RefreshReg$ || (() => {});',
|
|
238
|
+
' window.$RefreshSig$ = window.$RefreshSig$ || (() => (type) => type);',
|
|
239
|
+
' window.__vite_plugin_react_preamble_installed__ = true;',
|
|
240
|
+
'}',
|
|
241
|
+
'',
|
|
242
|
+
].join('\n');
|
|
243
|
+
return { code: shim + code, map: null };
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
|
|
248
|
+
if (meta) {
|
|
249
|
+
// Emit `manifest.json` alongside the built module listing every emitted asset, so the
|
|
250
|
+
// dist directory can be uploaded as-is to a GitHub Release for the DXOS community
|
|
251
|
+
// registry to pick up. The host loader fetches this file at install time and eagerly
|
|
252
|
+
// caches every listed asset for offline use.
|
|
253
|
+
plugins.push({
|
|
254
|
+
name: 'composer-plugin:emit-manifest',
|
|
255
|
+
apply: 'build',
|
|
256
|
+
// `enforce: 'post'` is load-bearing: vite's CSS extraction plugin emits sibling
|
|
257
|
+
// `.css` assets in its own `generateBundle` hook. Without `post`, ours runs first
|
|
258
|
+
// and sees only the JS chunks — the manifest then omits CSS, so the host can't
|
|
259
|
+
// inject `<link>` tags for the plugin's stylesheet at install time.
|
|
260
|
+
enforce: 'post',
|
|
261
|
+
generateBundle(_options, bundle) {
|
|
262
|
+
// Source maps are large and only fetched when devtools opens — exclude them
|
|
263
|
+
// from the manifest so the host doesn't precache megabytes of debug data.
|
|
264
|
+
const assets = Object.keys(bundle)
|
|
265
|
+
.filter((name) => name !== MANIFEST_ASSET_NAME && !name.endsWith('.map'))
|
|
266
|
+
.sort();
|
|
267
|
+
this.emitFile({
|
|
268
|
+
type: 'asset',
|
|
269
|
+
fileName: MANIFEST_ASSET_NAME,
|
|
270
|
+
source: serializeManifest(meta, { assets }),
|
|
271
|
+
});
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return plugins;
|
|
277
|
+
};
|