@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.
Files changed (70) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +219 -0
  3. package/dist/context.d.ts +22 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +18 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/dataloaders/index.d.ts +18 -0
  8. package/dist/dataloaders/index.d.ts.map +1 -0
  9. package/dist/dataloaders/index.js +17 -0
  10. package/dist/dataloaders/index.js.map +1 -0
  11. package/dist/dataloaders/nodeLoader.d.ts +19 -0
  12. package/dist/dataloaders/nodeLoader.d.ts.map +1 -0
  13. package/dist/dataloaders/nodeLoader.js +31 -0
  14. package/dist/dataloaders/nodeLoader.js.map +1 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/pagination.d.ts +50 -0
  20. package/dist/pagination.d.ts.map +1 -0
  21. package/dist/pagination.js +71 -0
  22. package/dist/pagination.js.map +1 -0
  23. package/dist/resolvers/edge.d.ts +22 -0
  24. package/dist/resolvers/edge.d.ts.map +1 -0
  25. package/dist/resolvers/edge.js +36 -0
  26. package/dist/resolvers/edge.js.map +1 -0
  27. package/dist/resolvers/index.d.ts +159 -0
  28. package/dist/resolvers/index.d.ts.map +1 -0
  29. package/dist/resolvers/index.js +21 -0
  30. package/dist/resolvers/index.js.map +1 -0
  31. package/dist/resolvers/mutation.d.ts +69 -0
  32. package/dist/resolvers/mutation.d.ts.map +1 -0
  33. package/dist/resolvers/mutation.js +82 -0
  34. package/dist/resolvers/mutation.js.map +1 -0
  35. package/dist/resolvers/node.d.ts +50 -0
  36. package/dist/resolvers/node.d.ts.map +1 -0
  37. package/dist/resolvers/node.js +69 -0
  38. package/dist/resolvers/node.js.map +1 -0
  39. package/dist/resolvers/query.d.ts +169 -0
  40. package/dist/resolvers/query.d.ts.map +1 -0
  41. package/dist/resolvers/query.js +188 -0
  42. package/dist/resolvers/query.js.map +1 -0
  43. package/dist/schema/enums.graphql +27 -0
  44. package/dist/schema/mutations.graphql +53 -0
  45. package/dist/schema/queries.graphql +213 -0
  46. package/dist/schema/scalars.graphql +2 -0
  47. package/dist/schema/subscriptions.graphql +84 -0
  48. package/dist/schema/types.graphql +440 -0
  49. package/dist/server.d.ts +31 -0
  50. package/dist/server.d.ts.map +1 -0
  51. package/dist/server.js +109 -0
  52. package/dist/server.js.map +1 -0
  53. package/package.json +51 -0
  54. package/src/context.ts +33 -0
  55. package/src/dataloaders/index.ts +24 -0
  56. package/src/dataloaders/nodeLoader.ts +41 -0
  57. package/src/index.ts +11 -0
  58. package/src/pagination.ts +109 -0
  59. package/src/resolvers/edge.ts +39 -0
  60. package/src/resolvers/index.ts +24 -0
  61. package/src/resolvers/mutation.ts +108 -0
  62. package/src/resolvers/node.ts +118 -0
  63. package/src/resolvers/query.ts +307 -0
  64. package/src/schema/enums.graphql +27 -0
  65. package/src/schema/mutations.graphql +53 -0
  66. package/src/schema/queries.graphql +213 -0
  67. package/src/schema/scalars.graphql +2 -0
  68. package/src/schema/subscriptions.graphql +84 -0
  69. package/src/schema/types.graphql +440 -0
  70. 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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"}