@dxos/plugin-explorer 0.8.1-staging.391c573 → 0.8.1-staging.97aedb1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/lib/browser/{ExplorerContainer-3FC557MG.mjs → ExplorerContainer-HL532ODG.mjs} +3 -4
  2. package/dist/lib/browser/{ExplorerContainer-3FC557MG.mjs.map → ExplorerContainer-HL532ODG.mjs.map} +3 -3
  3. package/dist/lib/browser/{chunk-4OFGICWF.mjs → chunk-B2DMPSP5.mjs} +16 -16
  4. package/dist/lib/browser/{chunk-PMHCTMKT.mjs → chunk-QLQLPZNI.mjs} +4 -4
  5. package/dist/lib/browser/{chunk-X5CI43J6.mjs → chunk-SBLNE7FL.mjs} +7 -7
  6. package/dist/lib/browser/chunk-SBLNE7FL.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-QOKAZK4V.mjs → chunk-Z2SDLMQM.mjs} +2 -2
  8. package/dist/lib/browser/chunk-Z2SDLMQM.mjs.map +7 -0
  9. package/dist/lib/browser/index.mjs +13 -20
  10. package/dist/lib/browser/index.mjs.map +3 -3
  11. package/dist/lib/browser/{intent-resolver-UJNDAIDZ.mjs → intent-resolver-NHHRWTOP.mjs} +4 -4
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/meta.mjs +1 -1
  14. package/dist/lib/browser/{react-surface-TQPQNICA.mjs → react-surface-N7TC6BMF.mjs} +8 -7
  15. package/dist/lib/browser/react-surface-N7TC6BMF.mjs.map +7 -0
  16. package/dist/lib/browser/types/index.mjs +2 -2
  17. package/dist/lib/node/{ExplorerContainer-2DQFUEG7.cjs → ExplorerContainer-73AHSBAG.cjs} +6 -7
  18. package/dist/lib/node/{ExplorerContainer-2DQFUEG7.cjs.map → ExplorerContainer-73AHSBAG.cjs.map} +3 -3
  19. package/dist/lib/node/{chunk-ZJL53DLS.cjs → chunk-HCDBN6NN.cjs} +7 -7
  20. package/dist/lib/node/{chunk-AABHIUUW.cjs → chunk-OIHH6TVE.cjs} +8 -8
  21. package/dist/lib/node/chunk-OIHH6TVE.cjs.map +7 -0
  22. package/dist/lib/node/{chunk-5MTMJYC4.cjs → chunk-VB3QE6XY.cjs} +4 -4
  23. package/dist/lib/node/chunk-VB3QE6XY.cjs.map +7 -0
  24. package/dist/lib/node/{chunk-YUY7P7R2.cjs → chunk-YLL7H7CZ.cjs} +6 -6
  25. package/dist/lib/node/index.cjs +31 -38
  26. package/dist/lib/node/index.cjs.map +3 -3
  27. package/dist/lib/node/{intent-resolver-XQV24IAA.cjs → intent-resolver-EEOTX3OZ.cjs} +8 -8
  28. package/dist/lib/node/meta.cjs +3 -3
  29. package/dist/lib/node/meta.cjs.map +1 -1
  30. package/dist/lib/node/meta.json +1 -1
  31. package/dist/lib/node/{react-surface-5KXC7YQA.cjs → react-surface-WD4G2NRS.cjs} +12 -11
  32. package/dist/lib/node/react-surface-WD4G2NRS.cjs.map +7 -0
  33. package/dist/lib/node/types/index.cjs +4 -4
  34. package/dist/lib/node/types/index.cjs.map +1 -1
  35. package/dist/lib/node-esm/{ExplorerContainer-RBGUFI5X.mjs → ExplorerContainer-NMI55PYM.mjs} +3 -4
  36. package/dist/lib/node-esm/{ExplorerContainer-RBGUFI5X.mjs.map → ExplorerContainer-NMI55PYM.mjs.map} +3 -3
  37. package/dist/lib/node-esm/{chunk-UHJZUVRI.mjs → chunk-PUFSCMN4.mjs} +2 -2
  38. package/dist/lib/node-esm/chunk-PUFSCMN4.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-PIOV7IOO.mjs → chunk-PZOORWFE.mjs} +16 -16
  40. package/dist/lib/node-esm/{chunk-57K7ORAW.mjs → chunk-QZH2GDN5.mjs} +4 -4
  41. package/dist/lib/node-esm/{chunk-TI3P4L2P.mjs → chunk-SZRRNWYT.mjs} +7 -7
  42. package/dist/lib/node-esm/chunk-SZRRNWYT.mjs.map +7 -0
  43. package/dist/lib/node-esm/index.mjs +13 -20
  44. package/dist/lib/node-esm/index.mjs.map +3 -3
  45. package/dist/lib/node-esm/{intent-resolver-RZQ3EEOE.mjs → intent-resolver-PTFKXAT4.mjs} +4 -4
  46. package/dist/lib/node-esm/meta.json +1 -1
  47. package/dist/lib/node-esm/meta.mjs +1 -1
  48. package/dist/lib/node-esm/{react-surface-F7FKYPQZ.mjs → react-surface-J5SW7VF2.mjs} +8 -7
  49. package/dist/lib/node-esm/react-surface-J5SW7VF2.mjs.map +7 -0
  50. package/dist/lib/node-esm/types/index.mjs +2 -2
  51. package/dist/types/src/ExplorerPlugin.d.ts.map +1 -1
  52. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  53. package/dist/types/src/components/Graph/graph-model.d.ts.map +1 -1
  54. package/dist/types/src/components/Tree/Tree.stories.d.ts.map +1 -1
  55. package/dist/types/src/meta.d.ts +2 -9
  56. package/dist/types/src/meta.d.ts.map +1 -1
  57. package/dist/types/src/translations.d.ts +2 -6
  58. package/dist/types/src/translations.d.ts.map +1 -1
  59. package/package.json +24 -24
  60. package/src/ExplorerPlugin.tsx +1 -2
  61. package/src/capabilities/react-surface.tsx +2 -1
  62. package/src/components/ExplorerContainer.tsx +1 -1
  63. package/src/components/Graph/graph-model.ts +7 -7
  64. package/src/components/Tree/Tree.stories.tsx +3 -36
  65. package/src/meta.ts +2 -2
  66. package/src/translations.ts +1 -2
  67. package/dist/lib/browser/chunk-QOKAZK4V.mjs.map +0 -7
  68. package/dist/lib/browser/chunk-X5CI43J6.mjs.map +0 -7
  69. package/dist/lib/browser/react-surface-TQPQNICA.mjs.map +0 -7
  70. package/dist/lib/node/chunk-5MTMJYC4.cjs.map +0 -7
  71. package/dist/lib/node/chunk-AABHIUUW.cjs.map +0 -7
  72. package/dist/lib/node/react-surface-5KXC7YQA.cjs.map +0 -7
  73. package/dist/lib/node-esm/chunk-TI3P4L2P.mjs.map +0 -7
  74. package/dist/lib/node-esm/chunk-UHJZUVRI.mjs.map +0 -7
  75. package/dist/lib/node-esm/react-surface-F7FKYPQZ.mjs.map +0 -7
  76. /package/dist/lib/browser/{chunk-4OFGICWF.mjs.map → chunk-B2DMPSP5.mjs.map} +0 -0
  77. /package/dist/lib/browser/{chunk-PMHCTMKT.mjs.map → chunk-QLQLPZNI.mjs.map} +0 -0
  78. /package/dist/lib/browser/{intent-resolver-UJNDAIDZ.mjs.map → intent-resolver-NHHRWTOP.mjs.map} +0 -0
  79. /package/dist/lib/node/{chunk-ZJL53DLS.cjs.map → chunk-HCDBN6NN.cjs.map} +0 -0
  80. /package/dist/lib/node/{chunk-YUY7P7R2.cjs.map → chunk-YLL7H7CZ.cjs.map} +0 -0
  81. /package/dist/lib/node/{intent-resolver-XQV24IAA.cjs.map → intent-resolver-EEOTX3OZ.cjs.map} +0 -0
  82. /package/dist/lib/node-esm/{chunk-PIOV7IOO.mjs.map → chunk-PZOORWFE.mjs.map} +0 -0
  83. /package/dist/lib/node-esm/{chunk-57K7ORAW.mjs.map → chunk-QZH2GDN5.mjs.map} +0 -0
  84. /package/dist/lib/node-esm/{intent-resolver-RZQ3EEOE.mjs.map → intent-resolver-PTFKXAT4.mjs.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type UnsubscribeCallback } from '@dxos/async';
5
+ import { type CleanupFn } from '@dxos/async';
6
6
  import {
7
7
  getSchema,
8
8
  getSchemaDXN,
@@ -15,7 +15,7 @@ import {
15
15
  import { type GraphData, GraphModel } from '@dxos/gem-spore';
16
16
  import { log } from '@dxos/log';
17
17
  import { CollectionType } from '@dxos/plugin-space/types';
18
- import { Filter, type ReactiveEchoObject, type Space, type Subscription } from '@dxos/react-client/echo';
18
+ import { Filter, type ReactiveEchoObject, type Space } from '@dxos/react-client/echo';
19
19
 
20
20
  export type SpaceGraphModelOptions = {
21
21
  schema?: boolean;
@@ -47,9 +47,9 @@ export class SpaceGraphModel extends GraphModel<EchoGraphNode> {
47
47
  };
48
48
 
49
49
  private _schema?: EchoSchema[];
50
- private _schemaSubscription?: UnsubscribeCallback;
50
+ private _schemaSubscription?: CleanupFn;
51
51
  private _objects?: ReactiveEchoObject<any>[];
52
- private _objectsSubscription?: Subscription;
52
+ private _objectsSubscription?: CleanupFn;
53
53
 
54
54
  constructor(private readonly _options: SpaceGraphModelOptions = {}) {
55
55
  super();
@@ -110,7 +110,7 @@ export class SpaceGraphModel extends GraphModel<EchoGraphNode> {
110
110
 
111
111
  // Runtime schema.
112
112
  space.db.graph.schemaRegistry.schemas.forEach((schema) => {
113
- const typename = getSchemaDXN(schema)?.toTypename();
113
+ const typename = getSchemaDXN(schema)?.typename;
114
114
  if (typename) {
115
115
  addSchema(typename);
116
116
  }
@@ -118,7 +118,7 @@ export class SpaceGraphModel extends GraphModel<EchoGraphNode> {
118
118
 
119
119
  // Database Schema.
120
120
  this._schema?.forEach((schema) => {
121
- const typename = getSchemaDXN(schema)?.toTypename();
121
+ const typename = getSchemaDXN(schema)?.typename;
122
122
  if (typename) {
123
123
  addSchema(typename);
124
124
  }
@@ -128,7 +128,7 @@ export class SpaceGraphModel extends GraphModel<EchoGraphNode> {
128
128
  this._objects.forEach((object) => {
129
129
  const schema = getSchema(object);
130
130
  if (schema) {
131
- const typename = getSchemaDXN(schema)?.toTypename();
131
+ const typename = getSchemaDXN(schema)?.typename;
132
132
  if (typename) {
133
133
  const current = currentNodes.find((node) => node.id === object.id);
134
134
  this._graph.nodes.push({ ...current, id: object.id, type: 'object', data: { typename, object } });
@@ -7,59 +7,26 @@ import '@dxos-theme';
7
7
  import { type Meta } from '@storybook/react';
8
8
  import React, { type FC, useEffect, useState } from 'react';
9
9
 
10
- import { create, makeRef } from '@dxos/live-object';
11
- import { TreeItemType, TreeType } from '@dxos/plugin-outliner/types';
10
+ import { TreeType, Tree as TreeModel } from '@dxos/plugin-outliner/types';
12
11
  import { faker } from '@dxos/random';
13
12
  import { useClient } from '@dxos/react-client';
14
13
  import { type ClientRepeatedComponentProps, ClientRepeater } from '@dxos/react-client/testing';
15
14
  import { withLayout, withTheme } from '@dxos/storybook-utils';
16
- import { range } from '@dxos/util';
17
15
 
18
16
  import { Tree, type TreeComponentProps } from './Tree';
19
17
 
20
18
  // TODO(burdon): Storybook for Graph/Tree/Plot (generics); incl. GraphModel.
21
19
  // TODO(burdon): Type for all Explorer components (Space, Object, Query, etc.) incl.
22
- // TODO(burdon): Factor out to gem?
23
20
 
24
21
  faker.seed(1);
25
22
 
26
- const makeTreeItems = <T extends number>(count: T, items: TreeItemType[] = []) => {
27
- return range(count, () => create(TreeItemType, { content: '', items: items.map((item) => makeRef(item)) }));
28
- };
29
-
30
23
  const Story: FC<ClientRepeatedComponentProps & { type?: TreeComponentProps<any>['variant'] }> = ({ type }) => {
31
24
  const client = useClient();
32
25
  const space = client.spaces.default;
33
26
  const [object, setObject] = useState<TreeType>();
34
27
  useEffect(() => {
35
28
  setTimeout(() => {
36
- const tree = create(TreeType, {
37
- root: makeRef(
38
- makeTreeItems(1, [
39
- ...makeTreeItems(7),
40
- ...makeTreeItems(1, [
41
- ...makeTreeItems(1),
42
- ...makeTreeItems(1, [
43
- ...makeTreeItems(3),
44
- ...makeTreeItems(1, makeTreeItems(2)),
45
- ...makeTreeItems(2),
46
- ...makeTreeItems(1, makeTreeItems(2)),
47
- ...makeTreeItems(2),
48
- ]),
49
- ...makeTreeItems(1),
50
- ]),
51
- ...makeTreeItems(2),
52
- ...makeTreeItems(1, [
53
- ...makeTreeItems(1),
54
- ...makeTreeItems(1, [...makeTreeItems(2), ...makeTreeItems(1, makeTreeItems(2))]),
55
- ...makeTreeItems(1),
56
- ]),
57
- ...makeTreeItems(2),
58
- ])[0],
59
- ),
60
- });
61
-
62
- space.db.add(tree);
29
+ const tree = space.db.add(TreeModel.create());
63
30
  setObject(tree);
64
31
  });
65
32
  }, []);
@@ -92,7 +59,7 @@ export const Edge = {
92
59
  const meta: Meta = {
93
60
  title: 'plugins/plugin-explorer/Tree',
94
61
  component: Tree,
95
- render: () => <ClientRepeater component={Story} types={[TreeType, TreeItemType]} createSpace />,
62
+ render: () => <ClientRepeater component={Story} types={[TreeType]} createSpace />,
96
63
  decorators: [withTheme, withLayout({ fullscreen: true })],
97
64
  parameters: {
98
65
  layout: 'fullscreen',
package/src/meta.ts CHANGED
@@ -6,7 +6,7 @@ import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
7
  export const EXPLORER_PLUGIN = 'dxos.org/plugin/explorer';
8
8
 
9
- export const meta = {
9
+ export const meta: PluginMeta = {
10
10
  id: EXPLORER_PLUGIN,
11
11
  name: 'Explorer',
12
12
  description: 'Install this plugin to view a hypergraph of all objects inside of your Space.',
@@ -14,4 +14,4 @@ export const meta = {
14
14
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-explorer',
15
15
  tags: ['experimental'],
16
16
  screenshots: ['https://dxos.network/plugin-details-explorer-dark.png'],
17
- } satisfies PluginMeta;
17
+ };
@@ -10,12 +10,11 @@ export default [
10
10
  'en-US': {
11
11
  [ViewType.typename]: {
12
12
  'typename label': 'Explorer',
13
+ 'object name placeholder': 'New explorer',
13
14
  },
14
15
  [EXPLORER_PLUGIN]: {
15
16
  'plugin name': 'Explorer',
16
17
  'object title label': 'Title',
17
- 'object title placeholder': 'New explorer',
18
- 'create object label': 'Create explorer',
19
18
  },
20
19
  },
21
20
  },
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const EXPLORER_PLUGIN = 'dxos.org/plugin/explorer';\n\nexport const meta = {\n id: EXPLORER_PLUGIN,\n name: 'Explorer',\n description: 'Install this plugin to view a hypergraph of all objects inside of your Space.',\n icon: 'ph--graph--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-explorer',\n tags: ['experimental'],\n screenshots: ['https://dxos.network/plugin-details-explorer-dark.png'],\n} satisfies PluginMeta;\n"],
5
- "mappings": ";AAMO,IAAMA,kBAAkB;AAExB,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa;IAAC;;AAChB;",
6
- "names": ["EXPLORER_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/Graph/graph-model.ts", "../../../src/components/Graph/Graph.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport {\n getSchema,\n getSchemaDXN,\n AST,\n type EchoSchema,\n ReferenceAnnotationId,\n SchemaValidator,\n StoredSchema,\n} from '@dxos/echo-schema';\nimport { type GraphData, GraphModel } from '@dxos/gem-spore';\nimport { log } from '@dxos/log';\nimport { CollectionType } from '@dxos/plugin-space/types';\nimport { Filter, type ReactiveEchoObject, type Space, type Subscription } from '@dxos/react-client/echo';\n\nexport type SpaceGraphModelOptions = {\n schema?: boolean;\n};\n\n// TODO(burdon): Convert to common/graph.\n\ntype SchemaGraphNode = {\n id: string;\n type: 'schema';\n data: { typename: string };\n};\n\ntype ObjectGraphNode = {\n id: string;\n type: 'object';\n data: { typename: string; object: ReactiveEchoObject<any> };\n};\n\nexport type EchoGraphNode = SchemaGraphNode | ObjectGraphNode;\n\n/**\n * Converts ECHO objects to a graph.\n */\nexport class SpaceGraphModel extends GraphModel<EchoGraphNode> {\n private readonly _graph: GraphData<EchoGraphNode> = {\n nodes: [],\n links: [],\n };\n\n private _schema?: EchoSchema[];\n private _schemaSubscription?: UnsubscribeCallback;\n private _objects?: ReactiveEchoObject<any>[];\n private _objectsSubscription?: Subscription;\n\n constructor(private readonly _options: SpaceGraphModelOptions = {}) {\n super();\n }\n\n override get graph(): GraphData<EchoGraphNode> {\n return this._graph;\n }\n\n get objects(): ReactiveEchoObject<any>[] {\n return this._objects ?? [];\n }\n\n // TODO(burdon): Alternative diagram types:\n // - https://observablehq.com/@d3/radial-tree/2\n // - https://observablehq.com/@d3/disjoint-force-directed-graph/2\n // - https://observablehq.com/@mbostock/tadpoles\n // - https://observablehq.com/@d3/psr-b1919-21\n // - https://vasturiano.github.io/react-force-graph/example/basic (3D)\n\n async open(space: Space, objectId?: string) {\n // TODO(burdon): Factor out graph builder to lib (use common/graph abstraction).\n if (!this._schemaSubscription) {\n // TODO(burdon): Normalize unsubscribe callbacks and merge handlers.\n // TODO(burdon): Trigger initial subscription update.\n // TODO(burdon): Normalize subscription cb for objects, schema, etc.\n\n const schemaaQuery = space.db.schemaRegistry.query({});\n const schemas = await schemaaQuery.run();\n const onSchemaUpdate = ({ results }: { results: EchoSchema[] }) => (this._schema = results);\n this._schemaSubscription = schemaaQuery.subscribe(onSchemaUpdate);\n onSchemaUpdate({ results: schemas });\n\n this._objectsSubscription = space.db\n // TODO(burdon): ERROR: Cannot mix type and or filters.\n .query(Filter.not(Filter.or(Filter.schema(StoredSchema), Filter.schema(CollectionType))))\n .subscribe(\n ({ objects }) => {\n this._objects = objects;\n\n // Merge with current nodes.\n const currentNodes = this._graph.nodes;\n\n this._graph.nodes = [];\n this._graph.links = [];\n\n const addSchema = (typename: string) => {\n const current = currentNodes.find((node) => node.id === typename);\n if (typename) {\n this._graph.nodes.push({\n ...current,\n id: typename,\n type: 'schema',\n data: { typename },\n });\n }\n };\n\n // Runtime schema.\n space.db.graph.schemaRegistry.schemas.forEach((schema) => {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n addSchema(typename);\n }\n });\n\n // Database Schema.\n this._schema?.forEach((schema) => {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n addSchema(typename);\n }\n });\n\n // Database Objects.\n this._objects.forEach((object) => {\n const schema = getSchema(object);\n if (schema) {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n const current = currentNodes.find((node) => node.id === object.id);\n this._graph.nodes.push({ ...current, id: object.id, type: 'object', data: { typename, object } });\n\n // Link to schema.\n const schemaNode = this._graph.nodes.find(\n (node) => node.type === 'schema' && node.data.typename === typename,\n );\n if (schemaNode) {\n this._graph.links.push({\n id: `${object.id}-${schemaNode.id}`,\n source: object.id,\n target: schemaNode.id,\n });\n } else {\n log.info('schema node not found', { typename });\n }\n\n // Link ot refs.\n // TODO(burdon): This isn't working.\n AST.getPropertySignatures(schema.ast).forEach((prop) => {\n if (!SchemaValidator.hasTypeAnnotation(schema, prop.name.toString(), ReferenceAnnotationId)) {\n return;\n }\n\n const value = object[String(prop.name)];\n if (value) {\n const refs = Array.isArray(value) ? value : [value];\n for (const ref of refs) {\n if (objects.findIndex((obj) => obj.id === ref.id) !== -1) {\n this._graph.links.push({\n id: `${object.id}-${String(prop.name)}-${ref.id}`,\n source: object.id,\n target: ref.id,\n });\n }\n }\n }\n });\n }\n }\n });\n\n this.triggerUpdate();\n },\n { fire: true },\n );\n }\n\n this.setSelected(objectId);\n return this;\n }\n\n close() {\n this._schemaSubscription?.();\n this._schemaSubscription = undefined;\n this._objectsSubscription?.();\n this._objectsSubscription = undefined;\n\n return this;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { forceLink, forceManyBody } from 'd3';\nimport ForceGraph from 'force-graph';\nimport React, { type FC, useEffect, useRef } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { type Space } from '@dxos/client/echo';\nimport { filterObjectsSync, type SearchResult } from '@dxos/plugin-search';\nimport { useAsyncState } from '@dxos/react-ui';\n\nimport { SpaceGraphModel } from './graph-model';\n\nexport type GraphProps = {\n space: Space;\n match?: RegExp;\n};\n\nexport const Graph: FC<GraphProps> = ({ space, match }) => {\n const { ref, width, height } = useResizeDetector({ refreshRate: 200 });\n const rootRef = useRef<HTMLDivElement>(null);\n const forceGraph = useRef<ForceGraph>();\n\n const [model] = useAsyncState(\n async () => (space ? new SpaceGraphModel({ schema: true }).open(space) : undefined),\n [space],\n );\n\n const filteredRef = useRef<SearchResult[]>();\n filteredRef.current = filterObjectsSync(model?.objects ?? [], match);\n\n useEffect(() => {\n if (rootRef.current) {\n // https://github.com/vasturiano/force-graph\n // https://github.com/vasturiano/3d-force-graph\n forceGraph.current = new ForceGraph(rootRef.current)\n .nodeRelSize(6)\n .nodeLabel((node: any) => {\n if (node.type === 'schema') {\n return node.data.typename;\n }\n\n return node.id;\n })\n .nodeAutoColorBy((node: any) => (node.type === 'schema' ? 'schema' : node.data.typename))\n .linkColor(() => 'rgba(255,255,255,0.25)');\n }\n\n return () => {\n forceGraph.current?.pauseAnimation().graphData({ nodes: [], links: [] });\n forceGraph.current = undefined;\n };\n }, []);\n\n useEffect(() => {\n if (forceGraph.current && width && height && model) {\n forceGraph.current\n .pauseAnimation()\n .width(width)\n .height(height)\n .onEngineStop(() => {\n handleZoomToFit();\n })\n\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#force-engine-d3-force-configuration\n // .d3Force('center', forceCenter().strength(0.9))\n .d3Force('link', forceLink().distance(160).strength(0.5))\n .d3Force('charge', forceManyBody().strength(-30))\n // .d3AlphaDecay(0.0228)\n // .d3VelocityDecay(0.4)\n\n .graphData(model.graph)\n .warmupTicks(100)\n .cooldownTime(1000)\n .resumeAnimation();\n }\n }, [model, width, height]);\n\n const handleZoomToFit = () => {\n forceGraph.current?.zoomToFit(400, 40);\n };\n\n return (\n <div ref={ref} className='relative grow' onClick={handleZoomToFit}>\n <div ref={rootRef} className='absolute inset-0' />\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["getSchema", "getSchemaDXN", "AST", "ReferenceAnnotationId", "SchemaValidator", "StoredSchema", "GraphModel", "log", "CollectionType", "Filter", "SpaceGraphModel", "constructor", "_options", "_graph", "nodes", "links", "graph", "objects", "_objects", "open", "space", "objectId", "_schemaSubscription", "schemaaQuery", "db", "schemaRegistry", "query", "schemas", "run", "onSchemaUpdate", "results", "_schema", "subscribe", "_objectsSubscription", "not", "or", "schema", "currentNodes", "addSchema", "typename", "current", "find", "node", "id", "push", "type", "data", "forEach", "toTypename", "object", "schemaNode", "source", "target", "info", "getPropertySignatures", "ast", "prop", "hasTypeAnnotation", "name", "toString", "value", "String", "refs", "Array", "isArray", "ref", "findIndex", "obj", "triggerUpdate", "fire", "setSelected", "close", "undefined", "forceLink", "forceManyBody", "ForceGraph", "React", "useEffect", "useRef", "useResizeDetector", "filterObjectsSync", "useAsyncState", "Graph", "space", "match", "ref", "width", "height", "useResizeDetector", "refreshRate", "rootRef", "useRef", "forceGraph", "model", "useAsyncState", "SpaceGraphModel", "schema", "open", "undefined", "filteredRef", "current", "filterObjectsSync", "objects", "useEffect", "ForceGraph", "nodeRelSize", "nodeLabel", "node", "type", "data", "typename", "id", "nodeAutoColorBy", "linkColor", "pauseAnimation", "graphData", "nodes", "links", "onEngineStop", "handleZoomToFit", "d3Force", "forceLink", "distance", "strength", "forceManyBody", "graph", "warmupTicks", "cooldownTime", "resumeAnimation", "zoomToFit", "div", "className", "onClick"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\n\nimport { ExplorerContainer } from '../components';\nimport { EXPLORER_PLUGIN } from '../meta';\nimport { ViewType } from '../types';\n\nexport default () =>\n contributes(\n Capabilities.ReactSurface,\n createSurface({\n id: `${EXPLORER_PLUGIN}/article`,\n role: ['article', 'section'],\n filter: (data): data is { subject: ViewType } => data.subject instanceof ViewType,\n component: ({ data, role }) => <ExplorerContainer view={data.subject} role={role} />,\n }),\n );\n"],
5
- "mappings": ";;;;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,cAAcC,aAAaC,qBAAqB;AAMzD,IAAA,wBAAe,MACbC,YACEC,aAAaC,cACbC,cAAc;EACZC,IAAI,GAAGC,eAAAA;EACPC,MAAM;IAAC;IAAW;;EAClBC,QAAQ,CAACC,SAAwCA,KAAKC,mBAAmBC;EACzEC,WAAW,CAAC,EAAEH,MAAMF,KAAI,MAAO,sBAAA,cAACM,mBAAAA;IAAkBC,MAAML,KAAKC;IAASH;;AACxE,CAAA,CAAA;",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "EXPLORER_PLUGIN", "role", "filter", "data", "subject", "ViewType", "component", "ExplorerContainer", "view"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const EXPLORER_PLUGIN = 'dxos.org/plugin/explorer';\n\nexport const meta = {\n id: EXPLORER_PLUGIN,\n name: 'Explorer',\n description: 'Install this plugin to view a hypergraph of all objects inside of your Space.',\n icon: 'ph--graph--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-explorer',\n tags: ['experimental'],\n screenshots: ['https://dxos.network/plugin-details-explorer-dark.png'],\n} satisfies PluginMeta;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,kBAAkB;AAExB,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa;IAAC;;AAChB;",
6
- "names": ["EXPLORER_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/Graph/graph-model.ts", "../../../src/components/Graph/Graph.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport {\n getSchema,\n getSchemaDXN,\n AST,\n type EchoSchema,\n ReferenceAnnotationId,\n SchemaValidator,\n StoredSchema,\n} from '@dxos/echo-schema';\nimport { type GraphData, GraphModel } from '@dxos/gem-spore';\nimport { log } from '@dxos/log';\nimport { CollectionType } from '@dxos/plugin-space/types';\nimport { Filter, type ReactiveEchoObject, type Space, type Subscription } from '@dxos/react-client/echo';\n\nexport type SpaceGraphModelOptions = {\n schema?: boolean;\n};\n\n// TODO(burdon): Convert to common/graph.\n\ntype SchemaGraphNode = {\n id: string;\n type: 'schema';\n data: { typename: string };\n};\n\ntype ObjectGraphNode = {\n id: string;\n type: 'object';\n data: { typename: string; object: ReactiveEchoObject<any> };\n};\n\nexport type EchoGraphNode = SchemaGraphNode | ObjectGraphNode;\n\n/**\n * Converts ECHO objects to a graph.\n */\nexport class SpaceGraphModel extends GraphModel<EchoGraphNode> {\n private readonly _graph: GraphData<EchoGraphNode> = {\n nodes: [],\n links: [],\n };\n\n private _schema?: EchoSchema[];\n private _schemaSubscription?: UnsubscribeCallback;\n private _objects?: ReactiveEchoObject<any>[];\n private _objectsSubscription?: Subscription;\n\n constructor(private readonly _options: SpaceGraphModelOptions = {}) {\n super();\n }\n\n override get graph(): GraphData<EchoGraphNode> {\n return this._graph;\n }\n\n get objects(): ReactiveEchoObject<any>[] {\n return this._objects ?? [];\n }\n\n // TODO(burdon): Alternative diagram types:\n // - https://observablehq.com/@d3/radial-tree/2\n // - https://observablehq.com/@d3/disjoint-force-directed-graph/2\n // - https://observablehq.com/@mbostock/tadpoles\n // - https://observablehq.com/@d3/psr-b1919-21\n // - https://vasturiano.github.io/react-force-graph/example/basic (3D)\n\n async open(space: Space, objectId?: string) {\n // TODO(burdon): Factor out graph builder to lib (use common/graph abstraction).\n if (!this._schemaSubscription) {\n // TODO(burdon): Normalize unsubscribe callbacks and merge handlers.\n // TODO(burdon): Trigger initial subscription update.\n // TODO(burdon): Normalize subscription cb for objects, schema, etc.\n\n const schemaaQuery = space.db.schemaRegistry.query({});\n const schemas = await schemaaQuery.run();\n const onSchemaUpdate = ({ results }: { results: EchoSchema[] }) => (this._schema = results);\n this._schemaSubscription = schemaaQuery.subscribe(onSchemaUpdate);\n onSchemaUpdate({ results: schemas });\n\n this._objectsSubscription = space.db\n // TODO(burdon): ERROR: Cannot mix type and or filters.\n .query(Filter.not(Filter.or(Filter.schema(StoredSchema), Filter.schema(CollectionType))))\n .subscribe(\n ({ objects }) => {\n this._objects = objects;\n\n // Merge with current nodes.\n const currentNodes = this._graph.nodes;\n\n this._graph.nodes = [];\n this._graph.links = [];\n\n const addSchema = (typename: string) => {\n const current = currentNodes.find((node) => node.id === typename);\n if (typename) {\n this._graph.nodes.push({\n ...current,\n id: typename,\n type: 'schema',\n data: { typename },\n });\n }\n };\n\n // Runtime schema.\n space.db.graph.schemaRegistry.schemas.forEach((schema) => {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n addSchema(typename);\n }\n });\n\n // Database Schema.\n this._schema?.forEach((schema) => {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n addSchema(typename);\n }\n });\n\n // Database Objects.\n this._objects.forEach((object) => {\n const schema = getSchema(object);\n if (schema) {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n const current = currentNodes.find((node) => node.id === object.id);\n this._graph.nodes.push({ ...current, id: object.id, type: 'object', data: { typename, object } });\n\n // Link to schema.\n const schemaNode = this._graph.nodes.find(\n (node) => node.type === 'schema' && node.data.typename === typename,\n );\n if (schemaNode) {\n this._graph.links.push({\n id: `${object.id}-${schemaNode.id}`,\n source: object.id,\n target: schemaNode.id,\n });\n } else {\n log.info('schema node not found', { typename });\n }\n\n // Link ot refs.\n // TODO(burdon): This isn't working.\n AST.getPropertySignatures(schema.ast).forEach((prop) => {\n if (!SchemaValidator.hasTypeAnnotation(schema, prop.name.toString(), ReferenceAnnotationId)) {\n return;\n }\n\n const value = object[String(prop.name)];\n if (value) {\n const refs = Array.isArray(value) ? value : [value];\n for (const ref of refs) {\n if (objects.findIndex((obj) => obj.id === ref.id) !== -1) {\n this._graph.links.push({\n id: `${object.id}-${String(prop.name)}-${ref.id}`,\n source: object.id,\n target: ref.id,\n });\n }\n }\n }\n });\n }\n }\n });\n\n this.triggerUpdate();\n },\n { fire: true },\n );\n }\n\n this.setSelected(objectId);\n return this;\n }\n\n close() {\n this._schemaSubscription?.();\n this._schemaSubscription = undefined;\n this._objectsSubscription?.();\n this._objectsSubscription = undefined;\n\n return this;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { forceLink, forceManyBody } from 'd3';\nimport ForceGraph from 'force-graph';\nimport React, { type FC, useEffect, useRef } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { type Space } from '@dxos/client/echo';\nimport { filterObjectsSync, type SearchResult } from '@dxos/plugin-search';\nimport { useAsyncState } from '@dxos/react-ui';\n\nimport { SpaceGraphModel } from './graph-model';\n\nexport type GraphProps = {\n space: Space;\n match?: RegExp;\n};\n\nexport const Graph: FC<GraphProps> = ({ space, match }) => {\n const { ref, width, height } = useResizeDetector({ refreshRate: 200 });\n const rootRef = useRef<HTMLDivElement>(null);\n const forceGraph = useRef<ForceGraph>();\n\n const [model] = useAsyncState(\n async () => (space ? new SpaceGraphModel({ schema: true }).open(space) : undefined),\n [space],\n );\n\n const filteredRef = useRef<SearchResult[]>();\n filteredRef.current = filterObjectsSync(model?.objects ?? [], match);\n\n useEffect(() => {\n if (rootRef.current) {\n // https://github.com/vasturiano/force-graph\n // https://github.com/vasturiano/3d-force-graph\n forceGraph.current = new ForceGraph(rootRef.current)\n .nodeRelSize(6)\n .nodeLabel((node: any) => {\n if (node.type === 'schema') {\n return node.data.typename;\n }\n\n return node.id;\n })\n .nodeAutoColorBy((node: any) => (node.type === 'schema' ? 'schema' : node.data.typename))\n .linkColor(() => 'rgba(255,255,255,0.25)');\n }\n\n return () => {\n forceGraph.current?.pauseAnimation().graphData({ nodes: [], links: [] });\n forceGraph.current = undefined;\n };\n }, []);\n\n useEffect(() => {\n if (forceGraph.current && width && height && model) {\n forceGraph.current\n .pauseAnimation()\n .width(width)\n .height(height)\n .onEngineStop(() => {\n handleZoomToFit();\n })\n\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#force-engine-d3-force-configuration\n // .d3Force('center', forceCenter().strength(0.9))\n .d3Force('link', forceLink().distance(160).strength(0.5))\n .d3Force('charge', forceManyBody().strength(-30))\n // .d3AlphaDecay(0.0228)\n // .d3VelocityDecay(0.4)\n\n .graphData(model.graph)\n .warmupTicks(100)\n .cooldownTime(1000)\n .resumeAnimation();\n }\n }, [model, width, height]);\n\n const handleZoomToFit = () => {\n forceGraph.current?.zoomToFit(400, 40);\n };\n\n return (\n <div ref={ref} className='relative grow' onClick={handleZoomToFit}>\n <div ref={rootRef} className='absolute inset-0' />\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["SpaceGraphModel", "GraphModel", "constructor", "_options", "_graph", "nodes", "links", "graph", "objects", "_objects", "open", "space", "objectId", "_schemaSubscription", "schemaaQuery", "db", "schemaRegistry", "query", "schemas", "run", "onSchemaUpdate", "results", "_schema", "subscribe", "_objectsSubscription", "Filter", "not", "or", "schema", "StoredSchema", "CollectionType", "currentNodes", "addSchema", "typename", "current", "find", "node", "id", "push", "type", "data", "forEach", "getSchemaDXN", "toTypename", "object", "getSchema", "schemaNode", "source", "target", "log", "info", "AST", "getPropertySignatures", "ast", "prop", "SchemaValidator", "hasTypeAnnotation", "name", "toString", "ReferenceAnnotationId", "value", "String", "refs", "Array", "isArray", "ref", "findIndex", "obj", "triggerUpdate", "fire", "setSelected", "close", "undefined", "Graph", "match", "width", "height", "useResizeDetector", "refreshRate", "rootRef", "useRef", "forceGraph", "model", "useAsyncState", "filteredRef", "filterObjectsSync", "useEffect", "ForceGraph", "nodeRelSize", "nodeLabel", "nodeAutoColorBy", "linkColor", "pauseAnimation", "graphData", "onEngineStop", "handleZoomToFit", "d3Force", "forceLink", "distance", "strength", "forceManyBody", "warmupTicks", "cooldownTime", "resumeAnimation", "zoomToFit", "React", "div", "className", "onClick"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\n\nimport { ExplorerContainer } from '../components';\nimport { EXPLORER_PLUGIN } from '../meta';\nimport { ViewType } from '../types';\n\nexport default () =>\n contributes(\n Capabilities.ReactSurface,\n createSurface({\n id: `${EXPLORER_PLUGIN}/article`,\n role: ['article', 'section'],\n filter: (data): data is { subject: ViewType } => data.subject instanceof ViewType,\n component: ({ data, role }) => <ExplorerContainer view={data.subject} role={role} />,\n }),\n );\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAkB;AAElB,2BAAyD;AAMzD,IAAA,wBAAe,UACbA,kCACEC,kCAAaC,kBACbC,oCAAc;EACZC,IAAI,GAAGC,qCAAAA;EACPC,MAAM;IAAC;IAAW;;EAClBC,QAAQ,CAACC,SAAwCA,KAAKC,mBAAmBC;EACzEC,WAAW,CAAC,EAAEH,MAAMF,KAAI,MAAO,6BAAAM,QAAA,cAACC,yCAAAA;IAAkBC,MAAMN,KAAKC;IAASH;;AACxE,CAAA,CAAA;",
6
- "names": ["contributes", "Capabilities", "ReactSurface", "createSurface", "id", "EXPLORER_PLUGIN", "role", "filter", "data", "subject", "ViewType", "component", "React", "ExplorerContainer", "view"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/Graph/graph-model.ts", "../../../src/components/Graph/Graph.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport {\n getSchema,\n getSchemaDXN,\n AST,\n type EchoSchema,\n ReferenceAnnotationId,\n SchemaValidator,\n StoredSchema,\n} from '@dxos/echo-schema';\nimport { type GraphData, GraphModel } from '@dxos/gem-spore';\nimport { log } from '@dxos/log';\nimport { CollectionType } from '@dxos/plugin-space/types';\nimport { Filter, type ReactiveEchoObject, type Space, type Subscription } from '@dxos/react-client/echo';\n\nexport type SpaceGraphModelOptions = {\n schema?: boolean;\n};\n\n// TODO(burdon): Convert to common/graph.\n\ntype SchemaGraphNode = {\n id: string;\n type: 'schema';\n data: { typename: string };\n};\n\ntype ObjectGraphNode = {\n id: string;\n type: 'object';\n data: { typename: string; object: ReactiveEchoObject<any> };\n};\n\nexport type EchoGraphNode = SchemaGraphNode | ObjectGraphNode;\n\n/**\n * Converts ECHO objects to a graph.\n */\nexport class SpaceGraphModel extends GraphModel<EchoGraphNode> {\n private readonly _graph: GraphData<EchoGraphNode> = {\n nodes: [],\n links: [],\n };\n\n private _schema?: EchoSchema[];\n private _schemaSubscription?: UnsubscribeCallback;\n private _objects?: ReactiveEchoObject<any>[];\n private _objectsSubscription?: Subscription;\n\n constructor(private readonly _options: SpaceGraphModelOptions = {}) {\n super();\n }\n\n override get graph(): GraphData<EchoGraphNode> {\n return this._graph;\n }\n\n get objects(): ReactiveEchoObject<any>[] {\n return this._objects ?? [];\n }\n\n // TODO(burdon): Alternative diagram types:\n // - https://observablehq.com/@d3/radial-tree/2\n // - https://observablehq.com/@d3/disjoint-force-directed-graph/2\n // - https://observablehq.com/@mbostock/tadpoles\n // - https://observablehq.com/@d3/psr-b1919-21\n // - https://vasturiano.github.io/react-force-graph/example/basic (3D)\n\n async open(space: Space, objectId?: string) {\n // TODO(burdon): Factor out graph builder to lib (use common/graph abstraction).\n if (!this._schemaSubscription) {\n // TODO(burdon): Normalize unsubscribe callbacks and merge handlers.\n // TODO(burdon): Trigger initial subscription update.\n // TODO(burdon): Normalize subscription cb for objects, schema, etc.\n\n const schemaaQuery = space.db.schemaRegistry.query({});\n const schemas = await schemaaQuery.run();\n const onSchemaUpdate = ({ results }: { results: EchoSchema[] }) => (this._schema = results);\n this._schemaSubscription = schemaaQuery.subscribe(onSchemaUpdate);\n onSchemaUpdate({ results: schemas });\n\n this._objectsSubscription = space.db\n // TODO(burdon): ERROR: Cannot mix type and or filters.\n .query(Filter.not(Filter.or(Filter.schema(StoredSchema), Filter.schema(CollectionType))))\n .subscribe(\n ({ objects }) => {\n this._objects = objects;\n\n // Merge with current nodes.\n const currentNodes = this._graph.nodes;\n\n this._graph.nodes = [];\n this._graph.links = [];\n\n const addSchema = (typename: string) => {\n const current = currentNodes.find((node) => node.id === typename);\n if (typename) {\n this._graph.nodes.push({\n ...current,\n id: typename,\n type: 'schema',\n data: { typename },\n });\n }\n };\n\n // Runtime schema.\n space.db.graph.schemaRegistry.schemas.forEach((schema) => {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n addSchema(typename);\n }\n });\n\n // Database Schema.\n this._schema?.forEach((schema) => {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n addSchema(typename);\n }\n });\n\n // Database Objects.\n this._objects.forEach((object) => {\n const schema = getSchema(object);\n if (schema) {\n const typename = getSchemaDXN(schema)?.toTypename();\n if (typename) {\n const current = currentNodes.find((node) => node.id === object.id);\n this._graph.nodes.push({ ...current, id: object.id, type: 'object', data: { typename, object } });\n\n // Link to schema.\n const schemaNode = this._graph.nodes.find(\n (node) => node.type === 'schema' && node.data.typename === typename,\n );\n if (schemaNode) {\n this._graph.links.push({\n id: `${object.id}-${schemaNode.id}`,\n source: object.id,\n target: schemaNode.id,\n });\n } else {\n log.info('schema node not found', { typename });\n }\n\n // Link ot refs.\n // TODO(burdon): This isn't working.\n AST.getPropertySignatures(schema.ast).forEach((prop) => {\n if (!SchemaValidator.hasTypeAnnotation(schema, prop.name.toString(), ReferenceAnnotationId)) {\n return;\n }\n\n const value = object[String(prop.name)];\n if (value) {\n const refs = Array.isArray(value) ? value : [value];\n for (const ref of refs) {\n if (objects.findIndex((obj) => obj.id === ref.id) !== -1) {\n this._graph.links.push({\n id: `${object.id}-${String(prop.name)}-${ref.id}`,\n source: object.id,\n target: ref.id,\n });\n }\n }\n }\n });\n }\n }\n });\n\n this.triggerUpdate();\n },\n { fire: true },\n );\n }\n\n this.setSelected(objectId);\n return this;\n }\n\n close() {\n this._schemaSubscription?.();\n this._schemaSubscription = undefined;\n this._objectsSubscription?.();\n this._objectsSubscription = undefined;\n\n return this;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { forceLink, forceManyBody } from 'd3';\nimport ForceGraph from 'force-graph';\nimport React, { type FC, useEffect, useRef } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { type Space } from '@dxos/client/echo';\nimport { filterObjectsSync, type SearchResult } from '@dxos/plugin-search';\nimport { useAsyncState } from '@dxos/react-ui';\n\nimport { SpaceGraphModel } from './graph-model';\n\nexport type GraphProps = {\n space: Space;\n match?: RegExp;\n};\n\nexport const Graph: FC<GraphProps> = ({ space, match }) => {\n const { ref, width, height } = useResizeDetector({ refreshRate: 200 });\n const rootRef = useRef<HTMLDivElement>(null);\n const forceGraph = useRef<ForceGraph>();\n\n const [model] = useAsyncState(\n async () => (space ? new SpaceGraphModel({ schema: true }).open(space) : undefined),\n [space],\n );\n\n const filteredRef = useRef<SearchResult[]>();\n filteredRef.current = filterObjectsSync(model?.objects ?? [], match);\n\n useEffect(() => {\n if (rootRef.current) {\n // https://github.com/vasturiano/force-graph\n // https://github.com/vasturiano/3d-force-graph\n forceGraph.current = new ForceGraph(rootRef.current)\n .nodeRelSize(6)\n .nodeLabel((node: any) => {\n if (node.type === 'schema') {\n return node.data.typename;\n }\n\n return node.id;\n })\n .nodeAutoColorBy((node: any) => (node.type === 'schema' ? 'schema' : node.data.typename))\n .linkColor(() => 'rgba(255,255,255,0.25)');\n }\n\n return () => {\n forceGraph.current?.pauseAnimation().graphData({ nodes: [], links: [] });\n forceGraph.current = undefined;\n };\n }, []);\n\n useEffect(() => {\n if (forceGraph.current && width && height && model) {\n forceGraph.current\n .pauseAnimation()\n .width(width)\n .height(height)\n .onEngineStop(() => {\n handleZoomToFit();\n })\n\n // https://github.com/vasturiano/force-graph?tab=readme-ov-file#force-engine-d3-force-configuration\n // .d3Force('center', forceCenter().strength(0.9))\n .d3Force('link', forceLink().distance(160).strength(0.5))\n .d3Force('charge', forceManyBody().strength(-30))\n // .d3AlphaDecay(0.0228)\n // .d3VelocityDecay(0.4)\n\n .graphData(model.graph)\n .warmupTicks(100)\n .cooldownTime(1000)\n .resumeAnimation();\n }\n }, [model, width, height]);\n\n const handleZoomToFit = () => {\n forceGraph.current?.zoomToFit(400, 40);\n };\n\n return (\n <div ref={ref} className='relative grow' onClick={handleZoomToFit}>\n <div ref={rootRef} className='absolute inset-0' />\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["getSchema", "getSchemaDXN", "AST", "ReferenceAnnotationId", "SchemaValidator", "StoredSchema", "GraphModel", "log", "CollectionType", "Filter", "SpaceGraphModel", "constructor", "_options", "_graph", "nodes", "links", "graph", "objects", "_objects", "open", "space", "objectId", "_schemaSubscription", "schemaaQuery", "db", "schemaRegistry", "query", "schemas", "run", "onSchemaUpdate", "results", "_schema", "subscribe", "_objectsSubscription", "not", "or", "schema", "currentNodes", "addSchema", "typename", "current", "find", "node", "id", "push", "type", "data", "forEach", "toTypename", "object", "schemaNode", "source", "target", "info", "getPropertySignatures", "ast", "prop", "hasTypeAnnotation", "name", "toString", "value", "String", "refs", "Array", "isArray", "ref", "findIndex", "obj", "triggerUpdate", "fire", "setSelected", "close", "undefined", "forceLink", "forceManyBody", "ForceGraph", "React", "useEffect", "useRef", "useResizeDetector", "filterObjectsSync", "useAsyncState", "Graph", "space", "match", "ref", "width", "height", "useResizeDetector", "refreshRate", "rootRef", "useRef", "forceGraph", "model", "useAsyncState", "SpaceGraphModel", "schema", "open", "undefined", "filteredRef", "current", "filterObjectsSync", "objects", "useEffect", "ForceGraph", "nodeRelSize", "nodeLabel", "node", "type", "data", "typename", "id", "nodeAutoColorBy", "linkColor", "pauseAnimation", "graphData", "nodes", "links", "onEngineStop", "handleZoomToFit", "d3Force", "forceLink", "distance", "strength", "forceManyBody", "graph", "warmupTicks", "cooldownTime", "resumeAnimation", "zoomToFit", "div", "className", "onClick"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const EXPLORER_PLUGIN = 'dxos.org/plugin/explorer';\n\nexport const meta = {\n id: EXPLORER_PLUGIN,\n name: 'Explorer',\n description: 'Install this plugin to view a hypergraph of all objects inside of your Space.',\n icon: 'ph--graph--regular',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-explorer',\n tags: ['experimental'],\n screenshots: ['https://dxos.network/plugin-details-explorer-dark.png'],\n} satisfies PluginMeta;\n"],
5
- "mappings": ";;;AAMO,IAAMA,kBAAkB;AAExB,IAAMC,OAAO;EAClBC,IAAIF;EACJG,MAAM;EACNC,aAAa;EACbC,MAAM;EACNC,QAAQ;EACRC,MAAM;IAAC;;EACPC,aAAa;IAAC;;AAChB;",
6
- "names": ["EXPLORER_PLUGIN", "meta", "id", "name", "description", "icon", "source", "tags", "screenshots"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/react-surface.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Capabilities, contributes, createSurface } from '@dxos/app-framework';\n\nimport { ExplorerContainer } from '../components';\nimport { EXPLORER_PLUGIN } from '../meta';\nimport { ViewType } from '../types';\n\nexport default () =>\n contributes(\n Capabilities.ReactSurface,\n createSurface({\n id: `${EXPLORER_PLUGIN}/article`,\n role: ['article', 'section'],\n filter: (data): data is { subject: ViewType } => data.subject instanceof ViewType,\n component: ({ data, role }) => <ExplorerContainer view={data.subject} role={role} />,\n }),\n );\n"],
5
- "mappings": ";;;;;;;;;;;;;AAIA,OAAOA,WAAW;AAElB,SAASC,cAAcC,aAAaC,qBAAqB;AAMzD,IAAA,wBAAe,MACbC,YACEC,aAAaC,cACbC,cAAc;EACZC,IAAI,GAAGC,eAAAA;EACPC,MAAM;IAAC;IAAW;;EAClBC,QAAQ,CAACC,SAAwCA,KAAKC,mBAAmBC;EACzEC,WAAW,CAAC,EAAEH,MAAMF,KAAI,MAAO,sBAAA,cAACM,mBAAAA;IAAkBC,MAAML,KAAKC;IAASH;;AACxE,CAAA,CAAA;",
6
- "names": ["React", "Capabilities", "contributes", "createSurface", "contributes", "Capabilities", "ReactSurface", "createSurface", "id", "EXPLORER_PLUGIN", "role", "filter", "data", "subject", "ViewType", "component", "ExplorerContainer", "view"]
7
- }