@dxos/app-framework 0.3.11-main.f89c150 → 0.3.11-main.fc97a54
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/{chunk-QYIBDGYI.mjs → chunk-7MQ2DVDI.mjs} +2 -3
- package/dist/lib/browser/{chunk-QYIBDGYI.mjs.map → chunk-7MQ2DVDI.mjs.map} +2 -2
- package/dist/lib/browser/index.mjs +180 -147
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{plugin-YLDDUID4.mjs → plugin-PGPBA2JO.mjs} +36 -13
- package/dist/lib/browser/plugin-PGPBA2JO.mjs.map +7 -0
- package/dist/lib/node/{chunk-YWRBMGDT.cjs → chunk-FETX4EGX.cjs} +5 -6
- package/dist/lib/node/{chunk-YWRBMGDT.cjs.map → chunk-FETX4EGX.cjs.map} +2 -2
- package/dist/lib/node/index.cjs +180 -149
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{plugin-NP3IH5Q3.cjs → plugin-HLGHD6N5.cjs} +43 -19
- package/dist/lib/node/plugin-HLGHD6N5.cjs.map +7 -0
- package/dist/types/src/plugins/IntentPlugin/intent.d.ts +33 -2
- package/dist/types/src/plugins/IntentPlugin/intent.d.ts.map +1 -1
- package/dist/types/src/plugins/IntentPlugin/plugin.d.ts.map +1 -1
- package/dist/types/src/plugins/PluginHost/PluginHost.d.ts +4 -2
- package/dist/types/src/plugins/PluginHost/PluginHost.d.ts.map +1 -1
- package/dist/types/src/plugins/PluginHost/plugin.d.ts +1 -1
- package/dist/types/src/plugins/PluginHost/plugin.d.ts.map +1 -1
- package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts +4 -5
- package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts.map +1 -1
- package/dist/types/src/plugins/common/layout.d.ts +15 -14
- package/dist/types/src/plugins/common/layout.d.ts.map +1 -1
- package/package.json +8 -7
- package/project.json +3 -1
- package/src/plugins/IntentPlugin/IntentContext.tsx +1 -1
- package/src/plugins/IntentPlugin/intent.ts +38 -2
- package/src/plugins/IntentPlugin/plugin.tsx +38 -9
- package/src/plugins/PluginHost/PluginHost.tsx +92 -57
- package/src/plugins/PluginHost/plugin.ts +2 -1
- package/src/plugins/SurfacePlugin/Surface.tsx +15 -21
- package/src/plugins/common/layout.ts +15 -14
- package/src/vite-env.d.ts +5 -0
- package/tsconfig.json +3 -0
- package/dist/lib/browser/plugin-YLDDUID4.mjs.map +0 -7
- 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-
|
|
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,
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
|
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__ */
|
|
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
|
|
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
|
-
|
|
309
|
-
data,
|
|
310
|
-
fallback
|
|
311
|
-
}, /* @__PURE__ */ React3.createElement(SurfaceResolver, {
|
|
182
|
+
const resolver = /* @__PURE__ */ React2.createElement(SurfaceResolver, {
|
|
312
183
|
...props,
|
|
313
184
|
ref: forwardedRef
|
|
314
|
-
})
|
|
315
|
-
|
|
316
|
-
|
|
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__ */
|
|
206
|
+
return /* @__PURE__ */ React2.createElement(SurfaceContext.Provider, {
|
|
332
207
|
value: currentContext
|
|
333
|
-
}, nodes
|
|
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__ */
|
|
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-
|
|
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
|
|
417
|
-
return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(
|
|
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,
|