@dxos/app-framework 0.3.11-main.a6c4a82 → 0.3.11-main.a757f8c
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-C2K6M6WC.mjs → chunk-7MQ2DVDI.mjs} +19 -2
- package/dist/lib/browser/chunk-7MQ2DVDI.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +179 -142
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/plugin-KC4DT4AJ.mjs +109 -0
- package/dist/lib/browser/plugin-KC4DT4AJ.mjs.map +7 -0
- package/dist/lib/node/{chunk-BOQBLWMX.cjs → chunk-FETX4EGX.cjs} +26 -7
- package/dist/lib/node/chunk-FETX4EGX.cjs.map +7 -0
- package/dist/lib/node/index.cjs +172 -137
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{plugin-WDNRX2SR.cjs → plugin-RDMDEGRT.cjs} +60 -14
- package/dist/lib/node/plugin-RDMDEGRT.cjs.map +7 -0
- package/dist/types/src/plugins/IntentPlugin/IntentContext.d.ts +10 -2
- package/dist/types/src/plugins/IntentPlugin/IntentContext.d.ts.map +1 -1
- package/dist/types/src/plugins/IntentPlugin/intent.d.ts +34 -1
- 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/IntentPlugin/provides.d.ts +2 -2
- package/dist/types/src/plugins/IntentPlugin/provides.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.map +1 -1
- package/dist/types/src/plugins/common/layout.d.ts +17 -15
- 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 +27 -3
- package/src/plugins/IntentPlugin/intent.ts +41 -1
- package/src/plugins/IntentPlugin/plugin.tsx +56 -7
- package/src/plugins/IntentPlugin/provides.ts +2 -2
- package/src/plugins/PluginHost/PluginHost.tsx +92 -57
- package/src/plugins/PluginHost/plugin.ts +1 -0
- package/src/plugins/common/layout.ts +16 -14
- package/tsconfig.json +3 -0
- package/dist/lib/browser/chunk-C2K6M6WC.mjs.map +0 -7
- package/dist/lib/browser/plugin-CBPJO5NB.mjs +0 -63
- package/dist/lib/browser/plugin-CBPJO5NB.mjs.map +0 -7
- package/dist/lib/node/chunk-BOQBLWMX.cjs.map +0 -7
- package/dist/lib/node/plugin-WDNRX2SR.cjs.map +0 -7
|
@@ -4,11 +4,26 @@ var parseIntentResolverPlugin = (plugin) => plugin.provides.intent?.resolver ? p
|
|
|
4
4
|
|
|
5
5
|
// packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx
|
|
6
6
|
import { createContext, useContext } from "react";
|
|
7
|
+
import { useEffect } from "react";
|
|
7
8
|
var IntentContext = /* @__PURE__ */ createContext({
|
|
8
|
-
dispatch: async () => {
|
|
9
|
+
dispatch: async () => ({}),
|
|
10
|
+
registerResolver: () => () => {
|
|
9
11
|
}
|
|
10
12
|
});
|
|
11
13
|
var useIntent = () => useContext(IntentContext);
|
|
14
|
+
var useIntentDispatcher = () => {
|
|
15
|
+
const { dispatch } = useIntent();
|
|
16
|
+
return dispatch;
|
|
17
|
+
};
|
|
18
|
+
var useIntentResolver = (plugin, resolver) => {
|
|
19
|
+
const { registerResolver } = useIntent();
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
return registerResolver(plugin, resolver);
|
|
22
|
+
}, [
|
|
23
|
+
plugin,
|
|
24
|
+
resolver
|
|
25
|
+
]);
|
|
26
|
+
};
|
|
12
27
|
var IntentProvider = IntentContext.Provider;
|
|
13
28
|
|
|
14
29
|
// packages/sdk/app-framework/src/plugins/IntentPlugin/meta.ts
|
|
@@ -21,7 +36,9 @@ export {
|
|
|
21
36
|
parseIntentPlugin,
|
|
22
37
|
parseIntentResolverPlugin,
|
|
23
38
|
useIntent,
|
|
39
|
+
useIntentDispatcher,
|
|
40
|
+
useIntentResolver,
|
|
24
41
|
IntentProvider,
|
|
25
42
|
meta_default
|
|
26
43
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
44
|
+
//# sourceMappingURL=chunk-7MQ2DVDI.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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,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
|
+
"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
|
+
}
|
|
@@ -10,8 +10,10 @@ import {
|
|
|
10
10
|
meta_default,
|
|
11
11
|
parseIntentPlugin,
|
|
12
12
|
parseIntentResolverPlugin,
|
|
13
|
-
useIntent
|
|
14
|
-
|
|
13
|
+
useIntent,
|
|
14
|
+
useIntentDispatcher,
|
|
15
|
+
useIntentResolver
|
|
16
|
+
} from "./chunk-7MQ2DVDI.mjs";
|
|
15
17
|
import {
|
|
16
18
|
filterPlugins,
|
|
17
19
|
findPlugin,
|
|
@@ -55,6 +57,7 @@ var LayoutAction;
|
|
|
55
57
|
LayoutAction2[LayoutAction2["OPEN_POPOVER"] = `${LAYOUT_ACTION}/open-popover`] = "OPEN_POPOVER";
|
|
56
58
|
LayoutAction2[LayoutAction2["CLOSE_POPOVER"] = `${LAYOUT_ACTION}/close-popover`] = "CLOSE_POPOVER";
|
|
57
59
|
LayoutAction2[LayoutAction2["ACTIVATE"] = `${LAYOUT_ACTION}/activate`] = "ACTIVATE";
|
|
60
|
+
LayoutAction2[LayoutAction2["FOCUS"] = `${LAYOUT_ACTION}/focus`] = "FOCUS";
|
|
58
61
|
})(LayoutAction || (LayoutAction = {}));
|
|
59
62
|
|
|
60
63
|
// packages/sdk/app-framework/src/plugins/common/metadata.ts
|
|
@@ -92,7 +95,7 @@ var parseTranslationsPlugin = (plugin) => {
|
|
|
92
95
|
var pluginMeta = (meta) => meta;
|
|
93
96
|
var Plugin;
|
|
94
97
|
(function(Plugin2) {
|
|
95
|
-
|
|
98
|
+
Plugin2.lazy = (p, props) => {
|
|
96
99
|
return () => p().then(({ default: definition }) => {
|
|
97
100
|
return definition(props);
|
|
98
101
|
});
|
|
@@ -122,141 +125,15 @@ var PluginProvider = PluginContext.Provider;
|
|
|
122
125
|
|
|
123
126
|
// packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx
|
|
124
127
|
import { shallow } from "deepsignal/react";
|
|
125
|
-
import
|
|
128
|
+
import React3, { useEffect, useState } from "react";
|
|
126
129
|
import { LocalStorageStore } from "@dxos/local-storage";
|
|
127
130
|
import { log } from "@dxos/log";
|
|
128
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
|
|
129
|
-
var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
|
|
130
|
-
var PLUGIN_HOST = "dxos.org/plugin/host";
|
|
131
|
-
var PluginHost = ({ order, plugins: definitions, core = [], defaults = [], fallback = null }) => {
|
|
132
|
-
const state = new LocalStorageStore(PLUGIN_HOST, {
|
|
133
|
-
ready: false,
|
|
134
|
-
enabled: [
|
|
135
|
-
...defaults
|
|
136
|
-
],
|
|
137
|
-
plugins: [],
|
|
138
|
-
available: order.filter(({ id }) => !core.includes(id)),
|
|
139
|
-
setPlugin: (id, enabled) => {
|
|
140
|
-
if (enabled) {
|
|
141
|
-
state.values.enabled = [
|
|
142
|
-
...state.values.enabled,
|
|
143
|
-
id
|
|
144
|
-
];
|
|
145
|
-
} else {
|
|
146
|
-
state.values.enabled = state.values.enabled.filter((enabled2) => enabled2 !== id);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
state.prop(state.values.$enabled, "enabled", LocalStorageStore.json);
|
|
151
|
-
return {
|
|
152
|
-
meta: {
|
|
153
|
-
id: PLUGIN_HOST,
|
|
154
|
-
name: "Plugin host"
|
|
155
|
-
},
|
|
156
|
-
provides: {
|
|
157
|
-
plugins: state.values,
|
|
158
|
-
context: ({ children }) => /* @__PURE__ */ React.createElement(PluginProvider, {
|
|
159
|
-
value: state.values
|
|
160
|
-
}, children),
|
|
161
|
-
root: () => {
|
|
162
|
-
useEffect(() => {
|
|
163
|
-
log("initializing plugins", {
|
|
164
|
-
enabled: state.values.enabled
|
|
165
|
-
}, {
|
|
166
|
-
F: __dxlog_file,
|
|
167
|
-
L: 67,
|
|
168
|
-
S: void 0,
|
|
169
|
-
C: (f, a) => f(...a)
|
|
170
|
-
});
|
|
171
|
-
const timeout = setTimeout(async () => {
|
|
172
|
-
const enabledIds = [
|
|
173
|
-
...core,
|
|
174
|
-
...state.values.enabled
|
|
175
|
-
].sort((a, b) => {
|
|
176
|
-
const indexA = order.findIndex(({ id }) => id === a);
|
|
177
|
-
const indexB = order.findIndex(({ id }) => id === b);
|
|
178
|
-
return indexA - indexB;
|
|
179
|
-
});
|
|
180
|
-
const enabled = await Promise.all(enabledIds.map((id) => definitions[id]).filter((definition) => Boolean(definition)).map((definition) => definition()));
|
|
181
|
-
const plugins = await Promise.all(enabled.map(async (definition) => {
|
|
182
|
-
const plugin = await initializePlugin(definition).catch((err) => {
|
|
183
|
-
console.error("Failed to initialize plugin:", definition.meta.id, err);
|
|
184
|
-
return void 0;
|
|
185
|
-
});
|
|
186
|
-
return plugin;
|
|
187
|
-
})).then((plugins2) => plugins2.filter((plugin) => Boolean(plugin)));
|
|
188
|
-
log("plugins initialized", {
|
|
189
|
-
plugins
|
|
190
|
-
}, {
|
|
191
|
-
F: __dxlog_file,
|
|
192
|
-
L: 92,
|
|
193
|
-
S: void 0,
|
|
194
|
-
C: (f, a) => f(...a)
|
|
195
|
-
});
|
|
196
|
-
await Promise.all(enabled.map(async (pluginDefinition) => {
|
|
197
|
-
await pluginDefinition.ready?.(plugins);
|
|
198
|
-
}));
|
|
199
|
-
log("plugins ready", {
|
|
200
|
-
plugins
|
|
201
|
-
}, {
|
|
202
|
-
F: __dxlog_file,
|
|
203
|
-
L: 99,
|
|
204
|
-
S: void 0,
|
|
205
|
-
C: (f, a) => f(...a)
|
|
206
|
-
});
|
|
207
|
-
state.values.plugins = shallow(plugins);
|
|
208
|
-
state.values.ready = true;
|
|
209
|
-
});
|
|
210
|
-
return () => {
|
|
211
|
-
clearTimeout(timeout);
|
|
212
|
-
state.values.ready = false;
|
|
213
|
-
};
|
|
214
|
-
}, []);
|
|
215
|
-
if (!state.values.ready) {
|
|
216
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, fallback);
|
|
217
|
-
}
|
|
218
|
-
const ComposedContext = composeContext(state.values.plugins);
|
|
219
|
-
return /* @__PURE__ */ React.createElement(ComposedContext, null, rootComponents(state.values.plugins));
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
};
|
|
224
|
-
var initializePlugin = async (pluginDefinition) => {
|
|
225
|
-
const provides = await pluginDefinition.initialize?.();
|
|
226
|
-
return {
|
|
227
|
-
...pluginDefinition,
|
|
228
|
-
provides: {
|
|
229
|
-
...pluginDefinition.provides,
|
|
230
|
-
...provides
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
};
|
|
234
|
-
var rootComponents = (plugins) => {
|
|
235
|
-
return plugins.map((plugin) => {
|
|
236
|
-
const Component2 = plugin.provides.root;
|
|
237
|
-
if (Component2) {
|
|
238
|
-
return /* @__PURE__ */ React.createElement(Component2, {
|
|
239
|
-
key: plugin.meta.id
|
|
240
|
-
});
|
|
241
|
-
} else {
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
}).filter((node) => Boolean(node));
|
|
245
|
-
};
|
|
246
|
-
var composeContext = (plugins) => {
|
|
247
|
-
return compose(plugins.map((p) => p.provides.context).filter(Boolean));
|
|
248
|
-
};
|
|
249
|
-
var compose = (contexts) => {
|
|
250
|
-
return [
|
|
251
|
-
...contexts
|
|
252
|
-
].reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React.createElement(Acc, null, /* @__PURE__ */ React.createElement(Next, null, children)));
|
|
253
|
-
};
|
|
254
131
|
|
|
255
132
|
// packages/sdk/app-framework/src/plugins/SurfacePlugin/helpers.ts
|
|
256
133
|
var isObject = (data) => !!data && typeof data === "object";
|
|
257
134
|
|
|
258
135
|
// packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx
|
|
259
|
-
import
|
|
136
|
+
import React, { Component } from "react";
|
|
260
137
|
var ErrorBoundary = class extends Component {
|
|
261
138
|
constructor(props) {
|
|
262
139
|
super(props);
|
|
@@ -276,7 +153,7 @@ var ErrorBoundary = class extends Component {
|
|
|
276
153
|
}
|
|
277
154
|
render() {
|
|
278
155
|
if (this.state.error) {
|
|
279
|
-
return /* @__PURE__ */
|
|
156
|
+
return /* @__PURE__ */ React.createElement(this.props.fallback, {
|
|
280
157
|
error: this.state.error,
|
|
281
158
|
reset: this.resetError
|
|
282
159
|
});
|
|
@@ -291,7 +168,7 @@ var ErrorBoundary = class extends Component {
|
|
|
291
168
|
};
|
|
292
169
|
|
|
293
170
|
// packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx
|
|
294
|
-
import
|
|
171
|
+
import React2, { forwardRef, Fragment, isValidElement } from "react";
|
|
295
172
|
import { createContext as createContext2, useContext as useContext2 } from "react";
|
|
296
173
|
var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, ...rest }, forwardedRef) => {
|
|
297
174
|
const props = {
|
|
@@ -302,13 +179,13 @@ var Surface = /* @__PURE__ */ forwardRef(({ role, name = role, fallback, ...rest
|
|
|
302
179
|
};
|
|
303
180
|
const context = useContext2(SurfaceContext);
|
|
304
181
|
const data = props.data ?? (name && context?.surfaces?.[name]?.data || {});
|
|
305
|
-
return /* @__PURE__ */
|
|
182
|
+
return /* @__PURE__ */ React2.createElement(React2.Fragment, null, fallback ? /* @__PURE__ */ React2.createElement(ErrorBoundary, {
|
|
306
183
|
data,
|
|
307
184
|
fallback
|
|
308
|
-
}, /* @__PURE__ */
|
|
185
|
+
}, /* @__PURE__ */ React2.createElement(SurfaceResolver, {
|
|
309
186
|
...props,
|
|
310
187
|
ref: forwardedRef
|
|
311
|
-
})) : /* @__PURE__ */
|
|
188
|
+
})) : /* @__PURE__ */ React2.createElement(SurfaceResolver, {
|
|
312
189
|
...props,
|
|
313
190
|
ref: forwardedRef
|
|
314
191
|
}));
|
|
@@ -325,9 +202,9 @@ var SurfaceResolver = /* @__PURE__ */ forwardRef((props, forwardedRef) => {
|
|
|
325
202
|
...props.surfaces
|
|
326
203
|
}
|
|
327
204
|
};
|
|
328
|
-
return /* @__PURE__ */
|
|
205
|
+
return /* @__PURE__ */ React2.createElement(SurfaceContext.Provider, {
|
|
329
206
|
value: currentContext
|
|
330
|
-
}, nodes.length > 0 ? nodes : props.contentFallback ? /* @__PURE__ */
|
|
207
|
+
}, nodes.length > 0 ? nodes : props.contentFallback ? /* @__PURE__ */ React2.createElement(props.contentFallback, null) : null);
|
|
331
208
|
});
|
|
332
209
|
var resolveNodes = (components, props, context, forwardedRef) => {
|
|
333
210
|
const data = {
|
|
@@ -362,12 +239,170 @@ var resolveNodes = (components, props, context, forwardedRef) => {
|
|
|
362
239
|
return 1;
|
|
363
240
|
}
|
|
364
241
|
return 0;
|
|
365
|
-
}).map(([key, result]) => /* @__PURE__ */
|
|
242
|
+
}).map(([key, result]) => /* @__PURE__ */ React2.createElement(Fragment, {
|
|
366
243
|
key
|
|
367
244
|
}, result.node));
|
|
368
245
|
return props.limit ? nodes.slice(0, props.limit) : nodes;
|
|
369
246
|
};
|
|
370
247
|
|
|
248
|
+
// packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx
|
|
249
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
|
|
250
|
+
var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
|
|
251
|
+
var PLUGIN_HOST = "dxos.org/plugin/host";
|
|
252
|
+
var PluginHost = ({ order, plugins: definitions, core = [], defaults = [], fallback = DefaultFallback, placeholder = null }) => {
|
|
253
|
+
const state = new LocalStorageStore(PLUGIN_HOST, {
|
|
254
|
+
ready: false,
|
|
255
|
+
enabled: [
|
|
256
|
+
...defaults
|
|
257
|
+
],
|
|
258
|
+
plugins: [],
|
|
259
|
+
available: order.filter(({ id }) => !core.includes(id)),
|
|
260
|
+
setPlugin: (id, enabled) => {
|
|
261
|
+
if (enabled) {
|
|
262
|
+
state.values.enabled = [
|
|
263
|
+
...state.values.enabled,
|
|
264
|
+
id
|
|
265
|
+
];
|
|
266
|
+
} else {
|
|
267
|
+
state.values.enabled = state.values.enabled.filter((enabled2) => enabled2 !== id);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
state.prop(state.values.$enabled, "enabled", LocalStorageStore.json);
|
|
272
|
+
return {
|
|
273
|
+
meta: {
|
|
274
|
+
id: PLUGIN_HOST,
|
|
275
|
+
name: "Plugin host"
|
|
276
|
+
},
|
|
277
|
+
provides: {
|
|
278
|
+
plugins: state.values,
|
|
279
|
+
context: ({ children }) => /* @__PURE__ */ React3.createElement(PluginProvider, {
|
|
280
|
+
value: state.values
|
|
281
|
+
}, children),
|
|
282
|
+
root: () => {
|
|
283
|
+
return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
|
|
284
|
+
fallback
|
|
285
|
+
}, /* @__PURE__ */ React3.createElement(Root, {
|
|
286
|
+
order,
|
|
287
|
+
core,
|
|
288
|
+
definitions,
|
|
289
|
+
state: state.values,
|
|
290
|
+
placeholder
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
};
|
|
296
|
+
var DefaultFallback = ({ error }) => {
|
|
297
|
+
return /* @__PURE__ */ React3.createElement("div", {
|
|
298
|
+
style: {
|
|
299
|
+
padding: "1rem"
|
|
300
|
+
}
|
|
301
|
+
}, /* @__PURE__ */ React3.createElement("h1", {
|
|
302
|
+
style: {
|
|
303
|
+
fontSize: "1.2rem",
|
|
304
|
+
fontWeight: 700,
|
|
305
|
+
margin: "0.5rem 0"
|
|
306
|
+
}
|
|
307
|
+
}, error.message), /* @__PURE__ */ React3.createElement("pre", null, error.stack));
|
|
308
|
+
};
|
|
309
|
+
var Root = ({ order, core: corePluginIds, definitions, state, placeholder }) => {
|
|
310
|
+
const [error, setError] = useState();
|
|
311
|
+
useEffect(() => {
|
|
312
|
+
log("initializing plugins", {
|
|
313
|
+
enabled: state.enabled
|
|
314
|
+
}, {
|
|
315
|
+
F: __dxlog_file,
|
|
316
|
+
L: 101,
|
|
317
|
+
S: void 0,
|
|
318
|
+
C: (f, a) => f(...a)
|
|
319
|
+
});
|
|
320
|
+
const timeout = setTimeout(async () => {
|
|
321
|
+
try {
|
|
322
|
+
const enabledIds = [
|
|
323
|
+
...corePluginIds,
|
|
324
|
+
...state.enabled
|
|
325
|
+
].sort((a, b) => {
|
|
326
|
+
const indexA = order.findIndex(({ id }) => id === a);
|
|
327
|
+
const indexB = order.findIndex(({ id }) => id === b);
|
|
328
|
+
return indexA - indexB;
|
|
329
|
+
});
|
|
330
|
+
const enabled = await Promise.all(enabledIds.map((id) => definitions[id]).filter((definition) => Boolean(definition)).map((definition) => definition()));
|
|
331
|
+
const plugins = await Promise.all(enabled.map(async (definition) => {
|
|
332
|
+
const plugin = await initializePlugin(definition).catch((err) => {
|
|
333
|
+
console.error("Failed to initialize plugin:", definition.meta.id, err);
|
|
334
|
+
return void 0;
|
|
335
|
+
});
|
|
336
|
+
return plugin;
|
|
337
|
+
})).then((plugins2) => plugins2.filter((plugin) => Boolean(plugin)));
|
|
338
|
+
log("plugins initialized", {
|
|
339
|
+
plugins
|
|
340
|
+
}, {
|
|
341
|
+
F: __dxlog_file,
|
|
342
|
+
L: 127,
|
|
343
|
+
S: void 0,
|
|
344
|
+
C: (f, a) => f(...a)
|
|
345
|
+
});
|
|
346
|
+
await Promise.all(enabled.map((pluginDefinition) => pluginDefinition.ready?.(plugins)));
|
|
347
|
+
log("plugins ready", {
|
|
348
|
+
plugins
|
|
349
|
+
}, {
|
|
350
|
+
F: __dxlog_file,
|
|
351
|
+
L: 130,
|
|
352
|
+
S: void 0,
|
|
353
|
+
C: (f, a) => f(...a)
|
|
354
|
+
});
|
|
355
|
+
state.plugins = shallow(plugins);
|
|
356
|
+
state.ready = true;
|
|
357
|
+
} catch (err) {
|
|
358
|
+
setError(err);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
return () => {
|
|
362
|
+
clearTimeout(timeout);
|
|
363
|
+
state.ready = false;
|
|
364
|
+
};
|
|
365
|
+
}, []);
|
|
366
|
+
if (error) {
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
if (!state.ready) {
|
|
370
|
+
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, placeholder);
|
|
371
|
+
}
|
|
372
|
+
const ComposedContext = composeContext(state.plugins);
|
|
373
|
+
return /* @__PURE__ */ React3.createElement(ComposedContext, null, rootComponents(state.plugins));
|
|
374
|
+
};
|
|
375
|
+
var initializePlugin = async (pluginDefinition) => {
|
|
376
|
+
const provides = await pluginDefinition.initialize?.();
|
|
377
|
+
return {
|
|
378
|
+
...pluginDefinition,
|
|
379
|
+
provides: {
|
|
380
|
+
...pluginDefinition.provides,
|
|
381
|
+
...provides
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
};
|
|
385
|
+
var rootComponents = (plugins) => {
|
|
386
|
+
return plugins.map((plugin) => {
|
|
387
|
+
const Component2 = plugin.provides.root;
|
|
388
|
+
if (Component2) {
|
|
389
|
+
return /* @__PURE__ */ React3.createElement(Component2, {
|
|
390
|
+
key: plugin.meta.id
|
|
391
|
+
});
|
|
392
|
+
} else {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
}).filter((node) => Boolean(node));
|
|
396
|
+
};
|
|
397
|
+
var composeContext = (plugins) => {
|
|
398
|
+
return compose(plugins.map((p) => p.provides.context).filter(Boolean));
|
|
399
|
+
};
|
|
400
|
+
var compose = (contexts) => {
|
|
401
|
+
return [
|
|
402
|
+
...contexts
|
|
403
|
+
].reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React3.createElement(Acc, null, /* @__PURE__ */ React3.createElement(Next, null, children)));
|
|
404
|
+
};
|
|
405
|
+
|
|
371
406
|
// packages/sdk/app-framework/src/App.tsx
|
|
372
407
|
import React4 from "react";
|
|
373
408
|
import { invariant } from "@dxos/invariant";
|
|
@@ -382,7 +417,7 @@ var createApp = ({ order, plugins, core = order.map(({ id }) => id), ...params }
|
|
|
382
417
|
plugins: {
|
|
383
418
|
...plugins,
|
|
384
419
|
[meta_default2.id]: Plugin.lazy(() => import("./plugin-JDIMDLDU.mjs")),
|
|
385
|
-
[meta_default.id]: Plugin.lazy(() => import("./plugin-
|
|
420
|
+
[meta_default.id]: Plugin.lazy(() => import("./plugin-KC4DT4AJ.mjs"))
|
|
386
421
|
},
|
|
387
422
|
core: [
|
|
388
423
|
meta_default2.id,
|
|
@@ -410,8 +445,8 @@ var createApp = ({ order, plugins, core = order.map(({ id }) => id), ...params }
|
|
|
410
445
|
]
|
|
411
446
|
});
|
|
412
447
|
const Context = host.provides.context;
|
|
413
|
-
const
|
|
414
|
-
return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(
|
|
448
|
+
const Root2 = host.provides.root;
|
|
449
|
+
return () => /* @__PURE__ */ React4.createElement(Context, null, /* @__PURE__ */ React4.createElement(Root2, null));
|
|
415
450
|
};
|
|
416
451
|
export {
|
|
417
452
|
ErrorBoundary,
|
|
@@ -448,6 +483,8 @@ export {
|
|
|
448
483
|
pluginMeta,
|
|
449
484
|
resolvePlugin,
|
|
450
485
|
useIntent,
|
|
486
|
+
useIntentDispatcher,
|
|
487
|
+
useIntentResolver,
|
|
451
488
|
usePlugin,
|
|
452
489
|
usePlugins,
|
|
453
490
|
useResolvePlugin,
|