@dxos/app-framework 0.3.11-next.0fb359e → 0.3.11-next.ee2b64c

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.
Files changed (38) hide show
  1. package/dist/lib/browser/{chunk-QYIBDGYI.mjs → chunk-7MQ2DVDI.mjs} +2 -3
  2. package/dist/lib/browser/{chunk-QYIBDGYI.mjs.map → chunk-7MQ2DVDI.mjs.map} +2 -2
  3. package/dist/lib/browser/index.mjs +180 -147
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/{plugin-YLDDUID4.mjs → plugin-PGPBA2JO.mjs} +36 -13
  7. package/dist/lib/browser/plugin-PGPBA2JO.mjs.map +7 -0
  8. package/dist/lib/node/{chunk-YWRBMGDT.cjs → chunk-FETX4EGX.cjs} +5 -6
  9. package/dist/lib/node/{chunk-YWRBMGDT.cjs.map → chunk-FETX4EGX.cjs.map} +2 -2
  10. package/dist/lib/node/index.cjs +180 -149
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/{plugin-NP3IH5Q3.cjs → plugin-HLGHD6N5.cjs} +43 -19
  14. package/dist/lib/node/plugin-HLGHD6N5.cjs.map +7 -0
  15. package/dist/types/src/plugins/IntentPlugin/intent.d.ts +33 -2
  16. package/dist/types/src/plugins/IntentPlugin/intent.d.ts.map +1 -1
  17. package/dist/types/src/plugins/IntentPlugin/plugin.d.ts.map +1 -1
  18. package/dist/types/src/plugins/PluginHost/PluginHost.d.ts +4 -2
  19. package/dist/types/src/plugins/PluginHost/PluginHost.d.ts.map +1 -1
  20. package/dist/types/src/plugins/PluginHost/plugin.d.ts +1 -1
  21. package/dist/types/src/plugins/PluginHost/plugin.d.ts.map +1 -1
  22. package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts +4 -5
  23. package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts.map +1 -1
  24. package/dist/types/src/plugins/common/layout.d.ts +15 -14
  25. package/dist/types/src/plugins/common/layout.d.ts.map +1 -1
  26. package/package.json +8 -7
  27. package/project.json +3 -1
  28. package/src/plugins/IntentPlugin/IntentContext.tsx +1 -1
  29. package/src/plugins/IntentPlugin/intent.ts +38 -2
  30. package/src/plugins/IntentPlugin/plugin.tsx +38 -9
  31. package/src/plugins/PluginHost/PluginHost.tsx +92 -57
  32. package/src/plugins/PluginHost/plugin.ts +2 -1
  33. package/src/plugins/SurfacePlugin/Surface.tsx +15 -21
  34. package/src/plugins/common/layout.ts +15 -14
  35. package/src/vite-env.d.ts +5 -0
  36. package/tsconfig.json +3 -0
  37. package/dist/lib/browser/plugin-YLDDUID4.mjs.map +0 -7
  38. package/dist/lib/node/plugin-NP3IH5Q3.cjs.map +0 -7
@@ -6,8 +6,7 @@ var parseIntentResolverPlugin = (plugin) => plugin.provides.intent?.resolver ? p
6
6
  import { createContext, useContext } from "react";
7
7
  import { useEffect } from "react";
8
8
  var IntentContext = /* @__PURE__ */ createContext({
9
- dispatch: async () => {
10
- },
9
+ dispatch: async () => ({}),
11
10
  registerResolver: () => () => {
12
11
  }
13
12
  });
@@ -42,4 +41,4 @@ export {
42
41
  IntentProvider,
43
42
  meta_default
44
43
  };
45
- //# sourceMappingURL=chunk-QYIBDGYI.mjs.map
44
+ //# sourceMappingURL=chunk-7MQ2DVDI.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/plugins/IntentPlugin/provides.ts", "../../../src/plugins/IntentPlugin/IntentContext.tsx", "../../../src/plugins/IntentPlugin/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IntentContext } from './IntentContext';\nimport { type IntentResolver } from './intent';\nimport { type Plugin } from '../PluginHost';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: IntentResolver;\n };\n};\n\nexport type IntentPluginProvides = {\n intent: IntentContext;\n};\n\nexport const parseIntentPlugin = (plugin: Plugin) =>\n (plugin.provides as any).intent?.dispatch ? (plugin as Plugin<IntentPluginProvides>) : undefined;\n\nexport const parseIntentResolverPlugin = (plugin: Plugin) =>\n (plugin.provides as any).intent?.resolver ? (plugin as Plugin<IntentResolverProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\nimport { useEffect } from 'react';\n\nimport { type UnsubscribeCallback } from '@dxos/async';\n\nimport { type IntentDispatcher, type IntentResolver } from './intent';\n\nexport type IntentContext = {\n dispatch: IntentDispatcher;\n registerResolver: (pluginId: string, resolver: IntentResolver) => UnsubscribeCallback;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({\n dispatch: async () => {},\n registerResolver: () => () => {},\n});\n\n/**\n * @deprecated\n * TODO(burdon): Use useIntentDispatcher.\n */\nexport const useIntent = () => useContext(IntentContext);\n\n// TODO(burdon): Dispatch or Dispatcher?\nexport const useIntentDispatcher = (): IntentDispatcher => {\n const { dispatch } = useIntent();\n return dispatch;\n};\n\nexport const useIntentResolver = (plugin: string, resolver: IntentResolver) => {\n const { registerResolver } = useIntent();\n useEffect(() => {\n return registerResolver(plugin, resolver);\n }, [plugin, resolver]);\n};\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst IntentMeta = {\n id: 'dxos.org/plugin/intent',\n};\n\nexport default IntentMeta;\n"],
5
- "mappings": ";AAkBO,IAAMA,oBAAoB,CAACC,WAC/BA,OAAOC,SAAiBC,QAAQC,WAAYH,SAA0CI;AAElF,IAAMC,4BAA4B,CAACL,WACvCA,OAAOC,SAAiBC,QAAQI,WAAYN,SAA4CI;;;AClB3F,SAAuBG,eAAeC,kBAAiC;AACvE,SAASC,iBAAiB;AAW1B,IAAMC,gBAAwCC,8BAA6B;EACzEC,UAAU,YAAA;EAAa;EACvBC,kBAAkB,MAAM,MAAA;EAAO;AACjC,CAAA;AAMO,IAAMC,YAAY,MAAMC,WAAWL,aAAAA;AAGnC,IAAMM,sBAAsB,MAAA;AACjC,QAAM,EAAEJ,SAAQ,IAAKE,UAAAA;AACrB,SAAOF;AACT;AAEO,IAAMK,oBAAoB,CAACC,QAAgBC,aAAAA;AAChD,QAAM,EAAEN,iBAAgB,IAAKC,UAAAA;AAC7BM,YAAU,MAAA;AACR,WAAOP,iBAAiBK,QAAQC,QAAAA;EAClC,GAAG;IAACD;IAAQC;GAAS;AACvB;AAEO,IAAME,iBAA0CX,cAAcY;;;ACpCrE,IAAMC,aAAa;EACjBC,IAAI;AACN;AAEA,IAAA,eAAeD;",
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IntentContext } from './IntentContext';\nimport { type IntentResolver } from './intent';\nimport { type Plugin } from '../PluginHost';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: IntentResolver;\n };\n};\n\nexport type IntentPluginProvides = {\n intent: IntentContext;\n};\n\nexport const parseIntentPlugin = (plugin: Plugin) =>\n (plugin.provides as any).intent?.dispatch ? (plugin as Plugin<IntentPluginProvides>) : undefined;\n\nexport const parseIntentResolverPlugin = (plugin: Plugin) =>\n (plugin.provides as any).intent?.resolver ? (plugin as Plugin<IntentResolverProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\nimport { useEffect } from 'react';\n\nimport { type UnsubscribeCallback } from '@dxos/async';\n\nimport { type IntentDispatcher, type IntentResolver } from './intent';\n\nexport type IntentContext = {\n dispatch: IntentDispatcher;\n registerResolver: (pluginId: string, resolver: IntentResolver) => UnsubscribeCallback;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({\n dispatch: async () => ({}),\n registerResolver: () => () => {},\n});\n\n/**\n * @deprecated\n * TODO(burdon): Use useIntentDispatcher.\n */\nexport const useIntent = () => useContext(IntentContext);\n\n// TODO(burdon): Dispatch or Dispatcher?\nexport const useIntentDispatcher = (): IntentDispatcher => {\n const { dispatch } = useIntent();\n return dispatch;\n};\n\nexport const useIntentResolver = (plugin: string, resolver: IntentResolver) => {\n const { registerResolver } = useIntent();\n useEffect(() => {\n return registerResolver(plugin, resolver);\n }, [plugin, resolver]);\n};\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nconst IntentMeta = {\n id: 'dxos.org/plugin/intent',\n};\n\nexport default IntentMeta;\n"],
5
+ "mappings": ";AAkBO,IAAMA,oBAAoB,CAACC,WAC/BA,OAAOC,SAAiBC,QAAQC,WAAYH,SAA0CI;AAElF,IAAMC,4BAA4B,CAACL,WACvCA,OAAOC,SAAiBC,QAAQI,WAAYN,SAA4CI;;;AClB3F,SAAuBG,eAAeC,kBAAiC;AACvE,SAASC,iBAAiB;AAW1B,IAAMC,gBAAwCC,8BAA6B;EACzEC,UAAU,aAAa,CAAC;EACxBC,kBAAkB,MAAM,MAAA;EAAO;AACjC,CAAA;AAMO,IAAMC,YAAY,MAAMC,WAAWL,aAAAA;AAGnC,IAAMM,sBAAsB,MAAA;AACjC,QAAM,EAAEJ,SAAQ,IAAKE,UAAAA;AACrB,SAAOF;AACT;AAEO,IAAMK,oBAAoB,CAACC,QAAgBC,aAAAA;AAChD,QAAM,EAAEN,iBAAgB,IAAKC,UAAAA;AAC7BM,YAAU,MAAA;AACR,WAAOP,iBAAiBK,QAAQC,QAAAA;EAClC,GAAG;IAACD;IAAQC;GAAS;AACvB;AAEO,IAAME,iBAA0CX,cAAcY;;;ACpCrE,IAAMC,aAAa;EACjBC,IAAI;AACN;AAEA,IAAA,eAAeD;",
6
6
  "names": ["parseIntentPlugin", "plugin", "provides", "intent", "dispatch", "undefined", "parseIntentResolverPlugin", "resolver", "createContext", "useContext", "useEffect", "IntentContext", "createContext", "dispatch", "registerResolver", "useIntent", "useContext", "useIntentDispatcher", "useIntentResolver", "plugin", "resolver", "useEffect", "IntentProvider", "Provider", "IntentMeta", "id"]
7
7
  }
@@ -13,7 +13,7 @@ import {
13
13
  useIntent,
14
14
  useIntentDispatcher,
15
15
  useIntentResolver
16
- } from "./chunk-QYIBDGYI.mjs";
16
+ } from "./chunk-7MQ2DVDI.mjs";
17
17
  import {
18
18
  filterPlugins,
19
19
  findPlugin,
@@ -95,7 +95,7 @@ var parseTranslationsPlugin = (plugin) => {
95
95
  var pluginMeta = (meta) => meta;
96
96
  var Plugin;
97
97
  (function(Plugin2) {
98
- var lazy = Plugin2.lazy = (p, props) => {
98
+ Plugin2.lazy = (p, props) => {
99
99
  return () => p().then(({ default: definition }) => {
100
100
  return definition(props);
101
101
  });
@@ -125,141 +125,15 @@ var PluginProvider = PluginContext.Provider;
125
125
 
126
126
  // packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx
127
127
  import { shallow } from "deepsignal/react";
128
- import React, { useEffect } from "react";
128
+ import React3, { useEffect, useState } from "react";
129
129
  import { LocalStorageStore } from "@dxos/local-storage";
130
130
  import { log } from "@dxos/log";
131
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
132
- var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
133
- var PLUGIN_HOST = "dxos.org/plugin/host";
134
- var PluginHost = ({ order, plugins: definitions, core = [], defaults = [], fallback = null }) => {
135
- const state = new LocalStorageStore(PLUGIN_HOST, {
136
- ready: false,
137
- enabled: [
138
- ...defaults
139
- ],
140
- plugins: [],
141
- available: order.filter(({ id }) => !core.includes(id)),
142
- setPlugin: (id, enabled) => {
143
- if (enabled) {
144
- state.values.enabled = [
145
- ...state.values.enabled,
146
- id
147
- ];
148
- } else {
149
- state.values.enabled = state.values.enabled.filter((enabled2) => enabled2 !== id);
150
- }
151
- }
152
- });
153
- state.prop(state.values.$enabled, "enabled", LocalStorageStore.json);
154
- return {
155
- meta: {
156
- id: PLUGIN_HOST,
157
- name: "Plugin host"
158
- },
159
- provides: {
160
- plugins: state.values,
161
- context: ({ children }) => /* @__PURE__ */ React.createElement(PluginProvider, {
162
- value: state.values
163
- }, children),
164
- root: () => {
165
- useEffect(() => {
166
- log("initializing plugins", {
167
- enabled: state.values.enabled
168
- }, {
169
- F: __dxlog_file,
170
- L: 67,
171
- S: void 0,
172
- C: (f, a) => f(...a)
173
- });
174
- const timeout = setTimeout(async () => {
175
- const enabledIds = [
176
- ...core,
177
- ...state.values.enabled
178
- ].sort((a, b) => {
179
- const indexA = order.findIndex(({ id }) => id === a);
180
- const indexB = order.findIndex(({ id }) => id === b);
181
- return indexA - indexB;
182
- });
183
- const enabled = await Promise.all(enabledIds.map((id) => definitions[id]).filter((definition) => Boolean(definition)).map((definition) => definition()));
184
- const plugins = await Promise.all(enabled.map(async (definition) => {
185
- const plugin = await initializePlugin(definition).catch((err) => {
186
- console.error("Failed to initialize plugin:", definition.meta.id, err);
187
- return void 0;
188
- });
189
- return plugin;
190
- })).then((plugins2) => plugins2.filter((plugin) => Boolean(plugin)));
191
- log("plugins initialized", {
192
- plugins
193
- }, {
194
- F: __dxlog_file,
195
- L: 92,
196
- S: void 0,
197
- C: (f, a) => f(...a)
198
- });
199
- await Promise.all(enabled.map(async (pluginDefinition) => {
200
- await pluginDefinition.ready?.(plugins);
201
- }));
202
- log("plugins ready", {
203
- plugins
204
- }, {
205
- F: __dxlog_file,
206
- L: 99,
207
- S: void 0,
208
- C: (f, a) => f(...a)
209
- });
210
- state.values.plugins = shallow(plugins);
211
- state.values.ready = true;
212
- });
213
- return () => {
214
- clearTimeout(timeout);
215
- state.values.ready = false;
216
- };
217
- }, []);
218
- if (!state.values.ready) {
219
- return /* @__PURE__ */ React.createElement(React.Fragment, null, fallback);
220
- }
221
- const ComposedContext = composeContext(state.values.plugins);
222
- return /* @__PURE__ */ React.createElement(ComposedContext, null, rootComponents(state.values.plugins));
223
- }
224
- }
225
- };
226
- };
227
- var initializePlugin = async (pluginDefinition) => {
228
- const provides = await pluginDefinition.initialize?.();
229
- return {
230
- ...pluginDefinition,
231
- provides: {
232
- ...pluginDefinition.provides,
233
- ...provides
234
- }
235
- };
236
- };
237
- var rootComponents = (plugins) => {
238
- return plugins.map((plugin) => {
239
- const Component2 = plugin.provides.root;
240
- if (Component2) {
241
- return /* @__PURE__ */ React.createElement(Component2, {
242
- key: plugin.meta.id
243
- });
244
- } else {
245
- return null;
246
- }
247
- }).filter((node) => Boolean(node));
248
- };
249
- var composeContext = (plugins) => {
250
- return compose(plugins.map((p) => p.provides.context).filter(Boolean));
251
- };
252
- var compose = (contexts) => {
253
- return [
254
- ...contexts
255
- ].reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React.createElement(Acc, null, /* @__PURE__ */ React.createElement(Next, null, children)));
256
- };
257
131
 
258
132
  // packages/sdk/app-framework/src/plugins/SurfacePlugin/helpers.ts
259
133
  var isObject = (data) => !!data && typeof data === "object";
260
134
 
261
135
  // packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx
262
- import React2, { Component } from "react";
136
+ import React, { Component } from "react";
263
137
  var ErrorBoundary = class extends Component {
264
138
  constructor(props) {
265
139
  super(props);
@@ -279,7 +153,7 @@ var ErrorBoundary = class extends Component {
279
153
  }
280
154
  render() {
281
155
  if (this.state.error) {
282
- return /* @__PURE__ */ React2.createElement(this.props.fallback, {
156
+ return /* @__PURE__ */ React.createElement(this.props.fallback, {
283
157
  error: this.state.error,
284
158
  reset: this.resetError
285
159
  });
@@ -294,9 +168,9 @@ var ErrorBoundary = class extends Component {
294
168
  };
295
169
 
296
170
  // packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx
297
- import React3, { forwardRef, Fragment, isValidElement } from "react";
171
+ import React2, { forwardRef, Fragment, isValidElement, Suspense } from "react";
298
172
  import { createContext as createContext2, useContext as useContext2 } from "react";
299
- var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, ...rest }, forwardedRef) => {
173
+ var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, placeholder, ...rest }, forwardedRef) => {
300
174
  const props = {
301
175
  role,
302
176
  name,
@@ -305,16 +179,17 @@ var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, ...rest
305
179
  };
306
180
  const context = useContext2(SurfaceContext);
307
181
  const data = props.data ?? (name && context?.surfaces?.[name]?.data || {});
308
- return /* @__PURE__ */ React3.createElement(React3.Fragment, null, fallback ? /* @__PURE__ */ React3.createElement(ErrorBoundary, {
309
- data,
310
- fallback
311
- }, /* @__PURE__ */ React3.createElement(SurfaceResolver, {
182
+ const resolver = /* @__PURE__ */ React2.createElement(SurfaceResolver, {
312
183
  ...props,
313
184
  ref: forwardedRef
314
- })) : /* @__PURE__ */ React3.createElement(SurfaceResolver, {
315
- ...props,
316
- ref: forwardedRef
317
- }));
185
+ });
186
+ const suspense = placeholder ? /* @__PURE__ */ React2.createElement(Suspense, {
187
+ fallback: placeholder
188
+ }, resolver) : resolver;
189
+ return fallback ? /* @__PURE__ */ React2.createElement(ErrorBoundary, {
190
+ data,
191
+ fallback
192
+ }, suspense) : suspense;
318
193
  });
319
194
  var SurfaceContext = /* @__PURE__ */ createContext2(null);
320
195
  var SurfaceResolver = /* @__PURE__ */ forwardRef((props, forwardedRef) => {
@@ -328,9 +203,9 @@ var SurfaceResolver = /* @__PURE__ */ forwardRef((props, forwardedRef) => {
328
203
  ...props.surfaces
329
204
  }
330
205
  };
331
- return /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
206
+ return /* @__PURE__ */ React2.createElement(SurfaceContext.Provider, {
332
207
  value: currentContext
333
- }, nodes.length > 0 ? nodes : props.contentFallback ? /* @__PURE__ */ React3.createElement(props.contentFallback, null) : null);
208
+ }, nodes);
334
209
  });
335
210
  var resolveNodes = (components, props, context, forwardedRef) => {
336
211
  const data = {
@@ -365,12 +240,170 @@ var resolveNodes = (components, props, context, forwardedRef) => {
365
240
  return 1;
366
241
  }
367
242
  return 0;
368
- }).map(([key, result]) => /* @__PURE__ */ React3.createElement(Fragment, {
243
+ }).map(([key, result]) => /* @__PURE__ */ React2.createElement(Fragment, {
369
244
  key
370
245
  }, result.node));
371
246
  return props.limit ? nodes.slice(0, props.limit) : nodes;
372
247
  };
373
248
 
249
+ // packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx
250
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
251
+ var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
252
+ var PLUGIN_HOST = "dxos.org/plugin/host";
253
+ var PluginHost = ({ order, plugins: definitions, core = [], defaults = [], fallback = DefaultFallback, placeholder = null }) => {
254
+ const state = new LocalStorageStore(PLUGIN_HOST, {
255
+ ready: false,
256
+ enabled: [
257
+ ...defaults
258
+ ],
259
+ plugins: [],
260
+ available: order.filter(({ id }) => !core.includes(id)),
261
+ setPlugin: (id, enabled) => {
262
+ if (enabled) {
263
+ state.values.enabled = [
264
+ ...state.values.enabled,
265
+ id
266
+ ];
267
+ } else {
268
+ state.values.enabled = state.values.enabled.filter((enabled2) => enabled2 !== id);
269
+ }
270
+ }
271
+ });
272
+ state.prop(state.values.$enabled, "enabled", LocalStorageStore.json);
273
+ return {
274
+ meta: {
275
+ id: PLUGIN_HOST,
276
+ name: "Plugin host"
277
+ },
278
+ provides: {
279
+ plugins: state.values,
280
+ context: ({ children }) => /* @__PURE__ */ React3.createElement(PluginProvider, {
281
+ value: state.values
282
+ }, children),
283
+ root: () => {
284
+ return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
285
+ fallback
286
+ }, /* @__PURE__ */ React3.createElement(Root, {
287
+ order,
288
+ core,
289
+ definitions,
290
+ state: state.values,
291
+ placeholder
292
+ }));
293
+ }
294
+ }
295
+ };
296
+ };
297
+ var DefaultFallback = ({ error }) => {
298
+ return /* @__PURE__ */ React3.createElement("div", {
299
+ style: {
300
+ padding: "1rem"
301
+ }
302
+ }, /* @__PURE__ */ React3.createElement("h1", {
303
+ style: {
304
+ fontSize: "1.2rem",
305
+ fontWeight: 700,
306
+ margin: "0.5rem 0"
307
+ }
308
+ }, error.message), /* @__PURE__ */ React3.createElement("pre", null, error.stack));
309
+ };
310
+ var Root = ({ order, core: corePluginIds, definitions, state, placeholder }) => {
311
+ const [error, setError] = useState();
312
+ useEffect(() => {
313
+ log("initializing plugins", {
314
+ enabled: state.enabled
315
+ }, {
316
+ F: __dxlog_file,
317
+ L: 101,
318
+ S: void 0,
319
+ C: (f, a) => f(...a)
320
+ });
321
+ const timeout = setTimeout(async () => {
322
+ try {
323
+ const enabledIds = [
324
+ ...corePluginIds,
325
+ ...state.enabled
326
+ ].sort((a, b) => {
327
+ const indexA = order.findIndex(({ id }) => id === a);
328
+ const indexB = order.findIndex(({ id }) => id === b);
329
+ return indexA - indexB;
330
+ });
331
+ const enabled = await Promise.all(enabledIds.map((id) => definitions[id]).filter((definition) => Boolean(definition)).map((definition) => definition()));
332
+ const plugins = await Promise.all(enabled.map(async (definition) => {
333
+ const plugin = await initializePlugin(definition).catch((err) => {
334
+ console.error("Failed to initialize plugin:", definition.meta.id, err);
335
+ return void 0;
336
+ });
337
+ return plugin;
338
+ })).then((plugins2) => plugins2.filter((plugin) => Boolean(plugin)));
339
+ log("plugins initialized", {
340
+ plugins
341
+ }, {
342
+ F: __dxlog_file,
343
+ L: 127,
344
+ S: void 0,
345
+ C: (f, a) => f(...a)
346
+ });
347
+ await Promise.all(enabled.map((pluginDefinition) => pluginDefinition.ready?.(plugins)));
348
+ log("plugins ready", {
349
+ plugins
350
+ }, {
351
+ F: __dxlog_file,
352
+ L: 130,
353
+ S: void 0,
354
+ C: (f, a) => f(...a)
355
+ });
356
+ state.plugins = shallow(plugins);
357
+ state.ready = true;
358
+ } catch (err) {
359
+ setError(err);
360
+ }
361
+ });
362
+ return () => {
363
+ clearTimeout(timeout);
364
+ state.ready = false;
365
+ };
366
+ }, []);
367
+ if (error) {
368
+ throw error;
369
+ }
370
+ if (!state.ready) {
371
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, placeholder);
372
+ }
373
+ const ComposedContext = composeContext(state.plugins);
374
+ return /* @__PURE__ */ React3.createElement(ComposedContext, null, rootComponents(state.plugins));
375
+ };
376
+ var initializePlugin = async (pluginDefinition) => {
377
+ const provides = await pluginDefinition.initialize?.();
378
+ return {
379
+ ...pluginDefinition,
380
+ provides: {
381
+ ...pluginDefinition.provides,
382
+ ...provides
383
+ }
384
+ };
385
+ };
386
+ var rootComponents = (plugins) => {
387
+ return plugins.map((plugin) => {
388
+ const Component2 = plugin.provides.root;
389
+ if (Component2) {
390
+ return /* @__PURE__ */ React3.createElement(Component2, {
391
+ key: plugin.meta.id
392
+ });
393
+ } else {
394
+ return null;
395
+ }
396
+ }).filter((node) => Boolean(node));
397
+ };
398
+ var composeContext = (plugins) => {
399
+ return compose(plugins.map((p) => p.provides.context).filter(Boolean));
400
+ };
401
+ var compose = (contexts) => {
402
+ return [
403
+ ...contexts
404
+ ].reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React3.createElement(Acc, null, /* @__PURE__ */ React3.createElement(Next, null, children)));
405
+ };
406
+
374
407
  // packages/sdk/app-framework/src/App.tsx
375
408
  import React4 from "react";
376
409
  import { invariant } from "@dxos/invariant";
@@ -385,7 +418,7 @@ var createApp = ({ order, plugins, core = order.map(({ id }) => id), ...params }
385
418
  plugins: {
386
419
  ...plugins,
387
420
  [meta_default2.id]: Plugin.lazy(() => import("./plugin-JDIMDLDU.mjs")),
388
- [meta_default.id]: Plugin.lazy(() => import("./plugin-YLDDUID4.mjs"))
421
+ [meta_default.id]: Plugin.lazy(() => import("./plugin-PGPBA2JO.mjs"))
389
422
  },
390
423
  core: [
391
424
  meta_default2.id,
@@ -413,8 +446,8 @@ var createApp = ({ order, plugins, core = order.map(({ id }) => id), ...params }
413
446
  ]
414
447
  });
415
448
  const Context = host.provides.context;
416
- const Root = host.provides.root;
417
- return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(Root, null));
449
+ const Root2 = host.provides.root;
450
+ return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(Root2, null));
418
451
  };
419
452
  export {
420
453
  ErrorBoundary,