@dxos/app-framework 0.3.5-next.63b0922 → 0.3.5
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/index.mjs +20 -7
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +22 -7
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/plugins/IntentPlugin/IntentPlugin.d.ts.map +1 -1
- package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts +5 -0
- package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts.map +1 -1
- package/dist/types/src/plugins/common/index.d.ts +1 -0
- package/dist/types/src/plugins/common/index.d.ts.map +1 -1
- package/dist/types/src/plugins/common/metadata.d.ts +16 -0
- package/dist/types/src/plugins/common/metadata.d.ts.map +1 -0
- package/dist/types/src/plugins/common/translations.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/plugins/IntentPlugin/IntentPlugin.tsx +7 -4
- package/src/plugins/SurfacePlugin/Surface.tsx +11 -2
- package/src/plugins/common/index.ts +1 -0
- package/src/plugins/common/metadata.ts +29 -0
- package/src/plugins/common/translations.ts +8 -0
|
@@ -35,6 +35,14 @@ var LayoutAction;
|
|
|
35
35
|
LayoutAction2[LayoutAction2["ACTIVATE"] = `${LAYOUT_ACTION}/activate`] = "ACTIVATE";
|
|
36
36
|
})(LayoutAction || (LayoutAction = {}));
|
|
37
37
|
|
|
38
|
+
// packages/sdk/app-framework/src/plugins/common/metadata.ts
|
|
39
|
+
var parseMetadataRecordsPlugin = (plugin) => {
|
|
40
|
+
return plugin.provides.metadata?.records ? plugin : void 0;
|
|
41
|
+
};
|
|
42
|
+
var parseMetadataResolverPlugin = (plugin) => {
|
|
43
|
+
return plugin.provides.metadata?.resolver ? plugin : void 0;
|
|
44
|
+
};
|
|
45
|
+
|
|
38
46
|
// packages/sdk/app-framework/src/plugins/common/translations.ts
|
|
39
47
|
import { z as z2 } from "zod";
|
|
40
48
|
var ResourceKey = z2.union([
|
|
@@ -83,14 +91,17 @@ var IntentPlugin = () => {
|
|
|
83
91
|
id: "dxos.org/plugin/intent"
|
|
84
92
|
},
|
|
85
93
|
ready: async (plugins) => {
|
|
86
|
-
const dispatch = (intent) => {
|
|
94
|
+
const dispatch = async (intent) => {
|
|
87
95
|
if (intent.plugin) {
|
|
88
96
|
const plugin = findPlugin(plugins, intent.plugin);
|
|
89
97
|
return plugin?.provides.intent.resolver(intent, plugins);
|
|
90
98
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {
|
|
100
|
+
const result = await plugin.provides.intent.resolver(intent, plugins);
|
|
101
|
+
if (result) {
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
94
105
|
};
|
|
95
106
|
state.dispatch = async (intentOrArray) => {
|
|
96
107
|
let result = null;
|
|
@@ -141,7 +152,7 @@ var PluginProvider = PluginContext.Provider;
|
|
|
141
152
|
import { deepSignal as deepSignal2, shallow } from "deepsignal/react";
|
|
142
153
|
import React2, { useEffect } from "react";
|
|
143
154
|
import { log } from "@dxos/log";
|
|
144
|
-
var __dxlog_file = "/home/
|
|
155
|
+
var __dxlog_file = "/home/circleci/project/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
|
|
145
156
|
var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
|
|
146
157
|
var PluginHost = ({ plugins: definitions, fallback }) => {
|
|
147
158
|
const state = deepSignal2({
|
|
@@ -333,7 +344,7 @@ var SurfaceResolver = (props) => {
|
|
|
333
344
|
};
|
|
334
345
|
return /* @__PURE__ */ React4.createElement(SurfaceContext.Provider, {
|
|
335
346
|
value: currentContext
|
|
336
|
-
}, nodes);
|
|
347
|
+
}, nodes.length > 0 ? nodes : props.contentFallback ? /* @__PURE__ */ React4.createElement(props.contentFallback, null) : null);
|
|
337
348
|
};
|
|
338
349
|
var resolveNodes = (components, props, context) => {
|
|
339
350
|
const data = {
|
|
@@ -383,7 +394,7 @@ var SurfacePlugin = () => {
|
|
|
383
394
|
// packages/sdk/app-framework/src/App.tsx
|
|
384
395
|
import React6 from "react";
|
|
385
396
|
import { invariant } from "@dxos/invariant";
|
|
386
|
-
var __dxlog_file2 = "/home/
|
|
397
|
+
var __dxlog_file2 = "/home/circleci/project/packages/sdk/app-framework/src/App.tsx";
|
|
387
398
|
var createApp = ({ plugins, fallback }) => {
|
|
388
399
|
const host = PluginHost({
|
|
389
400
|
plugins: [
|
|
@@ -439,6 +450,8 @@ export {
|
|
|
439
450
|
parseIntentPlugin,
|
|
440
451
|
parseIntentResolverPlugin,
|
|
441
452
|
parseLayoutPlugin,
|
|
453
|
+
parseMetadataRecordsPlugin,
|
|
454
|
+
parseMetadataResolverPlugin,
|
|
442
455
|
parsePluginHost,
|
|
443
456
|
parseRootSurfacePlugin,
|
|
444
457
|
parseSurfacePlugin,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/plugins/common/graph.ts", "../../../src/plugins/common/layout.ts", "../../../src/plugins/common/translations.ts", "../../../src/plugins/helpers.ts", "../../../src/plugins/IntentPlugin/IntentContext.tsx", "../../../src/plugins/IntentPlugin/IntentPlugin.tsx", "../../../src/plugins/PluginHost/PluginContext.tsx", "../../../src/plugins/PluginHost/PluginHost.tsx", "../../../src/plugins/SurfacePlugin/ErrorBoundary.tsx", "../../../src/plugins/SurfacePlugin/Surface.tsx", "../../../src/plugins/SurfacePlugin/SurfaceRootContext.tsx", "../../../src/plugins/SurfacePlugin/SurfacePlugin.tsx", "../../../src/App.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Graph, Node } from '@dxos/app-graph';\nimport type { UnsubscribeCallback } from '@dxos/async';\n\nimport type { Plugin } from '../PluginHost';\n\n/**\n * Provides for a plugin that exposes the application graph.\n */\nexport type GraphPluginProvides = {\n graph: Graph;\n};\n\nexport type GraphBuilderProvides = {\n graph: {\n builder: (params: { parent: Node; plugins: Plugin[] }) => UnsubscribeCallback | void;\n };\n};\n\n/**\n * Type guard for graph plugins.\n */\nexport const parseGraphPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.root ? (plugin as Plugin<GraphPluginProvides>) : undefined;\n\n/**\n * Type guard for graph builder plugins.\n */\nexport const parseGraphBuilderPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.builder ? (plugin as Plugin<GraphBuilderProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\n//\n// Provides\n//\n\n/**\n * Basic state provided by a layout plugin.\n */\nexport const Layout = z.object({\n fullscreen: z.boolean(),\n sidebarOpen: z.boolean(),\n complementarySidebarOpen: z.boolean(),\n\n dialogContent: z.any().optional().describe('Data to be passed to the dialog Surface.'),\n dialogOpen: z.boolean(),\n\n popoverAnchorId: z.string().optional(),\n popoverContent: z.any().optional().describe('Data to be passed to the popover Surface.'),\n popoverOpen: z.boolean(),\n\n // TODO(wittjosiah): Array?\n active: z.string().optional().describe('Id of the currently active item.'),\n // TODO(wittjosiah): History?\n previous: z.string().optional(),\n});\n\nexport type Layout = z.infer<typeof Layout>;\n\n/**\n * Provides for a plugin that can manage the app layout.\n */\nexport type LayoutProvides = {\n layout: Readonly<Layout>;\n};\n\n/**\n * Type guard for layout plugins.\n */\nexport const parseLayoutPlugin = (plugin: Plugin) => {\n const { success } = Layout.safeParse((plugin.provides as any).layout);\n return success ? (plugin as Plugin<LayoutProvides>) : undefined;\n};\n\n//\n// Intents\n//\n\nconst LAYOUT_ACTION = 'dxos.org/plugin/intent';\n// TODO(wittjosiah): Consider consolidating some action types (e.g. toggle).\nexport enum LayoutAction {\n TOGGLE_FULLSCREEN = `${LAYOUT_ACTION}/toggle-fullscreen`,\n TOGGLE_SIDEBAR = `${LAYOUT_ACTION}/toggle-sidebar`,\n TOGGLE_COMPLEMENTARY_SIDEBAR = `${LAYOUT_ACTION}/toggle-complementary-sidebar`,\n OPEN_DIALOG = `${LAYOUT_ACTION}/open-dialog`,\n CLOSE_DIALOG = `${LAYOUT_ACTION}/close-dialog`,\n OPEN_POPOVER = `${LAYOUT_ACTION}/open-popover`,\n CLOSE_POPOVER = `${LAYOUT_ACTION}/close-popover`,\n ACTIVATE = `${LAYOUT_ACTION}/activate`,\n}\n\n/**\n * Expected payload for layout actions.\n */\nexport namespace LayoutAction {\n export type ToggleFullscreen = {\n state?: boolean;\n };\n\n export type ToggleSidebar = {\n state?: boolean;\n };\n\n export type ToggleComplementarySidebar = {\n state?: boolean;\n };\n\n export type OpenDialog = {\n component: string;\n subject: any;\n };\n\n export type CloseDialog = {};\n\n export type OpenPopover = {\n anchorId: string;\n component: string;\n subject: any;\n };\n\n export type ClosePopover = {};\n\n export type Activate = {\n id: string;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\nexport const ResourceKey = z.union([z.string(), z.record(z.any())]);\nexport type ResourceKey = z.infer<typeof ResourceKey>;\n\nexport const ResourceLanguage = z.record(ResourceKey);\nexport type ResourceLanguage = z.infer<typeof ResourceLanguage>;\n\n/**\n * A resource is a collection of translations for a language.\n */\nexport const Resource = z.record(ResourceLanguage);\nexport type Resource = z.infer<typeof Resource>;\n\n/**\n * Provides for a plugin that exposes translations.\n */\nexport type TranslationsProvides = {\n translations: Readonly<Resource[]>;\n};\n\n/**\n * Type guard for translation plugins.\n */\nexport const parseTranslationsPlugin = (plugin: Plugin) => {\n const { success } = z.array(Resource).safeParse((plugin.provides as any).translations);\n return success ? (plugin as Plugin<TranslationsProvides>) : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\n\nimport { type Plugin } from './PluginHost';\n\n/**\n * Find a plugin by ID.\n */\nexport const findPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> | undefined => {\n return plugins.find(\n (plugin) => plugin.meta.id === id || (typeof plugin.meta.shortId === 'string' && plugin.meta.shortId === id),\n ) as Plugin<T>;\n};\n\n/**\n * Find a plugin by ID, or raise an error if not found.\n */\nexport const getPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> => {\n return findPlugin(plugins, id) ?? raise(new Error(`Plugin not found: ${id}`));\n};\n\n/**\n * Filter a list of plugins to only those that match a predicate.\n */\nexport const filterPlugins = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T>[] => plugins.map((plugin) => predicate(plugin)).filter((plugin): plugin is Plugin<T> => !!plugin);\n\n/**\n * Resolves a plugin by predicate.\n *\n * @example\n * import { parseIntentPlugin, resolvePlugin } from '@dxos/app-framework';\n * const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n */\nexport const resolvePlugin = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T> | undefined => filterPlugins(plugins, predicate)[0];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\n\nimport { type DispatchIntent } from './intent';\n\nexport type IntentContext = {\n dispatch: DispatchIntent;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({ dispatch: async () => {} });\n\nexport const useIntent = () => useContext(IntentContext);\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type IntentContext, IntentProvider } from './IntentContext';\nimport { type Intent } from './intent';\nimport { type PluginDefinition, type Plugin } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: (intent: Intent, plugins: Plugin[]) => any;\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/**\n * Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.\n * Inspired by https://developer.android.com/reference/android/content/Intent.\n */\nexport const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {\n const state = deepSignal<IntentContext>({ dispatch: async () => {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/intent',\n },\n ready: async (plugins) => {\n // Dispatch intent to associated plugin.\n const dispatch = (intent: Intent) => {\n if (intent.plugin) {\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n return plugin?.provides.intent.resolver(intent, plugins);\n }\n\n // Return resolved value from first plugin that handles the intent.\n return filterPlugins(plugins, parseIntentResolverPlugin).reduce((acc, plugin) => {\n return acc ?? plugin.provides.intent.resolver(intent, plugins);\n }, undefined);\n };\n\n // Sequentially dispatch array of invents.\n state.dispatch = async (intentOrArray) => {\n let result: any = null;\n for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {\n const data = intent.data ? { ...result, ...intent.data } : result;\n result = await dispatch({ ...intent, data });\n }\n return result;\n };\n },\n provides: {\n intent: state,\n context: ({ children }) => <IntentProvider value={state}>{children}</IntentProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, type Provider, createContext, useContext } from 'react';\n\nimport { type Plugin, type PluginDefinition } from './plugin';\nimport { findPlugin, resolvePlugin } from '../helpers';\n\nexport type PluginContext = {\n ready: boolean;\n initializing: PluginDefinition[];\n loading: PluginDefinition[];\n plugins: Plugin[];\n};\n\nconst PluginContext: Context<PluginContext> = createContext<PluginContext>({\n ready: false,\n initializing: [],\n loading: [],\n plugins: [],\n});\n\n/**\n * Get all plugins.\n */\nexport const usePlugins = (): PluginContext => useContext(PluginContext);\n\n/**\n * Get a plugin by ID.\n */\nexport const usePlugin = <T,>(id: string): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return findPlugin<T>(plugins, id);\n};\n\n/**\n * Resolve a plugin by predicate.\n */\nexport const useResolvePlugin = <T,>(predicate: (plugin: Plugin) => Plugin<T> | undefined): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return resolvePlugin(plugins, predicate);\n};\n\nexport const PluginProvider: Provider<PluginContext> = PluginContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React, { useEffect, type FC, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type PluginContext, PluginProvider } from './PluginContext';\nimport { type Plugin, type PluginDefinition, type PluginProvides } from './plugin';\n\nexport type BootstrapPluginsParams = {\n plugins: PluginDefinition[];\n fallback?: ReactNode | FC<Omit<PluginContext, 'ready'>>;\n};\n\nexport type PluginHostProvides = {\n plugins: PluginContext;\n};\n\nexport const parsePluginHost = (plugin: Plugin) =>\n (plugin.provides as PluginHostProvides).plugins ? (plugin as Plugin<PluginHostProvides>) : undefined;\n\n/**\n * Bootstraps an application by initializing plugins and rendering root components.\n */\nexport const PluginHost = ({\n plugins: definitions,\n fallback,\n}: BootstrapPluginsParams): PluginDefinition<PluginHostProvides> => {\n const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n return {\n meta: {\n id: 'dxos.org/plugin/host',\n },\n provides: {\n plugins: state,\n context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n root: () => {\n useEffect(() => {\n log('initializing plugins', { definitions });\n const timeout = setTimeout(async () => {\n state.initializing = shallow(definitions);\n const plugins = await Promise.all(\n definitions.map(async (definition) => {\n const plugin = await initializePlugin(definition).catch((err) => {\n console.error('Failed to initialize plugin:', definition.meta.id, err);\n return undefined;\n });\n state.initializing = shallow(state.initializing.filter((plugin) => plugin !== definition));\n return plugin;\n }),\n ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n log('plugins initialized', { plugins });\n state.loading = shallow(definitions);\n await Promise.all(\n definitions.map(async (pluginDefinition) => {\n await pluginDefinition.ready?.(plugins);\n state.loading = shallow(state.loading.filter((plugin) => plugin !== pluginDefinition));\n }),\n );\n\n log('plugins ready', { plugins });\n state.plugins = shallow(plugins);\n state.ready = true;\n });\n\n return () => {\n clearTimeout(timeout);\n state.ready = false;\n void Promise.all(definitions.map((definition) => definition.unload?.()));\n };\n }, []);\n\n if (!state.ready) {\n if (typeof fallback === 'function') {\n const FallbackComponent = fallback;\n return (\n <FallbackComponent initializing={state.initializing} loading={state.loading} plugins={state.plugins} />\n );\n }\n return <>{fallback ?? null}</>;\n }\n\n const ComposedContext = composeContext(state.plugins);\n\n return <ComposedContext>{rootComponents(state.plugins)}</ComposedContext>;\n },\n },\n };\n};\n\n/**\n * Resolve a `PluginDefinition` into a fully initialized `Plugin`.\n */\nexport const initializePlugin = async <T, U>(pluginDefinition: PluginDefinition<T, U>): Promise<Plugin<T & U>> => {\n const provides = await pluginDefinition.initialize?.();\n return {\n ...pluginDefinition,\n provides: {\n ...pluginDefinition.provides,\n ...provides,\n } as PluginProvides<T & U>,\n };\n};\n\nconst rootComponents = (plugins: Plugin[]) => {\n return plugins\n .map((plugin) => {\n const Component = plugin.provides.root;\n if (Component) {\n return <Component key={plugin.meta.id} />;\n } else {\n return null;\n }\n })\n .filter((node): node is JSX.Element => Boolean(node));\n};\n\nconst composeContext = (plugins: Plugin[]) => {\n return compose(plugins.map((p) => p.provides.context!).filter(Boolean));\n};\n\nconst compose = (contexts: FC<PropsWithChildren>[]) => {\n return [...contexts].reduce((Acc, Next) => ({ children }) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n// export const PluginHost = ({ plugins: definitions, fallback }: BootstrapPluginsParams): PluginDefinition => {\n// // const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n// return {\n// meta: {\n// id: 'dxos.org/plugin/host',\n// },\n// provides: {\n// // plugins: state,\n// // context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n// root: () => {\n// const [plugins, setPlugins] = useState<Plugin[]>();\n// const [initializing, setInitializing] = useState<PluginDefinition[]>([]);\n// const [loading, setLoading] = useState<PluginDefinition[]>([]);\n// useEffect(() => {\n// log('initializing plugins', { definitions });\n// const timeout = setTimeout(async () => {\n// setInitializing(definitions);\n// const plugins = await Promise.all(\n// definitions.map(async (definition) => {\n// const plugin = await initializePlugin(definition).catch((err) => {\n// console.error('Failed to initialize plugin:', definition.meta.id, err);\n// return undefined;\n// });\n// setInitializing((initializing) => initializing.filter((plugin) => plugin !== definition));\n// return plugin;\n// }),\n// ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n// log('plugins initialized', { plugins });\n// setLoading(definitions);\n// await Promise.all(\n// definitions.map(async (pluginDefinition) => {\n// await pluginDefinition.ready?.(plugins);\n// setLoading((loading) => loading.filter((plugin) => plugin !== pluginDefinition));\n// }),\n// );\n\n// log('plugins ready', { plugins });\n// setPlugins(plugins);\n// });\n\n// return () => {\n// clearTimeout(timeout);\n// void Promise.all(definitions.map((definition) => definition.unload?.()));\n// };\n// }, []);\n\n// if (!plugins) {\n// if (typeof fallback === 'function') {\n// const FallbackComponent = fallback;\n// return <FallbackComponent initializing={initializing} loading={loading} />;\n// }\n// return <>{fallback ?? null}</>;\n// }\n\n// const ComposedContext = composeContext(plugins);\n\n// return (\n// <PluginProvider value={{ plugins, initializing, loading, ready: true }}>\n// <ComposedContext>{rootComponents(plugins)}</ComposedContext>\n// </PluginProvider>\n// );\n// },\n// },\n// };\n// };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { Component, type FC, type PropsWithChildren } from 'react';\n\ntype Props = PropsWithChildren<{ data?: any; fallback: FC<{ error: Error; reset: () => void }> }>;\ntype State = { error: Error | undefined };\n\n/**\n * Surface error boundary.\n *\n * For basic usage prefer providing a fallback component to `Surface`.\n *\n * For more information on error boundaries, see:\n * https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { error: undefined };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override componentDidUpdate(prevProps: Props): void {\n if (prevProps.data !== this.props.data) {\n this.resetError();\n }\n }\n\n override render() {\n if (this.state.error) {\n return <this.props.fallback error={this.state.error} reset={this.resetError} />;\n }\n\n return this.props.children;\n }\n\n private resetError() {\n this.setState({ error: undefined });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport React, { type PropsWithChildren, type ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\n\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { type SurfaceComponent, useSurface } from './SurfaceRootContext';\n\n/**\n * Direction determines how multiple components are laid out.\n */\nexport type Direction = 'inline' | 'inline-reverse' | 'block' | 'block-reverse';\n\nexport type SurfaceProps = {\n /**\n * Role defines how the data should be rendered.\n */\n role?: string;\n\n /**\n * Names allow nested surfaces to be specified in the parent context, similar to a slot.\n * Defaults to the value of `role` if not specified.\n */\n name?: string;\n\n /**\n * The data to be rendered by the surface.\n */\n data?: Record<string, unknown>;\n\n /**\n * Configure nested surfaces (indexed by the surface's `name`).\n */\n surfaces?: Record<string, Pick<SurfaceProps, 'data' | 'surfaces'>>;\n\n /**\n * If specified, the Surface will be wrapped in an error boundary.\n * The fallback component will be rendered if an error occurs.\n */\n fallback?: ErrorBoundary['props']['fallback'];\n\n /**\n * If more than one component is resolved, the limit determines how many are rendered.\n */\n limit?: number | undefined;\n\n /**\n * If more than one component is resolved, the direction determines how they are laid out.\n * NOTE: This is not yet implemented.\n */\n direction?: Direction;\n};\n\n/**\n * A surface is a named region of the screen that can be populated by plugins.\n */\nexport const Surface = ({ role, name = role, fallback, ...rest }: SurfaceProps) => {\n const props = { role, name, fallback, ...rest };\n const context = useContext(SurfaceContext);\n const data = props.data ?? ((name && context?.surfaces?.[name]?.data) || {});\n\n return (\n <>\n {fallback ? (\n <ErrorBoundary data={data} fallback={fallback}>\n <SurfaceResolver {...props} />\n </ErrorBoundary>\n ) : (\n <SurfaceResolver {...props} />\n )}\n </>\n );\n};\n\nconst SurfaceContext = createContext<SurfaceProps | null>(null);\n\nconst SurfaceResolver = (props: SurfaceProps) => {\n const { components } = useSurface();\n const parent = useContext(SurfaceContext);\n const nodes = resolveNodes(components, props, parent);\n const currentContext: SurfaceProps = {\n ...props,\n surfaces: {\n ...((props.name && parent?.surfaces?.[props.name]?.surfaces) || {}),\n ...props.surfaces,\n },\n };\n\n return <SurfaceContext.Provider value={currentContext}>{nodes}</SurfaceContext.Provider>;\n};\n\nconst resolveNodes = (\n components: Record<string, SurfaceComponent>,\n props: SurfaceProps,\n context: SurfaceProps | null,\n): ReactNode[] => {\n const data = {\n ...((props.name && context?.surfaces?.[props.name]?.data) || {}),\n ...props.data,\n };\n\n const nodes = Object.entries(components)\n .map(([key, component]) => {\n const result = component(data, props.role);\n return result ? <Wrapper key={key}>{result}</Wrapper> : undefined;\n })\n .filter((Component): Component is JSX.Element => Boolean(Component));\n\n return props.limit ? nodes.slice(0, props.limit) : nodes;\n};\n\nconst Wrapper = ({ children }: PropsWithChildren) => <>{children}</>;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext, useContext, type Context, type Provider, type ReactNode } from 'react';\n\n/**\n * Function which resolves a Surface.\n *\n * If a null value is returned, the rendering is deferred to other plugins.\n */\nexport type SurfaceComponent = (data: Record<string, unknown>, role?: string) => ReactNode;\n\nexport type SurfaceRootContext = {\n components: Record<string, SurfaceComponent>;\n};\n\nconst SurfaceRootContext: Context<SurfaceRootContext> = createContext<SurfaceRootContext>({ components: {} });\n\nexport const useSurface = () => useContext(SurfaceRootContext);\n\nexport const SurfaceProvider: Provider<SurfaceRootContext> = SurfaceRootContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type SurfaceComponent, SurfaceProvider, type SurfaceRootContext } from './SurfaceRootContext';\nimport type { Plugin, PluginDefinition } from '../PluginHost';\nimport { filterPlugins } from '../helpers';\n\nexport type SurfaceProvides = {\n surface: {\n /**\n * Used by the `Surface` resolver to find a component to render.\n */\n component: SurfaceComponent;\n };\n};\n\nexport type SurfacePluginProvides = {\n surface: SurfaceRootContext;\n};\n\nexport const parseRootSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.components ? (plugin as Plugin<SurfacePluginProvides>) : undefined;\n\nexport const parseSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.component ? (plugin as Plugin<SurfaceProvides>) : undefined;\n\n/**\n * Provides a registry of surface components.\n */\nexport const SurfacePlugin = (): PluginDefinition<SurfacePluginProvides> => {\n const state = deepSignal<SurfaceRootContext>({ components: {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/surface',\n },\n ready: async (plugins) => {\n state.components = shallow(\n filterPlugins(plugins, parseSurfacePlugin).reduce((acc, plugin) => {\n return { ...acc, [plugin.meta.id]: plugin.provides.surface.component };\n }, {}),\n );\n },\n provides: {\n surface: state,\n context: ({ children }) => <SurfaceProvider value={state}>{children}</SurfaceProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type BootstrapPluginsParams, PluginHost, SurfacePlugin, IntentPlugin } from './plugins';\n\n/**\n * Expected usage is for this to be the entrypoint of the application.\n * Initializes plugins and renders the root components.\n *\n * @example\n * const fallback = <div>Initializing Plugins...</div>;\n * const App = createApp({ plugins, fallback });\n * createRoot(document.getElementById('root')!).render(\n * <StrictMode>\n * <App />\n * </StrictMode>,\n * );\n *\n * @param params.plugins List of plugin definitions to initialize.\n * @param params.fallback Fallback component to render while plugins are initializing.\n */\nexport const createApp = ({ plugins, fallback }: BootstrapPluginsParams) => {\n const host = PluginHost({\n plugins: [SurfacePlugin(), IntentPlugin(), ...plugins],\n fallback,\n });\n\n invariant(host.provides?.context);\n invariant(host.provides?.root);\n const Context = host.provides.context;\n const Root = host.provides.root;\n\n return () => (\n <Context>\n <Root />\n </Context>\n );\n};\n"],
|
|
5
|
-
"mappings": ";AAyBO,IAAMA,mBAAmB,CAACC,WAC9BA,OAAOC,SAAiBC,OAAOC,OAAQH,SAAyCI;AAK5E,IAAMC,0BAA0B,CAACL,WACrCA,OAAOC,SAAiBC,OAAOI,UAAWN,SAA0CI;;;AC5BvF,SAASG,SAAS;AAWX,IAAMC,SAASC,EAAEC,OAAO;EAC7BC,YAAYF,EAAEG,QAAO;EACrBC,aAAaJ,EAAEG,QAAO;EACtBE,0BAA0BL,EAAEG,QAAO;EAEnCG,eAAeN,EAAEO,IAAG,EAAGC,SAAQ,EAAGC,SAAS,0CAAA;EAC3CC,YAAYV,EAAEG,QAAO;EAErBQ,iBAAiBX,EAAEY,OAAM,EAAGJ,SAAQ;EACpCK,gBAAgBb,EAAEO,IAAG,EAAGC,SAAQ,EAAGC,SAAS,2CAAA;EAC5CK,aAAad,EAAEG,QAAO;;EAGtBY,QAAQf,EAAEY,OAAM,EAAGJ,SAAQ,EAAGC,SAAS,kCAAA;;EAEvCO,UAAUhB,EAAEY,OAAM,EAAGJ,SAAQ;AAC/B,CAAA;AAcO,IAAMS,oBAAoB,CAACC,WAAAA;AAChC,QAAM,EAAEC,QAAO,IAAKpB,OAAOqB,UAAWF,OAAOG,SAAiBC,MAAM;AACpE,SAAOH,UAAWD,SAAoCK;AACxD;AAMA,IAAMC,gBAAgB;IAEf;UAAKC,eAAY;AAAZA,EAAAA,cAAAA,cACVC,mBAAAA,IAAoB,GAAGF,aAAAA,oBAAiC,IAAxDE;AADUD,EAAAA,cAAAA,cAEVE,gBAAAA,IAAiB,GAAGH,aAAAA,iBAA8B,IAAlDG;AAFUF,EAAAA,cAAAA,cAGVG,8BAAAA,IAA+B,GAAGJ,aAAAA,+BAA4C,IAA9EI;AAHUH,EAAAA,cAAAA,cAIVI,aAAAA,IAAc,GAAGL,aAAAA,cAA2B,IAA5CK;AAJUJ,EAAAA,cAAAA,cAKVK,cAAAA,IAAe,GAAGN,aAAAA,eAA4B,IAA9CM;AALUL,EAAAA,cAAAA,cAMVM,cAAAA,IAAe,GAAGP,aAAAA,eAA4B,IAA9CO;AANUN,EAAAA,cAAAA,cAOVO,eAAAA,IAAgB,GAAGR,aAAAA,gBAA6B,IAAhDQ;AAPUP,EAAAA,cAAAA,cAQVQ,UAAAA,IAAW,GAAGT,aAAAA,WAAwB,IAAtCS;GARUR,iBAAAA,eAAAA,CAAAA,EAAAA;;;
|
|
6
|
-
"names": ["parseGraphPlugin", "plugin", "provides", "graph", "root", "undefined", "parseGraphBuilderPlugin", "builder", "z", "Layout", "z", "object", "fullscreen", "boolean", "sidebarOpen", "complementarySidebarOpen", "dialogContent", "any", "optional", "describe", "dialogOpen", "popoverAnchorId", "string", "popoverContent", "popoverOpen", "active", "previous", "parseLayoutPlugin", "plugin", "success", "safeParse", "provides", "layout", "undefined", "LAYOUT_ACTION", "LayoutAction", "TOGGLE_FULLSCREEN", "TOGGLE_SIDEBAR", "TOGGLE_COMPLEMENTARY_SIDEBAR", "OPEN_DIALOG", "CLOSE_DIALOG", "OPEN_POPOVER", "CLOSE_POPOVER", "ACTIVATE", "z", "ResourceKey", "z", "union", "string", "record", "any", "ResourceLanguage", "Resource", "parseTranslationsPlugin", "plugin", "success", "array", "safeParse", "provides", "translations", "undefined", "raise", "findPlugin", "plugins", "id", "find", "plugin", "meta", "shortId", "getPlugin", "raise", "Error", "filterPlugins", "predicate", "map", "filter", "resolvePlugin", "createContext", "useContext", "IntentContext", "createContext", "dispatch", "useIntent", "useContext", "IntentProvider", "Provider", "deepSignal", "React", "parseIntentPlugin", "plugin", "provides", "intent", "dispatch", "undefined", "parseIntentResolverPlugin", "resolver", "IntentPlugin", "state", "deepSignal", "meta", "id", "ready", "plugins", "findPlugin", "filterPlugins", "
|
|
3
|
+
"sources": ["../../../src/plugins/common/graph.ts", "../../../src/plugins/common/layout.ts", "../../../src/plugins/common/metadata.ts", "../../../src/plugins/common/translations.ts", "../../../src/plugins/helpers.ts", "../../../src/plugins/IntentPlugin/IntentContext.tsx", "../../../src/plugins/IntentPlugin/IntentPlugin.tsx", "../../../src/plugins/PluginHost/PluginContext.tsx", "../../../src/plugins/PluginHost/PluginHost.tsx", "../../../src/plugins/SurfacePlugin/ErrorBoundary.tsx", "../../../src/plugins/SurfacePlugin/Surface.tsx", "../../../src/plugins/SurfacePlugin/SurfaceRootContext.tsx", "../../../src/plugins/SurfacePlugin/SurfacePlugin.tsx", "../../../src/App.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Graph, Node } from '@dxos/app-graph';\nimport type { UnsubscribeCallback } from '@dxos/async';\n\nimport type { Plugin } from '../PluginHost';\n\n/**\n * Provides for a plugin that exposes the application graph.\n */\nexport type GraphPluginProvides = {\n graph: Graph;\n};\n\nexport type GraphBuilderProvides = {\n graph: {\n builder: (params: { parent: Node; plugins: Plugin[] }) => UnsubscribeCallback | void;\n };\n};\n\n/**\n * Type guard for graph plugins.\n */\nexport const parseGraphPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.root ? (plugin as Plugin<GraphPluginProvides>) : undefined;\n\n/**\n * Type guard for graph builder plugins.\n */\nexport const parseGraphBuilderPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.builder ? (plugin as Plugin<GraphBuilderProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\n//\n// Provides\n//\n\n/**\n * Basic state provided by a layout plugin.\n */\nexport const Layout = z.object({\n fullscreen: z.boolean(),\n sidebarOpen: z.boolean(),\n complementarySidebarOpen: z.boolean(),\n\n dialogContent: z.any().optional().describe('Data to be passed to the dialog Surface.'),\n dialogOpen: z.boolean(),\n\n popoverAnchorId: z.string().optional(),\n popoverContent: z.any().optional().describe('Data to be passed to the popover Surface.'),\n popoverOpen: z.boolean(),\n\n // TODO(wittjosiah): Array?\n active: z.string().optional().describe('Id of the currently active item.'),\n // TODO(wittjosiah): History?\n previous: z.string().optional(),\n});\n\nexport type Layout = z.infer<typeof Layout>;\n\n/**\n * Provides for a plugin that can manage the app layout.\n */\nexport type LayoutProvides = {\n layout: Readonly<Layout>;\n};\n\n/**\n * Type guard for layout plugins.\n */\nexport const parseLayoutPlugin = (plugin: Plugin) => {\n const { success } = Layout.safeParse((plugin.provides as any).layout);\n return success ? (plugin as Plugin<LayoutProvides>) : undefined;\n};\n\n//\n// Intents\n//\n\nconst LAYOUT_ACTION = 'dxos.org/plugin/intent';\n// TODO(wittjosiah): Consider consolidating some action types (e.g. toggle).\nexport enum LayoutAction {\n TOGGLE_FULLSCREEN = `${LAYOUT_ACTION}/toggle-fullscreen`,\n TOGGLE_SIDEBAR = `${LAYOUT_ACTION}/toggle-sidebar`,\n TOGGLE_COMPLEMENTARY_SIDEBAR = `${LAYOUT_ACTION}/toggle-complementary-sidebar`,\n OPEN_DIALOG = `${LAYOUT_ACTION}/open-dialog`,\n CLOSE_DIALOG = `${LAYOUT_ACTION}/close-dialog`,\n OPEN_POPOVER = `${LAYOUT_ACTION}/open-popover`,\n CLOSE_POPOVER = `${LAYOUT_ACTION}/close-popover`,\n ACTIVATE = `${LAYOUT_ACTION}/activate`,\n}\n\n/**\n * Expected payload for layout actions.\n */\nexport namespace LayoutAction {\n export type ToggleFullscreen = {\n state?: boolean;\n };\n\n export type ToggleSidebar = {\n state?: boolean;\n };\n\n export type ToggleComplementarySidebar = {\n state?: boolean;\n };\n\n export type OpenDialog = {\n component: string;\n subject: any;\n };\n\n export type CloseDialog = {};\n\n export type OpenPopover = {\n anchorId: string;\n component: string;\n subject: any;\n };\n\n export type ClosePopover = {};\n\n export type Activate = {\n id: string;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Plugin } from '../PluginHost';\n\nexport type Metadata = Record<string, any>;\n\nexport type MetadataRecordsProvides = {\n metadata: {\n records: Record<string, Metadata>;\n };\n};\n\nexport type MetadataResolver = (type: string) => Metadata;\n\nexport type MetadataResolverProvides = {\n metadata: {\n resolver: MetadataResolver;\n };\n};\n\nexport const parseMetadataRecordsPlugin = (plugin: Plugin) => {\n return (plugin.provides as any).metadata?.records ? (plugin as Plugin<MetadataRecordsProvides>) : undefined;\n};\n\nexport const parseMetadataResolverPlugin = (plugin: Plugin) => {\n return (plugin.provides as any).metadata?.resolver ? (plugin as Plugin<MetadataResolverProvides>) : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\nexport const ResourceKey = z.union([z.string(), z.record(z.any())]);\nexport type ResourceKey = z.infer<typeof ResourceKey>;\n\nexport const ResourceLanguage = z.record(ResourceKey);\nexport type ResourceLanguage = z.infer<typeof ResourceLanguage>;\n\n/**\n * A resource is a collection of translations for a language.\n */\nexport const Resource = z.record(ResourceLanguage);\nexport type Resource = z.infer<typeof Resource>;\n\n/**\n * Provides for a plugin that exposes translations.\n */\n// TODO(wittjosiah): Rename to TranslationResourcesProvides.\nexport type TranslationsProvides = {\n translations: Readonly<Resource[]>;\n};\n\n// TODO(wittjosiah): Add TranslationsProvides.\n// export type TranslationsProvides = {\n// translations: {\n// t: TFunction;\n// };\n// };\n\n/**\n * Type guard for translation plugins.\n */\nexport const parseTranslationsPlugin = (plugin: Plugin) => {\n const { success } = z.array(Resource).safeParse((plugin.provides as any).translations);\n return success ? (plugin as Plugin<TranslationsProvides>) : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\n\nimport { type Plugin } from './PluginHost';\n\n/**\n * Find a plugin by ID.\n */\nexport const findPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> | undefined => {\n return plugins.find(\n (plugin) => plugin.meta.id === id || (typeof plugin.meta.shortId === 'string' && plugin.meta.shortId === id),\n ) as Plugin<T>;\n};\n\n/**\n * Find a plugin by ID, or raise an error if not found.\n */\nexport const getPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> => {\n return findPlugin(plugins, id) ?? raise(new Error(`Plugin not found: ${id}`));\n};\n\n/**\n * Filter a list of plugins to only those that match a predicate.\n */\nexport const filterPlugins = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T>[] => plugins.map((plugin) => predicate(plugin)).filter((plugin): plugin is Plugin<T> => !!plugin);\n\n/**\n * Resolves a plugin by predicate.\n *\n * @example\n * import { parseIntentPlugin, resolvePlugin } from '@dxos/app-framework';\n * const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n */\nexport const resolvePlugin = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T> | undefined => filterPlugins(plugins, predicate)[0];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\n\nimport { type DispatchIntent } from './intent';\n\nexport type IntentContext = {\n dispatch: DispatchIntent;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({ dispatch: async () => {} });\n\nexport const useIntent = () => useContext(IntentContext);\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type IntentContext, IntentProvider } from './IntentContext';\nimport { type Intent } from './intent';\nimport { type PluginDefinition, type Plugin } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: (intent: Intent, plugins: Plugin[]) => any;\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/**\n * Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.\n * Inspired by https://developer.android.com/reference/android/content/Intent.\n */\nexport const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {\n const state = deepSignal<IntentContext>({ dispatch: async () => {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/intent',\n },\n ready: async (plugins) => {\n // Dispatch intent to associated plugin.\n const dispatch = async (intent: Intent) => {\n if (intent.plugin) {\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n return plugin?.provides.intent.resolver(intent, plugins);\n }\n\n // Return resolved value from first plugin that handles the intent.\n for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {\n const result = await plugin.provides.intent.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n };\n\n // Sequentially dispatch array of invents.\n state.dispatch = async (intentOrArray) => {\n let result: any = null;\n for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {\n const data = intent.data ? { ...result, ...intent.data } : result;\n result = await dispatch({ ...intent, data });\n }\n return result;\n };\n },\n provides: {\n intent: state,\n context: ({ children }) => <IntentProvider value={state}>{children}</IntentProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, type Provider, createContext, useContext } from 'react';\n\nimport { type Plugin, type PluginDefinition } from './plugin';\nimport { findPlugin, resolvePlugin } from '../helpers';\n\nexport type PluginContext = {\n ready: boolean;\n initializing: PluginDefinition[];\n loading: PluginDefinition[];\n plugins: Plugin[];\n};\n\nconst PluginContext: Context<PluginContext> = createContext<PluginContext>({\n ready: false,\n initializing: [],\n loading: [],\n plugins: [],\n});\n\n/**\n * Get all plugins.\n */\nexport const usePlugins = (): PluginContext => useContext(PluginContext);\n\n/**\n * Get a plugin by ID.\n */\nexport const usePlugin = <T,>(id: string): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return findPlugin<T>(plugins, id);\n};\n\n/**\n * Resolve a plugin by predicate.\n */\nexport const useResolvePlugin = <T,>(predicate: (plugin: Plugin) => Plugin<T> | undefined): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return resolvePlugin(plugins, predicate);\n};\n\nexport const PluginProvider: Provider<PluginContext> = PluginContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React, { useEffect, type FC, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type PluginContext, PluginProvider } from './PluginContext';\nimport { type Plugin, type PluginDefinition, type PluginProvides } from './plugin';\n\nexport type BootstrapPluginsParams = {\n plugins: PluginDefinition[];\n fallback?: ReactNode | FC<Omit<PluginContext, 'ready'>>;\n};\n\nexport type PluginHostProvides = {\n plugins: PluginContext;\n};\n\nexport const parsePluginHost = (plugin: Plugin) =>\n (plugin.provides as PluginHostProvides).plugins ? (plugin as Plugin<PluginHostProvides>) : undefined;\n\n/**\n * Bootstraps an application by initializing plugins and rendering root components.\n */\nexport const PluginHost = ({\n plugins: definitions,\n fallback,\n}: BootstrapPluginsParams): PluginDefinition<PluginHostProvides> => {\n const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n return {\n meta: {\n id: 'dxos.org/plugin/host',\n },\n provides: {\n plugins: state,\n context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n root: () => {\n useEffect(() => {\n log('initializing plugins', { definitions });\n const timeout = setTimeout(async () => {\n state.initializing = shallow(definitions);\n const plugins = await Promise.all(\n definitions.map(async (definition) => {\n const plugin = await initializePlugin(definition).catch((err) => {\n console.error('Failed to initialize plugin:', definition.meta.id, err);\n return undefined;\n });\n state.initializing = shallow(state.initializing.filter((plugin) => plugin !== definition));\n return plugin;\n }),\n ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n log('plugins initialized', { plugins });\n state.loading = shallow(definitions);\n await Promise.all(\n definitions.map(async (pluginDefinition) => {\n await pluginDefinition.ready?.(plugins);\n state.loading = shallow(state.loading.filter((plugin) => plugin !== pluginDefinition));\n }),\n );\n\n log('plugins ready', { plugins });\n state.plugins = shallow(plugins);\n state.ready = true;\n });\n\n return () => {\n clearTimeout(timeout);\n state.ready = false;\n void Promise.all(definitions.map((definition) => definition.unload?.()));\n };\n }, []);\n\n if (!state.ready) {\n if (typeof fallback === 'function') {\n const FallbackComponent = fallback;\n return (\n <FallbackComponent initializing={state.initializing} loading={state.loading} plugins={state.plugins} />\n );\n }\n return <>{fallback ?? null}</>;\n }\n\n const ComposedContext = composeContext(state.plugins);\n\n return <ComposedContext>{rootComponents(state.plugins)}</ComposedContext>;\n },\n },\n };\n};\n\n/**\n * Resolve a `PluginDefinition` into a fully initialized `Plugin`.\n */\nexport const initializePlugin = async <T, U>(pluginDefinition: PluginDefinition<T, U>): Promise<Plugin<T & U>> => {\n const provides = await pluginDefinition.initialize?.();\n return {\n ...pluginDefinition,\n provides: {\n ...pluginDefinition.provides,\n ...provides,\n } as PluginProvides<T & U>,\n };\n};\n\nconst rootComponents = (plugins: Plugin[]) => {\n return plugins\n .map((plugin) => {\n const Component = plugin.provides.root;\n if (Component) {\n return <Component key={plugin.meta.id} />;\n } else {\n return null;\n }\n })\n .filter((node): node is JSX.Element => Boolean(node));\n};\n\nconst composeContext = (plugins: Plugin[]) => {\n return compose(plugins.map((p) => p.provides.context!).filter(Boolean));\n};\n\nconst compose = (contexts: FC<PropsWithChildren>[]) => {\n return [...contexts].reduce((Acc, Next) => ({ children }) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n// export const PluginHost = ({ plugins: definitions, fallback }: BootstrapPluginsParams): PluginDefinition => {\n// // const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n// return {\n// meta: {\n// id: 'dxos.org/plugin/host',\n// },\n// provides: {\n// // plugins: state,\n// // context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n// root: () => {\n// const [plugins, setPlugins] = useState<Plugin[]>();\n// const [initializing, setInitializing] = useState<PluginDefinition[]>([]);\n// const [loading, setLoading] = useState<PluginDefinition[]>([]);\n// useEffect(() => {\n// log('initializing plugins', { definitions });\n// const timeout = setTimeout(async () => {\n// setInitializing(definitions);\n// const plugins = await Promise.all(\n// definitions.map(async (definition) => {\n// const plugin = await initializePlugin(definition).catch((err) => {\n// console.error('Failed to initialize plugin:', definition.meta.id, err);\n// return undefined;\n// });\n// setInitializing((initializing) => initializing.filter((plugin) => plugin !== definition));\n// return plugin;\n// }),\n// ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n// log('plugins initialized', { plugins });\n// setLoading(definitions);\n// await Promise.all(\n// definitions.map(async (pluginDefinition) => {\n// await pluginDefinition.ready?.(plugins);\n// setLoading((loading) => loading.filter((plugin) => plugin !== pluginDefinition));\n// }),\n// );\n\n// log('plugins ready', { plugins });\n// setPlugins(plugins);\n// });\n\n// return () => {\n// clearTimeout(timeout);\n// void Promise.all(definitions.map((definition) => definition.unload?.()));\n// };\n// }, []);\n\n// if (!plugins) {\n// if (typeof fallback === 'function') {\n// const FallbackComponent = fallback;\n// return <FallbackComponent initializing={initializing} loading={loading} />;\n// }\n// return <>{fallback ?? null}</>;\n// }\n\n// const ComposedContext = composeContext(plugins);\n\n// return (\n// <PluginProvider value={{ plugins, initializing, loading, ready: true }}>\n// <ComposedContext>{rootComponents(plugins)}</ComposedContext>\n// </PluginProvider>\n// );\n// },\n// },\n// };\n// };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { Component, type FC, type PropsWithChildren } from 'react';\n\ntype Props = PropsWithChildren<{ data?: any; fallback: FC<{ error: Error; reset: () => void }> }>;\ntype State = { error: Error | undefined };\n\n/**\n * Surface error boundary.\n *\n * For basic usage prefer providing a fallback component to `Surface`.\n *\n * For more information on error boundaries, see:\n * https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { error: undefined };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override componentDidUpdate(prevProps: Props): void {\n if (prevProps.data !== this.props.data) {\n this.resetError();\n }\n }\n\n override render() {\n if (this.state.error) {\n return <this.props.fallback error={this.state.error} reset={this.resetError} />;\n }\n\n return this.props.children;\n }\n\n private resetError() {\n this.setState({ error: undefined });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport React, { type FC, type PropsWithChildren, type ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\n\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { type SurfaceComponent, useSurface } from './SurfaceRootContext';\n\n/**\n * Direction determines how multiple components are laid out.\n */\nexport type Direction = 'inline' | 'inline-reverse' | 'block' | 'block-reverse';\n\nexport type SurfaceProps = {\n /**\n * Role defines how the data should be rendered.\n */\n role?: string;\n\n /**\n * Names allow nested surfaces to be specified in the parent context, similar to a slot.\n * Defaults to the value of `role` if not specified.\n */\n name?: string;\n\n /**\n * The data to be rendered by the surface.\n */\n data?: Record<string, unknown>;\n\n /**\n * Configure nested surfaces (indexed by the surface's `name`).\n */\n surfaces?: Record<string, Pick<SurfaceProps, 'data' | 'surfaces'>>;\n\n /**\n * If specified, the Surface will be wrapped in an error boundary.\n * The fallback component will be rendered if an error occurs.\n */\n fallback?: ErrorBoundary['props']['fallback'];\n\n /**\n * If specified, this will render if no plugin can offer renderable content for the surface.\n */\n contentFallback?: FC<{}>;\n\n /**\n * If more than one component is resolved, the limit determines how many are rendered.\n */\n limit?: number | undefined;\n\n /**\n * If more than one component is resolved, the direction determines how they are laid out.\n * NOTE: This is not yet implemented.\n */\n direction?: Direction;\n};\n\n/**\n * A surface is a named region of the screen that can be populated by plugins.\n */\nexport const Surface = ({ role, name = role, fallback, ...rest }: SurfaceProps) => {\n const props = { role, name, fallback, ...rest };\n const context = useContext(SurfaceContext);\n const data = props.data ?? ((name && context?.surfaces?.[name]?.data) || {});\n\n return (\n <>\n {fallback ? (\n <ErrorBoundary data={data} fallback={fallback}>\n <SurfaceResolver {...props} />\n </ErrorBoundary>\n ) : (\n <SurfaceResolver {...props} />\n )}\n </>\n );\n};\n\nconst SurfaceContext = createContext<SurfaceProps | null>(null);\n\nconst SurfaceResolver = (props: SurfaceProps) => {\n const { components } = useSurface();\n const parent = useContext(SurfaceContext);\n const nodes = resolveNodes(components, props, parent);\n const currentContext: SurfaceProps = {\n ...props,\n surfaces: {\n ...((props.name && parent?.surfaces?.[props.name]?.surfaces) || {}),\n ...props.surfaces,\n },\n };\n\n return (\n <SurfaceContext.Provider value={currentContext}>\n {nodes.length > 0 ? nodes : props.contentFallback ? <props.contentFallback /> : null}\n </SurfaceContext.Provider>\n );\n};\n\nconst resolveNodes = (\n components: Record<string, SurfaceComponent>,\n props: SurfaceProps,\n context: SurfaceProps | null,\n): ReactNode[] => {\n const data = {\n ...((props.name && context?.surfaces?.[props.name]?.data) || {}),\n ...props.data,\n };\n\n const nodes = Object.entries(components)\n .map(([key, component]) => {\n const result = component(data, props.role);\n return result ? <Wrapper key={key}>{result}</Wrapper> : undefined;\n })\n .filter((Component): Component is JSX.Element => Boolean(Component));\n\n return props.limit ? nodes.slice(0, props.limit) : nodes;\n};\n\nconst Wrapper = ({ children }: PropsWithChildren) => <>{children}</>;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext, useContext, type Context, type Provider, type ReactNode } from 'react';\n\n/**\n * Function which resolves a Surface.\n *\n * If a null value is returned, the rendering is deferred to other plugins.\n */\nexport type SurfaceComponent = (data: Record<string, unknown>, role?: string) => ReactNode;\n\nexport type SurfaceRootContext = {\n components: Record<string, SurfaceComponent>;\n};\n\nconst SurfaceRootContext: Context<SurfaceRootContext> = createContext<SurfaceRootContext>({ components: {} });\n\nexport const useSurface = () => useContext(SurfaceRootContext);\n\nexport const SurfaceProvider: Provider<SurfaceRootContext> = SurfaceRootContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type SurfaceComponent, SurfaceProvider, type SurfaceRootContext } from './SurfaceRootContext';\nimport type { Plugin, PluginDefinition } from '../PluginHost';\nimport { filterPlugins } from '../helpers';\n\nexport type SurfaceProvides = {\n surface: {\n /**\n * Used by the `Surface` resolver to find a component to render.\n */\n component: SurfaceComponent;\n };\n};\n\nexport type SurfacePluginProvides = {\n surface: SurfaceRootContext;\n};\n\nexport const parseRootSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.components ? (plugin as Plugin<SurfacePluginProvides>) : undefined;\n\nexport const parseSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.component ? (plugin as Plugin<SurfaceProvides>) : undefined;\n\n/**\n * Provides a registry of surface components.\n */\nexport const SurfacePlugin = (): PluginDefinition<SurfacePluginProvides> => {\n const state = deepSignal<SurfaceRootContext>({ components: {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/surface',\n },\n ready: async (plugins) => {\n state.components = shallow(\n filterPlugins(plugins, parseSurfacePlugin).reduce((acc, plugin) => {\n return { ...acc, [plugin.meta.id]: plugin.provides.surface.component };\n }, {}),\n );\n },\n provides: {\n surface: state,\n context: ({ children }) => <SurfaceProvider value={state}>{children}</SurfaceProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type BootstrapPluginsParams, PluginHost, SurfacePlugin, IntentPlugin } from './plugins';\n\n/**\n * Expected usage is for this to be the entrypoint of the application.\n * Initializes plugins and renders the root components.\n *\n * @example\n * const fallback = <div>Initializing Plugins...</div>;\n * const App = createApp({ plugins, fallback });\n * createRoot(document.getElementById('root')!).render(\n * <StrictMode>\n * <App />\n * </StrictMode>,\n * );\n *\n * @param params.plugins List of plugin definitions to initialize.\n * @param params.fallback Fallback component to render while plugins are initializing.\n */\nexport const createApp = ({ plugins, fallback }: BootstrapPluginsParams) => {\n const host = PluginHost({\n plugins: [SurfacePlugin(), IntentPlugin(), ...plugins],\n fallback,\n });\n\n invariant(host.provides?.context);\n invariant(host.provides?.root);\n const Context = host.provides.context;\n const Root = host.provides.root;\n\n return () => (\n <Context>\n <Root />\n </Context>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["parseGraphPlugin", "plugin", "provides", "graph", "root", "undefined", "parseGraphBuilderPlugin", "builder", "z", "Layout", "z", "object", "fullscreen", "boolean", "sidebarOpen", "complementarySidebarOpen", "dialogContent", "any", "optional", "describe", "dialogOpen", "popoverAnchorId", "string", "popoverContent", "popoverOpen", "active", "previous", "parseLayoutPlugin", "plugin", "success", "safeParse", "provides", "layout", "undefined", "LAYOUT_ACTION", "LayoutAction", "TOGGLE_FULLSCREEN", "TOGGLE_SIDEBAR", "TOGGLE_COMPLEMENTARY_SIDEBAR", "OPEN_DIALOG", "CLOSE_DIALOG", "OPEN_POPOVER", "CLOSE_POPOVER", "ACTIVATE", "parseMetadataRecordsPlugin", "plugin", "provides", "metadata", "records", "undefined", "parseMetadataResolverPlugin", "resolver", "z", "ResourceKey", "z", "union", "string", "record", "any", "ResourceLanguage", "Resource", "parseTranslationsPlugin", "plugin", "success", "array", "safeParse", "provides", "translations", "undefined", "raise", "findPlugin", "plugins", "id", "find", "plugin", "meta", "shortId", "getPlugin", "raise", "Error", "filterPlugins", "predicate", "map", "filter", "resolvePlugin", "createContext", "useContext", "IntentContext", "createContext", "dispatch", "useIntent", "useContext", "IntentProvider", "Provider", "deepSignal", "React", "parseIntentPlugin", "plugin", "provides", "intent", "dispatch", "undefined", "parseIntentResolverPlugin", "resolver", "IntentPlugin", "state", "deepSignal", "meta", "id", "ready", "plugins", "findPlugin", "filterPlugins", "result", "intentOrArray", "Array", "isArray", "data", "context", "children", "IntentProvider", "value", "createContext", "useContext", "PluginContext", "createContext", "ready", "initializing", "loading", "plugins", "usePlugins", "useContext", "usePlugin", "id", "findPlugin", "useResolvePlugin", "predicate", "resolvePlugin", "PluginProvider", "Provider", "deepSignal", "shallow", "React", "useEffect", "log", "parsePluginHost", "plugin", "provides", "plugins", "undefined", "PluginHost", "definitions", "fallback", "state", "deepSignal", "ready", "initializing", "loading", "meta", "id", "context", "children", "React", "PluginProvider", "value", "root", "useEffect", "log", "timeout", "setTimeout", "shallow", "Promise", "all", "map", "definition", "initializePlugin", "catch", "err", "console", "error", "filter", "then", "Boolean", "pluginDefinition", "clearTimeout", "unload", "FallbackComponent", "ComposedContext", "composeContext", "rootComponents", "initialize", "Component", "key", "node", "compose", "p", "contexts", "reduce", "Acc", "Next", "React", "Component", "ErrorBoundary", "Component", "constructor", "props", "state", "error", "undefined", "getDerivedStateFromError", "componentDidUpdate", "prevProps", "data", "resetError", "render", "React", "this", "fallback", "reset", "children", "setState", "React", "createContext", "useContext", "createContext", "useContext", "SurfaceRootContext", "createContext", "components", "useSurface", "useContext", "SurfaceProvider", "Provider", "Surface", "role", "name", "fallback", "rest", "props", "context", "useContext", "SurfaceContext", "data", "surfaces", "React", "ErrorBoundary", "SurfaceResolver", "createContext", "components", "useSurface", "parent", "nodes", "resolveNodes", "currentContext", "Provider", "value", "length", "contentFallback", "Object", "entries", "map", "key", "component", "result", "Wrapper", "undefined", "filter", "Component", "Boolean", "limit", "slice", "children", "deepSignal", "shallow", "React", "parseRootSurfacePlugin", "plugin", "provides", "surface", "components", "undefined", "parseSurfacePlugin", "component", "SurfacePlugin", "state", "deepSignal", "meta", "id", "ready", "plugins", "shallow", "filterPlugins", "reduce", "acc", "context", "children", "React", "SurfaceProvider", "value", "React", "invariant", "createApp", "plugins", "fallback", "host", "PluginHost", "SurfacePlugin", "IntentPlugin", "invariant", "provides", "context", "root", "Context", "Root", "React"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytes":2213,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytes":7754,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytes":2942,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytes":660,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-framework/src/plugins/common/layout.ts","kind":"import-statement","original":"./layout"},{"path":"packages/sdk/app-framework/src/plugins/common/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytes":4017,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts":{"bytes":1706,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytes":1616,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytes":7877,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytes":686,"imports":[{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts","kind":"import-statement","original":"./intent"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx","kind":"import-statement","original":"./IntentPlugin"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts":{"bytes":3382,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytes":3530,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytes":23187,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytes":678,"imports":[{"path":"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx","kind":"import-statement","original":"./PluginHost"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytes":4120,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytes":1967,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytes":9240,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytes":5052,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytes":807,"imports":[{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx","kind":"import-statement","original":"./Surface"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx","kind":"import-statement","original":"./SurfacePlugin"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/index.ts":{"bytes":854,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/index.ts","kind":"import-statement","original":"./common"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"./helpers"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts","kind":"import-statement","original":"./IntentPlugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/index.ts","kind":"import-statement","original":"./PluginHost"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts","kind":"import-statement","original":"./SurfacePlugin"}],"format":"esm"},"packages/sdk/app-framework/src/App.tsx":{"bytes":4157,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"}],"format":"esm"},"packages/sdk/app-framework/src/index.ts":{"bytes":544,"imports":[{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"},{"path":"packages/sdk/app-framework/src/App.tsx","kind":"import-statement","original":"./App"}],"format":"esm"}},"outputs":{"packages/sdk/app-framework/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":38939},"packages/sdk/app-framework/dist/lib/browser/index.mjs":{"imports":[{"path":"zod","kind":"import-statement","external":true},{"path":"zod","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"exports":["ErrorBoundary","IntentPlugin","IntentProvider","Layout","LayoutAction","PluginHost","PluginProvider","Resource","ResourceKey","ResourceLanguage","Surface","SurfacePlugin","SurfaceProvider","createApp","filterPlugins","findPlugin","getPlugin","initializePlugin","parseGraphBuilderPlugin","parseGraphPlugin","parseIntentPlugin","parseIntentResolverPlugin","parseLayoutPlugin","parsePluginHost","parseRootSurfacePlugin","parseSurfacePlugin","parseTranslationsPlugin","resolvePlugin","useIntent","usePlugin","usePlugins","useResolvePlugin","useSurface"],"entryPoint":"packages/sdk/app-framework/src/index.ts","inputs":{"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytesInOutput":174},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytesInOutput":1724},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytesInOutput":357},"packages/sdk/app-framework/src/plugins/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytesInOutput":525},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytesInOutput":231},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytesInOutput":1470},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytesInOutput":524},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytesInOutput":4146},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytesInOutput":676},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytesInOutput":1771},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytesInOutput":270},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytesInOutput":897},"packages/sdk/app-framework/src/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/App.tsx":{"bytesInOutput":842}},"bytes":15173}}}
|
|
1
|
+
{"inputs":{"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytes":2208,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytes":7749,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/metadata.ts":{"bytes":2053,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytes":3460,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytes":743,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-framework/src/plugins/common/layout.ts","kind":"import-statement","original":"./layout"},{"path":"packages/sdk/app-framework/src/plugins/common/metadata.ts","kind":"import-statement","original":"./metadata"},{"path":"packages/sdk/app-framework/src/plugins/common/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytes":4012,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts":{"bytes":1701,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytes":1611,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytes":8039,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytes":681,"imports":[{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts","kind":"import-statement","original":"./intent"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx","kind":"import-statement","original":"./IntentPlugin"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts":{"bytes":3377,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytes":3525,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytes":23182,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytes":673,"imports":[{"path":"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx","kind":"import-statement","original":"./PluginHost"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytes":4115,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytes":1962,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytes":9818,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytes":5047,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytes":802,"imports":[{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx","kind":"import-statement","original":"./Surface"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx","kind":"import-statement","original":"./SurfacePlugin"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/index.ts":{"bytes":849,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/index.ts","kind":"import-statement","original":"./common"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"./helpers"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts","kind":"import-statement","original":"./IntentPlugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/index.ts","kind":"import-statement","original":"./PluginHost"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts","kind":"import-statement","original":"./SurfacePlugin"}],"format":"esm"},"packages/sdk/app-framework/src/App.tsx":{"bytes":4152,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"}],"format":"esm"},"packages/sdk/app-framework/src/index.ts":{"bytes":539,"imports":[{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"},{"path":"packages/sdk/app-framework/src/App.tsx","kind":"import-statement","original":"./App"}],"format":"esm"}},"outputs":{"packages/sdk/app-framework/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":40668},"packages/sdk/app-framework/dist/lib/browser/index.mjs":{"imports":[{"path":"zod","kind":"import-statement","external":true},{"path":"zod","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"exports":["ErrorBoundary","IntentPlugin","IntentProvider","Layout","LayoutAction","PluginHost","PluginProvider","Resource","ResourceKey","ResourceLanguage","Surface","SurfacePlugin","SurfaceProvider","createApp","filterPlugins","findPlugin","getPlugin","initializePlugin","parseGraphBuilderPlugin","parseGraphPlugin","parseIntentPlugin","parseIntentResolverPlugin","parseLayoutPlugin","parseMetadataRecordsPlugin","parseMetadataResolverPlugin","parsePluginHost","parseRootSurfacePlugin","parseSurfacePlugin","parseTranslationsPlugin","resolvePlugin","useIntent","usePlugin","usePlugins","useResolvePlugin","useSurface"],"entryPoint":"packages/sdk/app-framework/src/index.ts","inputs":{"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytesInOutput":174},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytesInOutput":1724},"packages/sdk/app-framework/src/plugins/common/metadata.ts":{"bytesInOutput":226},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytesInOutput":357},"packages/sdk/app-framework/src/plugins/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytesInOutput":525},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytesInOutput":231},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytesInOutput":1527},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytesInOutput":524},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytesInOutput":4141},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytesInOutput":676},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytesInOutput":1889},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytesInOutput":270},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytesInOutput":897},"packages/sdk/app-framework/src/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/App.tsx":{"bytesInOutput":837}},"bytes":15687}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -53,6 +53,8 @@ __export(src_exports, {
|
|
|
53
53
|
parseIntentPlugin: () => parseIntentPlugin,
|
|
54
54
|
parseIntentResolverPlugin: () => parseIntentResolverPlugin,
|
|
55
55
|
parseLayoutPlugin: () => parseLayoutPlugin,
|
|
56
|
+
parseMetadataRecordsPlugin: () => parseMetadataRecordsPlugin,
|
|
57
|
+
parseMetadataResolverPlugin: () => parseMetadataResolverPlugin,
|
|
56
58
|
parsePluginHost: () => parsePluginHost,
|
|
57
59
|
parseRootSurfacePlugin: () => parseRootSurfacePlugin,
|
|
58
60
|
parseSurfacePlugin: () => parseSurfacePlugin,
|
|
@@ -103,6 +105,14 @@ var LayoutAction;
|
|
|
103
105
|
LayoutAction2[LayoutAction2["ACTIVATE"] = `${LAYOUT_ACTION}/activate`] = "ACTIVATE";
|
|
104
106
|
})(LayoutAction || (LayoutAction = {}));
|
|
105
107
|
|
|
108
|
+
// packages/sdk/app-framework/src/plugins/common/metadata.ts
|
|
109
|
+
var parseMetadataRecordsPlugin = (plugin) => {
|
|
110
|
+
return plugin.provides.metadata?.records ? plugin : void 0;
|
|
111
|
+
};
|
|
112
|
+
var parseMetadataResolverPlugin = (plugin) => {
|
|
113
|
+
return plugin.provides.metadata?.resolver ? plugin : void 0;
|
|
114
|
+
};
|
|
115
|
+
|
|
106
116
|
// packages/sdk/app-framework/src/plugins/common/translations.ts
|
|
107
117
|
var import_zod2 = require("zod");
|
|
108
118
|
var ResourceKey = import_zod2.z.union([
|
|
@@ -151,14 +161,17 @@ var IntentPlugin = () => {
|
|
|
151
161
|
id: "dxos.org/plugin/intent"
|
|
152
162
|
},
|
|
153
163
|
ready: async (plugins) => {
|
|
154
|
-
const dispatch = (intent) => {
|
|
164
|
+
const dispatch = async (intent) => {
|
|
155
165
|
if (intent.plugin) {
|
|
156
166
|
const plugin = findPlugin(plugins, intent.plugin);
|
|
157
167
|
return plugin?.provides.intent.resolver(intent, plugins);
|
|
158
168
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
169
|
+
for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {
|
|
170
|
+
const result = await plugin.provides.intent.resolver(intent, plugins);
|
|
171
|
+
if (result) {
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
162
175
|
};
|
|
163
176
|
state.dispatch = async (intentOrArray) => {
|
|
164
177
|
let result = null;
|
|
@@ -209,7 +222,7 @@ var PluginProvider = PluginContext.Provider;
|
|
|
209
222
|
var import_react5 = require("deepsignal/react");
|
|
210
223
|
var import_react6 = __toESM(require("react"));
|
|
211
224
|
var import_log = require("@dxos/log");
|
|
212
|
-
var __dxlog_file = "/home/
|
|
225
|
+
var __dxlog_file = "/home/circleci/project/packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx";
|
|
213
226
|
var parsePluginHost = (plugin) => plugin.provides.plugins ? plugin : void 0;
|
|
214
227
|
var PluginHost = ({ plugins: definitions, fallback }) => {
|
|
215
228
|
const state = (0, import_react5.deepSignal)({
|
|
@@ -401,7 +414,7 @@ var SurfaceResolver = (props) => {
|
|
|
401
414
|
};
|
|
402
415
|
return /* @__PURE__ */ import_react9.default.createElement(SurfaceContext.Provider, {
|
|
403
416
|
value: currentContext
|
|
404
|
-
}, nodes);
|
|
417
|
+
}, nodes.length > 0 ? nodes : props.contentFallback ? /* @__PURE__ */ import_react9.default.createElement(props.contentFallback, null) : null);
|
|
405
418
|
};
|
|
406
419
|
var resolveNodes = (components, props, context) => {
|
|
407
420
|
const data = {
|
|
@@ -451,7 +464,7 @@ var SurfacePlugin = () => {
|
|
|
451
464
|
// packages/sdk/app-framework/src/App.tsx
|
|
452
465
|
var import_react13 = __toESM(require("react"));
|
|
453
466
|
var import_invariant = require("@dxos/invariant");
|
|
454
|
-
var __dxlog_file2 = "/home/
|
|
467
|
+
var __dxlog_file2 = "/home/circleci/project/packages/sdk/app-framework/src/App.tsx";
|
|
455
468
|
var createApp = ({ plugins, fallback }) => {
|
|
456
469
|
const host = PluginHost({
|
|
457
470
|
plugins: [
|
|
@@ -508,6 +521,8 @@ var createApp = ({ plugins, fallback }) => {
|
|
|
508
521
|
parseIntentPlugin,
|
|
509
522
|
parseIntentResolverPlugin,
|
|
510
523
|
parseLayoutPlugin,
|
|
524
|
+
parseMetadataRecordsPlugin,
|
|
525
|
+
parseMetadataResolverPlugin,
|
|
511
526
|
parsePluginHost,
|
|
512
527
|
parseRootSurfacePlugin,
|
|
513
528
|
parseSurfacePlugin,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/index.ts", "../../../src/plugins/common/graph.ts", "../../../src/plugins/common/layout.ts", "../../../src/plugins/common/translations.ts", "../../../src/plugins/helpers.ts", "../../../src/plugins/IntentPlugin/IntentContext.tsx", "../../../src/plugins/IntentPlugin/IntentPlugin.tsx", "../../../src/plugins/PluginHost/PluginContext.tsx", "../../../src/plugins/PluginHost/PluginHost.tsx", "../../../src/plugins/SurfacePlugin/ErrorBoundary.tsx", "../../../src/plugins/SurfacePlugin/Surface.tsx", "../../../src/plugins/SurfacePlugin/SurfaceRootContext.tsx", "../../../src/plugins/SurfacePlugin/SurfacePlugin.tsx", "../../../src/App.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport * from './plugins';\n\nexport * from './App';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Graph, Node } from '@dxos/app-graph';\nimport type { UnsubscribeCallback } from '@dxos/async';\n\nimport type { Plugin } from '../PluginHost';\n\n/**\n * Provides for a plugin that exposes the application graph.\n */\nexport type GraphPluginProvides = {\n graph: Graph;\n};\n\nexport type GraphBuilderProvides = {\n graph: {\n builder: (params: { parent: Node; plugins: Plugin[] }) => UnsubscribeCallback | void;\n };\n};\n\n/**\n * Type guard for graph plugins.\n */\nexport const parseGraphPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.root ? (plugin as Plugin<GraphPluginProvides>) : undefined;\n\n/**\n * Type guard for graph builder plugins.\n */\nexport const parseGraphBuilderPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.builder ? (plugin as Plugin<GraphBuilderProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\n//\n// Provides\n//\n\n/**\n * Basic state provided by a layout plugin.\n */\nexport const Layout = z.object({\n fullscreen: z.boolean(),\n sidebarOpen: z.boolean(),\n complementarySidebarOpen: z.boolean(),\n\n dialogContent: z.any().optional().describe('Data to be passed to the dialog Surface.'),\n dialogOpen: z.boolean(),\n\n popoverAnchorId: z.string().optional(),\n popoverContent: z.any().optional().describe('Data to be passed to the popover Surface.'),\n popoverOpen: z.boolean(),\n\n // TODO(wittjosiah): Array?\n active: z.string().optional().describe('Id of the currently active item.'),\n // TODO(wittjosiah): History?\n previous: z.string().optional(),\n});\n\nexport type Layout = z.infer<typeof Layout>;\n\n/**\n * Provides for a plugin that can manage the app layout.\n */\nexport type LayoutProvides = {\n layout: Readonly<Layout>;\n};\n\n/**\n * Type guard for layout plugins.\n */\nexport const parseLayoutPlugin = (plugin: Plugin) => {\n const { success } = Layout.safeParse((plugin.provides as any).layout);\n return success ? (plugin as Plugin<LayoutProvides>) : undefined;\n};\n\n//\n// Intents\n//\n\nconst LAYOUT_ACTION = 'dxos.org/plugin/intent';\n// TODO(wittjosiah): Consider consolidating some action types (e.g. toggle).\nexport enum LayoutAction {\n TOGGLE_FULLSCREEN = `${LAYOUT_ACTION}/toggle-fullscreen`,\n TOGGLE_SIDEBAR = `${LAYOUT_ACTION}/toggle-sidebar`,\n TOGGLE_COMPLEMENTARY_SIDEBAR = `${LAYOUT_ACTION}/toggle-complementary-sidebar`,\n OPEN_DIALOG = `${LAYOUT_ACTION}/open-dialog`,\n CLOSE_DIALOG = `${LAYOUT_ACTION}/close-dialog`,\n OPEN_POPOVER = `${LAYOUT_ACTION}/open-popover`,\n CLOSE_POPOVER = `${LAYOUT_ACTION}/close-popover`,\n ACTIVATE = `${LAYOUT_ACTION}/activate`,\n}\n\n/**\n * Expected payload for layout actions.\n */\nexport namespace LayoutAction {\n export type ToggleFullscreen = {\n state?: boolean;\n };\n\n export type ToggleSidebar = {\n state?: boolean;\n };\n\n export type ToggleComplementarySidebar = {\n state?: boolean;\n };\n\n export type OpenDialog = {\n component: string;\n subject: any;\n };\n\n export type CloseDialog = {};\n\n export type OpenPopover = {\n anchorId: string;\n component: string;\n subject: any;\n };\n\n export type ClosePopover = {};\n\n export type Activate = {\n id: string;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\nexport const ResourceKey = z.union([z.string(), z.record(z.any())]);\nexport type ResourceKey = z.infer<typeof ResourceKey>;\n\nexport const ResourceLanguage = z.record(ResourceKey);\nexport type ResourceLanguage = z.infer<typeof ResourceLanguage>;\n\n/**\n * A resource is a collection of translations for a language.\n */\nexport const Resource = z.record(ResourceLanguage);\nexport type Resource = z.infer<typeof Resource>;\n\n/**\n * Provides for a plugin that exposes translations.\n */\nexport type TranslationsProvides = {\n translations: Readonly<Resource[]>;\n};\n\n/**\n * Type guard for translation plugins.\n */\nexport const parseTranslationsPlugin = (plugin: Plugin) => {\n const { success } = z.array(Resource).safeParse((plugin.provides as any).translations);\n return success ? (plugin as Plugin<TranslationsProvides>) : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\n\nimport { type Plugin } from './PluginHost';\n\n/**\n * Find a plugin by ID.\n */\nexport const findPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> | undefined => {\n return plugins.find(\n (plugin) => plugin.meta.id === id || (typeof plugin.meta.shortId === 'string' && plugin.meta.shortId === id),\n ) as Plugin<T>;\n};\n\n/**\n * Find a plugin by ID, or raise an error if not found.\n */\nexport const getPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> => {\n return findPlugin(plugins, id) ?? raise(new Error(`Plugin not found: ${id}`));\n};\n\n/**\n * Filter a list of plugins to only those that match a predicate.\n */\nexport const filterPlugins = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T>[] => plugins.map((plugin) => predicate(plugin)).filter((plugin): plugin is Plugin<T> => !!plugin);\n\n/**\n * Resolves a plugin by predicate.\n *\n * @example\n * import { parseIntentPlugin, resolvePlugin } from '@dxos/app-framework';\n * const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n */\nexport const resolvePlugin = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T> | undefined => filterPlugins(plugins, predicate)[0];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\n\nimport { type DispatchIntent } from './intent';\n\nexport type IntentContext = {\n dispatch: DispatchIntent;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({ dispatch: async () => {} });\n\nexport const useIntent = () => useContext(IntentContext);\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type IntentContext, IntentProvider } from './IntentContext';\nimport { type Intent } from './intent';\nimport { type PluginDefinition, type Plugin } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: (intent: Intent, plugins: Plugin[]) => any;\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/**\n * Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.\n * Inspired by https://developer.android.com/reference/android/content/Intent.\n */\nexport const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {\n const state = deepSignal<IntentContext>({ dispatch: async () => {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/intent',\n },\n ready: async (plugins) => {\n // Dispatch intent to associated plugin.\n const dispatch = (intent: Intent) => {\n if (intent.plugin) {\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n return plugin?.provides.intent.resolver(intent, plugins);\n }\n\n // Return resolved value from first plugin that handles the intent.\n return filterPlugins(plugins, parseIntentResolverPlugin).reduce((acc, plugin) => {\n return acc ?? plugin.provides.intent.resolver(intent, plugins);\n }, undefined);\n };\n\n // Sequentially dispatch array of invents.\n state.dispatch = async (intentOrArray) => {\n let result: any = null;\n for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {\n const data = intent.data ? { ...result, ...intent.data } : result;\n result = await dispatch({ ...intent, data });\n }\n return result;\n };\n },\n provides: {\n intent: state,\n context: ({ children }) => <IntentProvider value={state}>{children}</IntentProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, type Provider, createContext, useContext } from 'react';\n\nimport { type Plugin, type PluginDefinition } from './plugin';\nimport { findPlugin, resolvePlugin } from '../helpers';\n\nexport type PluginContext = {\n ready: boolean;\n initializing: PluginDefinition[];\n loading: PluginDefinition[];\n plugins: Plugin[];\n};\n\nconst PluginContext: Context<PluginContext> = createContext<PluginContext>({\n ready: false,\n initializing: [],\n loading: [],\n plugins: [],\n});\n\n/**\n * Get all plugins.\n */\nexport const usePlugins = (): PluginContext => useContext(PluginContext);\n\n/**\n * Get a plugin by ID.\n */\nexport const usePlugin = <T,>(id: string): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return findPlugin<T>(plugins, id);\n};\n\n/**\n * Resolve a plugin by predicate.\n */\nexport const useResolvePlugin = <T,>(predicate: (plugin: Plugin) => Plugin<T> | undefined): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return resolvePlugin(plugins, predicate);\n};\n\nexport const PluginProvider: Provider<PluginContext> = PluginContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React, { useEffect, type FC, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type PluginContext, PluginProvider } from './PluginContext';\nimport { type Plugin, type PluginDefinition, type PluginProvides } from './plugin';\n\nexport type BootstrapPluginsParams = {\n plugins: PluginDefinition[];\n fallback?: ReactNode | FC<Omit<PluginContext, 'ready'>>;\n};\n\nexport type PluginHostProvides = {\n plugins: PluginContext;\n};\n\nexport const parsePluginHost = (plugin: Plugin) =>\n (plugin.provides as PluginHostProvides).plugins ? (plugin as Plugin<PluginHostProvides>) : undefined;\n\n/**\n * Bootstraps an application by initializing plugins and rendering root components.\n */\nexport const PluginHost = ({\n plugins: definitions,\n fallback,\n}: BootstrapPluginsParams): PluginDefinition<PluginHostProvides> => {\n const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n return {\n meta: {\n id: 'dxos.org/plugin/host',\n },\n provides: {\n plugins: state,\n context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n root: () => {\n useEffect(() => {\n log('initializing plugins', { definitions });\n const timeout = setTimeout(async () => {\n state.initializing = shallow(definitions);\n const plugins = await Promise.all(\n definitions.map(async (definition) => {\n const plugin = await initializePlugin(definition).catch((err) => {\n console.error('Failed to initialize plugin:', definition.meta.id, err);\n return undefined;\n });\n state.initializing = shallow(state.initializing.filter((plugin) => plugin !== definition));\n return plugin;\n }),\n ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n log('plugins initialized', { plugins });\n state.loading = shallow(definitions);\n await Promise.all(\n definitions.map(async (pluginDefinition) => {\n await pluginDefinition.ready?.(plugins);\n state.loading = shallow(state.loading.filter((plugin) => plugin !== pluginDefinition));\n }),\n );\n\n log('plugins ready', { plugins });\n state.plugins = shallow(plugins);\n state.ready = true;\n });\n\n return () => {\n clearTimeout(timeout);\n state.ready = false;\n void Promise.all(definitions.map((definition) => definition.unload?.()));\n };\n }, []);\n\n if (!state.ready) {\n if (typeof fallback === 'function') {\n const FallbackComponent = fallback;\n return (\n <FallbackComponent initializing={state.initializing} loading={state.loading} plugins={state.plugins} />\n );\n }\n return <>{fallback ?? null}</>;\n }\n\n const ComposedContext = composeContext(state.plugins);\n\n return <ComposedContext>{rootComponents(state.plugins)}</ComposedContext>;\n },\n },\n };\n};\n\n/**\n * Resolve a `PluginDefinition` into a fully initialized `Plugin`.\n */\nexport const initializePlugin = async <T, U>(pluginDefinition: PluginDefinition<T, U>): Promise<Plugin<T & U>> => {\n const provides = await pluginDefinition.initialize?.();\n return {\n ...pluginDefinition,\n provides: {\n ...pluginDefinition.provides,\n ...provides,\n } as PluginProvides<T & U>,\n };\n};\n\nconst rootComponents = (plugins: Plugin[]) => {\n return plugins\n .map((plugin) => {\n const Component = plugin.provides.root;\n if (Component) {\n return <Component key={plugin.meta.id} />;\n } else {\n return null;\n }\n })\n .filter((node): node is JSX.Element => Boolean(node));\n};\n\nconst composeContext = (plugins: Plugin[]) => {\n return compose(plugins.map((p) => p.provides.context!).filter(Boolean));\n};\n\nconst compose = (contexts: FC<PropsWithChildren>[]) => {\n return [...contexts].reduce((Acc, Next) => ({ children }) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n// export const PluginHost = ({ plugins: definitions, fallback }: BootstrapPluginsParams): PluginDefinition => {\n// // const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n// return {\n// meta: {\n// id: 'dxos.org/plugin/host',\n// },\n// provides: {\n// // plugins: state,\n// // context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n// root: () => {\n// const [plugins, setPlugins] = useState<Plugin[]>();\n// const [initializing, setInitializing] = useState<PluginDefinition[]>([]);\n// const [loading, setLoading] = useState<PluginDefinition[]>([]);\n// useEffect(() => {\n// log('initializing plugins', { definitions });\n// const timeout = setTimeout(async () => {\n// setInitializing(definitions);\n// const plugins = await Promise.all(\n// definitions.map(async (definition) => {\n// const plugin = await initializePlugin(definition).catch((err) => {\n// console.error('Failed to initialize plugin:', definition.meta.id, err);\n// return undefined;\n// });\n// setInitializing((initializing) => initializing.filter((plugin) => plugin !== definition));\n// return plugin;\n// }),\n// ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n// log('plugins initialized', { plugins });\n// setLoading(definitions);\n// await Promise.all(\n// definitions.map(async (pluginDefinition) => {\n// await pluginDefinition.ready?.(plugins);\n// setLoading((loading) => loading.filter((plugin) => plugin !== pluginDefinition));\n// }),\n// );\n\n// log('plugins ready', { plugins });\n// setPlugins(plugins);\n// });\n\n// return () => {\n// clearTimeout(timeout);\n// void Promise.all(definitions.map((definition) => definition.unload?.()));\n// };\n// }, []);\n\n// if (!plugins) {\n// if (typeof fallback === 'function') {\n// const FallbackComponent = fallback;\n// return <FallbackComponent initializing={initializing} loading={loading} />;\n// }\n// return <>{fallback ?? null}</>;\n// }\n\n// const ComposedContext = composeContext(plugins);\n\n// return (\n// <PluginProvider value={{ plugins, initializing, loading, ready: true }}>\n// <ComposedContext>{rootComponents(plugins)}</ComposedContext>\n// </PluginProvider>\n// );\n// },\n// },\n// };\n// };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { Component, type FC, type PropsWithChildren } from 'react';\n\ntype Props = PropsWithChildren<{ data?: any; fallback: FC<{ error: Error; reset: () => void }> }>;\ntype State = { error: Error | undefined };\n\n/**\n * Surface error boundary.\n *\n * For basic usage prefer providing a fallback component to `Surface`.\n *\n * For more information on error boundaries, see:\n * https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { error: undefined };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override componentDidUpdate(prevProps: Props): void {\n if (prevProps.data !== this.props.data) {\n this.resetError();\n }\n }\n\n override render() {\n if (this.state.error) {\n return <this.props.fallback error={this.state.error} reset={this.resetError} />;\n }\n\n return this.props.children;\n }\n\n private resetError() {\n this.setState({ error: undefined });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport React, { type PropsWithChildren, type ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\n\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { type SurfaceComponent, useSurface } from './SurfaceRootContext';\n\n/**\n * Direction determines how multiple components are laid out.\n */\nexport type Direction = 'inline' | 'inline-reverse' | 'block' | 'block-reverse';\n\nexport type SurfaceProps = {\n /**\n * Role defines how the data should be rendered.\n */\n role?: string;\n\n /**\n * Names allow nested surfaces to be specified in the parent context, similar to a slot.\n * Defaults to the value of `role` if not specified.\n */\n name?: string;\n\n /**\n * The data to be rendered by the surface.\n */\n data?: Record<string, unknown>;\n\n /**\n * Configure nested surfaces (indexed by the surface's `name`).\n */\n surfaces?: Record<string, Pick<SurfaceProps, 'data' | 'surfaces'>>;\n\n /**\n * If specified, the Surface will be wrapped in an error boundary.\n * The fallback component will be rendered if an error occurs.\n */\n fallback?: ErrorBoundary['props']['fallback'];\n\n /**\n * If more than one component is resolved, the limit determines how many are rendered.\n */\n limit?: number | undefined;\n\n /**\n * If more than one component is resolved, the direction determines how they are laid out.\n * NOTE: This is not yet implemented.\n */\n direction?: Direction;\n};\n\n/**\n * A surface is a named region of the screen that can be populated by plugins.\n */\nexport const Surface = ({ role, name = role, fallback, ...rest }: SurfaceProps) => {\n const props = { role, name, fallback, ...rest };\n const context = useContext(SurfaceContext);\n const data = props.data ?? ((name && context?.surfaces?.[name]?.data) || {});\n\n return (\n <>\n {fallback ? (\n <ErrorBoundary data={data} fallback={fallback}>\n <SurfaceResolver {...props} />\n </ErrorBoundary>\n ) : (\n <SurfaceResolver {...props} />\n )}\n </>\n );\n};\n\nconst SurfaceContext = createContext<SurfaceProps | null>(null);\n\nconst SurfaceResolver = (props: SurfaceProps) => {\n const { components } = useSurface();\n const parent = useContext(SurfaceContext);\n const nodes = resolveNodes(components, props, parent);\n const currentContext: SurfaceProps = {\n ...props,\n surfaces: {\n ...((props.name && parent?.surfaces?.[props.name]?.surfaces) || {}),\n ...props.surfaces,\n },\n };\n\n return <SurfaceContext.Provider value={currentContext}>{nodes}</SurfaceContext.Provider>;\n};\n\nconst resolveNodes = (\n components: Record<string, SurfaceComponent>,\n props: SurfaceProps,\n context: SurfaceProps | null,\n): ReactNode[] => {\n const data = {\n ...((props.name && context?.surfaces?.[props.name]?.data) || {}),\n ...props.data,\n };\n\n const nodes = Object.entries(components)\n .map(([key, component]) => {\n const result = component(data, props.role);\n return result ? <Wrapper key={key}>{result}</Wrapper> : undefined;\n })\n .filter((Component): Component is JSX.Element => Boolean(Component));\n\n return props.limit ? nodes.slice(0, props.limit) : nodes;\n};\n\nconst Wrapper = ({ children }: PropsWithChildren) => <>{children}</>;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext, useContext, type Context, type Provider, type ReactNode } from 'react';\n\n/**\n * Function which resolves a Surface.\n *\n * If a null value is returned, the rendering is deferred to other plugins.\n */\nexport type SurfaceComponent = (data: Record<string, unknown>, role?: string) => ReactNode;\n\nexport type SurfaceRootContext = {\n components: Record<string, SurfaceComponent>;\n};\n\nconst SurfaceRootContext: Context<SurfaceRootContext> = createContext<SurfaceRootContext>({ components: {} });\n\nexport const useSurface = () => useContext(SurfaceRootContext);\n\nexport const SurfaceProvider: Provider<SurfaceRootContext> = SurfaceRootContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type SurfaceComponent, SurfaceProvider, type SurfaceRootContext } from './SurfaceRootContext';\nimport type { Plugin, PluginDefinition } from '../PluginHost';\nimport { filterPlugins } from '../helpers';\n\nexport type SurfaceProvides = {\n surface: {\n /**\n * Used by the `Surface` resolver to find a component to render.\n */\n component: SurfaceComponent;\n };\n};\n\nexport type SurfacePluginProvides = {\n surface: SurfaceRootContext;\n};\n\nexport const parseRootSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.components ? (plugin as Plugin<SurfacePluginProvides>) : undefined;\n\nexport const parseSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.component ? (plugin as Plugin<SurfaceProvides>) : undefined;\n\n/**\n * Provides a registry of surface components.\n */\nexport const SurfacePlugin = (): PluginDefinition<SurfacePluginProvides> => {\n const state = deepSignal<SurfaceRootContext>({ components: {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/surface',\n },\n ready: async (plugins) => {\n state.components = shallow(\n filterPlugins(plugins, parseSurfacePlugin).reduce((acc, plugin) => {\n return { ...acc, [plugin.meta.id]: plugin.provides.surface.component };\n }, {}),\n );\n },\n provides: {\n surface: state,\n context: ({ children }) => <SurfaceProvider value={state}>{children}</SurfaceProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type BootstrapPluginsParams, PluginHost, SurfacePlugin, IntentPlugin } from './plugins';\n\n/**\n * Expected usage is for this to be the entrypoint of the application.\n * Initializes plugins and renders the root components.\n *\n * @example\n * const fallback = <div>Initializing Plugins...</div>;\n * const App = createApp({ plugins, fallback });\n * createRoot(document.getElementById('root')!).render(\n * <StrictMode>\n * <App />\n * </StrictMode>,\n * );\n *\n * @param params.plugins List of plugin definitions to initialize.\n * @param params.fallback Fallback component to render while plugins are initializing.\n */\nexport const createApp = ({ plugins, fallback }: BootstrapPluginsParams) => {\n const host = PluginHost({\n plugins: [SurfacePlugin(), IntentPlugin(), ...plugins],\n fallback,\n });\n\n invariant(host.provides?.context);\n invariant(host.provides?.root);\n const Context = host.provides.context;\n const Root = host.provides.root;\n\n return () => (\n <Context>\n <Root />\n </Context>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
6
|
-
"names": ["parseGraphPlugin", "plugin", "provides", "graph", "root", "undefined", "parseGraphBuilderPlugin", "builder", "Layout", "z", "object", "fullscreen", "boolean", "sidebarOpen", "complementarySidebarOpen", "dialogContent", "any", "optional", "describe", "dialogOpen", "popoverAnchorId", "string", "popoverContent", "popoverOpen", "active", "previous", "parseLayoutPlugin", "plugin", "success", "safeParse", "provides", "layout", "undefined", "LAYOUT_ACTION", "LayoutAction", "TOGGLE_FULLSCREEN", "TOGGLE_SIDEBAR", "TOGGLE_COMPLEMENTARY_SIDEBAR", "OPEN_DIALOG", "CLOSE_DIALOG", "OPEN_POPOVER", "CLOSE_POPOVER", "ACTIVATE", "import_zod", "ResourceKey", "z", "union", "string", "record", "any", "ResourceLanguage", "Resource", "parseTranslationsPlugin", "plugin", "success", "array", "safeParse", "provides", "translations", "undefined", "findPlugin", "plugins", "id", "find", "plugin", "meta", "shortId", "getPlugin", "raise", "Error", "filterPlugins", "predicate", "map", "filter", "resolvePlugin", "IntentContext", "createContext", "dispatch", "useIntent", "useContext", "IntentProvider", "Provider", "import_react", "parseIntentPlugin", "plugin", "provides", "intent", "dispatch", "undefined", "parseIntentResolverPlugin", "resolver", "IntentPlugin", "state", "deepSignal", "meta", "id", "ready", "plugins", "findPlugin", "filterPlugins", "
|
|
3
|
+
"sources": ["../../../src/index.ts", "../../../src/plugins/common/graph.ts", "../../../src/plugins/common/layout.ts", "../../../src/plugins/common/metadata.ts", "../../../src/plugins/common/translations.ts", "../../../src/plugins/helpers.ts", "../../../src/plugins/IntentPlugin/IntentContext.tsx", "../../../src/plugins/IntentPlugin/IntentPlugin.tsx", "../../../src/plugins/PluginHost/PluginContext.tsx", "../../../src/plugins/PluginHost/PluginHost.tsx", "../../../src/plugins/SurfacePlugin/ErrorBoundary.tsx", "../../../src/plugins/SurfacePlugin/Surface.tsx", "../../../src/plugins/SurfacePlugin/SurfaceRootContext.tsx", "../../../src/plugins/SurfacePlugin/SurfacePlugin.tsx", "../../../src/App.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport * from './plugins';\n\nexport * from './App';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Graph, Node } from '@dxos/app-graph';\nimport type { UnsubscribeCallback } from '@dxos/async';\n\nimport type { Plugin } from '../PluginHost';\n\n/**\n * Provides for a plugin that exposes the application graph.\n */\nexport type GraphPluginProvides = {\n graph: Graph;\n};\n\nexport type GraphBuilderProvides = {\n graph: {\n builder: (params: { parent: Node; plugins: Plugin[] }) => UnsubscribeCallback | void;\n };\n};\n\n/**\n * Type guard for graph plugins.\n */\nexport const parseGraphPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.root ? (plugin as Plugin<GraphPluginProvides>) : undefined;\n\n/**\n * Type guard for graph builder plugins.\n */\nexport const parseGraphBuilderPlugin = (plugin: Plugin) =>\n (plugin.provides as any).graph?.builder ? (plugin as Plugin<GraphBuilderProvides>) : undefined;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\n//\n// Provides\n//\n\n/**\n * Basic state provided by a layout plugin.\n */\nexport const Layout = z.object({\n fullscreen: z.boolean(),\n sidebarOpen: z.boolean(),\n complementarySidebarOpen: z.boolean(),\n\n dialogContent: z.any().optional().describe('Data to be passed to the dialog Surface.'),\n dialogOpen: z.boolean(),\n\n popoverAnchorId: z.string().optional(),\n popoverContent: z.any().optional().describe('Data to be passed to the popover Surface.'),\n popoverOpen: z.boolean(),\n\n // TODO(wittjosiah): Array?\n active: z.string().optional().describe('Id of the currently active item.'),\n // TODO(wittjosiah): History?\n previous: z.string().optional(),\n});\n\nexport type Layout = z.infer<typeof Layout>;\n\n/**\n * Provides for a plugin that can manage the app layout.\n */\nexport type LayoutProvides = {\n layout: Readonly<Layout>;\n};\n\n/**\n * Type guard for layout plugins.\n */\nexport const parseLayoutPlugin = (plugin: Plugin) => {\n const { success } = Layout.safeParse((plugin.provides as any).layout);\n return success ? (plugin as Plugin<LayoutProvides>) : undefined;\n};\n\n//\n// Intents\n//\n\nconst LAYOUT_ACTION = 'dxos.org/plugin/intent';\n// TODO(wittjosiah): Consider consolidating some action types (e.g. toggle).\nexport enum LayoutAction {\n TOGGLE_FULLSCREEN = `${LAYOUT_ACTION}/toggle-fullscreen`,\n TOGGLE_SIDEBAR = `${LAYOUT_ACTION}/toggle-sidebar`,\n TOGGLE_COMPLEMENTARY_SIDEBAR = `${LAYOUT_ACTION}/toggle-complementary-sidebar`,\n OPEN_DIALOG = `${LAYOUT_ACTION}/open-dialog`,\n CLOSE_DIALOG = `${LAYOUT_ACTION}/close-dialog`,\n OPEN_POPOVER = `${LAYOUT_ACTION}/open-popover`,\n CLOSE_POPOVER = `${LAYOUT_ACTION}/close-popover`,\n ACTIVATE = `${LAYOUT_ACTION}/activate`,\n}\n\n/**\n * Expected payload for layout actions.\n */\nexport namespace LayoutAction {\n export type ToggleFullscreen = {\n state?: boolean;\n };\n\n export type ToggleSidebar = {\n state?: boolean;\n };\n\n export type ToggleComplementarySidebar = {\n state?: boolean;\n };\n\n export type OpenDialog = {\n component: string;\n subject: any;\n };\n\n export type CloseDialog = {};\n\n export type OpenPopover = {\n anchorId: string;\n component: string;\n subject: any;\n };\n\n export type ClosePopover = {};\n\n export type Activate = {\n id: string;\n };\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type { Plugin } from '../PluginHost';\n\nexport type Metadata = Record<string, any>;\n\nexport type MetadataRecordsProvides = {\n metadata: {\n records: Record<string, Metadata>;\n };\n};\n\nexport type MetadataResolver = (type: string) => Metadata;\n\nexport type MetadataResolverProvides = {\n metadata: {\n resolver: MetadataResolver;\n };\n};\n\nexport const parseMetadataRecordsPlugin = (plugin: Plugin) => {\n return (plugin.provides as any).metadata?.records ? (plugin as Plugin<MetadataRecordsProvides>) : undefined;\n};\n\nexport const parseMetadataResolverPlugin = (plugin: Plugin) => {\n return (plugin.provides as any).metadata?.resolver ? (plugin as Plugin<MetadataResolverProvides>) : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { z } from 'zod';\n\nimport type { Plugin } from '../PluginHost';\n\nexport const ResourceKey = z.union([z.string(), z.record(z.any())]);\nexport type ResourceKey = z.infer<typeof ResourceKey>;\n\nexport const ResourceLanguage = z.record(ResourceKey);\nexport type ResourceLanguage = z.infer<typeof ResourceLanguage>;\n\n/**\n * A resource is a collection of translations for a language.\n */\nexport const Resource = z.record(ResourceLanguage);\nexport type Resource = z.infer<typeof Resource>;\n\n/**\n * Provides for a plugin that exposes translations.\n */\n// TODO(wittjosiah): Rename to TranslationResourcesProvides.\nexport type TranslationsProvides = {\n translations: Readonly<Resource[]>;\n};\n\n// TODO(wittjosiah): Add TranslationsProvides.\n// export type TranslationsProvides = {\n// translations: {\n// t: TFunction;\n// };\n// };\n\n/**\n * Type guard for translation plugins.\n */\nexport const parseTranslationsPlugin = (plugin: Plugin) => {\n const { success } = z.array(Resource).safeParse((plugin.provides as any).translations);\n return success ? (plugin as Plugin<TranslationsProvides>) : undefined;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { raise } from '@dxos/debug';\n\nimport { type Plugin } from './PluginHost';\n\n/**\n * Find a plugin by ID.\n */\nexport const findPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> | undefined => {\n return plugins.find(\n (plugin) => plugin.meta.id === id || (typeof plugin.meta.shortId === 'string' && plugin.meta.shortId === id),\n ) as Plugin<T>;\n};\n\n/**\n * Find a plugin by ID, or raise an error if not found.\n */\nexport const getPlugin = <T>(plugins: Plugin[], id: string): Plugin<T> => {\n return findPlugin(plugins, id) ?? raise(new Error(`Plugin not found: ${id}`));\n};\n\n/**\n * Filter a list of plugins to only those that match a predicate.\n */\nexport const filterPlugins = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T>[] => plugins.map((plugin) => predicate(plugin)).filter((plugin): plugin is Plugin<T> => !!plugin);\n\n/**\n * Resolves a plugin by predicate.\n *\n * @example\n * import { parseIntentPlugin, resolvePlugin } from '@dxos/app-framework';\n * const intentPlugin = resolvePlugin(plugins, parseIntentPlugin);\n */\nexport const resolvePlugin = <T>(\n plugins: Plugin[],\n predicate: (plugin: Plugin) => Plugin<T> | undefined,\n): Plugin<T> | undefined => filterPlugins(plugins, predicate)[0];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, createContext, useContext, type Provider } from 'react';\n\nimport { type DispatchIntent } from './intent';\n\nexport type IntentContext = {\n dispatch: DispatchIntent;\n};\n\nconst IntentContext: Context<IntentContext> = createContext<IntentContext>({ dispatch: async () => {} });\n\nexport const useIntent = () => useContext(IntentContext);\n\nexport const IntentProvider: Provider<IntentContext> = IntentContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type IntentContext, IntentProvider } from './IntentContext';\nimport { type Intent } from './intent';\nimport { type PluginDefinition, type Plugin } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\nexport type IntentResolverProvides = {\n intent: {\n resolver: (intent: Intent, plugins: Plugin[]) => any;\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/**\n * Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.\n * Inspired by https://developer.android.com/reference/android/content/Intent.\n */\nexport const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {\n const state = deepSignal<IntentContext>({ dispatch: async () => {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/intent',\n },\n ready: async (plugins) => {\n // Dispatch intent to associated plugin.\n const dispatch = async (intent: Intent) => {\n if (intent.plugin) {\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n return plugin?.provides.intent.resolver(intent, plugins);\n }\n\n // Return resolved value from first plugin that handles the intent.\n for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {\n const result = await plugin.provides.intent.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n };\n\n // Sequentially dispatch array of invents.\n state.dispatch = async (intentOrArray) => {\n let result: any = null;\n for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {\n const data = intent.data ? { ...result, ...intent.data } : result;\n result = await dispatch({ ...intent, data });\n }\n return result;\n };\n },\n provides: {\n intent: state,\n context: ({ children }) => <IntentProvider value={state}>{children}</IntentProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Context, type Provider, createContext, useContext } from 'react';\n\nimport { type Plugin, type PluginDefinition } from './plugin';\nimport { findPlugin, resolvePlugin } from '../helpers';\n\nexport type PluginContext = {\n ready: boolean;\n initializing: PluginDefinition[];\n loading: PluginDefinition[];\n plugins: Plugin[];\n};\n\nconst PluginContext: Context<PluginContext> = createContext<PluginContext>({\n ready: false,\n initializing: [],\n loading: [],\n plugins: [],\n});\n\n/**\n * Get all plugins.\n */\nexport const usePlugins = (): PluginContext => useContext(PluginContext);\n\n/**\n * Get a plugin by ID.\n */\nexport const usePlugin = <T,>(id: string): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return findPlugin<T>(plugins, id);\n};\n\n/**\n * Resolve a plugin by predicate.\n */\nexport const useResolvePlugin = <T,>(predicate: (plugin: Plugin) => Plugin<T> | undefined): Plugin<T> | undefined => {\n const { plugins } = usePlugins();\n return resolvePlugin(plugins, predicate);\n};\n\nexport const PluginProvider: Provider<PluginContext> = PluginContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React, { useEffect, type FC, type PropsWithChildren, type ReactNode } from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type PluginContext, PluginProvider } from './PluginContext';\nimport { type Plugin, type PluginDefinition, type PluginProvides } from './plugin';\n\nexport type BootstrapPluginsParams = {\n plugins: PluginDefinition[];\n fallback?: ReactNode | FC<Omit<PluginContext, 'ready'>>;\n};\n\nexport type PluginHostProvides = {\n plugins: PluginContext;\n};\n\nexport const parsePluginHost = (plugin: Plugin) =>\n (plugin.provides as PluginHostProvides).plugins ? (plugin as Plugin<PluginHostProvides>) : undefined;\n\n/**\n * Bootstraps an application by initializing plugins and rendering root components.\n */\nexport const PluginHost = ({\n plugins: definitions,\n fallback,\n}: BootstrapPluginsParams): PluginDefinition<PluginHostProvides> => {\n const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n return {\n meta: {\n id: 'dxos.org/plugin/host',\n },\n provides: {\n plugins: state,\n context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n root: () => {\n useEffect(() => {\n log('initializing plugins', { definitions });\n const timeout = setTimeout(async () => {\n state.initializing = shallow(definitions);\n const plugins = await Promise.all(\n definitions.map(async (definition) => {\n const plugin = await initializePlugin(definition).catch((err) => {\n console.error('Failed to initialize plugin:', definition.meta.id, err);\n return undefined;\n });\n state.initializing = shallow(state.initializing.filter((plugin) => plugin !== definition));\n return plugin;\n }),\n ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n log('plugins initialized', { plugins });\n state.loading = shallow(definitions);\n await Promise.all(\n definitions.map(async (pluginDefinition) => {\n await pluginDefinition.ready?.(plugins);\n state.loading = shallow(state.loading.filter((plugin) => plugin !== pluginDefinition));\n }),\n );\n\n log('plugins ready', { plugins });\n state.plugins = shallow(plugins);\n state.ready = true;\n });\n\n return () => {\n clearTimeout(timeout);\n state.ready = false;\n void Promise.all(definitions.map((definition) => definition.unload?.()));\n };\n }, []);\n\n if (!state.ready) {\n if (typeof fallback === 'function') {\n const FallbackComponent = fallback;\n return (\n <FallbackComponent initializing={state.initializing} loading={state.loading} plugins={state.plugins} />\n );\n }\n return <>{fallback ?? null}</>;\n }\n\n const ComposedContext = composeContext(state.plugins);\n\n return <ComposedContext>{rootComponents(state.plugins)}</ComposedContext>;\n },\n },\n };\n};\n\n/**\n * Resolve a `PluginDefinition` into a fully initialized `Plugin`.\n */\nexport const initializePlugin = async <T, U>(pluginDefinition: PluginDefinition<T, U>): Promise<Plugin<T & U>> => {\n const provides = await pluginDefinition.initialize?.();\n return {\n ...pluginDefinition,\n provides: {\n ...pluginDefinition.provides,\n ...provides,\n } as PluginProvides<T & U>,\n };\n};\n\nconst rootComponents = (plugins: Plugin[]) => {\n return plugins\n .map((plugin) => {\n const Component = plugin.provides.root;\n if (Component) {\n return <Component key={plugin.meta.id} />;\n } else {\n return null;\n }\n })\n .filter((node): node is JSX.Element => Boolean(node));\n};\n\nconst composeContext = (plugins: Plugin[]) => {\n return compose(plugins.map((p) => p.provides.context!).filter(Boolean));\n};\n\nconst compose = (contexts: FC<PropsWithChildren>[]) => {\n return [...contexts].reduce((Acc, Next) => ({ children }) => (\n <Acc>\n <Next>{children}</Next>\n </Acc>\n ));\n};\n// export const PluginHost = ({ plugins: definitions, fallback }: BootstrapPluginsParams): PluginDefinition => {\n// // const state = deepSignal<PluginContext>({ ready: false, initializing: [], loading: [], plugins: [] });\n\n// return {\n// meta: {\n// id: 'dxos.org/plugin/host',\n// },\n// provides: {\n// // plugins: state,\n// // context: ({ children }) => <PluginProvider value={state}>{children}</PluginProvider>,\n// root: () => {\n// const [plugins, setPlugins] = useState<Plugin[]>();\n// const [initializing, setInitializing] = useState<PluginDefinition[]>([]);\n// const [loading, setLoading] = useState<PluginDefinition[]>([]);\n// useEffect(() => {\n// log('initializing plugins', { definitions });\n// const timeout = setTimeout(async () => {\n// setInitializing(definitions);\n// const plugins = await Promise.all(\n// definitions.map(async (definition) => {\n// const plugin = await initializePlugin(definition).catch((err) => {\n// console.error('Failed to initialize plugin:', definition.meta.id, err);\n// return undefined;\n// });\n// setInitializing((initializing) => initializing.filter((plugin) => plugin !== definition));\n// return plugin;\n// }),\n// ).then((plugins) => plugins.filter((plugin): plugin is Plugin => Boolean(plugin)));\n\n// log('plugins initialized', { plugins });\n// setLoading(definitions);\n// await Promise.all(\n// definitions.map(async (pluginDefinition) => {\n// await pluginDefinition.ready?.(plugins);\n// setLoading((loading) => loading.filter((plugin) => plugin !== pluginDefinition));\n// }),\n// );\n\n// log('plugins ready', { plugins });\n// setPlugins(plugins);\n// });\n\n// return () => {\n// clearTimeout(timeout);\n// void Promise.all(definitions.map((definition) => definition.unload?.()));\n// };\n// }, []);\n\n// if (!plugins) {\n// if (typeof fallback === 'function') {\n// const FallbackComponent = fallback;\n// return <FallbackComponent initializing={initializing} loading={loading} />;\n// }\n// return <>{fallback ?? null}</>;\n// }\n\n// const ComposedContext = composeContext(plugins);\n\n// return (\n// <PluginProvider value={{ plugins, initializing, loading, ready: true }}>\n// <ComposedContext>{rootComponents(plugins)}</ComposedContext>\n// </PluginProvider>\n// );\n// },\n// },\n// };\n// };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { Component, type FC, type PropsWithChildren } from 'react';\n\ntype Props = PropsWithChildren<{ data?: any; fallback: FC<{ error: Error; reset: () => void }> }>;\ntype State = { error: Error | undefined };\n\n/**\n * Surface error boundary.\n *\n * For basic usage prefer providing a fallback component to `Surface`.\n *\n * For more information on error boundaries, see:\n * https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary\n */\nexport class ErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { error: undefined };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n override componentDidUpdate(prevProps: Props): void {\n if (prevProps.data !== this.props.data) {\n this.resetError();\n }\n }\n\n override render() {\n if (this.state.error) {\n return <this.props.fallback error={this.state.error} reset={this.resetError} />;\n }\n\n return this.props.children;\n }\n\n private resetError() {\n this.setState({ error: undefined });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport React, { type FC, type PropsWithChildren, type ReactNode } from 'react';\nimport { createContext, useContext } from 'react';\n\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { type SurfaceComponent, useSurface } from './SurfaceRootContext';\n\n/**\n * Direction determines how multiple components are laid out.\n */\nexport type Direction = 'inline' | 'inline-reverse' | 'block' | 'block-reverse';\n\nexport type SurfaceProps = {\n /**\n * Role defines how the data should be rendered.\n */\n role?: string;\n\n /**\n * Names allow nested surfaces to be specified in the parent context, similar to a slot.\n * Defaults to the value of `role` if not specified.\n */\n name?: string;\n\n /**\n * The data to be rendered by the surface.\n */\n data?: Record<string, unknown>;\n\n /**\n * Configure nested surfaces (indexed by the surface's `name`).\n */\n surfaces?: Record<string, Pick<SurfaceProps, 'data' | 'surfaces'>>;\n\n /**\n * If specified, the Surface will be wrapped in an error boundary.\n * The fallback component will be rendered if an error occurs.\n */\n fallback?: ErrorBoundary['props']['fallback'];\n\n /**\n * If specified, this will render if no plugin can offer renderable content for the surface.\n */\n contentFallback?: FC<{}>;\n\n /**\n * If more than one component is resolved, the limit determines how many are rendered.\n */\n limit?: number | undefined;\n\n /**\n * If more than one component is resolved, the direction determines how they are laid out.\n * NOTE: This is not yet implemented.\n */\n direction?: Direction;\n};\n\n/**\n * A surface is a named region of the screen that can be populated by plugins.\n */\nexport const Surface = ({ role, name = role, fallback, ...rest }: SurfaceProps) => {\n const props = { role, name, fallback, ...rest };\n const context = useContext(SurfaceContext);\n const data = props.data ?? ((name && context?.surfaces?.[name]?.data) || {});\n\n return (\n <>\n {fallback ? (\n <ErrorBoundary data={data} fallback={fallback}>\n <SurfaceResolver {...props} />\n </ErrorBoundary>\n ) : (\n <SurfaceResolver {...props} />\n )}\n </>\n );\n};\n\nconst SurfaceContext = createContext<SurfaceProps | null>(null);\n\nconst SurfaceResolver = (props: SurfaceProps) => {\n const { components } = useSurface();\n const parent = useContext(SurfaceContext);\n const nodes = resolveNodes(components, props, parent);\n const currentContext: SurfaceProps = {\n ...props,\n surfaces: {\n ...((props.name && parent?.surfaces?.[props.name]?.surfaces) || {}),\n ...props.surfaces,\n },\n };\n\n return (\n <SurfaceContext.Provider value={currentContext}>\n {nodes.length > 0 ? nodes : props.contentFallback ? <props.contentFallback /> : null}\n </SurfaceContext.Provider>\n );\n};\n\nconst resolveNodes = (\n components: Record<string, SurfaceComponent>,\n props: SurfaceProps,\n context: SurfaceProps | null,\n): ReactNode[] => {\n const data = {\n ...((props.name && context?.surfaces?.[props.name]?.data) || {}),\n ...props.data,\n };\n\n const nodes = Object.entries(components)\n .map(([key, component]) => {\n const result = component(data, props.role);\n return result ? <Wrapper key={key}>{result}</Wrapper> : undefined;\n })\n .filter((Component): Component is JSX.Element => Boolean(Component));\n\n return props.limit ? nodes.slice(0, props.limit) : nodes;\n};\n\nconst Wrapper = ({ children }: PropsWithChildren) => <>{children}</>;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext, useContext, type Context, type Provider, type ReactNode } from 'react';\n\n/**\n * Function which resolves a Surface.\n *\n * If a null value is returned, the rendering is deferred to other plugins.\n */\nexport type SurfaceComponent = (data: Record<string, unknown>, role?: string) => ReactNode;\n\nexport type SurfaceRootContext = {\n components: Record<string, SurfaceComponent>;\n};\n\nconst SurfaceRootContext: Context<SurfaceRootContext> = createContext<SurfaceRootContext>({ components: {} });\n\nexport const useSurface = () => useContext(SurfaceRootContext);\n\nexport const SurfaceProvider: Provider<SurfaceRootContext> = SurfaceRootContext.Provider;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal, shallow } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type SurfaceComponent, SurfaceProvider, type SurfaceRootContext } from './SurfaceRootContext';\nimport type { Plugin, PluginDefinition } from '../PluginHost';\nimport { filterPlugins } from '../helpers';\n\nexport type SurfaceProvides = {\n surface: {\n /**\n * Used by the `Surface` resolver to find a component to render.\n */\n component: SurfaceComponent;\n };\n};\n\nexport type SurfacePluginProvides = {\n surface: SurfaceRootContext;\n};\n\nexport const parseRootSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.components ? (plugin as Plugin<SurfacePluginProvides>) : undefined;\n\nexport const parseSurfacePlugin = (plugin?: Plugin) =>\n (plugin?.provides as any)?.surface?.component ? (plugin as Plugin<SurfaceProvides>) : undefined;\n\n/**\n * Provides a registry of surface components.\n */\nexport const SurfacePlugin = (): PluginDefinition<SurfacePluginProvides> => {\n const state = deepSignal<SurfaceRootContext>({ components: {} });\n\n return {\n meta: {\n id: 'dxos.org/plugin/surface',\n },\n ready: async (plugins) => {\n state.components = shallow(\n filterPlugins(plugins, parseSurfacePlugin).reduce((acc, plugin) => {\n return { ...acc, [plugin.meta.id]: plugin.provides.surface.component };\n }, {}),\n );\n },\n provides: {\n surface: state,\n context: ({ children }) => <SurfaceProvider value={state}>{children}</SurfaceProvider>,\n },\n };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { invariant } from '@dxos/invariant';\n\nimport { type BootstrapPluginsParams, PluginHost, SurfacePlugin, IntentPlugin } from './plugins';\n\n/**\n * Expected usage is for this to be the entrypoint of the application.\n * Initializes plugins and renders the root components.\n *\n * @example\n * const fallback = <div>Initializing Plugins...</div>;\n * const App = createApp({ plugins, fallback });\n * createRoot(document.getElementById('root')!).render(\n * <StrictMode>\n * <App />\n * </StrictMode>,\n * );\n *\n * @param params.plugins List of plugin definitions to initialize.\n * @param params.fallback Fallback component to render while plugins are initializing.\n */\nexport const createApp = ({ plugins, fallback }: BootstrapPluginsParams) => {\n const host = PluginHost({\n plugins: [SurfacePlugin(), IntentPlugin(), ...plugins],\n fallback,\n });\n\n invariant(host.provides?.context);\n invariant(host.provides?.root);\n const Context = host.provides.context;\n const Root = host.provides.root;\n\n return () => (\n <Context>\n <Root />\n </Context>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["parseGraphPlugin", "plugin", "provides", "graph", "root", "undefined", "parseGraphBuilderPlugin", "builder", "Layout", "z", "object", "fullscreen", "boolean", "sidebarOpen", "complementarySidebarOpen", "dialogContent", "any", "optional", "describe", "dialogOpen", "popoverAnchorId", "string", "popoverContent", "popoverOpen", "active", "previous", "parseLayoutPlugin", "plugin", "success", "safeParse", "provides", "layout", "undefined", "LAYOUT_ACTION", "LayoutAction", "TOGGLE_FULLSCREEN", "TOGGLE_SIDEBAR", "TOGGLE_COMPLEMENTARY_SIDEBAR", "OPEN_DIALOG", "CLOSE_DIALOG", "OPEN_POPOVER", "CLOSE_POPOVER", "ACTIVATE", "parseMetadataRecordsPlugin", "plugin", "provides", "metadata", "records", "undefined", "parseMetadataResolverPlugin", "resolver", "import_zod", "ResourceKey", "z", "union", "string", "record", "any", "ResourceLanguage", "Resource", "parseTranslationsPlugin", "plugin", "success", "array", "safeParse", "provides", "translations", "undefined", "findPlugin", "plugins", "id", "find", "plugin", "meta", "shortId", "getPlugin", "raise", "Error", "filterPlugins", "predicate", "map", "filter", "resolvePlugin", "IntentContext", "createContext", "dispatch", "useIntent", "useContext", "IntentProvider", "Provider", "import_react", "parseIntentPlugin", "plugin", "provides", "intent", "dispatch", "undefined", "parseIntentResolverPlugin", "resolver", "IntentPlugin", "state", "deepSignal", "meta", "id", "ready", "plugins", "findPlugin", "filterPlugins", "result", "intentOrArray", "Array", "isArray", "data", "context", "children", "React", "IntentProvider", "value", "import_react", "PluginContext", "createContext", "ready", "initializing", "loading", "plugins", "usePlugins", "useContext", "usePlugin", "id", "findPlugin", "useResolvePlugin", "predicate", "resolvePlugin", "PluginProvider", "Provider", "import_react", "parsePluginHost", "plugin", "provides", "plugins", "undefined", "PluginHost", "definitions", "fallback", "state", "deepSignal", "ready", "initializing", "loading", "meta", "id", "context", "children", "React", "PluginProvider", "value", "root", "useEffect", "log", "timeout", "setTimeout", "shallow", "Promise", "all", "map", "definition", "initializePlugin", "catch", "err", "console", "error", "filter", "then", "Boolean", "pluginDefinition", "clearTimeout", "unload", "FallbackComponent", "ComposedContext", "composeContext", "rootComponents", "initialize", "Component", "key", "node", "compose", "p", "contexts", "reduce", "Acc", "Next", "import_react", "ErrorBoundary", "Component", "constructor", "props", "state", "error", "undefined", "getDerivedStateFromError", "componentDidUpdate", "prevProps", "data", "resetError", "render", "React", "this", "fallback", "reset", "children", "setState", "import_react", "import_react", "SurfaceRootContext", "createContext", "components", "useSurface", "useContext", "SurfaceProvider", "Provider", "Surface", "role", "name", "fallback", "rest", "props", "context", "useContext", "SurfaceContext", "data", "surfaces", "React", "ErrorBoundary", "SurfaceResolver", "createContext", "components", "useSurface", "parent", "nodes", "resolveNodes", "currentContext", "Provider", "value", "length", "contentFallback", "Object", "entries", "map", "key", "component", "result", "Wrapper", "undefined", "filter", "Component", "Boolean", "limit", "slice", "children", "import_react", "parseRootSurfacePlugin", "plugin", "provides", "surface", "components", "undefined", "parseSurfacePlugin", "component", "SurfacePlugin", "state", "deepSignal", "meta", "id", "ready", "plugins", "shallow", "filterPlugins", "reduce", "acc", "context", "children", "React", "SurfaceProvider", "value", "import_react", "createApp", "plugins", "fallback", "host", "PluginHost", "SurfacePlugin", "IntentPlugin", "invariant", "provides", "context", "root", "Context", "Root", "React"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytes":2213,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytes":7754,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytes":2942,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytes":660,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-framework/src/plugins/common/layout.ts","kind":"import-statement","original":"./layout"},{"path":"packages/sdk/app-framework/src/plugins/common/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytes":4017,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts":{"bytes":1706,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytes":1616,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytes":7877,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytes":686,"imports":[{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts","kind":"import-statement","original":"./intent"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx","kind":"import-statement","original":"./IntentPlugin"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts":{"bytes":3382,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytes":3530,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytes":23187,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytes":678,"imports":[{"path":"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx","kind":"import-statement","original":"./PluginHost"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytes":4120,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytes":1967,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytes":9240,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytes":5052,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytes":807,"imports":[{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx","kind":"import-statement","original":"./Surface"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx","kind":"import-statement","original":"./SurfacePlugin"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/index.ts":{"bytes":854,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/index.ts","kind":"import-statement","original":"./common"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"./helpers"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts","kind":"import-statement","original":"./IntentPlugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/index.ts","kind":"import-statement","original":"./PluginHost"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts","kind":"import-statement","original":"./SurfacePlugin"}],"format":"esm"},"packages/sdk/app-framework/src/App.tsx":{"bytes":4157,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"}],"format":"esm"},"packages/sdk/app-framework/src/index.ts":{"bytes":544,"imports":[{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"},{"path":"packages/sdk/app-framework/src/App.tsx","kind":"import-statement","original":"./App"}],"format":"esm"}},"outputs":{"packages/sdk/app-framework/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":38872},"packages/sdk/app-framework/dist/lib/node/index.cjs":{"imports":[{"path":"zod","kind":"require-call","external":true},{"path":"zod","kind":"require-call","external":true},{"path":"@dxos/debug","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"deepsignal/react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"deepsignal/react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"@dxos/log","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"deepsignal/react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"@dxos/invariant","kind":"require-call","external":true}],"exports":[],"entryPoint":"packages/sdk/app-framework/src/index.ts","inputs":{"packages/sdk/app-framework/src/index.ts":{"bytesInOutput":1391},"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytesInOutput":174},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytesInOutput":1853},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytesInOutput":437},"packages/sdk/app-framework/src/plugins/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytesInOutput":549},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytesInOutput":253},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytesInOutput":1527},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytesInOutput":514},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytesInOutput":4434},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytesInOutput":709},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytesInOutput":1937},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytesInOutput":260},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytesInOutput":938},"packages/sdk/app-framework/src/App.tsx":{"bytesInOutput":944}},"bytes":19006}}}
|
|
1
|
+
{"inputs":{"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytes":2208,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytes":7749,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/metadata.ts":{"bytes":2053,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytes":3460,"imports":[{"path":"zod","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytes":743,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-framework/src/plugins/common/layout.ts","kind":"import-statement","original":"./layout"},{"path":"packages/sdk/app-framework/src/plugins/common/metadata.ts","kind":"import-statement","original":"./metadata"},{"path":"packages/sdk/app-framework/src/plugins/common/translations.ts","kind":"import-statement","original":"./translations"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytes":4012,"imports":[{"path":"@dxos/debug","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts":{"bytes":1701,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytes":1611,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytes":8039,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytes":681,"imports":[{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/intent.ts","kind":"import-statement","original":"./intent"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx","kind":"import-statement","original":"./IntentContext"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx","kind":"import-statement","original":"./IntentPlugin"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts":{"bytes":3377,"imports":[],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytes":3525,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytes":23182,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytes":673,"imports":[{"path":"packages/sdk/app-framework/src/plugins/PluginHost/plugin.ts","kind":"import-statement","original":"./plugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx","kind":"import-statement","original":"./PluginContext"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx","kind":"import-statement","original":"./PluginHost"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytes":4115,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytes":1962,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytes":9818,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytes":5047,"imports":[{"path":"deepsignal/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"../helpers"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytes":802,"imports":[{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx","kind":"import-statement","original":"./ErrorBoundary"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx","kind":"import-statement","original":"./Surface"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx","kind":"import-statement","original":"./SurfacePlugin"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx","kind":"import-statement","original":"./SurfaceRootContext"}],"format":"esm"},"packages/sdk/app-framework/src/plugins/index.ts":{"bytes":849,"imports":[{"path":"packages/sdk/app-framework/src/plugins/common/index.ts","kind":"import-statement","original":"./common"},{"path":"packages/sdk/app-framework/src/plugins/helpers.ts","kind":"import-statement","original":"./helpers"},{"path":"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts","kind":"import-statement","original":"./IntentPlugin"},{"path":"packages/sdk/app-framework/src/plugins/PluginHost/index.ts","kind":"import-statement","original":"./PluginHost"},{"path":"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts","kind":"import-statement","original":"./SurfacePlugin"}],"format":"esm"},"packages/sdk/app-framework/src/App.tsx":{"bytes":4152,"imports":[{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"}],"format":"esm"},"packages/sdk/app-framework/src/index.ts":{"bytes":539,"imports":[{"path":"packages/sdk/app-framework/src/plugins/index.ts","kind":"import-statement","original":"./plugins"},{"path":"packages/sdk/app-framework/src/App.tsx","kind":"import-statement","original":"./App"}],"format":"esm"}},"outputs":{"packages/sdk/app-framework/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":40603},"packages/sdk/app-framework/dist/lib/node/index.cjs":{"imports":[{"path":"zod","kind":"require-call","external":true},{"path":"zod","kind":"require-call","external":true},{"path":"@dxos/debug","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"deepsignal/react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"deepsignal/react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"@dxos/log","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"deepsignal/react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"react","kind":"require-call","external":true},{"path":"@dxos/invariant","kind":"require-call","external":true}],"exports":[],"entryPoint":"packages/sdk/app-framework/src/index.ts","inputs":{"packages/sdk/app-framework/src/index.ts":{"bytesInOutput":1521},"packages/sdk/app-framework/src/plugins/common/graph.ts":{"bytesInOutput":174},"packages/sdk/app-framework/src/plugins/common/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/common/layout.ts":{"bytesInOutput":1853},"packages/sdk/app-framework/src/plugins/common/metadata.ts":{"bytesInOutput":226},"packages/sdk/app-framework/src/plugins/common/translations.ts":{"bytesInOutput":437},"packages/sdk/app-framework/src/plugins/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/helpers.ts":{"bytesInOutput":549},"packages/sdk/app-framework/src/plugins/IntentPlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentContext.tsx":{"bytesInOutput":253},"packages/sdk/app-framework/src/plugins/IntentPlugin/IntentPlugin.tsx":{"bytesInOutput":1584},"packages/sdk/app-framework/src/plugins/PluginHost/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/PluginHost/PluginContext.tsx":{"bytesInOutput":514},"packages/sdk/app-framework/src/plugins/PluginHost/PluginHost.tsx":{"bytesInOutput":4429},"packages/sdk/app-framework/src/plugins/SurfacePlugin/ErrorBoundary.tsx":{"bytesInOutput":709},"packages/sdk/app-framework/src/plugins/SurfacePlugin/index.ts":{"bytesInOutput":0},"packages/sdk/app-framework/src/plugins/SurfacePlugin/Surface.tsx":{"bytesInOutput":2070},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfaceRootContext.tsx":{"bytesInOutput":260},"packages/sdk/app-framework/src/plugins/SurfacePlugin/SurfacePlugin.tsx":{"bytesInOutput":938},"packages/sdk/app-framework/src/App.tsx":{"bytesInOutput":939}},"bytes":19665}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntentPlugin.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/IntentPlugin/IntentPlugin.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC;KACtD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,MAAM,6CACkD,CAAC;AAEnG,eAAO,MAAM,yBAAyB,WAAY,MAAM,+CAC4C,CAAC;AAErG;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,iBAAiB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"IntentPlugin.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/IntentPlugin/IntentPlugin.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,aAAa,EAAkB,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE;QACN,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC;KACtD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,MAAM,6CACkD,CAAC;AAEnG,eAAO,MAAM,yBAAyB,WAAY,MAAM,+CAC4C,CAAC;AAErG;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,iBAAiB,oBAAoB,CAuCpE,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type FC } from 'react';
|
|
1
2
|
import { ErrorBoundary } from './ErrorBoundary';
|
|
2
3
|
/**
|
|
3
4
|
* Direction determines how multiple components are laid out.
|
|
@@ -26,6 +27,10 @@ export type SurfaceProps = {
|
|
|
26
27
|
* The fallback component will be rendered if an error occurs.
|
|
27
28
|
*/
|
|
28
29
|
fallback?: ErrorBoundary['props']['fallback'];
|
|
30
|
+
/**
|
|
31
|
+
* If specified, this will render if no plugin can offer renderable content for the surface.
|
|
32
|
+
*/
|
|
33
|
+
contentFallback?: FC<{}>;
|
|
29
34
|
/**
|
|
30
35
|
* If more than one component is resolved, the limit determines how many are rendered.
|
|
31
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/SurfacePlugin/Surface.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/SurfacePlugin/Surface.tsx"],"names":[],"mappings":"AAIA,OAAc,EAAE,KAAK,EAAE,EAA0C,MAAM,OAAO,CAAC;AAG/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,GAAG,eAAe,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAEnE;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IAE9C;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAEzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,sCAA8C,YAAY,gBAgB7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/index.ts"],"names":[],"mappings":"AAIA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/index.ts"],"names":[],"mappings":"AAIA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Plugin } from '../PluginHost';
|
|
2
|
+
export type Metadata = Record<string, any>;
|
|
3
|
+
export type MetadataRecordsProvides = {
|
|
4
|
+
metadata: {
|
|
5
|
+
records: Record<string, Metadata>;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
export type MetadataResolver = (type: string) => Metadata;
|
|
9
|
+
export type MetadataResolverProvides = {
|
|
10
|
+
metadata: {
|
|
11
|
+
resolver: MetadataResolver;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare const parseMetadataRecordsPlugin: (plugin: Plugin) => Plugin<MetadataRecordsProvides> | undefined;
|
|
15
|
+
export declare const parseMetadataResolverPlugin: (plugin: Plugin) => Plugin<MetadataResolverProvides> | undefined;
|
|
16
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/metadata.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE3C,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;KACnC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC;AAE1D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE;QACR,QAAQ,EAAE,gBAAgB,CAAC;KAC5B,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,0BAA0B,WAAY,MAAM,gDAExD,CAAC;AAEF,eAAO,MAAM,2BAA2B,WAAY,MAAM,iDAEzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/translations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,WAAW,+DAA2C,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB,yFAAwB,CAAC;AACtD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,QAAQ,mHAA6B,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD;;GAEG;
|
|
1
|
+
{"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/translations.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,WAAW,+DAA2C,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,gBAAgB,yFAAwB,CAAC;AACtD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,QAAQ,mHAA6B,CAAC;AACnD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD;;GAEG;AAEH,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;CACpC,CAAC;AASF;;GAEG;AACH,eAAO,MAAM,uBAAuB,WAAY,MAAM,6CAGrD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/app-framework",
|
|
3
|
-
"version": "0.3.5
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "A framework for building applications from composible plugins.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
"@preact/signals-react": "^1.3.6",
|
|
16
16
|
"deepsignal": "1.4.0-shallow.0",
|
|
17
17
|
"zod": "^3.19.1",
|
|
18
|
-
"@dxos/app-graph": "0.3.5
|
|
19
|
-
"@dxos/async": "0.3.5
|
|
20
|
-
"@dxos/debug": "0.3.5
|
|
21
|
-
"@dxos/invariant": "0.3.5
|
|
22
|
-
"@dxos/log": "0.3.5
|
|
18
|
+
"@dxos/app-graph": "0.3.5",
|
|
19
|
+
"@dxos/async": "0.3.5",
|
|
20
|
+
"@dxos/debug": "0.3.5",
|
|
21
|
+
"@dxos/invariant": "0.3.5",
|
|
22
|
+
"@dxos/log": "0.3.5"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/react": "^18.0.21",
|
|
@@ -39,16 +39,19 @@ export const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {
|
|
|
39
39
|
},
|
|
40
40
|
ready: async (plugins) => {
|
|
41
41
|
// Dispatch intent to associated plugin.
|
|
42
|
-
const dispatch = (intent: Intent) => {
|
|
42
|
+
const dispatch = async (intent: Intent) => {
|
|
43
43
|
if (intent.plugin) {
|
|
44
44
|
const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);
|
|
45
45
|
return plugin?.provides.intent.resolver(intent, plugins);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// Return resolved value from first plugin that handles the intent.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {
|
|
50
|
+
const result = await plugin.provides.intent.resolver(intent, plugins);
|
|
51
|
+
if (result) {
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
52
55
|
};
|
|
53
56
|
|
|
54
57
|
// Sequentially dispatch array of invents.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { type PropsWithChildren, type ReactNode } from 'react';
|
|
5
|
+
import React, { type FC, type PropsWithChildren, type ReactNode } from 'react';
|
|
6
6
|
import { createContext, useContext } from 'react';
|
|
7
7
|
|
|
8
8
|
import { ErrorBoundary } from './ErrorBoundary';
|
|
@@ -41,6 +41,11 @@ export type SurfaceProps = {
|
|
|
41
41
|
*/
|
|
42
42
|
fallback?: ErrorBoundary['props']['fallback'];
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* If specified, this will render if no plugin can offer renderable content for the surface.
|
|
46
|
+
*/
|
|
47
|
+
contentFallback?: FC<{}>;
|
|
48
|
+
|
|
44
49
|
/**
|
|
45
50
|
* If more than one component is resolved, the limit determines how many are rendered.
|
|
46
51
|
*/
|
|
@@ -88,7 +93,11 @@ const SurfaceResolver = (props: SurfaceProps) => {
|
|
|
88
93
|
},
|
|
89
94
|
};
|
|
90
95
|
|
|
91
|
-
return
|
|
96
|
+
return (
|
|
97
|
+
<SurfaceContext.Provider value={currentContext}>
|
|
98
|
+
{nodes.length > 0 ? nodes : props.contentFallback ? <props.contentFallback /> : null}
|
|
99
|
+
</SurfaceContext.Provider>
|
|
100
|
+
);
|
|
92
101
|
};
|
|
93
102
|
|
|
94
103
|
const resolveNodes = (
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { Plugin } from '../PluginHost';
|
|
6
|
+
|
|
7
|
+
export type Metadata = Record<string, any>;
|
|
8
|
+
|
|
9
|
+
export type MetadataRecordsProvides = {
|
|
10
|
+
metadata: {
|
|
11
|
+
records: Record<string, Metadata>;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type MetadataResolver = (type: string) => Metadata;
|
|
16
|
+
|
|
17
|
+
export type MetadataResolverProvides = {
|
|
18
|
+
metadata: {
|
|
19
|
+
resolver: MetadataResolver;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const parseMetadataRecordsPlugin = (plugin: Plugin) => {
|
|
24
|
+
return (plugin.provides as any).metadata?.records ? (plugin as Plugin<MetadataRecordsProvides>) : undefined;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const parseMetadataResolverPlugin = (plugin: Plugin) => {
|
|
28
|
+
return (plugin.provides as any).metadata?.resolver ? (plugin as Plugin<MetadataResolverProvides>) : undefined;
|
|
29
|
+
};
|
|
@@ -21,10 +21,18 @@ export type Resource = z.infer<typeof Resource>;
|
|
|
21
21
|
/**
|
|
22
22
|
* Provides for a plugin that exposes translations.
|
|
23
23
|
*/
|
|
24
|
+
// TODO(wittjosiah): Rename to TranslationResourcesProvides.
|
|
24
25
|
export type TranslationsProvides = {
|
|
25
26
|
translations: Readonly<Resource[]>;
|
|
26
27
|
};
|
|
27
28
|
|
|
29
|
+
// TODO(wittjosiah): Add TranslationsProvides.
|
|
30
|
+
// export type TranslationsProvides = {
|
|
31
|
+
// translations: {
|
|
32
|
+
// t: TFunction;
|
|
33
|
+
// };
|
|
34
|
+
// };
|
|
35
|
+
|
|
28
36
|
/**
|
|
29
37
|
* Type guard for translation plugins.
|
|
30
38
|
*/
|