@blockml/graph 0.9.1
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/blocks/org/blockml/bml/graph/BuildIndexResult.bml +43 -0
- package/blocks/org/blockml/bml/graph/GraphEdge.bml +49 -0
- package/blocks/org/blockml/bml/graph/GraphIndexOptions.bml +43 -0
- package/blocks/org/blockml/bml/graph/GraphMember.bml +46 -0
- package/blocks/org/blockml/bml/graph/GraphNeighbor.bml +52 -0
- package/blocks/org/blockml/bml/graph/GraphNode.bml +58 -0
- package/blocks/org/blockml/bml/graph/GraphPath.bml +40 -0
- package/blocks/org/blockml/bml/graph/GraphQueryResult.bml +37 -0
- package/blocks/org/blockml/bml/graph/GraphType.bml +33 -0
- package/blocks/org/blockml/bml/graph/IndexStatus.bml +43 -0
- package/blocks/org/blockml/bml/graph/Library.bml +95 -0
- package/blocks/org/blockml/bml/graph/README.bml +36 -0
- package/blocks/org/blockml/bml/graph/capability/Ancestors.bml +40 -0
- package/blocks/org/blockml/bml/graph/capability/BuildIndex.bml +41 -0
- package/blocks/org/blockml/bml/graph/capability/Descendants.bml +43 -0
- package/blocks/org/blockml/bml/graph/capability/Members.bml +37 -0
- package/blocks/org/blockml/bml/graph/capability/Neighbors.bml +53 -0
- package/blocks/org/blockml/bml/graph/capability/OpenIndex.bml +40 -0
- package/blocks/org/blockml/bml/graph/capability/Path.bml +43 -0
- package/blocks/org/blockml/bml/graph/capability/Query.bml +43 -0
- package/blocks/org/blockml/bml/graph/capability/RebuildIndex.bml +40 -0
- package/blocks/org/blockml/bml/graph/capability/Schema.bml +37 -0
- package/blocks/org/blockml/bml/graph/capability/UsedBy.bml +52 -0
- package/blocks/org/blockml/bml/graph/capability/Uses.bml +49 -0
- package/blocks/org/blockml/bml/graph/documentation/ArchitectureOverview.bml +39 -0
- package/blocks/org/blockml/bml/graph/documentation/Introduction.bml +37 -0
- package/blocks/org/blockml/bml/graph/documentation/LayerSeparation.bml +39 -0
- package/blocks/org/blockml/bml/graph/documentation/PackageOwnership.bml +36 -0
- package/blocks/org/blockml/bml/graph/documentation/PublicApi.bml +44 -0
- package/blocks/org/blockml/bml/graph/documentation/ScopeExclusions.bml +40 -0
- package/blocks/org/blockml/bml/graph/documentation/V1Scope.bml +41 -0
- package/dist/fingerprint.d.ts +27 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +146 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/graph-index.d.ts +23 -0
- package/dist/graph-index.d.ts.map +1 -0
- package/dist/graph-index.js +49 -0
- package/dist/graph-index.js.map +1 -0
- package/dist/graph-lock.d.ts +6 -0
- package/dist/graph-lock.d.ts.map +1 -0
- package/dist/graph-lock.js +106 -0
- package/dist/graph-lock.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/ladybug-store.d.ts +19 -0
- package/dist/ladybug-store.d.ts.map +1 -0
- package/dist/ladybug-store.js +133 -0
- package/dist/ladybug-store.js.map +1 -0
- package/dist/mapper.d.ts +40 -0
- package/dist/mapper.d.ts.map +1 -0
- package/dist/mapper.js +245 -0
- package/dist/mapper.js.map +1 -0
- package/dist/operations.d.ts +14 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +375 -0
- package/dist/operations.js.map +1 -0
- package/dist/schema.d.ts +8 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +42 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +10 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +2 -0
- package/dist/store.js.map +1 -0
- package/dist/type-refs.d.ts +8 -0
- package/dist/type-refs.d.ts.map +1 -0
- package/dist/type-refs.js +48 -0
- package/dist/type-refs.js.map +1 -0
- package/dist/types.d.ts +103 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,SAAS,EAET,SAAS,EAET,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAoI7C,iBAAe,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAUvF;AAiKD,wBAAsB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAEnG;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAErG;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAExG;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC,CAStB;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,EAAE,CAAC,CAStB;AAyFD,wBAAsB,YAAY,CAChC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAiDhC;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAiDpF;AAED,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { DEFAULT_GRAPH_DEPTH, DEFAULT_USES_DEPTH } from "./types.js";
|
|
2
|
+
import { graphSchema } from "./schema.js";
|
|
3
|
+
const BLOCK_TO_BLOCK = ["BASE_TYPE", "CONTRACT", "HAS_SUBBLOCK"];
|
|
4
|
+
const MEMBER_TO_BLOCK = ["MEMBER_TYPE", "INPUT_TYPE", "OUTPUT_TYPE", "THROWS"];
|
|
5
|
+
function asString(value) {
|
|
6
|
+
if (value === null || value === undefined) {
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
return String(value);
|
|
10
|
+
}
|
|
11
|
+
function asBool(value) {
|
|
12
|
+
return value === true || value === "true" || value === 1;
|
|
13
|
+
}
|
|
14
|
+
function asNumber(value) {
|
|
15
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
const parsed = Number(value);
|
|
19
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
20
|
+
}
|
|
21
|
+
function originOf(value) {
|
|
22
|
+
if (value === "workspace" || value === "dependency" || value === "unresolved") {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
return "unresolved";
|
|
26
|
+
}
|
|
27
|
+
function memberKindOf(value) {
|
|
28
|
+
if (value === "property" ||
|
|
29
|
+
value === "aggregation" ||
|
|
30
|
+
value === "association" ||
|
|
31
|
+
value === "capability") {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
function blockNodeFromRow(fqn, name, file, library, origin, resolved) {
|
|
37
|
+
const node = {
|
|
38
|
+
kind: "block",
|
|
39
|
+
fqn: asString(fqn),
|
|
40
|
+
name: asString(name),
|
|
41
|
+
file: asString(file),
|
|
42
|
+
origin: originOf(origin),
|
|
43
|
+
resolved: asBool(resolved),
|
|
44
|
+
};
|
|
45
|
+
const lib = asString(library);
|
|
46
|
+
if (lib) {
|
|
47
|
+
node.library = lib;
|
|
48
|
+
}
|
|
49
|
+
return node;
|
|
50
|
+
}
|
|
51
|
+
function memberNodeFromRow(id, name, file, origin, kind, displayFqn) {
|
|
52
|
+
const node = {
|
|
53
|
+
kind: "member",
|
|
54
|
+
fqn: asString(id),
|
|
55
|
+
name: asString(name),
|
|
56
|
+
file: asString(file),
|
|
57
|
+
origin: originOf(origin),
|
|
58
|
+
resolved: true,
|
|
59
|
+
};
|
|
60
|
+
const memberKind = memberKindOf(kind);
|
|
61
|
+
if (memberKind) {
|
|
62
|
+
node.memberKind = memberKind;
|
|
63
|
+
}
|
|
64
|
+
const display = asString(displayFqn);
|
|
65
|
+
if (display) {
|
|
66
|
+
node.displayFqn = display;
|
|
67
|
+
}
|
|
68
|
+
return node;
|
|
69
|
+
}
|
|
70
|
+
function optionalLine(line) {
|
|
71
|
+
const n = asNumber(line);
|
|
72
|
+
return n > 0 ? n : undefined;
|
|
73
|
+
}
|
|
74
|
+
function withEdgeMeta(neighbor, file, line, via) {
|
|
75
|
+
const edgeFile = asString(file);
|
|
76
|
+
if (edgeFile) {
|
|
77
|
+
neighbor.file = edgeFile;
|
|
78
|
+
}
|
|
79
|
+
const edgeLine = optionalLine(line);
|
|
80
|
+
if (edgeLine !== undefined) {
|
|
81
|
+
neighbor.line = edgeLine;
|
|
82
|
+
}
|
|
83
|
+
if (via) {
|
|
84
|
+
neighbor.via = via;
|
|
85
|
+
}
|
|
86
|
+
return neighbor;
|
|
87
|
+
}
|
|
88
|
+
function depthOf(depth) {
|
|
89
|
+
if (depth === undefined || !Number.isFinite(depth) || depth < 1) {
|
|
90
|
+
return DEFAULT_GRAPH_DEPTH;
|
|
91
|
+
}
|
|
92
|
+
return Math.floor(depth);
|
|
93
|
+
}
|
|
94
|
+
function usesDepthOf(depth) {
|
|
95
|
+
if (depth === undefined || !Number.isFinite(depth) || depth < 1) {
|
|
96
|
+
return DEFAULT_USES_DEPTH;
|
|
97
|
+
}
|
|
98
|
+
return Math.floor(depth);
|
|
99
|
+
}
|
|
100
|
+
async function loadBlock(store, fqn) {
|
|
101
|
+
const rows = await store.exec("MATCH (b:Block {fqn: $fqn}) RETURN b.fqn, b.name, b.file, b.library, b.origin, b.resolved", { fqn });
|
|
102
|
+
const row = rows[0];
|
|
103
|
+
if (!row) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
return blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]);
|
|
107
|
+
}
|
|
108
|
+
async function usesOneHop(store, fqn) {
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const relation of BLOCK_TO_BLOCK) {
|
|
111
|
+
const rows = await store.exec(`MATCH (a:Block {fqn: $fqn})-[r:${relation}]->(b:Block)
|
|
112
|
+
RETURN b.fqn, b.name, b.file, b.library, b.origin, b.resolved, r.file, r.line
|
|
113
|
+
ORDER BY b.fqn`, { fqn });
|
|
114
|
+
for (const row of rows) {
|
|
115
|
+
out.push(withEdgeMeta({
|
|
116
|
+
node: blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]),
|
|
117
|
+
relation,
|
|
118
|
+
direction: "outgoing",
|
|
119
|
+
}, row[6], row[7]));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const relation of MEMBER_TO_BLOCK) {
|
|
123
|
+
const rows = await store.exec(`MATCH (a:Block {fqn: $fqn})-[:HAS_MEMBER]->(m:Member)-[r:${relation}]->(b:Block)
|
|
124
|
+
RETURN b.fqn, b.name, b.file, b.library, b.origin, b.resolved, r.file, r.line,
|
|
125
|
+
m.id, m.name, m.file, m.origin, m.kind, m.displayFqn
|
|
126
|
+
ORDER BY b.fqn, m.displayFqn`, { fqn });
|
|
127
|
+
for (const row of rows) {
|
|
128
|
+
out.push(withEdgeMeta({
|
|
129
|
+
node: blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]),
|
|
130
|
+
relation,
|
|
131
|
+
direction: "outgoing",
|
|
132
|
+
}, row[6], row[7], memberNodeFromRow(row[8], row[9], row[10], row[11], row[12], row[13])));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
async function usedByOneHop(store, fqn) {
|
|
138
|
+
const out = [];
|
|
139
|
+
for (const relation of BLOCK_TO_BLOCK) {
|
|
140
|
+
const rows = await store.exec(`MATCH (a:Block)-[r:${relation}]->(b:Block {fqn: $fqn})
|
|
141
|
+
RETURN a.fqn, a.name, a.file, a.library, a.origin, a.resolved, r.file, r.line
|
|
142
|
+
ORDER BY a.fqn`, { fqn });
|
|
143
|
+
for (const row of rows) {
|
|
144
|
+
out.push(withEdgeMeta({
|
|
145
|
+
node: blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]),
|
|
146
|
+
relation,
|
|
147
|
+
direction: "incoming",
|
|
148
|
+
}, row[6], row[7]));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const relation of MEMBER_TO_BLOCK) {
|
|
152
|
+
const rows = await store.exec(`MATCH (a:Block)-[:HAS_MEMBER]->(m:Member)-[r:${relation}]->(b:Block {fqn: $fqn})
|
|
153
|
+
RETURN a.fqn, a.name, a.file, a.library, a.origin, a.resolved, r.file, r.line,
|
|
154
|
+
m.id, m.name, m.file, m.origin, m.kind, m.displayFqn
|
|
155
|
+
ORDER BY a.fqn, m.displayFqn`, { fqn });
|
|
156
|
+
for (const row of rows) {
|
|
157
|
+
out.push(withEdgeMeta({
|
|
158
|
+
node: blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]),
|
|
159
|
+
relation,
|
|
160
|
+
direction: "incoming",
|
|
161
|
+
}, row[6], row[7], memberNodeFromRow(row[8], row[9], row[10], row[11], row[12], row[13])));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
async function neighborsOneHop(store, fqn) {
|
|
167
|
+
const outgoing = await usesOneHop(store, fqn);
|
|
168
|
+
const incoming = await usedByOneHop(store, fqn);
|
|
169
|
+
return [...outgoing, ...incoming];
|
|
170
|
+
}
|
|
171
|
+
async function oneHop(store, fqn, kind) {
|
|
172
|
+
if (kind === "outgoing") {
|
|
173
|
+
return usesOneHop(store, fqn);
|
|
174
|
+
}
|
|
175
|
+
if (kind === "incoming") {
|
|
176
|
+
return usedByOneHop(store, fqn);
|
|
177
|
+
}
|
|
178
|
+
return neighborsOneHop(store, fqn);
|
|
179
|
+
}
|
|
180
|
+
async function walkHops(store, start, depth, kind) {
|
|
181
|
+
const max = usesDepthOf(depth);
|
|
182
|
+
const out = [];
|
|
183
|
+
const seen = new Set();
|
|
184
|
+
let frontier = [start];
|
|
185
|
+
const ownerCache = new Map();
|
|
186
|
+
for (let hop = 1; hop <= max; hop++) {
|
|
187
|
+
const next = [];
|
|
188
|
+
for (const owner of frontier) {
|
|
189
|
+
let ownerNode;
|
|
190
|
+
if (owner !== start) {
|
|
191
|
+
if (!ownerCache.has(owner)) {
|
|
192
|
+
ownerCache.set(owner, await loadBlock(store, owner));
|
|
193
|
+
}
|
|
194
|
+
ownerNode = ownerCache.get(owner);
|
|
195
|
+
}
|
|
196
|
+
const hits = await oneHop(store, owner, kind);
|
|
197
|
+
for (const hit of hits) {
|
|
198
|
+
const target = hit.node.fqn;
|
|
199
|
+
if (!target || target === start || seen.has(target)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
seen.add(target);
|
|
203
|
+
const neighbor = { ...hit };
|
|
204
|
+
if (ownerNode) {
|
|
205
|
+
neighbor.source = ownerNode;
|
|
206
|
+
}
|
|
207
|
+
out.push(neighbor);
|
|
208
|
+
next.push(target);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
frontier = next;
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
export async function uses(store, fqn, depth) {
|
|
216
|
+
return walkHops(store, fqn, depth ?? DEFAULT_USES_DEPTH, "outgoing");
|
|
217
|
+
}
|
|
218
|
+
export async function usedBy(store, fqn, depth) {
|
|
219
|
+
return walkHops(store, fqn, depth ?? DEFAULT_USES_DEPTH, "incoming");
|
|
220
|
+
}
|
|
221
|
+
export async function neighbors(store, fqn, depth) {
|
|
222
|
+
return walkHops(store, fqn, depth ?? DEFAULT_USES_DEPTH, "both");
|
|
223
|
+
}
|
|
224
|
+
export async function ancestors(store, fqn, depth) {
|
|
225
|
+
const max = depthOf(depth);
|
|
226
|
+
const rows = await store.exec(`MATCH (a:Block {fqn: $fqn})-[:BASE_TYPE*1..${max}]->(b:Block)
|
|
227
|
+
RETURN DISTINCT b.fqn, b.name, b.file, b.library, b.origin, b.resolved
|
|
228
|
+
ORDER BY b.fqn`, { fqn });
|
|
229
|
+
return rows.map((row) => blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]));
|
|
230
|
+
}
|
|
231
|
+
export async function descendants(store, fqn, depth) {
|
|
232
|
+
const max = depthOf(depth);
|
|
233
|
+
const rows = await store.exec(`MATCH (a:Block)-[:BASE_TYPE*1..${max}]->(b:Block {fqn: $fqn})
|
|
234
|
+
RETURN DISTINCT a.fqn, a.name, a.file, a.library, a.origin, a.resolved
|
|
235
|
+
ORDER BY a.fqn`, { fqn });
|
|
236
|
+
return rows.map((row) => blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]));
|
|
237
|
+
}
|
|
238
|
+
function pushHop(hops, key, node, relation, file, line) {
|
|
239
|
+
const hop = { key, node, relation, direction: "outgoing" };
|
|
240
|
+
const edgeFile = asString(file);
|
|
241
|
+
if (edgeFile) {
|
|
242
|
+
hop.file = edgeFile;
|
|
243
|
+
}
|
|
244
|
+
const edgeLine = optionalLine(line);
|
|
245
|
+
if (edgeLine !== undefined) {
|
|
246
|
+
hop.line = edgeLine;
|
|
247
|
+
}
|
|
248
|
+
hops.push(hop);
|
|
249
|
+
}
|
|
250
|
+
async function expandOutgoing(store, node) {
|
|
251
|
+
const hops = [];
|
|
252
|
+
if (node.kind === "block") {
|
|
253
|
+
for (const relation of BLOCK_TO_BLOCK) {
|
|
254
|
+
const outgoing = await store.exec(`MATCH (a:Block {fqn: $id})-[r:${relation}]->(b:Block)
|
|
255
|
+
RETURN b.fqn, b.name, b.file, b.library, b.origin, b.resolved, r.file, r.line`, { id: node.fqn });
|
|
256
|
+
for (const row of outgoing) {
|
|
257
|
+
pushHop(hops, `block:${asString(row[0])}`, blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]), relation, row[6], row[7]);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const toMembers = await store.exec(`MATCH (a:Block {fqn: $id})-[r:HAS_MEMBER]->(m:Member)
|
|
261
|
+
RETURN m.id, m.name, m.file, m.origin, m.kind, m.displayFqn, r.file, r.line`, { id: node.fqn });
|
|
262
|
+
for (const row of toMembers) {
|
|
263
|
+
pushHop(hops, `member:${asString(row[0])}`, memberNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]), "HAS_MEMBER", row[6], row[7]);
|
|
264
|
+
}
|
|
265
|
+
return hops;
|
|
266
|
+
}
|
|
267
|
+
for (const relation of MEMBER_TO_BLOCK) {
|
|
268
|
+
const outgoing = await store.exec(`MATCH (m:Member {id: $id})-[r:${relation}]->(b:Block)
|
|
269
|
+
RETURN b.fqn, b.name, b.file, b.library, b.origin, b.resolved, r.file, r.line`, { id: node.fqn });
|
|
270
|
+
for (const row of outgoing) {
|
|
271
|
+
pushHop(hops, `block:${asString(row[0])}`, blockNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]), relation, row[6], row[7]);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return hops;
|
|
275
|
+
}
|
|
276
|
+
export async function shortestPath(store, from, to, depth) {
|
|
277
|
+
if (from === to) {
|
|
278
|
+
const node = await loadBlock(store, from);
|
|
279
|
+
if (!node) {
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
return { from: node, to: node, hops: [] };
|
|
283
|
+
}
|
|
284
|
+
const start = await loadBlock(store, from);
|
|
285
|
+
const goal = await loadBlock(store, to);
|
|
286
|
+
if (!start || !goal) {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
const max = depthOf(depth);
|
|
290
|
+
const visited = new Set([`block:${from}`]);
|
|
291
|
+
const queue = [{ node: start, hops: [] }];
|
|
292
|
+
while (queue.length > 0) {
|
|
293
|
+
const current = queue.shift();
|
|
294
|
+
if (current.hops.length >= max) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
const nextHops = await expandOutgoing(store, current.node);
|
|
298
|
+
for (const hop of nextHops) {
|
|
299
|
+
if (visited.has(hop.key)) {
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
visited.add(hop.key);
|
|
303
|
+
const pathHop = {
|
|
304
|
+
relation: hop.relation,
|
|
305
|
+
direction: hop.direction,
|
|
306
|
+
node: hop.node,
|
|
307
|
+
};
|
|
308
|
+
if (hop.file) {
|
|
309
|
+
pathHop.file = hop.file;
|
|
310
|
+
}
|
|
311
|
+
if (hop.line !== undefined) {
|
|
312
|
+
pathHop.line = hop.line;
|
|
313
|
+
}
|
|
314
|
+
if (hop.via) {
|
|
315
|
+
pathHop.via = hop.via;
|
|
316
|
+
}
|
|
317
|
+
const hops = [...current.hops, pathHop];
|
|
318
|
+
if (hop.node.kind === "block" && hop.node.fqn === to) {
|
|
319
|
+
return { from: start, to: goal, hops };
|
|
320
|
+
}
|
|
321
|
+
queue.push({ node: hop.node, hops });
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
export async function members(store, fqn) {
|
|
327
|
+
const authored = await store.exec(`MATCH (start:Block {fqn: $fqn})-[r:HAS_MEMBER]->(m:Member)
|
|
328
|
+
RETURN m.id, m.name, m.file, m.origin, m.kind, m.displayFqn, m.ownerFqn, r.file, r.line
|
|
329
|
+
ORDER BY m.name`, { fqn });
|
|
330
|
+
const inherited = await store.exec(`MATCH (start:Block {fqn: $fqn})-[:BASE_TYPE*1..16]->(owner:Block)-[r:HAS_MEMBER]->(m:Member)
|
|
331
|
+
RETURN m.id, m.name, m.file, m.origin, m.kind, m.displayFqn, m.ownerFqn, r.file, r.line
|
|
332
|
+
ORDER BY m.ownerFqn, m.name`, { fqn });
|
|
333
|
+
const viaContract = await store.exec(`MATCH (start:Block {fqn: $fqn})-[:CONTRACT]->(owner:Block)-[r:HAS_MEMBER]->(m:Member)
|
|
334
|
+
RETURN m.id, m.name, m.file, m.origin, m.kind, m.displayFqn, m.ownerFqn, r.file, r.line
|
|
335
|
+
ORDER BY m.ownerFqn, m.name`, { fqn });
|
|
336
|
+
const seen = new Set();
|
|
337
|
+
const out = [];
|
|
338
|
+
for (const row of [...authored, ...inherited, ...viaContract]) {
|
|
339
|
+
const id = asString(row[0]);
|
|
340
|
+
const name = asString(row[1]);
|
|
341
|
+
if (!id || seen.has(id) || seen.has(`name:${name}`)) {
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
seen.add(id);
|
|
345
|
+
seen.add(`name:${name}`);
|
|
346
|
+
const node = memberNodeFromRow(row[0], row[1], row[2], row[3], row[4], row[5]);
|
|
347
|
+
const ownerFqn = asString(row[6]);
|
|
348
|
+
const member = {
|
|
349
|
+
node,
|
|
350
|
+
relation: "HAS_MEMBER",
|
|
351
|
+
};
|
|
352
|
+
if (ownerFqn && ownerFqn !== fqn) {
|
|
353
|
+
member.inheritedFrom = ownerFqn;
|
|
354
|
+
}
|
|
355
|
+
const file = asString(row[7]);
|
|
356
|
+
if (file) {
|
|
357
|
+
member.file = file;
|
|
358
|
+
}
|
|
359
|
+
const line = optionalLine(row[8]);
|
|
360
|
+
if (line !== undefined) {
|
|
361
|
+
member.line = line;
|
|
362
|
+
}
|
|
363
|
+
out.push(member);
|
|
364
|
+
}
|
|
365
|
+
return out;
|
|
366
|
+
}
|
|
367
|
+
export async function runQuery(store, cypher, params) {
|
|
368
|
+
const { columns, rows } = await store.execWithColumns(cypher, params);
|
|
369
|
+
return {
|
|
370
|
+
columns,
|
|
371
|
+
rows: rows.map((values) => ({ columns, values })),
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
export { graphSchema, loadBlock };
|
|
375
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GraphRelation, GraphSchema } from "./types.js";
|
|
2
|
+
export declare const GRAPH_NODE_TABLES: readonly ["Block", "Member"];
|
|
3
|
+
export declare const GRAPH_RELATIONS: GraphRelation[];
|
|
4
|
+
export declare const GRAPH_SCHEMA_DDL: string[];
|
|
5
|
+
export declare const GRAPH_SCHEMA_DESCRIPTION: string;
|
|
6
|
+
export declare const GRAPH_CYPHER_EXAMPLE = "MATCH (a:Block {fqn: $fqn})-[:BASE_TYPE]->(b:Block) RETURN b.fqn";
|
|
7
|
+
export declare function graphSchema(): GraphSchema;
|
|
8
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7D,eAAO,MAAM,iBAAiB,8BAA+B,CAAC;AAE9D,eAAO,MAAM,eAAe,EAAE,aAAa,EAS1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,UAW5B,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAQ1B,CAAC;AAEZ,eAAO,MAAM,oBAAoB,qEACmC,CAAC;AAErE,wBAAgB,WAAW,IAAI,WAAW,CAOzC"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export const GRAPH_NODE_TABLES = ["Block", "Member"];
|
|
2
|
+
export const GRAPH_RELATIONS = [
|
|
3
|
+
"BASE_TYPE",
|
|
4
|
+
"CONTRACT",
|
|
5
|
+
"HAS_SUBBLOCK",
|
|
6
|
+
"HAS_MEMBER",
|
|
7
|
+
"MEMBER_TYPE",
|
|
8
|
+
"INPUT_TYPE",
|
|
9
|
+
"OUTPUT_TYPE",
|
|
10
|
+
"THROWS",
|
|
11
|
+
];
|
|
12
|
+
export const GRAPH_SCHEMA_DDL = [
|
|
13
|
+
"CREATE NODE TABLE Block(fqn STRING, name STRING, file STRING, library STRING, origin STRING, resolved BOOLEAN, abstract BOOLEAN, PRIMARY KEY (fqn))",
|
|
14
|
+
"CREATE NODE TABLE Member(id STRING, ownerFqn STRING, name STRING, kind STRING, displayFqn STRING, file STRING, line INT64, origin STRING, PRIMARY KEY (id))",
|
|
15
|
+
"CREATE REL TABLE BASE_TYPE(FROM Block TO Block, file STRING, line INT64)",
|
|
16
|
+
"CREATE REL TABLE CONTRACT(FROM Block TO Block, file STRING, line INT64)",
|
|
17
|
+
"CREATE REL TABLE HAS_SUBBLOCK(FROM Block TO Block, file STRING, line INT64)",
|
|
18
|
+
"CREATE REL TABLE HAS_MEMBER(FROM Block TO Member, file STRING, line INT64)",
|
|
19
|
+
"CREATE REL TABLE MEMBER_TYPE(FROM Member TO Block, file STRING, line INT64, cardinality STRING)",
|
|
20
|
+
"CREATE REL TABLE INPUT_TYPE(FROM Member TO Block, file STRING, line INT64)",
|
|
21
|
+
"CREATE REL TABLE OUTPUT_TYPE(FROM Member TO Block, file STRING, line INT64)",
|
|
22
|
+
"CREATE REL TABLE THROWS(FROM Member TO Block, file STRING, line INT64)",
|
|
23
|
+
];
|
|
24
|
+
export const GRAPH_SCHEMA_DESCRIPTION = [
|
|
25
|
+
"Authored BlockML definition graph. Nodes: Block (type FQN), Member (ownerFqn#kind:name).",
|
|
26
|
+
"Relations: BASE_TYPE, CONTRACT, HAS_SUBBLOCK, HAS_MEMBER, MEMBER_TYPE, INPUT_TYPE, OUTPUT_TYPE, THROWS.",
|
|
27
|
+
"Only authored edges are stored. Transitive relations are computed by traversals.",
|
|
28
|
+
"path follows outgoing authored edges only (the same direction as uses).",
|
|
29
|
+
"Block.origin is workspace | dependency | unresolved. Stub Blocks have resolved=false.",
|
|
30
|
+
"Ladybug Cypher subset: MATCH, OPTIONAL MATCH, WHERE, RETURN, ORDER BY, LIMIT, DISTINCT, named relationship types, $params, variable-length [:REL*1..n].",
|
|
31
|
+
"No type(), labels(), shortestPath(), CALL, CREATE, MERGE, or DELETE. Prefer named graph operations; use schema() before Cypher.",
|
|
32
|
+
].join(" ");
|
|
33
|
+
export const GRAPH_CYPHER_EXAMPLE = "MATCH (a:Block {fqn: $fqn})-[:BASE_TYPE]->(b:Block) RETURN b.fqn";
|
|
34
|
+
export function graphSchema() {
|
|
35
|
+
return {
|
|
36
|
+
nodes: [...GRAPH_NODE_TABLES],
|
|
37
|
+
relations: [...GRAPH_RELATIONS],
|
|
38
|
+
description: GRAPH_SCHEMA_DESCRIPTION,
|
|
39
|
+
example: GRAPH_CYPHER_EXAMPLE,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,WAAW;IACX,UAAU;IACV,cAAc;IACd,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,aAAa;IACb,QAAQ;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,qJAAqJ;IACrJ,6JAA6J;IAC7J,0EAA0E;IAC1E,yEAAyE;IACzE,6EAA6E;IAC7E,4EAA4E;IAC5E,iGAAiG;IACjG,4EAA4E;IAC5E,6EAA6E;IAC7E,wEAAwE;CACzE,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,0FAA0F;IAC1F,yGAAyG;IACzG,kFAAkF;IAClF,yEAAyE;IACzE,uFAAuF;IACvF,yJAAyJ;IACzJ,iIAAiI;CAClI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,CAAC,MAAM,oBAAoB,GAC/B,kEAAkE,CAAC;AAErE,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,iBAAiB,CAAC;QAC7B,SAAS,EAAE,CAAC,GAAG,eAAe,CAAC;QAC/B,WAAW,EAAE,wBAAwB;QACrC,OAAO,EAAE,oBAAoB;KAC9B,CAAC;AACJ,CAAC"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface GraphStore {
|
|
2
|
+
exec(cypher: string, params?: Record<string, unknown>): Promise<unknown[][]>;
|
|
3
|
+
execWithColumns(cypher: string, params?: Record<string, unknown>): Promise<{
|
|
4
|
+
columns: string[];
|
|
5
|
+
rows: unknown[][];
|
|
6
|
+
}>;
|
|
7
|
+
close(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare const MEMORY_DB_PATH = ":memory:";
|
|
10
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7E,eAAe,CACb,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,aAAa,CAAC"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Multiplicity, TypeExpression } from "@blockml/bom";
|
|
2
|
+
export interface NamedTypeRef {
|
|
3
|
+
fqn: string;
|
|
4
|
+
cardinality?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function multiplicityLabel(multiplicity?: Multiplicity): string | undefined;
|
|
7
|
+
export declare function collectNamedTypes(expr: TypeExpression | undefined): NamedTypeRef[];
|
|
8
|
+
//# sourceMappingURL=type-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-refs.d.ts","sourceRoot":"","sources":["../src/type-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAMjF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,YAAY,EAAE,CAwClF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function multiplicityLabel(multiplicity) {
|
|
2
|
+
if (!multiplicity) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
const max = multiplicity.max === "*" ? "n" : String(multiplicity.max);
|
|
6
|
+
return `${multiplicity.min}..${max}`;
|
|
7
|
+
}
|
|
8
|
+
export function collectNamedTypes(expr) {
|
|
9
|
+
if (!expr) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
const out = [];
|
|
13
|
+
walk(expr, undefined);
|
|
14
|
+
return out;
|
|
15
|
+
function walk(current, inherited) {
|
|
16
|
+
switch (current.kind) {
|
|
17
|
+
case "named": {
|
|
18
|
+
const cardinality = multiplicityLabel(current.multiplicity) ?? inherited;
|
|
19
|
+
const named = { fqn: current.fqn };
|
|
20
|
+
if (cardinality) {
|
|
21
|
+
named.cardinality = cardinality;
|
|
22
|
+
}
|
|
23
|
+
out.push(named);
|
|
24
|
+
for (const arg of current.typeArguments ?? []) {
|
|
25
|
+
walk(arg, undefined);
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case "union":
|
|
30
|
+
for (const alternative of current.alternatives) {
|
|
31
|
+
walk(alternative, inherited);
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
case "grouped":
|
|
35
|
+
walk(current.expression, multiplicityLabel(current.multiplicity) ?? inherited);
|
|
36
|
+
break;
|
|
37
|
+
case "anonymousStruct":
|
|
38
|
+
for (const field of current.fields) {
|
|
39
|
+
walk(field.type, inherited);
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
case "genericParam":
|
|
43
|
+
case "self":
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=type-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-refs.js","sourceRoot":"","sources":["../src/type-refs.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,YAA2B;IAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACtE,OAAO,GAAG,YAAY,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAgC;IAChE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC;IAEX,SAAS,IAAI,CAAC,OAAuB,EAAE,SAAkB;QACvD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;gBACzE,MAAM,KAAK,GAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;gBACjD,IAAI,WAAW,EAAE,CAAC;oBAChB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;gBAClC,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;oBAC9C,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,OAAO;gBACV,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;oBAC/C,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC,CAAC;gBAC/E,MAAM;YACR,KAAK,iBAAiB;gBACpB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM;YACR,KAAK,cAAc,CAAC;YACpB,KAAK,MAAM;gBACT,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { Diagnostic } from "@blockml/bom";
|
|
2
|
+
export declare const INDEX_FORMAT_VERSION = 1;
|
|
3
|
+
export declare const DEFAULT_GRAPH_DEPTH = 16;
|
|
4
|
+
export declare const DEFAULT_USES_DEPTH = 1;
|
|
5
|
+
export type GraphOrigin = "workspace" | "dependency" | "unresolved";
|
|
6
|
+
export type GraphNodeKind = "block" | "member";
|
|
7
|
+
export type MemberKind = "property" | "aggregation" | "association" | "capability";
|
|
8
|
+
export type GraphRelation = "BASE_TYPE" | "CONTRACT" | "HAS_SUBBLOCK" | "HAS_MEMBER" | "MEMBER_TYPE" | "INPUT_TYPE" | "OUTPUT_TYPE" | "THROWS";
|
|
9
|
+
export interface GraphIndexOptions {
|
|
10
|
+
rootDir?: string;
|
|
11
|
+
srcDir?: string;
|
|
12
|
+
libraries?: string[];
|
|
13
|
+
indexDir?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface GraphDepthOptions {
|
|
16
|
+
depth?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface GraphNode {
|
|
19
|
+
kind: GraphNodeKind;
|
|
20
|
+
fqn: string;
|
|
21
|
+
name: string;
|
|
22
|
+
file: string;
|
|
23
|
+
origin: GraphOrigin;
|
|
24
|
+
resolved: boolean;
|
|
25
|
+
library?: string;
|
|
26
|
+
memberKind?: MemberKind;
|
|
27
|
+
displayFqn?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface GraphEdge {
|
|
30
|
+
relation: GraphRelation;
|
|
31
|
+
from: string;
|
|
32
|
+
to: string;
|
|
33
|
+
file?: string;
|
|
34
|
+
line?: number;
|
|
35
|
+
cardinality?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface GraphNeighbor {
|
|
38
|
+
node: GraphNode;
|
|
39
|
+
relation: GraphRelation;
|
|
40
|
+
direction: "outgoing" | "incoming";
|
|
41
|
+
via?: GraphNode;
|
|
42
|
+
source?: GraphNode;
|
|
43
|
+
file?: string;
|
|
44
|
+
line?: number;
|
|
45
|
+
}
|
|
46
|
+
export type GraphPathHop = GraphNeighbor;
|
|
47
|
+
export interface GraphPath {
|
|
48
|
+
from: GraphNode;
|
|
49
|
+
to: GraphNode;
|
|
50
|
+
hops: GraphPathHop[];
|
|
51
|
+
}
|
|
52
|
+
export interface GraphMember {
|
|
53
|
+
node: GraphNode;
|
|
54
|
+
relation: "HAS_MEMBER";
|
|
55
|
+
inheritedFrom?: string;
|
|
56
|
+
file?: string;
|
|
57
|
+
line?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface GraphQueryRow {
|
|
60
|
+
columns: string[];
|
|
61
|
+
values: unknown[];
|
|
62
|
+
}
|
|
63
|
+
export interface GraphQueryResult {
|
|
64
|
+
columns: string[];
|
|
65
|
+
rows: GraphQueryRow[];
|
|
66
|
+
}
|
|
67
|
+
export interface GraphSchema {
|
|
68
|
+
nodes: string[];
|
|
69
|
+
relations: GraphRelation[];
|
|
70
|
+
description: string;
|
|
71
|
+
example: string;
|
|
72
|
+
}
|
|
73
|
+
export type IndexState = "missing" | "ready" | "stale";
|
|
74
|
+
export interface IndexStatus {
|
|
75
|
+
state: IndexState;
|
|
76
|
+
blocks?: number;
|
|
77
|
+
members?: number;
|
|
78
|
+
indexDir: string;
|
|
79
|
+
}
|
|
80
|
+
export interface GraphIndexHandle {
|
|
81
|
+
readonly diagnostics: Diagnostic[];
|
|
82
|
+
readonly blocks: number;
|
|
83
|
+
readonly memberCount: number;
|
|
84
|
+
readonly filePaths: string[];
|
|
85
|
+
uses(fqn: string, options?: GraphDepthOptions): Promise<GraphNeighbor[]>;
|
|
86
|
+
usedBy(fqn: string, options?: GraphDepthOptions): Promise<GraphNeighbor[]>;
|
|
87
|
+
neighbors(fqn: string, options?: GraphDepthOptions): Promise<GraphNeighbor[]>;
|
|
88
|
+
ancestors(fqn: string, options?: GraphDepthOptions): Promise<GraphNode[]>;
|
|
89
|
+
descendants(fqn: string, options?: GraphDepthOptions): Promise<GraphNode[]>;
|
|
90
|
+
path(from: string, to: string, options?: GraphDepthOptions): Promise<GraphPath | undefined>;
|
|
91
|
+
members(fqn: string): Promise<GraphMember[]>;
|
|
92
|
+
block(fqn: string): Promise<GraphNode | undefined>;
|
|
93
|
+
schema(): GraphSchema;
|
|
94
|
+
query(cypher: string, params?: Record<string, unknown>): Promise<GraphQueryResult>;
|
|
95
|
+
close(): Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
export interface BuildIndexResult {
|
|
98
|
+
index: GraphIndexHandle;
|
|
99
|
+
diagnostics: Diagnostic[];
|
|
100
|
+
blocks: number;
|
|
101
|
+
members: number;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=types.d.ts.map
|