@dxos/app-framework 0.8.4-main.d05539e30a → 0.8.4-main.d9fc60f731
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-K5XIVCQU.mjs → capability-JCUNWZ66.mjs} +7 -7
- package/dist/lib/browser/{chunk-5AHASNDW.mjs → chunk-2ZIYRDAF.mjs} +1 -1
- package/dist/lib/browser/{chunk-5AHASNDW.mjs.map → chunk-2ZIYRDAF.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-QLML5QFJ.mjs → chunk-7MBI66M7.mjs} +12 -6
- package/dist/lib/browser/chunk-7MBI66M7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-VJ5PFAWC.mjs → chunk-BMLCIFZW.mjs} +37 -16
- package/dist/lib/browser/chunk-BMLCIFZW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-SLX73WRZ.mjs → chunk-DC3WRPBV.mjs} +14 -5
- package/dist/lib/browser/chunk-DC3WRPBV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-BRK6GYNB.mjs → chunk-E5DTDNDY.mjs} +20 -19
- package/dist/lib/browser/chunk-E5DTDNDY.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KLHQNYJ2.mjs → chunk-KZUDO43J.mjs} +2 -2
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-UVTGHZQF.mjs → chunk-VBG5F5UF.mjs} +51 -88
- package/dist/lib/browser/chunk-VBG5F5UF.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +5 -5
- package/dist/lib/browser/common/activation-events.mjs +3 -3
- package/dist/lib/browser/common/capabilities.mjs +4 -4
- package/dist/lib/browser/core/plugin-manager.mjs +2 -2
- package/dist/lib/browser/core/plugin.mjs +3 -1
- package/dist/lib/browser/core/url-loader.mjs +2 -2
- package/dist/lib/browser/index.mjs +13 -14
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{process-manager-capability-JIWLN7SU.mjs → process-manager-capability-4FUA4TRP.mjs} +6 -6
- package/dist/lib/browser/testing/index.mjs +11 -10
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/testing/react.mjs +6 -6
- package/dist/lib/browser/ui/index.mjs +7 -9
- package/dist/lib/node-esm/{capability-RLKFFLTB.mjs → capability-7TCQK7ZP.mjs} +7 -7
- package/dist/lib/node-esm/{chunk-SFYCO3PT.mjs → chunk-4BX2AE47.mjs} +37 -16
- package/dist/lib/node-esm/chunk-4BX2AE47.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LJNUFNDO.mjs → chunk-GEWHMHM7.mjs} +12 -6
- package/dist/lib/node-esm/chunk-GEWHMHM7.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-BYHYYJZH.mjs → chunk-KSH4OVMY.mjs} +20 -19
- package/dist/lib/node-esm/chunk-KSH4OVMY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PW2VYGOS.mjs → chunk-QBUGLR4H.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-PW2VYGOS.mjs.map → chunk-QBUGLR4H.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-42UNAKYO.mjs → chunk-XGBUKRCK.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-6S45OMUP.mjs → chunk-XIGPWXCQ.mjs} +14 -5
- package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JNT72ZCN.mjs → chunk-Y7JKXNDU.mjs} +51 -88
- package/dist/lib/node-esm/chunk-Y7JKXNDU.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +5 -5
- package/dist/lib/node-esm/common/activation-events.mjs +3 -3
- package/dist/lib/node-esm/common/capabilities.mjs +4 -4
- package/dist/lib/node-esm/core/plugin-manager.mjs +2 -2
- package/dist/lib/node-esm/core/plugin.mjs +3 -1
- package/dist/lib/node-esm/core/url-loader.mjs +2 -2
- package/dist/lib/node-esm/index.mjs +13 -14
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{process-manager-capability-PHKLO2BL.mjs → process-manager-capability-F23D62RN.mjs} +6 -6
- package/dist/lib/node-esm/testing/index.mjs +11 -10
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/testing/react.mjs +6 -6
- package/dist/lib/node-esm/ui/index.mjs +7 -9
- package/dist/plugin/node-esm/index.mjs +155 -77
- package/dist/plugin/node-esm/index.mjs.map +4 -4
- package/dist/plugin/node-esm/meta.json +1 -1
- package/dist/types/src/common/capabilities.d.ts +1 -1
- package/dist/types/src/common/index.d.ts +0 -1
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/translations.d.ts +1 -1
- package/dist/types/src/core/capability-manager.d.ts +4 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin.d.ts +33 -6
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +15 -1
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +1 -1
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/meta.d.ts +1 -1
- package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.d.ts +34 -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.map +1 -1
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -1
- package/dist/types/src/ui/components/index.d.ts +0 -1
- package/dist/types/src/ui/components/index.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useApp.d.ts +1 -7
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +6 -0
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -1
- package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +26 -23
- package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -1
- package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +40 -35
- package/src/common/capabilities.ts +1 -1
- package/src/common/index.ts +0 -1
- package/src/common/translations.ts +1 -1
- package/src/core/capability-manager.test.ts +3 -0
- package/src/core/capability-manager.ts +22 -1
- package/src/core/plugin-manager.test.ts +51 -21
- package/src/core/plugin-manager.ts +10 -5
- package/src/core/plugin.ts +44 -8
- package/src/core/url-loader.test.ts +2 -1
- package/src/plugin-process-manager/history/history-tracker.test.ts +39 -60
- package/src/plugin-process-manager/history/history-tracker.ts +32 -16
- package/src/plugin-process-manager/history/undo-mapping.ts +1 -1
- package/src/plugin-process-manager/history/undo-registry.test.ts +3 -1
- package/src/plugin-process-manager/meta.ts +6 -4
- package/src/plugin-process-manager/testing.ts +6 -5
- package/src/testing/react.test.tsx +3 -1
- package/src/testing/withPluginManager.tsx +4 -3
- package/src/ui/components/App/App.stories.tsx +9 -11
- package/src/ui/components/App/App.tsx +80 -17
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +9 -14
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +1 -1
- package/src/ui/components/Surface/SurfaceComponent.tsx +1 -1
- package/src/ui/components/Surface/types.test.ts +2 -2
- package/src/ui/components/Surface/types.ts +21 -0
- package/src/ui/components/index.ts +0 -1
- package/src/ui/hooks/useApp.test.tsx +3 -1
- package/src/ui/hooks/useApp.tsx +4 -18
- package/src/ui/hooks/useCapabilities.ts +1 -0
- package/src/ui/hooks/useProcessManagerRuntime.ts +12 -2
- package/src/vite-plugin/boot-loader/BootLoader.solid-stories.tsx +198 -0
- package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
- package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
- package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
- package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
- package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
- package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
- package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
- package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
- package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
- package/src/vite-plugin/boot-loader/loader.ts +133 -63
- package/src/vite-plugin/manifest.test.ts +19 -10
- package/src/vite-plugin/manifest.ts +9 -3
- package/tsconfig.json +6 -7
- package/dist/lib/browser/chunk-BRK6GYNB.mjs.map +0 -7
- package/dist/lib/browser/chunk-KFDF7KR3.mjs +0 -42
- package/dist/lib/browser/chunk-KFDF7KR3.mjs.map +0 -7
- package/dist/lib/browser/chunk-QLML5QFJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-SLX73WRZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-UVTGHZQF.mjs.map +0 -7
- package/dist/lib/browser/chunk-VJ5PFAWC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6S45OMUP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BYHYYJZH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JNT72ZCN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LJNUFNDO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OUEMWPIW.mjs +0 -43
- package/dist/lib/node-esm/chunk-OUEMWPIW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SFYCO3PT.mjs.map +0 -7
- package/dist/types/src/common/operations.d.ts +0 -19
- package/dist/types/src/common/operations.d.ts.map +0 -1
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +0 -64
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +0 -1
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +0 -19
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +0 -1
- package/dist/types/src/ui/components/Placeholder/index.d.ts +0 -2
- package/dist/types/src/ui/components/Placeholder/index.d.ts.map +0 -1
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +0 -34
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +0 -1
- package/src/common/operations.ts +0 -35
- package/src/ui/components/Placeholder/Placeholder.stories.tsx +0 -77
- package/src/ui/components/Placeholder/Placeholder.tsx +0 -155
- package/src/ui/components/Placeholder/index.ts +0 -5
- package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +0 -270
- package/src/vite-plugin/boot-loader/boot-loader.css +0 -320
- package/src/vite-plugin/boot-loader/boot-loader.js +0 -325
- /package/dist/lib/browser/{capability-K5XIVCQU.mjs.map → capability-JCUNWZ66.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-KLHQNYJ2.mjs.map → chunk-KZUDO43J.mjs.map} +0 -0
- /package/dist/lib/browser/{process-manager-capability-JIWLN7SU.mjs.map → process-manager-capability-4FUA4TRP.mjs.map} +0 -0
- /package/dist/lib/node-esm/{capability-RLKFFLTB.mjs.map → capability-7TCQK7ZP.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-42UNAKYO.mjs.map → chunk-XGBUKRCK.mjs.map} +0 -0
- /package/dist/lib/node-esm/{process-manager-capability-PHKLO2BL.mjs.map → process-manager-capability-F23D62RN.mjs.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/testing/harness.ts", "../../../../src/testing/service.ts", "../../../../src/testing/withPluginManager.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { type Registry } from '@effect-atom/atom-react';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as PubSub from 'effect/PubSub';\nimport * as Queue from 'effect/Queue';\n\nimport { type Operation } from '@dxos/compute';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { ActivationEvent, type Capability, type CapabilityManager, type Plugin, PluginManager } from '../core';\n\nexport type TestAppOptions = {\n /**\n * Plugins to register. Plugins whose `meta.tags` includes `'system'` are treated as core\n * (force-enabled). For test convenience, plugins without a `'system'` tag are enabled by\n * default unless `enabled` is provided.\n */\n plugins: Plugin.Plugin[];\n /** Plugin ids that are enabled by default in addition to core. Defaults to all non-system plugin ids. */\n enabled?: string[];\n /** Additional activation events fired alongside SetupReactSurface. */\n setupEvents?: ActivationEvent.ActivationEvent[];\n /**\n * Whether to automatically fire SetupReactSurface + Startup during setup.\n * Defaults to true.\n */\n autoStart?: boolean;\n /**\n * Whether to register the PluginManager + AtomRegistry framework capabilities.\n * Defaults to true.\n */\n registerFrameworkCapabilities?: boolean;\n};\n\n/**\n * A running plugin manager plus helpers for driving it in tests.\n */\nexport interface TestHarness {\n readonly manager: PluginManager.PluginManager;\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n /** Activate the given event. Equivalent to `manager.activate(event)`. */\n fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;\n /** Re-activate all modules that were activated by the given event. */\n reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;\n\n /** Returns the first contributed capability for the given interface. Throws if none are present. */\n get<T>(iface: Capability.InterfaceDef<T>): T;\n /** Returns all contributed capabilities for the given interface. */\n getAll<T>(iface: Capability.InterfaceDef<T>): T[];\n /** Waits until at least one capability is contributed for the given interface. */\n waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T>;\n /** Waits until the given activation event has completed. */\n waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void>;\n\n /** Invokes an operation through the `Capabilities.OperationInvoker` capability. */\n invoke<I, O>(op: Operation.Definition<I, O>, ...args: void extends I ? [input?: I] : [input: I]): Promise<O>;\n\n /**\n * Waits for `Capabilities.ProcessManagerRuntime` and runs the given effect on it.\n * Convenience around `waitForCapability(ProcessManagerRuntime).runPromise(effect)`.\n */\n runPromise<A, E>(\n effect: Effect.Effect<A, E, Capabilities.ProcessManagerRuntimeServices>,\n options?: { readonly timeout?: number; readonly signal?: AbortSignal },\n ): Promise<A>;\n\n enable(id: string): Promise<boolean>;\n disable(id: string): Promise<boolean>;\n\n /** Shuts down the underlying plugin manager. */\n dispose(): Promise<void>;\n\n /** Async-disposable support so tests can use `await using harness = ...`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5_000;\n\n/**\n * Creates a TestHarness with the same bootstrap sequence that `useApp` performs,\n * minus the React provider tree.\n *\n * For Node-only tests, this is enough to fire activation events, read\n * capabilities, and invoke operations.\n *\n * For React tests, pass the returned harness to `render` or `renderSurface`\n * from `@dxos/app-framework/testing-react`.\n */\nexport const createTestApp = async (opts: TestAppOptions): Promise<TestHarness> => {\n const {\n plugins,\n enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map((plugin) => plugin.meta.id),\n setupEvents = [],\n autoStart = true,\n registerFrameworkCapabilities = true,\n } = opts;\n\n const pluginLoader = (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\n const manager = PluginManager.make({ pluginLoader, plugins, enabled });\n\n if (registerFrameworkCapabilities) {\n manager.capabilities.contribute({\n interface: Capabilities.PluginManager,\n implementation: manager,\n module: 'org.dxos.app-framework.plugin-manager',\n });\n manager.capabilities.contribute({\n interface: Capabilities.AtomRegistry,\n implementation: manager.registry,\n module: 'org.dxos.app-framework.atom-registry',\n });\n }\n\n if (autoStart) {\n try {\n await runAndForwardErrors(\n Effect.all([\n ...setupEvents.map((event) => manager.activate(event)),\n manager.activate(ActivationEvents.SetupReactSurface),\n manager.activate(ActivationEvents.Startup),\n ]),\n );\n } catch (err) {\n await runAndForwardErrors(manager.shutdown()).catch(() => undefined);\n throw err;\n }\n }\n\n return new TestHarnessImpl(manager);\n};\n\nclass TestHarnessImpl implements TestHarness {\n constructor(readonly manager: PluginManager.PluginManager) {}\n\n get capabilities(): CapabilityManager.CapabilityManager {\n return this.manager.capabilities;\n }\n\n get registry(): Registry.Registry {\n return this.manager.registry;\n }\n\n fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {\n return runAndForwardErrors(this.manager.activate(event));\n }\n\n reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {\n return runAndForwardErrors(this.manager.reset(event));\n }\n\n get<T>(iface: Capability.InterfaceDef<T>): T {\n return this.manager.capabilities.get(iface);\n }\n\n getAll<T>(iface: Capability.InterfaceDef<T>): T[] {\n return this.manager.capabilities.getAll(iface);\n }\n\n waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n return runAndForwardErrors(\n this.manager.capabilities.waitFor(iface).pipe(\n Effect.timeoutFail({\n duration: Duration.millis(timeout),\n onTimeout: () => timeoutError(iface.identifier),\n }),\n ),\n );\n }\n\n waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void> {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n\n const program = Effect.gen(this, function* () {\n const queue = yield* PubSub.subscribe(this.manager.activation);\n // Re-check after subscribing to avoid a race where the event fires\n // between the caller invoking this and the subscription being installed.\n if (this.manager.getEventsFired().includes(key)) {\n return;\n }\n while (true) {\n const message = yield* Queue.take(queue);\n if (message.event === key && message.state === 'activated') {\n return;\n }\n }\n }).pipe(\n Effect.scoped,\n Effect.timeoutFail({\n duration: Duration.millis(timeout),\n onTimeout: () => timeoutError(key),\n }),\n );\n\n return runAndForwardErrors(program);\n }\n\n async invoke<I, O>(op: Operation.Definition<I, O>, ...args: [input?: I]): Promise<O> {\n const invoker = await this.waitForCapability(Capabilities.OperationInvoker);\n const result = await invoker.invokePromise(op as any, ...(args as [any]));\n if (result.error) {\n throw result.error;\n }\n return result.data as O;\n }\n\n async runPromise<A, E>(\n effect: Effect.Effect<A, E, Capabilities.ProcessManagerRuntimeServices>,\n options?: { readonly timeout?: number; readonly signal?: AbortSignal },\n ): Promise<A> {\n const runtime = await this.waitForCapability(Capabilities.ProcessManagerRuntime, { timeout: options?.timeout });\n return runtime.runPromise(effect, options?.signal ? { signal: options.signal } : undefined);\n }\n\n enable(id: string): Promise<boolean> {\n return runAndForwardErrors(this.manager.enable(id));\n }\n\n disable(id: string): Promise<boolean> {\n return runAndForwardErrors(this.manager.disable(id));\n }\n\n async dispose(): Promise<void> {\n await runAndForwardErrors(this.manager.shutdown());\n }\n\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n}\n\nconst timeoutError = (id: string) => new Error(`Timed out waiting for ${id}`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { Plugin, PluginManager } from '../core';\n\n/**\n * Creates a Plugin.Service layer from a list of plugins.\n * This is primarily used for testing.\n */\nexport const fromPlugins = (plugins: Plugin.Plugin[]) =>\n Layer.effect(\n Plugin.Service,\n Effect.gen(function* () {\n // TODO(wittjosiah): Try to dedupe logic between here, createCliApp and useApp.\n\n const pluginLoader = (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\n const manager = PluginManager.make({\n pluginLoader,\n plugins,\n enabled: plugins.map((plugin) => plugin.meta.id),\n });\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 yield* manager.activate(ActivationEvents.Startup);\n\n return manager;\n }),\n );\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Decorator, type StoryContext } from '@storybook/react';\nimport * as Effect from 'effect/Effect';\nimport React, { useEffect, useState } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { useAsyncEffect } from '@dxos/react-hooks';\nimport { type MaybeProvider, getProviderValue } from '@dxos/util';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';\nimport { type UseAppOptions, useApp } from '../ui';\n\n/**\n * @internal\n */\nexport const setupPluginManager = ({\n capabilities,\n plugins = [],\n ...options\n}: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {\n // Auto-enable every non-system plugin so stories don't have to spell out\n // enablement. System-tagged plugins are force-enabled by the manager.\n const enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map(({ meta }) => meta.id);\n const pluginManager = PluginManager.make({\n pluginLoader: () => raise(new Error('Not implemented')),\n plugins: [StoryPlugin, ...plugins],\n enabled,\n ...options,\n });\n\n if (capabilities) {\n getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {\n pluginManager.capabilities.contribute({\n interface: capability.interface,\n implementation: capability.implementation,\n module: 'story',\n });\n });\n }\n\n return pluginManager;\n};\n\ntype ManagedPluginManagerState = {\n fireEvents?: (ActivationEvent.ActivationEvent | string)[];\n pluginManager: PluginManager.PluginManager;\n setupEvents?: ActivationEvent.ActivationEvent[];\n storyId: string;\n};\n\nexport type WithPluginManagerOptions = UseAppOptions & {\n /** @deprecated */\n capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;\n /** @deprecated */\n fireEvents?: (ActivationEvent.ActivationEvent | string)[];\n};\n\nexport type WithPluginManagerInitializer<Args = void> =\n | WithPluginManagerOptions\n | ((context: StoryContext<Args>) => WithPluginManagerOptions);\n\n/**\n * Wraps a story with a plugin manager.\n * NOTE: This builds up and tears down the plugin manager on every render.\n */\nexport const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {\n return (Story, context) => {\n const storyId = context.id;\n const options = typeof init === 'function' ? init(context as any) : init;\n const [managerState, setManagerState] = useState<ManagedPluginManagerState>();\n\n // Storybook replaces the full context object often, so key manager ownership by story id.\n useEffect(() => {\n const pluginManager = setupPluginManager(options);\n const capability = Capability.contributes(Capabilities.ReactRoot, {\n id: storyId,\n root: () => <Story />,\n });\n\n pluginManager.capabilities.contribute({\n ...capability,\n module: 'org.dxos.app-framework.with-plugin-manager',\n });\n\n setManagerState({\n pluginManager,\n setupEvents: options.setupEvents,\n fireEvents: options.fireEvents,\n storyId,\n });\n\n return () => {\n pluginManager.capabilities.remove(capability.interface, capability.implementation);\n void runAndForwardErrors(pluginManager.shutdown());\n };\n }, [storyId, init]);\n\n // Avoid mounting useApp with a stale manager from the previous story.\n if (!managerState || managerState.storyId !== storyId) {\n return <></>;\n }\n\n return <WithPluginManagerApp {...managerState} />;\n };\n};\n\nconst WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {\n // Fire deprecated events only after the effect-owned manager for this story exists.\n useAsyncEffect(async () => {\n await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);\n }, [fireEvents, pluginManager, storyId]);\n\n const App = useApp({ pluginManager, setupEvents });\n return <App />;\n};\n\nconst storyMeta = {\n id: 'org.dxos.app-framework.story',\n name: 'Story',\n tags: ['system'],\n};\n\n// No-op plugin to ensure there exists at least one plugin for the startup event.\n// This is necessary because `createApp` expects the startup event to complete before the app is ready.\nconst StoryPlugin = Plugin.define(storyMeta).pipe(\n Plugin.addModule({\n id: 'Story',\n activatesOn: ActivationEvents.Startup,\n activate: () => Effect.succeed([]),\n }),\n Plugin.make,\n)();\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,YAAYA,cAAc;AAC1B,YAAYC,YAAY;AACxB,YAAYC,YAAY;AACxB,YAAYC,WAAW;AAGvB,SAASC,2BAA2B;AACpC,SAASC,iBAAiB;AAwE1B,IAAA,eAAMC;;AAqBEC,IAAAA,gBACJC,OAAOC,SAAK;UACV,SAAMC,UAASC,QAAY,OAAED,CAAAA,EAAAA,KAAWA,MAAOE,CAAAA,KAAO,MAAKC,SAAAA,QAAAA,CAAAA,EAAAA,IAAAA,CAAAA,WAAAA,OAAAA,KAAAA,EAAAA,GAAAA,cAAAA,CAAAA,GAAAA,YAAAA,MAAAA,gCAAAA,KAAAA,IAAAA;uBACjDH,CAAAA,OAAS,YAAA,MAAA;AACnB,UAAA,SAAO,QAAA,KAAA,CAAAA,YAAAA,QAAA,KAAA,OAAA,EAAA;cAAEA,QAAAA,qBAAAA,EAAAA,IAAAA,EAAAA,YAAAA,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,QAAAA,GAAAA,CAAAA,UAAAA,2BAAAA,EAAAA,CAAAA;AAAO,WAAA;MAClB;IAEII;EAA+BP,CAAAA;QAAcI,UAAAA,uBAAAA,KAAAA;IAASI;IAAQ;IAEhEC;;qCAEwBC;YACxBC,aAAgBJ,WAAAA;MAChBK,WAAQ,qBAAA;MACV,gBAAA;MACAL,QAAQM;;YAENF,aAAgBJ,WAAQO;MACxBF,WAAQ,qBAAA;MACV,gBAAA,QAAA;MACF,QAAA;IAEIG,CAAAA;;iBAEMC;;YAGFT,oBAAiBU,WAAAA;QACjBV,GAAAA,YAAQW,IAASD,CAAAA,UAAAA,QAAiBE,SAAO,KAAA,CAAA;QAC1C,QAAA,SAAA,0BAAA,iBAAA;QAEH,QAAY,SAAA,0BAAA,OAAA;MACZ,CAAA,CAAA;aACA,KAAMC;AACR,YAAA,oBAAA,QAAA,SAAA,CAAA,EAAA,MAAA,MAAA,MAAA;AACF,YAAA;IAEA;EACA;AAEF,SAAMC,IAAAA,gBAAAA,OAAAA;;IACJ,wBAAqBd;;EAAuC,YAAA,SAAA;AAExDM,SAAAA,UAAoD;;EAExD,IAAA,eAAA;AAEIC,WAAAA,KAA8B,QAAA;;EAElC,IAAA,WAAA;AAEAQ,WAAoD,KAAoB,QAAA;;EAExE,KAAA,OAAA;AAEAC,WAAqD,oBAAoB,KAAA,QAAA,SAAA,KAAA,CAAA;;EAEzE,MAAA,OAAA;AAEOC,WAAsC,oBAAA,KAAA,QAAA,MAAA,KAAA,CAAA;;EAE7C,IAAA,OAAA;AAEAC,WAAUD,KAAwC,QAAA,aAAA,IAAA,KAAA;;EAElD,OAAA,OAAA;AAEAE,WAAAA,KAAAA,QAAsD,aAA2C,OAAA,KAAA;;oBAExFV,OAAAA,MACL;UAEIW,UAAUC,MAAAA,WAAgBC;WAC1BC,oBAAiBC,KAAaP,QAAMQ,aAAU,QAAA,KAAA,EAAA,KAAA,mBAAA;MAChD,UAAA,gBAAA,OAAA;MAGN,WAAA,MAAA,aAAA,MAAA,UAAA;IAEAC,CAAAA,CAAAA,CAAAA;;eAEQJ,OAAUK,MAAML;AAEtB,UAAMM,MAAAA,OAAUlC,UAAW,WAAM,QAAA,yBAAA,SAAA,KAAA;UAC/B,UAAMmC,MAAQ,WAAcC;UAC5B,UAAA,WAAA,MAAA,aAAA;AACA,YAAA,QAAA,OAAA,iBAAA,KAAA,QAAA,UAAA;AAGA,UAAA,KAAA,QAAA,eAAA,EAAA,SAAA,GAAA,GAAA;AACA;;aAEE,MAAIC;cACF,UAAA,OAAA,WAAA,KAAA;AACF,YAAA,QAAA,UAAA,OAAA,QAAA,UAAA,aAAA;AACF;QAEArC;MAEE0B;YACW,eAAMI,mBAAaQ;MAChC,UAAA,gBAAA,OAAA;MAGF,WAAOvB,MAAAA,aAAoBmB,GAAAA;IAC7B,CAAA,CAAA;AAEA,WAAMK,oBAA+E,OAAA;;QAEnF,OAAMC,OAAS,MAAMC;AACrB,UAAID,UAAY,MAAE,KAAA,kBAAA,qBAAA,gBAAA;UAChB,SAAMA,MAAOE,QAAK,cAAA,IAAA,GAAA,IAAA;AACpB,QAAA,OAAA,OAAA;AACA,YAAOF,OAAOG;IAChB;AAEA,WAAMC,OACJC;;mBAG4FC,SAAAA,SAASlB;AAAQ,UAAA,UAAA,MAAA,KAAA,kBAAA,qBAAA,uBAAA;MAC7G,SAAOmB,SAAQH;;AAA8D,WAAII,QAAAA,WAAAA,SAAAA,SAAAA,SAAAA;MACnF,QAAA,QAAA;IAEAC,IAAO5C,MAA8B;;EAErC,OAAA,IAAA;AAEA6C,WAAkB,oBAAoB,KAAA,QAAA,OAAA,EAAA,CAAA;;EAEtC,QAAA,IAAA;AAEA,WAAMC,oBAAyB,KAAA,QAAA,QAAA,EAAA,CAAA;;EAE/B,MAAA,UAAA;AAECC,UAAOC,oBAA+B,KAAA,QAAA,SAAA,CAAA;;EAEvC,CAAA,OAAA,YAAA,IAAA;AACF,WAAA,KAAA,QAAA;EAEA;;;;;AClPA,YAAYC,aAAY;AACxB,YAAYC,WAAW;AAEvB,SAASC,aAAAA,kBAAiB;AAK1B,IAAAC,gBAAA;AAUM,IAAMC,cAAgBC,CAAAA,YACR,aAAA,eAAA,SAAA,YAAA,aAAA;uBAEAC,CAAAA,OAAS,aAAA,MAAA;AACnB,UAAA,SAAO,QAAA,KAAA,CAAAA,YAAAA,QAAA,KAAA,OAAA,EAAA;eAAEA,QAAAA,qBAAAA,EAAAA,IAAAA,EAAAA,YAAAA,YAAAA,GAAAA,eAAAA,GAAAA,IAAAA,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,2BAAAA,EAAAA,CAAAA;AAAO,WAAA;MAClB;IAEIC;EACJH,CAAAA;QACAI,UAAAA,uBAAAA,KAAAA;IACAC;IACF;IAEAF,SAAQG,QAAaC,IAAAA,CAAAA,WAAW,OAAA,KAAA,EAAA;;UAE9BC,aAAgBL,WAAAA;IAChBM,WAAQ,qBAAA;IACV,gBAAA;IAEAN,QAAQG;;UAENE,aAAgBL,WAAQO;IACxBD,WAAQ,qBAAA;IACV,gBAAA,QAAA;IAEA,QAAON;EAEP,CAAA;AAEF,SAAA,QAAA,SAAA,0BAAA,OAAA;;;;;AC9CJ,YAAYQ,aAAY;AACxB,OAAOC,SAASC,WAAWC,gBAAgB;AAE3C,SAASC,aAAa;AACtB,SAASC,uBAAAA,4BAA2B;AACpC,SAASC,sBAAsB;AAC/B,SAA6BC,wBAAwB;AAS9C,IAAMC,qBAAqB,CAAC,EACjCC,cACAC,UAAU,CAAA,GACV,GAAGC,QAAAA,IAC+D,CAAC,MAAC;AAGpE,QAAMC,UAAUF,QAAQG,OAAO,CAAC,EAAEC,KAAI,MAAO,CAACA,KAAKC,MAAMC,SAAS,QAAA,CAAA,EAAWC,IAAI,CAAC,EAAEH,KAAI,MAAOA,KAAKI,EAAE;AACtG,QAAMC,gBAAgBC,uBAAcC,KAAK;IACvCC,cAAc,MAAMC,MAAM,IAAIC,MAAM,iBAAA,CAAA;IACpCd,SAAS;MAACe;SAAgBf;;IAC1BE;IACA,GAAGD;EACL,CAAA;AAEA,MAAIF,cAAc;AAChBiB,qBAAiBjB,cAAcU,cAAcV,YAAY,EAAEkB,QAAQ,CAACC,eAAAA;AAClET,oBAAcV,aAAaoB,WAAW;QACpCC,WAAWF,WAAWE;QACtBC,gBAAgBH,WAAWG;QAC3BC,QAAQ;MACV,CAAA;IACF,CAAA;EACF;AAEA,SAAOb;AACT;AAwBO,IAAMc,oBAAoB,CAAQC,OAA2C,CAAC,MAAC;AACpF,SAAO,CAACC,OAAOC,YAAAA;AACb,UAAMC,UAAUD,QAAQlB;AACxB,UAAMP,UAAU,OAAOuB,SAAS,aAAaA,KAAKE,OAAAA,IAAkBF;AACpE,UAAM,CAACI,cAAcC,eAAAA,IAAmBC,SAAAA;AAGxCC,cAAU,MAAA;AACR,YAAMtB,gBAAgBX,mBAAmBG,OAAAA;AACzC,YAAMiB,aAAac,mBAAWC,YAAYC,qBAAaC,WAAW;QAChE3B,IAAImB;QACJS,MAAM,MAAM,sBAAA,cAACX,OAAAA,IAAAA;MACf,CAAA;AAEAhB,oBAAcV,aAAaoB,WAAW;QACpC,GAAGD;QACHI,QAAQ;MACV,CAAA;AAEAO,sBAAgB;QACdpB;QACA4B,aAAapC,QAAQoC;QACrBC,YAAYrC,QAAQqC;QACpBX;MACF,CAAA;AAEA,aAAO,MAAA;AACLlB,sBAAcV,aAAawC,OAAOrB,WAAWE,WAAWF,WAAWG,cAAc;AACjF,aAAKmB,qBAAoB/B,cAAcgC,SAAQ,CAAA;MACjD;IACF,GAAG;MAACd;MAASH;KAAK;AAGlB,QAAI,CAACI,gBAAgBA,aAAaD,YAAYA,SAAS;AACrD,aAAO,sBAAA,cAAA,MAAA,UAAA,IAAA;IACT;AAEA,WAAO,sBAAA,cAACe,sBAAyBd,YAAAA;EACnC;AACF;AAEA,IAAMc,uBAAuB,CAAC,EAAEJ,YAAY7B,eAAe4B,aAAaV,QAAO,MAA6B;AAE1GgB,iBAAe,YAAA;AACb,UAAMC,QAAQC,IAAIP,YAAY/B,IAAI,CAACuC,UAAUrC,cAAcsC,SAASD,KAAAA,CAAAA,KAAW,CAAA,CAAE;EACnF,GAAG;IAACR;IAAY7B;IAAekB;GAAQ;AAEvC,QAAMqB,MAAMC,OAAO;IAAExC;IAAe4B;EAAY,CAAA;AAChD,SAAO,sBAAA,cAACW,KAAAA,IAAAA;AACV;AAEA,IAAME,
|
|
6
|
-
"names": ["Duration", "Effect", "PubSub", "Queue", "runAndForwardErrors", "invariant", "DEFAULT_TIMEOUT_MS", "pluginLoader", "Effect", "sync", "plugin", "plugins", "meta", "id", "manager", "enabled", "registerFrameworkCapabilities", "PluginManager", "implementation", "module", "capabilities", "registry", "autoStart", "runAndForwardErrors", "ActivationEvents", "activate", "Startup", "err", "TestHarnessImpl", "fire", "reset", "iface", "getAll", "waitForCapability", "duration", "Duration", "timeout", "onTimeout", "timeoutError", "identifier", "waitForEvent", "opts", "program", "queue", "subscribe", "message", "key", "invoke", "result", "invoker", "error", "data", "runPromise", "effect", "options", "runtime", "undefined", "enable", "disable", "dispose", "Symbol", "asyncDispose", "Effect", "Layer", "invariant", "__dxlog_file", "pluginLoader", "id", "plugin", "manager", "plugins", "enabled", "capabilities", "contribute", "implementation", "module", "registry", "Effect", "React", "useEffect", "useState", "raise", "runAndForwardErrors", "useAsyncEffect", "getProviderValue", "setupPluginManager", "capabilities", "plugins", "options", "enabled", "filter", "meta", "tags", "includes", "map", "id", "pluginManager", "PluginManager", "make", "pluginLoader", "raise", "Error", "StoryPlugin", "getProviderValue", "forEach", "capability", "contribute", "interface", "implementation", "module", "withPluginManager", "init", "Story", "context", "storyId", "managerState", "setManagerState", "useState", "useEffect", "Capability", "contributes", "Capabilities", "ReactRoot", "root", "setupEvents", "fireEvents", "remove", "runAndForwardErrors", "shutdown", "WithPluginManagerApp", "useAsyncEffect", "Promise", "all", "event", "activate", "App", "useApp", "storyMeta", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { type Registry } from '@effect-atom/atom-react';\nimport * as Duration from 'effect/Duration';\nimport * as Effect from 'effect/Effect';\nimport * as PubSub from 'effect/PubSub';\nimport * as Queue from 'effect/Queue';\n\nimport { type Operation } from '@dxos/compute';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { ActivationEvent, type Capability, type CapabilityManager, type Plugin, PluginManager } from '../core';\n\nexport type TestAppOptions = {\n /**\n * Plugins to register. Plugins whose `meta.tags` includes `'system'` are treated as core\n * (force-enabled). For test convenience, plugins without a `'system'` tag are enabled by\n * default unless `enabled` is provided.\n */\n plugins: Plugin.Plugin[];\n /** Plugin ids that are enabled by default in addition to core. Defaults to all non-system plugin ids. */\n enabled?: string[];\n /** Additional activation events fired alongside SetupReactSurface. */\n setupEvents?: ActivationEvent.ActivationEvent[];\n /**\n * Whether to automatically fire SetupReactSurface + Startup during setup.\n * Defaults to true.\n */\n autoStart?: boolean;\n /**\n * Whether to register the PluginManager + AtomRegistry framework capabilities.\n * Defaults to true.\n */\n registerFrameworkCapabilities?: boolean;\n};\n\n/**\n * A running plugin manager plus helpers for driving it in tests.\n */\nexport interface TestHarness {\n readonly manager: PluginManager.PluginManager;\n readonly capabilities: CapabilityManager.CapabilityManager;\n readonly registry: Registry.Registry;\n\n /** Activate the given event. Equivalent to `manager.activate(event)`. */\n fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;\n /** Re-activate all modules that were activated by the given event. */\n reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean>;\n\n /** Returns the first contributed capability for the given interface. Throws if none are present. */\n get<T>(iface: Capability.InterfaceDef<T>): T;\n /** Returns all contributed capabilities for the given interface. */\n getAll<T>(iface: Capability.InterfaceDef<T>): T[];\n /** Waits until at least one capability is contributed for the given interface. */\n waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T>;\n /** Waits until the given activation event has completed. */\n waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void>;\n\n /** Invokes an operation through the `Capabilities.OperationInvoker` capability. */\n invoke<I, O>(op: Operation.Definition<I, O>, ...args: void extends I ? [input?: I] : [input: I]): Promise<O>;\n\n /**\n * Waits for `Capabilities.ProcessManagerRuntime` and runs the given effect on it.\n * Convenience around `waitForCapability(ProcessManagerRuntime).runPromise(effect)`.\n */\n runPromise<A, E>(\n effect: Effect.Effect<A, E, Capabilities.ProcessManagerRuntimeServices>,\n options?: { readonly timeout?: number; readonly signal?: AbortSignal },\n ): Promise<A>;\n\n enable(id: string): Promise<boolean>;\n disable(id: string): Promise<boolean>;\n\n /** Shuts down the underlying plugin manager. */\n dispose(): Promise<void>;\n\n /** Async-disposable support so tests can use `await using harness = ...`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5_000;\n\n/**\n * Creates a TestHarness with the same bootstrap sequence that `useApp` performs,\n * minus the React provider tree.\n *\n * For Node-only tests, this is enough to fire activation events, read\n * capabilities, and invoke operations.\n *\n * For React tests, pass the returned harness to `render` or `renderSurface`\n * from `@dxos/app-framework/testing-react`.\n */\nexport const createTestApp = async (opts: TestAppOptions): Promise<TestHarness> => {\n const {\n plugins,\n enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map((plugin) => plugin.meta.id),\n setupEvents = [],\n autoStart = true,\n registerFrameworkCapabilities = true,\n } = opts;\n\n const pluginLoader = (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\n const manager = PluginManager.make({ pluginLoader, plugins, enabled });\n\n if (registerFrameworkCapabilities) {\n manager.capabilities.contribute({\n interface: Capabilities.PluginManager,\n implementation: manager,\n module: 'org.dxos.app-framework.plugin-manager',\n });\n manager.capabilities.contribute({\n interface: Capabilities.AtomRegistry,\n implementation: manager.registry,\n module: 'org.dxos.app-framework.atom-registry',\n });\n }\n\n if (autoStart) {\n try {\n await runAndForwardErrors(\n Effect.all([\n ...setupEvents.map((event) => manager.activate(event)),\n manager.activate(ActivationEvents.SetupReactSurface),\n manager.activate(ActivationEvents.Startup),\n ]),\n );\n } catch (err) {\n await runAndForwardErrors(manager.shutdown()).catch(() => undefined);\n throw err;\n }\n }\n\n return new TestHarnessImpl(manager);\n};\n\nclass TestHarnessImpl implements TestHarness {\n constructor(readonly manager: PluginManager.PluginManager) {}\n\n get capabilities(): CapabilityManager.CapabilityManager {\n return this.manager.capabilities;\n }\n\n get registry(): Registry.Registry {\n return this.manager.registry;\n }\n\n fire(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {\n return runAndForwardErrors(this.manager.activate(event));\n }\n\n reset(event: ActivationEvent.ActivationEvent | string): Promise<boolean> {\n return runAndForwardErrors(this.manager.reset(event));\n }\n\n get<T>(iface: Capability.InterfaceDef<T>): T {\n return this.manager.capabilities.get(iface);\n }\n\n getAll<T>(iface: Capability.InterfaceDef<T>): T[] {\n return this.manager.capabilities.getAll(iface);\n }\n\n waitForCapability<T>(iface: Capability.InterfaceDef<T>, opts?: { timeout?: number }): Promise<T> {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n return runAndForwardErrors(\n this.manager.capabilities.waitFor(iface).pipe(\n Effect.timeoutFail({\n duration: Duration.millis(timeout),\n onTimeout: () => timeoutError(iface.identifier),\n }),\n ),\n );\n }\n\n waitForEvent(event: ActivationEvent.ActivationEvent | string, opts?: { timeout?: number }): Promise<void> {\n const key = typeof event === 'string' ? event : ActivationEvent.eventKey(event);\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT_MS;\n\n const program = Effect.gen(this, function* () {\n const queue = yield* PubSub.subscribe(this.manager.activation);\n // Re-check after subscribing to avoid a race where the event fires\n // between the caller invoking this and the subscription being installed.\n if (this.manager.getEventsFired().includes(key)) {\n return;\n }\n while (true) {\n const message = yield* Queue.take(queue);\n if (message.event === key && message.state === 'activated') {\n return;\n }\n }\n }).pipe(\n Effect.scoped,\n Effect.timeoutFail({\n duration: Duration.millis(timeout),\n onTimeout: () => timeoutError(key),\n }),\n );\n\n return runAndForwardErrors(program);\n }\n\n async invoke<I, O>(op: Operation.Definition<I, O>, ...args: [input?: I]): Promise<O> {\n const invoker = await this.waitForCapability(Capabilities.OperationInvoker);\n const result = await invoker.invokePromise(op as any, ...(args as [any]));\n if (result.error) {\n throw result.error;\n }\n return result.data as O;\n }\n\n async runPromise<A, E>(\n effect: Effect.Effect<A, E, Capabilities.ProcessManagerRuntimeServices>,\n options?: { readonly timeout?: number; readonly signal?: AbortSignal },\n ): Promise<A> {\n const runtime = await this.waitForCapability(Capabilities.ProcessManagerRuntime, { timeout: options?.timeout });\n return runtime.runPromise(effect, options?.signal ? { signal: options.signal } : undefined);\n }\n\n enable(id: string): Promise<boolean> {\n return runAndForwardErrors(this.manager.enable(id));\n }\n\n disable(id: string): Promise<boolean> {\n return runAndForwardErrors(this.manager.disable(id));\n }\n\n async dispose(): Promise<void> {\n await runAndForwardErrors(this.manager.shutdown());\n }\n\n [Symbol.asyncDispose](): Promise<void> {\n return this.dispose();\n }\n}\n\nconst timeoutError = (id: string) => new Error(`Timed out waiting for ${id}`);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { Plugin, PluginManager } from '../core';\n\n/**\n * Creates a Plugin.Service layer from a list of plugins.\n * This is primarily used for testing.\n */\nexport const fromPlugins = (plugins: Plugin.Plugin[]) =>\n Layer.effect(\n Plugin.Service,\n Effect.gen(function* () {\n // TODO(wittjosiah): Try to dedupe logic between here, createCliApp and useApp.\n\n const pluginLoader = (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\n const manager = PluginManager.make({\n pluginLoader,\n plugins,\n enabled: plugins.map((plugin) => plugin.meta.id),\n });\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 yield* manager.activate(ActivationEvents.Startup);\n\n return manager;\n }),\n );\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Decorator, type StoryContext } from '@storybook/react';\nimport * as Effect from 'effect/Effect';\nimport React, { useEffect, useState } from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { DXN } from '@dxos/keys';\nimport { useAsyncEffect } from '@dxos/react-hooks';\nimport { type MaybeProvider, getProviderValue } from '@dxos/util';\n\nimport { ActivationEvents, Capabilities } from '../common';\nimport { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';\nimport { type UseAppOptions, useApp } from '../ui';\n\n/**\n * @internal\n */\nexport const setupPluginManager = ({\n capabilities,\n plugins = [],\n ...options\n}: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {\n // Auto-enable every non-system plugin so stories don't have to spell out\n // enablement. System-tagged plugins are force-enabled by the manager.\n const enabled = plugins.filter(({ meta }) => !meta.tags?.includes('system')).map(({ meta }) => meta.id);\n const pluginManager = PluginManager.make({\n pluginLoader: () => raise(new Error('Not implemented')),\n plugins: [StoryPlugin, ...plugins],\n enabled,\n ...options,\n });\n\n if (capabilities) {\n getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {\n pluginManager.capabilities.contribute({\n interface: capability.interface,\n implementation: capability.implementation,\n module: 'story',\n });\n });\n }\n\n return pluginManager;\n};\n\ntype ManagedPluginManagerState = {\n fireEvents?: (ActivationEvent.ActivationEvent | string)[];\n pluginManager: PluginManager.PluginManager;\n setupEvents?: ActivationEvent.ActivationEvent[];\n storyId: string;\n};\n\nexport type WithPluginManagerOptions = UseAppOptions & {\n /** @deprecated */\n capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;\n /** @deprecated */\n fireEvents?: (ActivationEvent.ActivationEvent | string)[];\n};\n\nexport type WithPluginManagerInitializer<Args = void> =\n | WithPluginManagerOptions\n | ((context: StoryContext<Args>) => WithPluginManagerOptions);\n\n/**\n * Wraps a story with a plugin manager.\n * NOTE: This builds up and tears down the plugin manager on every render.\n */\nexport const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {\n return (Story, context) => {\n const storyId = context.id;\n const options = typeof init === 'function' ? init(context as any) : init;\n const [managerState, setManagerState] = useState<ManagedPluginManagerState>();\n\n // Storybook replaces the full context object often, so key manager ownership by story id.\n useEffect(() => {\n const pluginManager = setupPluginManager(options);\n const capability = Capability.contributes(Capabilities.ReactRoot, {\n id: storyId,\n root: () => <Story />,\n });\n\n pluginManager.capabilities.contribute({\n ...capability,\n module: 'org.dxos.app-framework.with-plugin-manager',\n });\n\n setManagerState({\n pluginManager,\n setupEvents: options.setupEvents,\n fireEvents: options.fireEvents,\n storyId,\n });\n\n return () => {\n pluginManager.capabilities.remove(capability.interface, capability.implementation);\n void runAndForwardErrors(pluginManager.shutdown());\n };\n }, [storyId, init]);\n\n // Avoid mounting useApp with a stale manager from the previous story.\n if (!managerState || managerState.storyId !== storyId) {\n return <></>;\n }\n\n return <WithPluginManagerApp {...managerState} />;\n };\n};\n\nconst WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {\n // Fire deprecated events only after the effect-owned manager for this story exists.\n useAsyncEffect(async () => {\n await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);\n }, [fireEvents, pluginManager, storyId]);\n\n const App = useApp({ pluginManager, setupEvents });\n return <App />;\n};\n\nconst storyMeta = Plugin.makeMeta({\n key: DXN.make('org.dxos.appFramework.story'),\n name: 'Story',\n tags: ['system'],\n});\n\n// No-op plugin to ensure there exists at least one plugin for the startup event.\n// This is necessary because `createApp` expects the startup event to complete before the app is ready.\nconst StoryPlugin = Plugin.define(storyMeta).pipe(\n Plugin.addModule({\n id: 'Story',\n activatesOn: ActivationEvents.Startup,\n activate: () => Effect.succeed([]),\n }),\n Plugin.make,\n)();\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,YAAYA,cAAc;AAC1B,YAAYC,YAAY;AACxB,YAAYC,YAAY;AACxB,YAAYC,WAAW;AAGvB,SAASC,2BAA2B;AACpC,SAASC,iBAAiB;AAwE1B,IAAA,eAAMC;;AAqBEC,IAAAA,gBACJC,OAAOC,SAAK;UACV,SAAMC,UAASC,QAAY,OAAED,CAAAA,EAAAA,KAAWA,MAAOE,CAAAA,KAAO,MAAKC,SAAAA,QAAAA,CAAAA,EAAAA,IAAAA,CAAAA,WAAAA,OAAAA,KAAAA,EAAAA,GAAAA,cAAAA,CAAAA,GAAAA,YAAAA,MAAAA,gCAAAA,KAAAA,IAAAA;uBACjDH,CAAAA,OAAS,YAAA,MAAA;AACnB,UAAA,SAAO,QAAA,KAAA,CAAAA,YAAAA,QAAA,KAAA,OAAA,EAAA;cAAEA,QAAAA,qBAAAA,EAAAA,IAAAA,EAAAA,YAAAA,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,QAAAA,GAAAA,CAAAA,UAAAA,2BAAAA,EAAAA,CAAAA;AAAO,WAAA;MAClB;IAEII;EAA+BP,CAAAA;QAAcI,UAAAA,uBAAAA,KAAAA;IAASI;IAAQ;IAEhEC;;qCAEwBC;YACxBC,aAAgBJ,WAAAA;MAChBK,WAAQ,qBAAA;MACV,gBAAA;MACAL,QAAQM;;YAENF,aAAgBJ,WAAQO;MACxBF,WAAQ,qBAAA;MACV,gBAAA,QAAA;MACF,QAAA;IAEIG,CAAAA;;iBAEMC;;YAGFT,oBAAiBU,WAAAA;QACjBV,GAAAA,YAAQW,IAASD,CAAAA,UAAAA,QAAiBE,SAAO,KAAA,CAAA;QAC1C,QAAA,SAAA,0BAAA,iBAAA;QAEH,QAAY,SAAA,0BAAA,OAAA;MACZ,CAAA,CAAA;aACA,KAAMC;AACR,YAAA,oBAAA,QAAA,SAAA,CAAA,EAAA,MAAA,MAAA,MAAA;AACF,YAAA;IAEA;EACA;AAEF,SAAMC,IAAAA,gBAAAA,OAAAA;;IACJ,wBAAqBd;;EAAuC,YAAA,SAAA;AAExDM,SAAAA,UAAoD;;EAExD,IAAA,eAAA;AAEIC,WAAAA,KAA8B,QAAA;;EAElC,IAAA,WAAA;AAEAQ,WAAoD,KAAoB,QAAA;;EAExE,KAAA,OAAA;AAEAC,WAAqD,oBAAoB,KAAA,QAAA,SAAA,KAAA,CAAA;;EAEzE,MAAA,OAAA;AAEOC,WAAsC,oBAAA,KAAA,QAAA,MAAA,KAAA,CAAA;;EAE7C,IAAA,OAAA;AAEAC,WAAUD,KAAwC,QAAA,aAAA,IAAA,KAAA;;EAElD,OAAA,OAAA;AAEAE,WAAAA,KAAAA,QAAsD,aAA2C,OAAA,KAAA;;oBAExFV,OAAAA,MACL;UAEIW,UAAUC,MAAAA,WAAgBC;WAC1BC,oBAAiBC,KAAaP,QAAMQ,aAAU,QAAA,KAAA,EAAA,KAAA,mBAAA;MAChD,UAAA,gBAAA,OAAA;MAGN,WAAA,MAAA,aAAA,MAAA,UAAA;IAEAC,CAAAA,CAAAA,CAAAA;;eAEQJ,OAAUK,MAAML;AAEtB,UAAMM,MAAAA,OAAUlC,UAAW,WAAM,QAAA,yBAAA,SAAA,KAAA;UAC/B,UAAMmC,MAAQ,WAAcC;UAC5B,UAAA,WAAA,MAAA,aAAA;AACA,YAAA,QAAA,OAAA,iBAAA,KAAA,QAAA,UAAA;AAGA,UAAA,KAAA,QAAA,eAAA,EAAA,SAAA,GAAA,GAAA;AACA;;aAEE,MAAIC;cACF,UAAA,OAAA,WAAA,KAAA;AACF,YAAA,QAAA,UAAA,OAAA,QAAA,UAAA,aAAA;AACF;QAEArC;MAEE0B;YACW,eAAMI,mBAAaQ;MAChC,UAAA,gBAAA,OAAA;MAGF,WAAOvB,MAAAA,aAAoBmB,GAAAA;IAC7B,CAAA,CAAA;AAEA,WAAMK,oBAA+E,OAAA;;QAEnF,OAAMC,OAAS,MAAMC;AACrB,UAAID,UAAY,MAAE,KAAA,kBAAA,qBAAA,gBAAA;UAChB,SAAMA,MAAOE,QAAK,cAAA,IAAA,GAAA,IAAA;AACpB,QAAA,OAAA,OAAA;AACA,YAAOF,OAAOG;IAChB;AAEA,WAAMC,OACJC;;mBAG4FC,SAAAA,SAASlB;AAAQ,UAAA,UAAA,MAAA,KAAA,kBAAA,qBAAA,uBAAA;MAC7G,SAAOmB,SAAQH;;AAA8D,WAAII,QAAAA,WAAAA,SAAAA,SAAAA,SAAAA;MACnF,QAAA,QAAA;IAEAC,IAAO5C,MAA8B;;EAErC,OAAA,IAAA;AAEA6C,WAAkB,oBAAoB,KAAA,QAAA,OAAA,EAAA,CAAA;;EAEtC,QAAA,IAAA;AAEA,WAAMC,oBAAyB,KAAA,QAAA,QAAA,EAAA,CAAA;;EAE/B,MAAA,UAAA;AAECC,UAAOC,oBAA+B,KAAA,QAAA,SAAA,CAAA;;EAEvC,CAAA,OAAA,YAAA,IAAA;AACF,WAAA,KAAA,QAAA;EAEA;;;;;AClPA,YAAYC,aAAY;AACxB,YAAYC,WAAW;AAEvB,SAASC,aAAAA,kBAAiB;AAK1B,IAAAC,gBAAA;AAUM,IAAMC,cAAgBC,CAAAA,YACR,aAAA,eAAA,SAAA,YAAA,aAAA;uBAEAC,CAAAA,OAAS,aAAA,MAAA;AACnB,UAAA,SAAO,QAAA,KAAA,CAAAA,YAAAA,QAAA,KAAA,OAAA,EAAA;eAAEA,QAAAA,qBAAAA,EAAAA,IAAAA,EAAAA,YAAAA,YAAAA,GAAAA,eAAAA,GAAAA,IAAAA,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,2BAAAA,EAAAA,CAAAA;AAAO,WAAA;MAClB;IAEIC;EACJH,CAAAA;QACAI,UAAAA,uBAAAA,KAAAA;IACAC;IACF;IAEAF,SAAQG,QAAaC,IAAAA,CAAAA,WAAW,OAAA,KAAA,EAAA;;UAE9BC,aAAgBL,WAAAA;IAChBM,WAAQ,qBAAA;IACV,gBAAA;IAEAN,QAAQG;;UAENE,aAAgBL,WAAQO;IACxBD,WAAQ,qBAAA;IACV,gBAAA,QAAA;IAEA,QAAON;EAEP,CAAA;AAEF,SAAA,QAAA,SAAA,0BAAA,OAAA;;;;;AC9CJ,YAAYQ,aAAY;AACxB,OAAOC,SAASC,WAAWC,gBAAgB;AAE3C,SAASC,aAAa;AACtB,SAASC,uBAAAA,4BAA2B;AACpC,SAASC,WAAW;AACpB,SAASC,sBAAsB;AAC/B,SAA6BC,wBAAwB;AAS9C,IAAMC,qBAAqB,CAAC,EACjCC,cACAC,UAAU,CAAA,GACV,GAAGC,QAAAA,IAC+D,CAAC,MAAC;AAGpE,QAAMC,UAAUF,QAAQG,OAAO,CAAC,EAAEC,KAAI,MAAO,CAACA,KAAKC,MAAMC,SAAS,QAAA,CAAA,EAAWC,IAAI,CAAC,EAAEH,KAAI,MAAOA,KAAKI,EAAE;AACtG,QAAMC,gBAAgBC,uBAAcC,KAAK;IACvCC,cAAc,MAAMC,MAAM,IAAIC,MAAM,iBAAA,CAAA;IACpCd,SAAS;MAACe;SAAgBf;;IAC1BE;IACA,GAAGD;EACL,CAAA;AAEA,MAAIF,cAAc;AAChBiB,qBAAiBjB,cAAcU,cAAcV,YAAY,EAAEkB,QAAQ,CAACC,eAAAA;AAClET,oBAAcV,aAAaoB,WAAW;QACpCC,WAAWF,WAAWE;QACtBC,gBAAgBH,WAAWG;QAC3BC,QAAQ;MACV,CAAA;IACF,CAAA;EACF;AAEA,SAAOb;AACT;AAwBO,IAAMc,oBAAoB,CAAQC,OAA2C,CAAC,MAAC;AACpF,SAAO,CAACC,OAAOC,YAAAA;AACb,UAAMC,UAAUD,QAAQlB;AACxB,UAAMP,UAAU,OAAOuB,SAAS,aAAaA,KAAKE,OAAAA,IAAkBF;AACpE,UAAM,CAACI,cAAcC,eAAAA,IAAmBC,SAAAA;AAGxCC,cAAU,MAAA;AACR,YAAMtB,gBAAgBX,mBAAmBG,OAAAA;AACzC,YAAMiB,aAAac,mBAAWC,YAAYC,qBAAaC,WAAW;QAChE3B,IAAImB;QACJS,MAAM,MAAM,sBAAA,cAACX,OAAAA,IAAAA;MACf,CAAA;AAEAhB,oBAAcV,aAAaoB,WAAW;QACpC,GAAGD;QACHI,QAAQ;MACV,CAAA;AAEAO,sBAAgB;QACdpB;QACA4B,aAAapC,QAAQoC;QACrBC,YAAYrC,QAAQqC;QACpBX;MACF,CAAA;AAEA,aAAO,MAAA;AACLlB,sBAAcV,aAAawC,OAAOrB,WAAWE,WAAWF,WAAWG,cAAc;AACjF,aAAKmB,qBAAoB/B,cAAcgC,SAAQ,CAAA;MACjD;IACF,GAAG;MAACd;MAASH;KAAK;AAGlB,QAAI,CAACI,gBAAgBA,aAAaD,YAAYA,SAAS;AACrD,aAAO,sBAAA,cAAA,MAAA,UAAA,IAAA;IACT;AAEA,WAAO,sBAAA,cAACe,sBAAyBd,YAAAA;EACnC;AACF;AAEA,IAAMc,uBAAuB,CAAC,EAAEJ,YAAY7B,eAAe4B,aAAaV,QAAO,MAA6B;AAE1GgB,iBAAe,YAAA;AACb,UAAMC,QAAQC,IAAIP,YAAY/B,IAAI,CAACuC,UAAUrC,cAAcsC,SAASD,KAAAA,CAAAA,KAAW,CAAA,CAAE;EACnF,GAAG;IAACR;IAAY7B;IAAekB;GAAQ;AAEvC,QAAMqB,MAAMC,OAAO;IAAExC;IAAe4B;EAAY,CAAA;AAChD,SAAO,sBAAA,cAACW,KAAAA,IAAAA;AACV;AAEA,IAAME,YAAYC,eAAOC,SAAS;EAChCC,KAAKC,IAAI3C,KAAK,6BAAA;EACd4C,MAAM;EACNlD,MAAM;IAAC;;AACT,CAAA;AAIA,IAAMU,cAAcoC,eAAOK,OAAON,SAAAA,EAAWO,KAC3CN,eAAOO,UAAU;EACflD,IAAI;EACJmD,aAAaC,0BAAiBC;EAC9Bd,UAAU,MAAae,gBAAQ,CAAA,CAAE;AACnC,CAAA,GACAX,eAAOxC,IAAI,EAAA;",
|
|
6
|
+
"names": ["Duration", "Effect", "PubSub", "Queue", "runAndForwardErrors", "invariant", "DEFAULT_TIMEOUT_MS", "pluginLoader", "Effect", "sync", "plugin", "plugins", "meta", "id", "manager", "enabled", "registerFrameworkCapabilities", "PluginManager", "implementation", "module", "capabilities", "registry", "autoStart", "runAndForwardErrors", "ActivationEvents", "activate", "Startup", "err", "TestHarnessImpl", "fire", "reset", "iface", "getAll", "waitForCapability", "duration", "Duration", "timeout", "onTimeout", "timeoutError", "identifier", "waitForEvent", "opts", "program", "queue", "subscribe", "message", "key", "invoke", "result", "invoker", "error", "data", "runPromise", "effect", "options", "runtime", "undefined", "enable", "disable", "dispose", "Symbol", "asyncDispose", "Effect", "Layer", "invariant", "__dxlog_file", "pluginLoader", "id", "plugin", "manager", "plugins", "enabled", "capabilities", "contribute", "implementation", "module", "registry", "Effect", "React", "useEffect", "useState", "raise", "runAndForwardErrors", "DXN", "useAsyncEffect", "getProviderValue", "setupPluginManager", "capabilities", "plugins", "options", "enabled", "filter", "meta", "tags", "includes", "map", "id", "pluginManager", "PluginManager", "make", "pluginLoader", "raise", "Error", "StoryPlugin", "getProviderValue", "forEach", "capability", "contribute", "interface", "implementation", "module", "withPluginManager", "init", "Story", "context", "storyId", "managerState", "setManagerState", "useState", "useEffect", "Capability", "contributes", "Capabilities", "ReactRoot", "root", "setupEvents", "fireEvents", "remove", "runAndForwardErrors", "shutdown", "WithPluginManagerApp", "useAsyncEffect", "Promise", "all", "event", "activate", "App", "useApp", "storyMeta", "Plugin", "makeMeta", "key", "DXN", "name", "define", "pipe", "addModule", "activatesOn", "ActivationEvents", "Startup", "succeed"]
|
|
7
7
|
}
|
|
@@ -2,20 +2,20 @@ import {
|
|
|
2
2
|
PluginManagerProvider,
|
|
3
3
|
SurfaceComponent,
|
|
4
4
|
topologicalSort
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-7MBI66M7.mjs";
|
|
6
6
|
import {
|
|
7
7
|
PluginManagerContext
|
|
8
8
|
} from "../chunk-FJ4765WW.mjs";
|
|
9
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-Q2GLJTVV.mjs";
|
|
10
10
|
import {
|
|
11
11
|
capabilities_exports
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-2ZIYRDAF.mjs";
|
|
13
13
|
import "../chunk-5GY3YOEL.mjs";
|
|
14
14
|
import "../chunk-FO3IYSLV.mjs";
|
|
15
|
-
import "../chunk-
|
|
16
|
-
import "../chunk-
|
|
15
|
+
import "../chunk-KZUDO43J.mjs";
|
|
16
|
+
import "../chunk-BMLCIFZW.mjs";
|
|
17
17
|
import "../chunk-66IXTIVK.mjs";
|
|
18
|
-
import "../chunk-
|
|
18
|
+
import "../chunk-DC3WRPBV.mjs";
|
|
19
19
|
import "../chunk-IW44C7UL.mjs";
|
|
20
20
|
import "../chunk-J5LGTIGS.mjs";
|
|
21
21
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
App,
|
|
3
3
|
LoadingState,
|
|
4
|
-
Placeholder,
|
|
5
4
|
useApp,
|
|
6
5
|
useAtomCapability,
|
|
7
6
|
useAtomCapabilityState,
|
|
@@ -13,28 +12,27 @@ import {
|
|
|
13
12
|
useSettingsState,
|
|
14
13
|
useSpaceCallback,
|
|
15
14
|
useSpaceService
|
|
16
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-VBG5F5UF.mjs";
|
|
17
16
|
import {
|
|
18
17
|
PluginManagerProvider,
|
|
19
18
|
Surface,
|
|
20
19
|
usePluginManager,
|
|
21
20
|
useSurface
|
|
22
|
-
} from "../chunk-
|
|
21
|
+
} from "../chunk-7MBI66M7.mjs";
|
|
23
22
|
import "../chunk-FJ4765WW.mjs";
|
|
24
|
-
import "../chunk-
|
|
25
|
-
import "../chunk-
|
|
23
|
+
import "../chunk-Q2GLJTVV.mjs";
|
|
24
|
+
import "../chunk-2ZIYRDAF.mjs";
|
|
26
25
|
import "../chunk-5GY3YOEL.mjs";
|
|
27
26
|
import "../chunk-FO3IYSLV.mjs";
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-
|
|
27
|
+
import "../chunk-KZUDO43J.mjs";
|
|
28
|
+
import "../chunk-BMLCIFZW.mjs";
|
|
30
29
|
import "../chunk-66IXTIVK.mjs";
|
|
31
|
-
import "../chunk-
|
|
30
|
+
import "../chunk-DC3WRPBV.mjs";
|
|
32
31
|
import "../chunk-IW44C7UL.mjs";
|
|
33
32
|
import "../chunk-J5LGTIGS.mjs";
|
|
34
33
|
export {
|
|
35
34
|
App,
|
|
36
35
|
LoadingState,
|
|
37
|
-
Placeholder,
|
|
38
36
|
PluginManagerProvider,
|
|
39
37
|
Surface,
|
|
40
38
|
useApp,
|
|
@@ -2,17 +2,17 @@ import { createRequire } from 'node:module';const require = createRequire(import
|
|
|
2
2
|
import {
|
|
3
3
|
make,
|
|
4
4
|
make2
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-KSH4OVMY.mjs";
|
|
6
|
+
import "./chunk-FPW45EZH.mjs";
|
|
7
7
|
import {
|
|
8
8
|
capabilities_exports
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-QBUGLR4H.mjs";
|
|
10
10
|
import "./chunk-KFZEB6BV.mjs";
|
|
11
11
|
import "./chunk-WK7OIQKI.mjs";
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-XGBUKRCK.mjs";
|
|
13
|
+
import "./chunk-4BX2AE47.mjs";
|
|
14
14
|
import "./chunk-XOCUANHO.mjs";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-XIGPWXCQ.mjs";
|
|
16
16
|
import {
|
|
17
17
|
capability_exports
|
|
18
18
|
} from "./chunk-CTKEZHKF.mjs";
|
|
@@ -33,4 +33,4 @@ var capability_default = capability_exports.makeModule(Effect.fnUntraced(functio
|
|
|
33
33
|
export {
|
|
34
34
|
capability_default as default
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=capability-
|
|
36
|
+
//# sourceMappingURL=capability-7TCQK7ZP.mjs.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
Service as Service2,
|
|
11
11
|
isLazy,
|
|
12
12
|
resolveLazy
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-XIGPWXCQ.mjs";
|
|
14
14
|
import {
|
|
15
15
|
Service
|
|
16
16
|
} from "./chunk-CTKEZHKF.mjs";
|
|
@@ -56,6 +56,7 @@ import { log } from "@dxos/log";
|
|
|
56
56
|
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/core/capability-manager.ts";
|
|
57
57
|
var CapabilityManagerImpl = class {
|
|
58
58
|
_registry;
|
|
59
|
+
_registeredIdentifiers = /* @__PURE__ */ new Set();
|
|
59
60
|
_capabilityEntries = Atom.family(() => {
|
|
60
61
|
return Atom.make([]).pipe(Atom.keepAlive);
|
|
61
62
|
});
|
|
@@ -78,7 +79,7 @@ var CapabilityManagerImpl = class {
|
|
|
78
79
|
_capability = Atom.family((id) => {
|
|
79
80
|
return Atom.make((get2) => {
|
|
80
81
|
const current = get2(this._capabilities(id));
|
|
81
|
-
invariant(current.length > 0, `No capability found for ${id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L:
|
|
82
|
+
invariant(current.length > 0, `No capability found for ${id}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 36, S: this, A: ["current.length > 0", "`No capability found for ${id}`"] });
|
|
82
83
|
return current[0];
|
|
83
84
|
});
|
|
84
85
|
});
|
|
@@ -92,7 +93,7 @@ var CapabilityManagerImpl = class {
|
|
|
92
93
|
log("capability already contributed, skipping", {
|
|
93
94
|
id: interfaceDef.identifier,
|
|
94
95
|
moduleId
|
|
95
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L:
|
|
96
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 47, S: this });
|
|
96
97
|
return;
|
|
97
98
|
}
|
|
98
99
|
const entry = {
|
|
@@ -103,11 +104,12 @@ var CapabilityManagerImpl = class {
|
|
|
103
104
|
...current,
|
|
104
105
|
entry
|
|
105
106
|
]);
|
|
107
|
+
this._registeredIdentifiers.add(interfaceDef.identifier);
|
|
106
108
|
log("capability contributed", {
|
|
107
109
|
id: interfaceDef.identifier,
|
|
108
110
|
moduleId,
|
|
109
111
|
count: current.length
|
|
110
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L:
|
|
112
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 62, S: this });
|
|
111
113
|
}
|
|
112
114
|
remove(interfaceDef, implementation) {
|
|
113
115
|
const current = this._registry.get(this._capabilityEntries(interfaceDef.identifier));
|
|
@@ -117,14 +119,17 @@ var CapabilityManagerImpl = class {
|
|
|
117
119
|
const next = current.filter((c) => c.implementation !== implementation);
|
|
118
120
|
if (next.length !== current.length) {
|
|
119
121
|
this._registry.set(this._capabilityEntries(interfaceDef.identifier), next);
|
|
122
|
+
if (next.length === 0) {
|
|
123
|
+
this._registeredIdentifiers.delete(interfaceDef.identifier);
|
|
124
|
+
}
|
|
120
125
|
log("capability removed", {
|
|
121
126
|
id: interfaceDef.identifier,
|
|
122
127
|
count: current.length
|
|
123
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L:
|
|
128
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 79, S: this });
|
|
124
129
|
} else {
|
|
125
130
|
log.warn("capability not removed", {
|
|
126
131
|
id: interfaceDef.identifier
|
|
127
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L:
|
|
132
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 84, S: this });
|
|
128
133
|
}
|
|
129
134
|
}
|
|
130
135
|
atom(interfaceDef) {
|
|
@@ -135,9 +140,20 @@ var CapabilityManagerImpl = class {
|
|
|
135
140
|
}
|
|
136
141
|
get(interfaceDef) {
|
|
137
142
|
const capabilities = this.getAll(interfaceDef);
|
|
138
|
-
|
|
143
|
+
if (capabilities.length === 0) {
|
|
144
|
+
log("capability not available", {
|
|
145
|
+
requested: interfaceDef.identifier,
|
|
146
|
+
registered: this.listRegisteredIdentifiers()
|
|
147
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 99, S: this });
|
|
148
|
+
invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 103, S: this, A: ["capabilities.length > 0", "`No capability found for ${interfaceDef.identifier}`"] });
|
|
149
|
+
}
|
|
139
150
|
return capabilities[0];
|
|
140
151
|
}
|
|
152
|
+
listRegisteredIdentifiers() {
|
|
153
|
+
return [
|
|
154
|
+
...this._registeredIdentifiers
|
|
155
|
+
].sort();
|
|
156
|
+
}
|
|
141
157
|
waitFor(interfaceDef) {
|
|
142
158
|
return Effect.gen(this, function* () {
|
|
143
159
|
const [capability] = this.getAll(interfaceDef);
|
|
@@ -979,7 +995,7 @@ var ManagerImpl = class {
|
|
|
979
995
|
* can iterate and tear down leaves first.
|
|
980
996
|
*/
|
|
981
997
|
_collectDependents(id, opts) {
|
|
982
|
-
const direct = this._get(this._pluginsAtom).filter((plugin) => plugin.meta.dependsOn?.
|
|
998
|
+
const direct = this._get(this._pluginsAtom).filter((plugin) => plugin.meta.dependsOn?.some((dep) => dep === id)).map((plugin) => plugin.meta.id);
|
|
983
999
|
if (!opts.transitive) {
|
|
984
1000
|
return opts.enabledOnly ? direct.filter((dependentId) => this._get(this._enabledAtom).includes(dependentId)) : direct;
|
|
985
1001
|
}
|
|
@@ -990,7 +1006,7 @@ var ManagerImpl = class {
|
|
|
990
1006
|
return;
|
|
991
1007
|
}
|
|
992
1008
|
visited.add(currentId);
|
|
993
|
-
const parents = this._get(this._pluginsAtom).filter((plugin) => plugin.meta.dependsOn?.
|
|
1009
|
+
const parents = this._get(this._pluginsAtom).filter((plugin) => plugin.meta.dependsOn?.some((dep) => dep === currentId)).map((plugin) => plugin.meta.id);
|
|
994
1010
|
for (const parentId of parents) {
|
|
995
1011
|
visit(parentId);
|
|
996
1012
|
if (parentId !== id && !result.includes(parentId)) {
|
|
@@ -1183,8 +1199,8 @@ var ManagerImpl = class {
|
|
|
1183
1199
|
const activatingModuleIds = modules.map((module) => module.id);
|
|
1184
1200
|
return Effect3.gen(this, function* () {
|
|
1185
1201
|
yield* Ref.update(this._activatingModules, (activating) => Array.appendAll(activating, activatingModuleIds));
|
|
1186
|
-
log3("
|
|
1187
|
-
key,
|
|
1202
|
+
log3.info("activation wave", {
|
|
1203
|
+
event: key,
|
|
1188
1204
|
modules: activatingModuleIds
|
|
1189
1205
|
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 1024, S: this });
|
|
1190
1206
|
performance.mark(`event:${key}:start`);
|
|
@@ -1355,12 +1371,17 @@ var ManagerImpl = class {
|
|
|
1355
1371
|
}));
|
|
1356
1372
|
const fiber = yield* Effect3.forkDaemon(loadEffect.pipe(Effect3.tap((result) => Deferred2.succeed(deferred, result)), Effect3.catchAllCause((cause) => {
|
|
1357
1373
|
const error = Cause.squash(cause);
|
|
1374
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1375
|
+
const missingCapability = errorMessage.match(/No capability found for ([^\s\[]+)/)?.[1];
|
|
1358
1376
|
log3.error("module failed to activate", {
|
|
1359
1377
|
module: module.id,
|
|
1360
|
-
|
|
1378
|
+
parentEvent,
|
|
1379
|
+
missingCapability,
|
|
1380
|
+
registeredCapabilities: this.capabilities.listRegisteredIdentifiers(),
|
|
1381
|
+
error: errorMessage,
|
|
1361
1382
|
stack: error instanceof Error ? error.stack : void 0,
|
|
1362
1383
|
isDefect: !Cause.isFailure(cause)
|
|
1363
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L:
|
|
1384
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 1198, S: this });
|
|
1364
1385
|
const normalizedError = error instanceof Error ? error : new Error(String(error));
|
|
1365
1386
|
const pluginId = this._getPluginIdForModule(module.id);
|
|
1366
1387
|
if (pluginId !== void 0) {
|
|
@@ -1395,7 +1416,7 @@ var ManagerImpl = class {
|
|
|
1395
1416
|
const id = module.id;
|
|
1396
1417
|
log3("deactivating", {
|
|
1397
1418
|
id
|
|
1398
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L:
|
|
1419
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 1240, S: this });
|
|
1399
1420
|
this._moduleMemoMap.delete(id);
|
|
1400
1421
|
const capabilities = this._capabilities.get(id);
|
|
1401
1422
|
if (capabilities) {
|
|
@@ -1412,7 +1433,7 @@ var ManagerImpl = class {
|
|
|
1412
1433
|
}
|
|
1413
1434
|
log3("deactivated", {
|
|
1414
1435
|
id
|
|
1415
|
-
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L:
|
|
1436
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 1257, S: this });
|
|
1416
1437
|
return true;
|
|
1417
1438
|
});
|
|
1418
1439
|
}
|
|
@@ -1444,4 +1465,4 @@ export {
|
|
|
1444
1465
|
make5 as make,
|
|
1445
1466
|
plugin_manager_exports
|
|
1446
1467
|
};
|
|
1447
|
-
//# sourceMappingURL=chunk-
|
|
1468
|
+
//# sourceMappingURL=chunk-4BX2AE47.mjs.map
|