@grafema/api 0.2.5-beta
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/LICENSE +190 -0
- package/README.md +219 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +18 -0
- package/dist/context.js.map +1 -0
- package/dist/dataloaders/index.d.ts +18 -0
- package/dist/dataloaders/index.d.ts.map +1 -0
- package/dist/dataloaders/index.js +17 -0
- package/dist/dataloaders/index.js.map +1 -0
- package/dist/dataloaders/nodeLoader.d.ts +19 -0
- package/dist/dataloaders/nodeLoader.d.ts.map +1 -0
- package/dist/dataloaders/nodeLoader.js +31 -0
- package/dist/dataloaders/nodeLoader.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/pagination.d.ts +50 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +71 -0
- package/dist/pagination.js.map +1 -0
- package/dist/resolvers/edge.d.ts +22 -0
- package/dist/resolvers/edge.d.ts.map +1 -0
- package/dist/resolvers/edge.js +36 -0
- package/dist/resolvers/edge.js.map +1 -0
- package/dist/resolvers/index.d.ts +159 -0
- package/dist/resolvers/index.d.ts.map +1 -0
- package/dist/resolvers/index.js +21 -0
- package/dist/resolvers/index.js.map +1 -0
- package/dist/resolvers/mutation.d.ts +69 -0
- package/dist/resolvers/mutation.d.ts.map +1 -0
- package/dist/resolvers/mutation.js +82 -0
- package/dist/resolvers/mutation.js.map +1 -0
- package/dist/resolvers/node.d.ts +50 -0
- package/dist/resolvers/node.d.ts.map +1 -0
- package/dist/resolvers/node.js +69 -0
- package/dist/resolvers/node.js.map +1 -0
- package/dist/resolvers/query.d.ts +169 -0
- package/dist/resolvers/query.d.ts.map +1 -0
- package/dist/resolvers/query.js +188 -0
- package/dist/resolvers/query.js.map +1 -0
- package/dist/schema/enums.graphql +27 -0
- package/dist/schema/mutations.graphql +53 -0
- package/dist/schema/queries.graphql +213 -0
- package/dist/schema/scalars.graphql +2 -0
- package/dist/schema/subscriptions.graphql +84 -0
- package/dist/schema/types.graphql +440 -0
- package/dist/server.d.ts +31 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +109 -0
- package/dist/server.js.map +1 -0
- package/package.json +51 -0
- package/src/context.ts +33 -0
- package/src/dataloaders/index.ts +24 -0
- package/src/dataloaders/nodeLoader.ts +41 -0
- package/src/index.ts +11 -0
- package/src/pagination.ts +109 -0
- package/src/resolvers/edge.ts +39 -0
- package/src/resolvers/index.ts +24 -0
- package/src/resolvers/mutation.ts +108 -0
- package/src/resolvers/node.ts +118 -0
- package/src/resolvers/query.ts +307 -0
- package/src/schema/enums.graphql +27 -0
- package/src/schema/mutations.graphql +53 -0
- package/src/schema/queries.graphql +213 -0
- package/src/schema/scalars.graphql +2 -0
- package/src/schema/subscriptions.graphql +84 -0
- package/src/schema/types.graphql +440 -0
- package/src/server.ts +140 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor-based Pagination Utilities
|
|
3
|
+
*
|
|
4
|
+
* Implements Relay Connection spec for cursor-based pagination.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Encode a cursor from an ID.
|
|
8
|
+
* Format: base64("cursor:${id}")
|
|
9
|
+
*/
|
|
10
|
+
export function encodeCursor(id) {
|
|
11
|
+
return Buffer.from(`cursor:${id}`).toString('base64');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Decode a cursor to get the ID.
|
|
15
|
+
* Returns null if cursor is invalid.
|
|
16
|
+
*/
|
|
17
|
+
export function decodeCursor(cursor) {
|
|
18
|
+
try {
|
|
19
|
+
const decoded = Buffer.from(cursor, 'base64').toString('utf-8');
|
|
20
|
+
if (decoded.startsWith('cursor:')) {
|
|
21
|
+
return decoded.slice(7);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Apply cursor-based pagination to an array.
|
|
31
|
+
*
|
|
32
|
+
* @param items - All items (already filtered)
|
|
33
|
+
* @param first - Number of items to return (default: 50, max: 250)
|
|
34
|
+
* @param after - Cursor to start after
|
|
35
|
+
* @param getId - Function to get ID from item for cursor encoding
|
|
36
|
+
* @returns Connection structure
|
|
37
|
+
*/
|
|
38
|
+
export function paginateArray(items, first, after, getId) {
|
|
39
|
+
const limit = Math.min(first ?? 50, 250);
|
|
40
|
+
// Find start index based on cursor
|
|
41
|
+
let startIndex = 0;
|
|
42
|
+
if (after) {
|
|
43
|
+
const afterId = decodeCursor(after);
|
|
44
|
+
if (afterId) {
|
|
45
|
+
const afterIndex = items.findIndex((item) => getId(item) === afterId);
|
|
46
|
+
if (afterIndex !== -1) {
|
|
47
|
+
startIndex = afterIndex + 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Slice items
|
|
52
|
+
const slicedItems = items.slice(startIndex, startIndex + limit);
|
|
53
|
+
// Build edges
|
|
54
|
+
const edges = slicedItems.map((item) => ({
|
|
55
|
+
node: item,
|
|
56
|
+
cursor: encodeCursor(getId(item)),
|
|
57
|
+
}));
|
|
58
|
+
// Build pageInfo
|
|
59
|
+
const pageInfo = {
|
|
60
|
+
hasNextPage: startIndex + limit < items.length,
|
|
61
|
+
hasPreviousPage: startIndex > 0,
|
|
62
|
+
startCursor: edges.length > 0 ? edges[0].cursor : null,
|
|
63
|
+
endCursor: edges.length > 0 ? edges[edges.length - 1].cursor : null,
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
edges,
|
|
67
|
+
pageInfo,
|
|
68
|
+
totalCount: items.length,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AA6BD;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAU,EACV,KAAgC,EAChC,KAAgC,EAChC,KAA0B;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAEzC,mCAAmC;IACnC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;YACtE,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc;IACd,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;IAEhE,cAAc;IACd,MAAM,KAAK,GAAc,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KAClC,CAAC,CAAC,CAAC;IAEJ,iBAAiB;IACjB,MAAM,QAAQ,GAAa;QACzB,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM;QAC9C,eAAe,EAAE,UAAU,GAAG,CAAC;QAC/B,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QACtD,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;KACpE,CAAC;IAEF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,UAAU,EAAE,KAAK,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge Type Resolvers
|
|
3
|
+
*
|
|
4
|
+
* Resolves fields on Edge type that require lookups.
|
|
5
|
+
*/
|
|
6
|
+
import type { EdgeRecord } from '@grafema/types';
|
|
7
|
+
import type { GraphQLContext } from '../context.js';
|
|
8
|
+
export declare const edgeResolvers: {
|
|
9
|
+
/**
|
|
10
|
+
* Resolve source node.
|
|
11
|
+
*/
|
|
12
|
+
src(parent: EdgeRecord, _args: unknown, context: GraphQLContext): Promise<import("@grafema/types").BaseNodeRecord | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve destination node.
|
|
15
|
+
*/
|
|
16
|
+
dst(parent: EdgeRecord, _args: unknown, context: GraphQLContext): Promise<import("@grafema/types").BaseNodeRecord | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve metadata field.
|
|
19
|
+
*/
|
|
20
|
+
metadata(parent: EdgeRecord): any;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=edge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../src/resolvers/edge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,aAAa;IACxB;;OAEG;gBACe,UAAU,SAAS,OAAO,WAAW,cAAc;IAIrE;;OAEG;gBACe,UAAU,SAAS,OAAO,WAAW,cAAc;IAIrE;;OAEG;qBACc,UAAU;CAW5B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge Type Resolvers
|
|
3
|
+
*
|
|
4
|
+
* Resolves fields on Edge type that require lookups.
|
|
5
|
+
*/
|
|
6
|
+
export const edgeResolvers = {
|
|
7
|
+
/**
|
|
8
|
+
* Resolve source node.
|
|
9
|
+
*/
|
|
10
|
+
async src(parent, _args, context) {
|
|
11
|
+
return context.loaders.node.load(parent.src);
|
|
12
|
+
},
|
|
13
|
+
/**
|
|
14
|
+
* Resolve destination node.
|
|
15
|
+
*/
|
|
16
|
+
async dst(parent, _args, context) {
|
|
17
|
+
return context.loaders.node.load(parent.dst);
|
|
18
|
+
},
|
|
19
|
+
/**
|
|
20
|
+
* Resolve metadata field.
|
|
21
|
+
*/
|
|
22
|
+
metadata(parent) {
|
|
23
|
+
if (!parent.metadata)
|
|
24
|
+
return null;
|
|
25
|
+
if (typeof parent.metadata === 'string') {
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(parent.metadata);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return parent.metadata;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=edge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../../src/resolvers/edge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,MAAkB,EAAE,KAAc,EAAE,OAAuB;QACnE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,MAAkB,EAAE,KAAc,EAAE,OAAuB;QACnE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAAkB;QACzB,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Resolver Map
|
|
3
|
+
*
|
|
4
|
+
* Combines all resolvers and adds custom scalar handlers.
|
|
5
|
+
*/
|
|
6
|
+
export declare const resolvers: {
|
|
7
|
+
JSON: import("graphql").GraphQLScalarType<any, any>;
|
|
8
|
+
Node: {
|
|
9
|
+
outgoingEdges(parent: import("@grafema/types").BaseNodeRecord, args: {
|
|
10
|
+
types?: string[] | null;
|
|
11
|
+
first?: number | null;
|
|
12
|
+
after?: string | null;
|
|
13
|
+
}, context: import("../context.js").GraphQLContext): Promise<import("../pagination.js").Connection<import("@grafema/types").EdgeRecord>>;
|
|
14
|
+
incomingEdges(parent: import("@grafema/types").BaseNodeRecord, args: {
|
|
15
|
+
types?: string[] | null;
|
|
16
|
+
first?: number | null;
|
|
17
|
+
after?: string | null;
|
|
18
|
+
}, context: import("../context.js").GraphQLContext): Promise<import("../pagination.js").Connection<import("@grafema/types").EdgeRecord>>;
|
|
19
|
+
children(parent: import("@grafema/types").BaseNodeRecord, args: {
|
|
20
|
+
first?: number | null;
|
|
21
|
+
after?: string | null;
|
|
22
|
+
}, context: import("../context.js").GraphQLContext): Promise<import("../pagination.js").Connection<import("@grafema/types").BaseNodeRecord>>;
|
|
23
|
+
parent(parent: import("@grafema/types").BaseNodeRecord, _args: unknown, context: import("../context.js").GraphQLContext): Promise<import("@grafema/types").BaseNodeRecord | null>;
|
|
24
|
+
metadata(parent: import("@grafema/types").BaseNodeRecord): any;
|
|
25
|
+
};
|
|
26
|
+
Edge: {
|
|
27
|
+
src(parent: import("@grafema/types").EdgeRecord, _args: unknown, context: import("../context.js").GraphQLContext): Promise<import("@grafema/types").BaseNodeRecord | null>;
|
|
28
|
+
dst(parent: import("@grafema/types").EdgeRecord, _args: unknown, context: import("../context.js").GraphQLContext): Promise<import("@grafema/types").BaseNodeRecord | null>;
|
|
29
|
+
metadata(parent: import("@grafema/types").EdgeRecord): any;
|
|
30
|
+
};
|
|
31
|
+
Query: {
|
|
32
|
+
node(_: unknown, args: {
|
|
33
|
+
id: string;
|
|
34
|
+
}, context: import("../context.js").GraphQLContext): Promise<import("@grafema/types").BaseNodeRecord | null>;
|
|
35
|
+
nodes(_: unknown, args: {
|
|
36
|
+
filter?: import("./query.js").NodeFilter | null;
|
|
37
|
+
first?: number | null;
|
|
38
|
+
after?: string | null;
|
|
39
|
+
}, context: import("../context.js").GraphQLContext): Promise<import("../pagination.js").Connection<import("@grafema/types").BaseNodeRecord>>;
|
|
40
|
+
bfs(_: unknown, args: {
|
|
41
|
+
startIds: string[];
|
|
42
|
+
maxDepth: number;
|
|
43
|
+
edgeTypes: string[];
|
|
44
|
+
}, context: import("../context.js").GraphQLContext): Promise<string[]>;
|
|
45
|
+
dfs(_: unknown, args: {
|
|
46
|
+
startIds: string[];
|
|
47
|
+
maxDepth: number;
|
|
48
|
+
edgeTypes?: string[] | null;
|
|
49
|
+
}, context: import("../context.js").GraphQLContext): Promise<string[]>;
|
|
50
|
+
reachability(_: unknown, args: {
|
|
51
|
+
from: string;
|
|
52
|
+
to: string;
|
|
53
|
+
edgeTypes?: string[] | null;
|
|
54
|
+
maxDepth?: number | null;
|
|
55
|
+
}, context: import("../context.js").GraphQLContext): Promise<boolean>;
|
|
56
|
+
datalog(_: unknown, args: {
|
|
57
|
+
query: string;
|
|
58
|
+
limit?: number | null;
|
|
59
|
+
offset?: number | null;
|
|
60
|
+
}, context: import("../context.js").GraphQLContext): Promise<{
|
|
61
|
+
success: boolean;
|
|
62
|
+
count: number;
|
|
63
|
+
results: {
|
|
64
|
+
bindings: {
|
|
65
|
+
[k: string]: string;
|
|
66
|
+
};
|
|
67
|
+
node: import("@grafema/types").BaseNodeRecord | null;
|
|
68
|
+
}[];
|
|
69
|
+
error: null;
|
|
70
|
+
} | {
|
|
71
|
+
success: boolean;
|
|
72
|
+
count: number;
|
|
73
|
+
results: never[];
|
|
74
|
+
error: string;
|
|
75
|
+
}>;
|
|
76
|
+
stats(_: unknown, _args: unknown, context: import("../context.js").GraphQLContext): Promise<import("@grafema/core/storage/backends/RFDBServerBackend").BackendStats>;
|
|
77
|
+
analysisStatus(_: unknown, _args: unknown, _context: import("../context.js").GraphQLContext): Promise<{
|
|
78
|
+
running: boolean;
|
|
79
|
+
phase: null;
|
|
80
|
+
message: null;
|
|
81
|
+
servicesDiscovered: number;
|
|
82
|
+
servicesAnalyzed: number;
|
|
83
|
+
error: null;
|
|
84
|
+
}>;
|
|
85
|
+
guarantees(_: unknown, _args: unknown, _context: import("../context.js").GraphQLContext): Promise<never[]>;
|
|
86
|
+
guarantee(_: unknown, _args: {
|
|
87
|
+
id: string;
|
|
88
|
+
}, _context: import("../context.js").GraphQLContext): Promise<null>;
|
|
89
|
+
findCalls(_: unknown, _args: {
|
|
90
|
+
target: string;
|
|
91
|
+
className?: string | null;
|
|
92
|
+
limit?: number | null;
|
|
93
|
+
offset?: number | null;
|
|
94
|
+
}, _context: import("../context.js").GraphQLContext): Promise<never[]>;
|
|
95
|
+
getFunctionDetails(_: unknown, _args: {
|
|
96
|
+
name: string;
|
|
97
|
+
file?: string | null;
|
|
98
|
+
transitive?: boolean | null;
|
|
99
|
+
}, _context: import("../context.js").GraphQLContext): Promise<null>;
|
|
100
|
+
findGuards(_: unknown, _args: {
|
|
101
|
+
nodeId: string;
|
|
102
|
+
}, _context: import("../context.js").GraphQLContext): Promise<never[]>;
|
|
103
|
+
traceAlias(_: unknown, _args: {
|
|
104
|
+
variableName: string;
|
|
105
|
+
file: string;
|
|
106
|
+
maxDepth?: number | null;
|
|
107
|
+
}, _context: import("../context.js").GraphQLContext): Promise<never[]>;
|
|
108
|
+
traceDataFlow(_: unknown, _args: {
|
|
109
|
+
source: string;
|
|
110
|
+
file?: string | null;
|
|
111
|
+
direction?: string | null;
|
|
112
|
+
maxDepth?: number | null;
|
|
113
|
+
}, _context: import("../context.js").GraphQLContext): Promise<never[]>;
|
|
114
|
+
};
|
|
115
|
+
Mutation: {
|
|
116
|
+
analyzeProject(_: unknown, _args: {
|
|
117
|
+
service?: string | null;
|
|
118
|
+
force?: boolean | null;
|
|
119
|
+
}, _context: import("../context.js").GraphQLContext): Promise<{
|
|
120
|
+
success: boolean;
|
|
121
|
+
status: {
|
|
122
|
+
running: boolean;
|
|
123
|
+
phase: null;
|
|
124
|
+
message: string;
|
|
125
|
+
servicesDiscovered: number;
|
|
126
|
+
servicesAnalyzed: number;
|
|
127
|
+
error: string;
|
|
128
|
+
};
|
|
129
|
+
}>;
|
|
130
|
+
createGuarantee(_: unknown, _args: {
|
|
131
|
+
input: Record<string, unknown>;
|
|
132
|
+
}, _context: import("../context.js").GraphQLContext): Promise<never>;
|
|
133
|
+
deleteGuarantee(_: unknown, _args: {
|
|
134
|
+
name: string;
|
|
135
|
+
}, _context: import("../context.js").GraphQLContext): Promise<never>;
|
|
136
|
+
checkGuarantees(_: unknown, _args: {
|
|
137
|
+
names?: string[] | null;
|
|
138
|
+
}, _context: import("../context.js").GraphQLContext): Promise<{
|
|
139
|
+
total: number;
|
|
140
|
+
passed: number;
|
|
141
|
+
failed: number;
|
|
142
|
+
results: never[];
|
|
143
|
+
}>;
|
|
144
|
+
checkInvariant(_: unknown, args: {
|
|
145
|
+
rule: string;
|
|
146
|
+
description?: string | null;
|
|
147
|
+
}, context: import("../context.js").GraphQLContext): Promise<{
|
|
148
|
+
guaranteeId: string;
|
|
149
|
+
passed: boolean;
|
|
150
|
+
violationCount: number;
|
|
151
|
+
violations: {
|
|
152
|
+
node: null;
|
|
153
|
+
file: null;
|
|
154
|
+
line: null;
|
|
155
|
+
}[];
|
|
156
|
+
}>;
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,eAAO,MAAM,SAAS;;;;iBASR,CAAC;iBACD,CAAC;iBAEZ,CAAC;;;iBAAqgB,CAAC;iBAAwB,CAAC;iBAAsB,CAAC;;;iBAA+f,CAAC;iBAAsB,CAAC;;;;;;;;;;;;;;;kBAAnuB,CAAC;iBAAgC,CAAC;iBAA4B,CAAC;;;;;;;;;;qBAAkxC,CAAC;;;;;qBAAkY,CAAC;oBAAiC,CAAC;;;;iBAAmb,CAAC;kBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAAu6E,CAAC;iBAA4B,CAAC;kBAA6B,CAAC;;;;gBAAwT,CAAC;sBAAiC,CAAC;;;;;;;;oBAAuf,CAAC;;;;gBAAwN,CAAC;qBAAgC,CAAC;oBAA+B,CAAC;;;;;mBAdvlM,CAAC;iBAE9B,CAAC;;;;;;;;;;;;;;;;;;;iBAYyxB,CAAC;;;;;;;;;uBAA6Q,CAAC;;;;;;;;;;;;CADrjC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GraphQL Resolver Map
|
|
3
|
+
*
|
|
4
|
+
* Combines all resolvers and adds custom scalar handlers.
|
|
5
|
+
*/
|
|
6
|
+
import { JSONResolver } from 'graphql-scalars';
|
|
7
|
+
import { nodeResolvers } from './node.js';
|
|
8
|
+
import { edgeResolvers } from './edge.js';
|
|
9
|
+
import { queryResolvers } from './query.js';
|
|
10
|
+
import { mutationResolvers } from './mutation.js';
|
|
11
|
+
export const resolvers = {
|
|
12
|
+
// Custom scalars
|
|
13
|
+
JSON: JSONResolver,
|
|
14
|
+
// Type resolvers
|
|
15
|
+
Node: nodeResolvers,
|
|
16
|
+
Edge: edgeResolvers,
|
|
17
|
+
// Root resolvers
|
|
18
|
+
Query: queryResolvers,
|
|
19
|
+
Mutation: mutationResolvers,
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,iBAAiB;IACjB,IAAI,EAAE,YAAY;IAElB,iBAAiB;IACjB,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,aAAa;IAEnB,iBAAiB;IACjB,KAAK,EAAE,cAAc;IACrB,QAAQ,EAAE,iBAAiB;CAC5B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation Resolvers
|
|
3
|
+
*
|
|
4
|
+
* Implements all Mutation type fields.
|
|
5
|
+
*/
|
|
6
|
+
import type { GraphQLContext } from '../context.js';
|
|
7
|
+
export declare const mutationResolvers: {
|
|
8
|
+
/**
|
|
9
|
+
* Run project analysis.
|
|
10
|
+
* Placeholder - would integrate with Orchestrator.
|
|
11
|
+
*/
|
|
12
|
+
analyzeProject(_: unknown, _args: {
|
|
13
|
+
service?: string | null;
|
|
14
|
+
force?: boolean | null;
|
|
15
|
+
}, _context: GraphQLContext): Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
status: {
|
|
18
|
+
running: boolean;
|
|
19
|
+
phase: null;
|
|
20
|
+
message: string;
|
|
21
|
+
servicesDiscovered: number;
|
|
22
|
+
servicesAnalyzed: number;
|
|
23
|
+
error: string;
|
|
24
|
+
};
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Create a new guarantee.
|
|
28
|
+
* Placeholder - would integrate with GuaranteeManager.
|
|
29
|
+
*/
|
|
30
|
+
createGuarantee(_: unknown, _args: {
|
|
31
|
+
input: Record<string, unknown>;
|
|
32
|
+
}, _context: GraphQLContext): Promise<never>;
|
|
33
|
+
/**
|
|
34
|
+
* Delete a guarantee.
|
|
35
|
+
* Placeholder.
|
|
36
|
+
*/
|
|
37
|
+
deleteGuarantee(_: unknown, _args: {
|
|
38
|
+
name: string;
|
|
39
|
+
}, _context: GraphQLContext): Promise<never>;
|
|
40
|
+
/**
|
|
41
|
+
* Check guarantees.
|
|
42
|
+
* Placeholder.
|
|
43
|
+
*/
|
|
44
|
+
checkGuarantees(_: unknown, _args: {
|
|
45
|
+
names?: string[] | null;
|
|
46
|
+
}, _context: GraphQLContext): Promise<{
|
|
47
|
+
total: number;
|
|
48
|
+
passed: number;
|
|
49
|
+
failed: number;
|
|
50
|
+
results: never[];
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Check ad-hoc invariant.
|
|
54
|
+
*/
|
|
55
|
+
checkInvariant(_: unknown, args: {
|
|
56
|
+
rule: string;
|
|
57
|
+
description?: string | null;
|
|
58
|
+
}, context: GraphQLContext): Promise<{
|
|
59
|
+
guaranteeId: string;
|
|
60
|
+
passed: boolean;
|
|
61
|
+
violationCount: number;
|
|
62
|
+
violations: {
|
|
63
|
+
node: null;
|
|
64
|
+
file: null;
|
|
65
|
+
line: null;
|
|
66
|
+
}[];
|
|
67
|
+
}>;
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=mutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/resolvers/mutation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,iBAAiB;IAC5B;;;OAGG;sBAEE,OAAO,SACH;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,YAChD,cAAc;;;;;;;;;;;IAgB1B;;;OAGG;uBAEE,OAAO,SACH;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,YAC/B,cAAc;IAK1B;;;OAGG;uBAEE,OAAO,SACH;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,YACb,cAAc;IAK1B;;;OAGG;uBAEE,OAAO,SACH;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;KAAE,YACxB,cAAc;;;;;;IAU1B;;OAEG;sBAEE,OAAO,QACJ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,WAC1C,cAAc;;;;;;;;;;CA4B1B,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutation Resolvers
|
|
3
|
+
*
|
|
4
|
+
* Implements all Mutation type fields.
|
|
5
|
+
*/
|
|
6
|
+
export const mutationResolvers = {
|
|
7
|
+
/**
|
|
8
|
+
* Run project analysis.
|
|
9
|
+
* Placeholder - would integrate with Orchestrator.
|
|
10
|
+
*/
|
|
11
|
+
async analyzeProject(_, _args, _context) {
|
|
12
|
+
// Placeholder - would integrate with Orchestrator
|
|
13
|
+
return {
|
|
14
|
+
success: false,
|
|
15
|
+
status: {
|
|
16
|
+
running: false,
|
|
17
|
+
phase: null,
|
|
18
|
+
message: 'Analysis via GraphQL not yet implemented',
|
|
19
|
+
servicesDiscovered: 0,
|
|
20
|
+
servicesAnalyzed: 0,
|
|
21
|
+
error: 'Not implemented',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
/**
|
|
26
|
+
* Create a new guarantee.
|
|
27
|
+
* Placeholder - would integrate with GuaranteeManager.
|
|
28
|
+
*/
|
|
29
|
+
async createGuarantee(_, _args, _context) {
|
|
30
|
+
throw new Error('createGuarantee not yet implemented');
|
|
31
|
+
},
|
|
32
|
+
/**
|
|
33
|
+
* Delete a guarantee.
|
|
34
|
+
* Placeholder.
|
|
35
|
+
*/
|
|
36
|
+
async deleteGuarantee(_, _args, _context) {
|
|
37
|
+
throw new Error('deleteGuarantee not yet implemented');
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Check guarantees.
|
|
41
|
+
* Placeholder.
|
|
42
|
+
*/
|
|
43
|
+
async checkGuarantees(_, _args, _context) {
|
|
44
|
+
return {
|
|
45
|
+
total: 0,
|
|
46
|
+
passed: 0,
|
|
47
|
+
failed: 0,
|
|
48
|
+
results: [],
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
/**
|
|
52
|
+
* Check ad-hoc invariant.
|
|
53
|
+
*/
|
|
54
|
+
async checkInvariant(_, args, context) {
|
|
55
|
+
try {
|
|
56
|
+
const results = await context.backend.checkGuarantee(args.rule);
|
|
57
|
+
const passed = results.length === 0;
|
|
58
|
+
return {
|
|
59
|
+
guaranteeId: 'adhoc',
|
|
60
|
+
passed,
|
|
61
|
+
violationCount: results.length,
|
|
62
|
+
violations: results.slice(0, 10).map((_r) => {
|
|
63
|
+
// Would need async resolution to populate node data
|
|
64
|
+
return {
|
|
65
|
+
node: null,
|
|
66
|
+
file: null,
|
|
67
|
+
line: null,
|
|
68
|
+
};
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return {
|
|
74
|
+
guaranteeId: 'adhoc',
|
|
75
|
+
passed: false,
|
|
76
|
+
violationCount: 0,
|
|
77
|
+
violations: [],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=mutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.js","sourceRoot":"","sources":["../../src/resolvers/mutation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,CAAU,EACV,KAA0D,EAC1D,QAAwB;QAExB,kDAAkD;QAClD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,0CAA0C;gBACnD,kBAAkB,EAAE,CAAC;gBACrB,gBAAgB,EAAE,CAAC;gBACnB,KAAK,EAAE,iBAAiB;aACzB;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CACnB,CAAU,EACV,KAAyC,EACzC,QAAwB;QAExB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CACnB,CAAU,EACV,KAAuB,EACvB,QAAwB;QAExB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CACnB,CAAU,EACV,KAAkC,EAClC,QAAwB;QAExB,OAAO;YACL,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;YACT,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,CAAU,EACV,IAAmD,EACnD,OAAuB;QAEvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YAEpC,OAAO;gBACL,WAAW,EAAE,OAAO;gBACpB,MAAM;gBACN,cAAc,EAAE,OAAO,CAAC,MAAM;gBAC9B,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;oBAC1C,oDAAoD;oBACpD,OAAO;wBACL,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,IAAI;qBACX,CAAC;gBACJ,CAAC,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,CAAC;gBACjB,UAAU,EAAE,EAAE;aACf,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Type Resolvers
|
|
3
|
+
*
|
|
4
|
+
* Resolves relationship fields on Node type.
|
|
5
|
+
*/
|
|
6
|
+
import type { BaseNodeRecord, EdgeRecord } from '@grafema/types';
|
|
7
|
+
import type { GraphQLContext } from '../context.js';
|
|
8
|
+
export declare const nodeResolvers: {
|
|
9
|
+
/**
|
|
10
|
+
* Resolve outgoing edges with cursor-based pagination.
|
|
11
|
+
*
|
|
12
|
+
* Complexity: O(k) where k = number of outgoing edges from this node
|
|
13
|
+
*/
|
|
14
|
+
outgoingEdges(parent: BaseNodeRecord, args: {
|
|
15
|
+
types?: string[] | null;
|
|
16
|
+
first?: number | null;
|
|
17
|
+
after?: string | null;
|
|
18
|
+
}, context: GraphQLContext): Promise<import("../pagination.js").Connection<EdgeRecord>>;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve incoming edges with cursor-based pagination.
|
|
21
|
+
*
|
|
22
|
+
* Complexity: O(k) where k = number of incoming edges to this node
|
|
23
|
+
*/
|
|
24
|
+
incomingEdges(parent: BaseNodeRecord, args: {
|
|
25
|
+
types?: string[] | null;
|
|
26
|
+
first?: number | null;
|
|
27
|
+
after?: string | null;
|
|
28
|
+
}, context: GraphQLContext): Promise<import("../pagination.js").Connection<EdgeRecord>>;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve child nodes (via CONTAINS edges) with cursor-based pagination.
|
|
31
|
+
*
|
|
32
|
+
* Complexity: O(c) where c = number of children
|
|
33
|
+
*/
|
|
34
|
+
children(parent: BaseNodeRecord, args: {
|
|
35
|
+
first?: number | null;
|
|
36
|
+
after?: string | null;
|
|
37
|
+
}, context: GraphQLContext): Promise<import("../pagination.js").Connection<BaseNodeRecord>>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve parent node (via incoming CONTAINS edge).
|
|
40
|
+
*
|
|
41
|
+
* Complexity: O(1) - single lookup
|
|
42
|
+
*/
|
|
43
|
+
parent(parent: BaseNodeRecord, _args: unknown, context: GraphQLContext): Promise<BaseNodeRecord | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve metadata field.
|
|
46
|
+
* Parses JSON string if needed.
|
|
47
|
+
*/
|
|
48
|
+
metadata(parent: BaseNodeRecord): any;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/resolvers/node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,eAAO,MAAM,aAAa;IACxB;;;;OAIG;0BAEO,cAAc,QAChB;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,WACtE,cAAc;IAezB;;;;OAIG;0BAEO,cAAc,QAChB;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,WACtE,cAAc;IAezB;;;;OAIG;qBAEO,cAAc,QAChB;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,WAC7C,cAAc;IAqBzB;;;;OAIG;mBAEO,cAAc,SACf,OAAO,WACL,cAAc;IAQzB;;;OAGG;qBACc,cAAc;CAWhC,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Type Resolvers
|
|
3
|
+
*
|
|
4
|
+
* Resolves relationship fields on Node type.
|
|
5
|
+
*/
|
|
6
|
+
import { paginateArray } from '../pagination.js';
|
|
7
|
+
export const nodeResolvers = {
|
|
8
|
+
/**
|
|
9
|
+
* Resolve outgoing edges with cursor-based pagination.
|
|
10
|
+
*
|
|
11
|
+
* Complexity: O(k) where k = number of outgoing edges from this node
|
|
12
|
+
*/
|
|
13
|
+
async outgoingEdges(parent, args, context) {
|
|
14
|
+
const edges = await context.backend.getOutgoingEdges(parent.id, args.types || null);
|
|
15
|
+
return paginateArray(edges, args.first, args.after, (e) => `${e.src}:${e.dst}:${e.type}`);
|
|
16
|
+
},
|
|
17
|
+
/**
|
|
18
|
+
* Resolve incoming edges with cursor-based pagination.
|
|
19
|
+
*
|
|
20
|
+
* Complexity: O(k) where k = number of incoming edges to this node
|
|
21
|
+
*/
|
|
22
|
+
async incomingEdges(parent, args, context) {
|
|
23
|
+
const edges = await context.backend.getIncomingEdges(parent.id, args.types || null);
|
|
24
|
+
return paginateArray(edges, args.first, args.after, (e) => `${e.src}:${e.dst}:${e.type}`);
|
|
25
|
+
},
|
|
26
|
+
/**
|
|
27
|
+
* Resolve child nodes (via CONTAINS edges) with cursor-based pagination.
|
|
28
|
+
*
|
|
29
|
+
* Complexity: O(c) where c = number of children
|
|
30
|
+
*/
|
|
31
|
+
async children(parent, args, context) {
|
|
32
|
+
const edges = await context.backend.getOutgoingEdges(parent.id, ['CONTAINS']);
|
|
33
|
+
// Use DataLoader to batch child node lookups
|
|
34
|
+
const childIds = edges.map((e) => e.dst);
|
|
35
|
+
const children = await context.loaders.node.loadMany(childIds);
|
|
36
|
+
// Filter out errors and nulls
|
|
37
|
+
const validChildren = children.filter((c) => c != null && !(c instanceof Error));
|
|
38
|
+
return paginateArray(validChildren, args.first, args.after, (n) => n.id);
|
|
39
|
+
},
|
|
40
|
+
/**
|
|
41
|
+
* Resolve parent node (via incoming CONTAINS edge).
|
|
42
|
+
*
|
|
43
|
+
* Complexity: O(1) - single lookup
|
|
44
|
+
*/
|
|
45
|
+
async parent(parent, _args, context) {
|
|
46
|
+
const edges = await context.backend.getIncomingEdges(parent.id, ['CONTAINS']);
|
|
47
|
+
if (edges.length === 0)
|
|
48
|
+
return null;
|
|
49
|
+
return context.loaders.node.load(edges[0].src);
|
|
50
|
+
},
|
|
51
|
+
/**
|
|
52
|
+
* Resolve metadata field.
|
|
53
|
+
* Parses JSON string if needed.
|
|
54
|
+
*/
|
|
55
|
+
metadata(parent) {
|
|
56
|
+
if (!parent.metadata)
|
|
57
|
+
return null;
|
|
58
|
+
if (typeof parent.metadata === 'string') {
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(parent.metadata);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return parent.metadata;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/resolvers/node.ts"],"names":[],"mappings":"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"}
|