@shrkcrft/graph 0.1.0-alpha.11 → 0.1.0-alpha.12

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.
@@ -57,6 +57,12 @@ export declare class GraphQueryApi {
57
57
  findFile(path: string): INode | undefined;
58
58
  /** Iterate every file node in the snapshot. Cheap; in-memory walk. */
59
59
  allFiles(): IterableIterator<INode>;
60
+ /**
61
+ * Files that have at least one `unresolved:<spec>` import edge.
62
+ * Useful for `shrk graph search --kind file --has-unresolved-imports`.
63
+ * Iterates outgoing edges per file; cheap in-memory walk.
64
+ */
65
+ filesWithUnresolvedImports(): readonly INode[];
60
66
  /** Iterate every package node in the snapshot. */
61
67
  allPackages(): IterableIterator<INode>;
62
68
  findSymbol(name: string, opts?: IFindSymbolOptions): readonly INode[];
@@ -72,6 +78,8 @@ export declare class GraphQueryApi {
72
78
  referencesOf(symbolNodeId: string): readonly INode[];
73
79
  /** Packages that this package depends on (PackageDependsOn). */
74
80
  packageDeps(packageName: string): readonly INode[];
81
+ /** Packages that depend on this package (reverse PackageDependsOn). */
82
+ packageDependents(packageName: string): readonly INode[];
75
83
  /**
76
84
  * Every import cycle in the snapshot (SCC ≥ 2). Recomputes from the
77
85
  * in-memory snapshot — file paths are filled in from the snapshot's
@@ -1 +1 @@
1
- {"version":3,"file":"query-api.d.ts","sourceRoot":"","sources":["../../src/query/query-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-api.d.ts","sourceRoot":"","sources":["../../src/query/query-api.ts"],"names":[],"mappings":"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"}
@@ -73,6 +73,26 @@ export class GraphQueryApi {
73
73
  for (const n of this.fileByPath.values())
74
74
  yield n;
75
75
  }
76
+ /**
77
+ * Files that have at least one `unresolved:<spec>` import edge.
78
+ * Useful for `shrk graph search --kind file --has-unresolved-imports`.
79
+ * Iterates outgoing edges per file; cheap in-memory walk.
80
+ */
81
+ filesWithUnresolvedImports() {
82
+ const out = [];
83
+ for (const node of this.fileByPath.values()) {
84
+ const edges = this.outByFrom.get(node.id) ?? [];
85
+ for (const e of edges) {
86
+ if (e.kind !== EdgeKind.ImportsFile)
87
+ continue;
88
+ if (!e.to.startsWith('unresolved:'))
89
+ continue;
90
+ out.push(node);
91
+ break;
92
+ }
93
+ }
94
+ return out;
95
+ }
76
96
  /** Iterate every package node in the snapshot. */
77
97
  *allPackages() {
78
98
  for (const n of this.snap.nodes.values()) {
@@ -180,6 +200,19 @@ export class GraphQueryApi {
180
200
  }
181
201
  return out;
182
202
  }
203
+ /** Packages that depend on this package (reverse PackageDependsOn). */
204
+ packageDependents(packageName) {
205
+ const edges = this.inByTo.get(`package:${packageName}`) ?? [];
206
+ const out = [];
207
+ for (const e of edges) {
208
+ if (e.kind !== EdgeKind.PackageDependsOn)
209
+ continue;
210
+ const n = this.snap.nodes.get(e.from);
211
+ if (n)
212
+ out.push(n);
213
+ }
214
+ return out;
215
+ }
183
216
  /**
184
217
  * Every import cycle in the snapshot (SCC ≥ 2). Recomputes from the
185
218
  * in-memory snapshot — file paths are filled in from the snapshot's
@@ -1 +1 @@
1
- {"version":3,"file":"graph-store.d.ts","sourceRoot":"","sources":["../../src/store/graph-store.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAEJ,WAAW,EAAE,MAAM;IAIhD,MAAM,IAAI,OAAO;IAIjB,KAAK,IAAI,IAAI;IAMb;;;OAGG;IACH,aAAa,CACX,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAAC,GACjD,cAAc;IA6CjB;;;OAGG;IACH,YAAY,IAAI,cAAc;IAwC9B;;;OAGG;IACH,YAAY,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAMlE"}
1
+ {"version":3,"file":"graph-store.d.ts","sourceRoot":"","sources":["../../src/store/graph-store.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAOlE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAEJ,WAAW,EAAE,MAAM;IAIhD,MAAM,IAAI,OAAO;IAIjB,KAAK,IAAI,IAAI;IAMb;;;OAGG;IACH,aAAa,CACX,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,KAAK,EAAE,SAAS,KAAK,EAAE,EACvB,KAAK,EAAE,SAAS,gBAAgB,EAAE,EAClC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAAC,GACjD,cAAc;IA+CjB;;;OAGG;IACH,YAAY,IAAI,cAAc;IAwC9B;;;OAGG;IACH,YAAY,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAMlE"}
@@ -54,8 +54,10 @@ export class GraphStore {
54
54
  rmSync(edgesDir, { recursive: true, force: true });
55
55
  mkdirSync(nodesDir, { recursive: true });
56
56
  mkdirSync(edgesDir, { recursive: true });
57
- const nodesByKind = bucketBy(nodes, (n) => n.kind);
58
- const edgesByKind = bucketBy(edges, (e) => e.kind);
57
+ const uniqueNodes = dedupeById(nodes);
58
+ const uniqueEdges = dedupeById(edges);
59
+ const nodesByKind = bucketBy(uniqueNodes, (n) => n.kind);
60
+ const edgesByKind = bucketBy(uniqueEdges, (e) => e.kind);
59
61
  const nodeCounts = {};
60
62
  const edgeCounts = {};
61
63
  for (const [kind, list] of Object.entries(nodesByKind)) {
@@ -140,6 +142,12 @@ function bucketBy(list, key) {
140
142
  }
141
143
  return out;
142
144
  }
145
+ function dedupeById(list) {
146
+ const byId = new Map();
147
+ for (const item of list)
148
+ byId.set(item.id, item);
149
+ return [...byId.values()];
150
+ }
143
151
  function writeJsonl(path, rows) {
144
152
  const body = rows.map((r) => JSON.stringify(r)).join('\n');
145
153
  writeFileSync(path, body.length > 0 ? body + '\n' : '');
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "@shrkcrft/graph",
3
- "version": "0.1.0-alpha.11",
3
+ "version": "0.1.0-alpha.12",
4
4
  "description": "SharkCraft code intelligence graph: files, symbols, packages, imports and exports. Persistent JSONL store; on-disk index queried by every other code-intelligence package.",
5
5
  "license": "MIT",
6
6
  "author": "SharkCraft contributors",
7
7
  "type": "module",
8
8
  "main": "./dist/index.js",
9
- "types": "./dist/index.d.ts",
9
+ "types": "./dist/index.d.d.ts",
10
10
  "exports": {
11
11
  ".": {
12
12
  "types": "./dist/index.d.ts",
13
+ "bun": "./src/index.ts",
13
14
  "import": "./dist/index.js",
14
15
  "default": "./dist/index.js"
15
16
  }
@@ -44,9 +45,9 @@
44
45
  "typecheck": "tsc --noEmit -p tsconfig.json"
45
46
  },
46
47
  "dependencies": {
47
- "@shrkcrft/core": "^0.1.0-alpha.11",
48
- "@shrkcrft/boundaries": "^0.1.0-alpha.11",
49
- "@shrkcrft/inspector": "^0.1.0-alpha.11"
48
+ "@shrkcrft/core": "^0.1.0-alpha.12",
49
+ "@shrkcrft/boundaries": "^0.1.0-alpha.12",
50
+ "@shrkcrft/inspector": "^0.1.0-alpha.12"
50
51
  },
51
52
  "publishConfig": {
52
53
  "access": "public"