grafio-mongo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.gitattributes +2 -0
  2. package/LICENSE +674 -0
  3. package/README.md +220 -0
  4. package/dist/MongoGraphFactory.d.ts +13 -0
  5. package/dist/MongoGraphFactory.d.ts.map +1 -0
  6. package/dist/MongoGraphFactory.js +33 -0
  7. package/dist/MongoGraphFactory.js.map +1 -0
  8. package/dist/MongoStorageProvider.d.ts +48 -0
  9. package/dist/MongoStorageProvider.d.ts.map +1 -0
  10. package/dist/MongoStorageProvider.js +417 -0
  11. package/dist/MongoStorageProvider.js.map +1 -0
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +7 -0
  15. package/dist/index.js.map +1 -0
  16. package/jest.config.js +27 -0
  17. package/package.json +41 -0
  18. package/src/MongoGraphFactory.ts +93 -0
  19. package/src/MongoStorageProvider.ts +719 -0
  20. package/src/index.ts +4 -0
  21. package/tests/EducationGraph.mongo.test.ts +33 -0
  22. package/tests/SocialGraph.mongo.test.ts +30 -0
  23. package/tests/graph/Graph.clear.mongo.test.ts +24 -0
  24. package/tests/graph/Graph.edge.mongo.test.ts +24 -0
  25. package/tests/graph/Graph.fromJSON.mongo.test.ts +24 -0
  26. package/tests/graph/Graph.index.mongo.test.ts +24 -0
  27. package/tests/graph/Graph.isDAG.mongo.test.ts +24 -0
  28. package/tests/graph/Graph.node.mongo.test.ts +24 -0
  29. package/tests/graph/Graph.properties.mongo.test.ts +24 -0
  30. package/tests/graph/Graph.serialization.mongo.test.ts +24 -0
  31. package/tests/graph/Graph.topologicalSort.mongo.test.ts +24 -0
  32. package/tests/graph/Graph.transaction.mongo.test.ts +24 -0
  33. package/tests/graph/Graph.traverse.mongo.test.ts +24 -0
  34. package/tests/graph/GraphToMermaid.mongo.test.ts +24 -0
  35. package/tests/storage/MongoGraphFactory.test.ts +102 -0
  36. package/tsconfig.json +21 -0
  37. package/tsconfig.perf.json +18 -0
  38. package/tsconfig.prod.json +11 -0
package/src/index.ts ADDED
@@ -0,0 +1,4 @@
1
+ // Re-export MongoDB implementations from grafio-mongo
2
+ export { MongoStorageProvider } from './MongoStorageProvider';
3
+ export type { MongoStorageProviderOptions } from './MongoStorageProvider';
4
+ export { MongoGraphFactory } from './MongoGraphFactory';
@@ -0,0 +1,33 @@
1
+ import { afterAll, beforeAll, beforeEach, describe } from '@jest/globals';
2
+ import { MongoMemoryServer } from 'mongodb-memory-server';
3
+ import { MongoClient } from 'mongodb';
4
+ import { Graph } from 'grafio';
5
+ import { MongoStorageProvider } from 'grafio';
6
+ import { educationGraphData, runEducationGraphScenarios } from 'grafio/testing';
7
+
8
+ let mongoServer: MongoMemoryServer;
9
+ let client: MongoClient;
10
+ let provider: MongoStorageProvider;
11
+
12
+ beforeAll(async () => {
13
+ mongoServer = await MongoMemoryServer.create();
14
+ client = new MongoClient(mongoServer.getUri());
15
+ await client.connect();
16
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
17
+ await provider.ensureIndexes();
18
+ });
19
+
20
+ beforeEach(async () => {
21
+ await provider.clear();
22
+ });
23
+
24
+ afterAll(async () => {
25
+ await client.close();
26
+ await mongoServer.stop();
27
+ });
28
+
29
+ describe('Education Graph (MongoDB)', () => {
30
+ runEducationGraphScenarios(async () => {
31
+ return await Graph.importJSON(educationGraphData, provider);
32
+ });
33
+ });
@@ -0,0 +1,30 @@
1
+ import { afterAll, beforeAll, beforeEach, describe } from '@jest/globals';
2
+ import { MongoMemoryServer } from 'mongodb-memory-server';
3
+ import { MongoClient } from 'mongodb';
4
+ import { MongoStorageProvider } from 'grafio';
5
+ import { runSocialGraphScenarios } from 'grafio/testing';
6
+
7
+ let mongoServer: MongoMemoryServer;
8
+ let client: MongoClient;
9
+ let provider: MongoStorageProvider;
10
+
11
+ beforeAll(async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ });
18
+
19
+ beforeEach(async () => {
20
+ await provider.clear();
21
+ });
22
+
23
+ afterAll(async () => {
24
+ await client.close();
25
+ await mongoServer.stop();
26
+ });
27
+
28
+ describe('Facebook Social Graph (MongoDB)', () => {
29
+ runSocialGraphScenarios(provider);
30
+ });
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphClearScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphClearScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphEdgeScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphEdgeScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphFromJSONScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphFromJSONScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphIndexScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphIndexScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphIsDAGScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphIsDAGScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphNodeScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphNodeScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphPropertiesScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphPropertiesScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphSerializationScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphSerializationScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphTopologicalSortScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphTopologicalSortScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryReplSet } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphTransactionScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryReplSet;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphTransactionScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryReplSet.create({ replSet: { count: 2 } });
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'test-transactions' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphTraverseScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphTraverseScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,24 @@
1
+ import { MongoMemoryServer } from 'mongodb-memory-server';
2
+ import { MongoClient } from 'mongodb';
3
+ import { MongoStorageProvider } from '../../src/MongoStorageProvider';
4
+ import { runGraphToMermaidScenarios } from 'grafio/testing';
5
+
6
+ let mongoServer: MongoMemoryServer;
7
+ let client: MongoClient;
8
+ let provider: MongoStorageProvider;
9
+
10
+ runGraphToMermaidScenarios(
11
+ async () => {
12
+ mongoServer = await MongoMemoryServer.create();
13
+ client = new MongoClient(mongoServer.getUri());
14
+ await client.connect();
15
+ provider = new MongoStorageProvider(client.db('test'), { graphId: 'default' });
16
+ await provider.ensureIndexes();
17
+ return provider;
18
+ },
19
+ async () => {},
20
+ async () => {
21
+ await client.close();
22
+ await mongoServer.stop();
23
+ }
24
+ );
@@ -0,0 +1,102 @@
1
+ import { beforeAll, afterAll, beforeEach, describe, expect, it, test } from '@jest/globals';
2
+ import { MongoMemoryServer } from 'mongodb-memory-server';
3
+ import { MongoClient } from 'mongodb';
4
+
5
+ import { MongoGraphFactory } from 'grafio';
6
+ import { runGraphFactoryScenarios } from 'grafio/testing';
7
+
8
+ let mongoServer: MongoMemoryServer;
9
+ let client: MongoClient;
10
+ let factory: MongoGraphFactory;
11
+
12
+ runGraphFactoryScenarios(
13
+ async () => {
14
+ mongoServer = await MongoMemoryServer.create();
15
+ const uri = mongoServer.getUri();
16
+ client = new MongoClient(uri);
17
+ await client.connect();
18
+ factory = new MongoGraphFactory(client.db('test'));
19
+ await factory.ensureIndexes();
20
+ return factory;
21
+ },
22
+ async () => { },
23
+ async () => {
24
+ await client.close();
25
+ await mongoServer.stop();
26
+ },
27
+ async () => {
28
+ describe('MongoGraphFactory', () => {
29
+
30
+ it('should import graph data and return a Graph instance', async () => {
31
+ const data = {
32
+ nodes: [
33
+ { id: 'n1', type: 'Person', properties: { name: 'Alice' } },
34
+ { id: 'n2', type: 'Person', properties: { name: 'Bob' } },
35
+ ],
36
+ edges: [
37
+ { id: 'e1', sourceId: 'n1', targetId: 'n2', type: 'KNOWS', properties: {} },
38
+ ],
39
+ };
40
+
41
+ const graph = await factory.fromGraphData(data, 'import-test');
42
+
43
+ const nodes = await graph.getNodes();
44
+ expect(nodes).toHaveLength(2);
45
+ expect(nodes[0].properties.name).toBe('Alice');
46
+ expect(nodes[1].properties.name).toBe('Bob');
47
+
48
+ const edges = await graph.getEdges();
49
+ expect(edges).toHaveLength(1);
50
+ expect(edges[0].type).toBe('KNOWS');
51
+ });
52
+
53
+ it('should use default graphId when not specified', async () => {
54
+ const data = {
55
+ nodes: [
56
+ { id: 'n1', type: 'Person', properties: { name: 'Carol' } },
57
+ ],
58
+ edges: [],
59
+ };
60
+
61
+ const graph = await factory.fromGraphData(data);
62
+
63
+ const nodes = await graph.getNodes();
64
+ expect(nodes).toHaveLength(1);
65
+ expect(nodes[0].properties.name).toBe('Carol');
66
+ });
67
+
68
+ it('should filter out data when graphId does not match', async () => {
69
+ const data = {
70
+ graphId: 'other-graph',
71
+ nodes: [
72
+ { id: 'n1', type: 'Person', properties: { name: 'ShouldNotImport' } },
73
+ ],
74
+ edges: [],
75
+ };
76
+
77
+ const graph = await factory.fromGraphData(data, 'my-graph');
78
+
79
+ const nodes = await graph.getNodes();
80
+ expect(nodes).toHaveLength(0);
81
+ });
82
+
83
+ it('should import data when graphId matches', async () => {
84
+ const data = {
85
+ graphId: 'my-graph',
86
+ nodes: [
87
+ { id: 'n1', type: 'Person', properties: { name: 'ShouldImport' } },
88
+ ],
89
+ edges: [],
90
+ };
91
+
92
+ const graph = await factory.fromGraphData(data, 'my-graph');
93
+
94
+ const nodes = await graph.getNodes();
95
+ expect(nodes).toHaveLength(1);
96
+ expect(nodes[0].properties.name).toBe('ShouldImport');
97
+ });
98
+ });
99
+ },
100
+ );
101
+
102
+
package/tsconfig.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "nodenext",
5
+ "lib": ["ES2022"],
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "sourceMap": true,
9
+ "outDir": "./dist",
10
+ "rootDir": "./src",
11
+ "strict": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "moduleResolution": "nodenext",
16
+ "isolatedModules": true,
17
+ "types": ["node", "jest"]
18
+ },
19
+ "include": ["src/**/*"],
20
+ "exclude": ["node_modules", "dist", "tests", "examples"]
21
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "CommonJS",
5
+ "lib": ["ES2022"],
6
+ "outDir": "./dist-perf",
7
+ "rootDir": ".",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "moduleResolution": "node",
13
+ "resolveJsonModule": true,
14
+ "types": ["node"]
15
+ },
16
+ "include": ["perf/**/*", "src/**/*"],
17
+ "exclude": ["node_modules", "dist", "tests"]
18
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "declaration": true,
5
+ "declarationMap": false,
6
+ "sourceMap": false,
7
+ "stripInternal": true,
8
+ "removeComments": true
9
+ },
10
+ "exclude": ["tests/**/*", "plans/**/*"]
11
+ }