@jafreck/lore 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +405 -0
- package/dist/cli.d.ts +19 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +345 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/call-graph.d.ts +39 -0
- package/dist/indexer/call-graph.d.ts.map +1 -0
- package/dist/indexer/call-graph.js +193 -0
- package/dist/indexer/call-graph.js.map +1 -0
- package/dist/indexer/complexity.d.ts +9 -0
- package/dist/indexer/complexity.d.ts.map +1 -0
- package/dist/indexer/complexity.js +66 -0
- package/dist/indexer/complexity.js.map +1 -0
- package/dist/indexer/config-parser.d.ts +16 -0
- package/dist/indexer/config-parser.d.ts.map +1 -0
- package/dist/indexer/config-parser.js +261 -0
- package/dist/indexer/config-parser.js.map +1 -0
- package/dist/indexer/coverage.d.ts +13 -0
- package/dist/indexer/coverage.d.ts.map +1 -0
- package/dist/indexer/coverage.js +84 -0
- package/dist/indexer/coverage.js.map +1 -0
- package/dist/indexer/db.d.ts +38 -0
- package/dist/indexer/db.d.ts.map +1 -0
- package/dist/indexer/db.js +275 -0
- package/dist/indexer/db.js.map +1 -0
- package/dist/indexer/embedder.d.ts +70 -0
- package/dist/indexer/embedder.d.ts.map +1 -0
- package/dist/indexer/embedder.js +186 -0
- package/dist/indexer/embedder.js.map +1 -0
- package/dist/indexer/ensure-python-deps.d.ts +22 -0
- package/dist/indexer/ensure-python-deps.d.ts.map +1 -0
- package/dist/indexer/ensure-python-deps.js +47 -0
- package/dist/indexer/ensure-python-deps.js.map +1 -0
- package/dist/indexer/extractors/bash.d.ts +12 -0
- package/dist/indexer/extractors/bash.d.ts.map +1 -0
- package/dist/indexer/extractors/bash.js +57 -0
- package/dist/indexer/extractors/bash.js.map +1 -0
- package/dist/indexer/extractors/c.d.ts +12 -0
- package/dist/indexer/extractors/c.d.ts.map +1 -0
- package/dist/indexer/extractors/c.js +106 -0
- package/dist/indexer/extractors/c.js.map +1 -0
- package/dist/indexer/extractors/cpp.d.ts +12 -0
- package/dist/indexer/extractors/cpp.d.ts.map +1 -0
- package/dist/indexer/extractors/cpp.js +84 -0
- package/dist/indexer/extractors/cpp.js.map +1 -0
- package/dist/indexer/extractors/csharp.d.ts +12 -0
- package/dist/indexer/extractors/csharp.d.ts.map +1 -0
- package/dist/indexer/extractors/csharp.js +79 -0
- package/dist/indexer/extractors/csharp.js.map +1 -0
- package/dist/indexer/extractors/dart.d.ts +12 -0
- package/dist/indexer/extractors/dart.d.ts.map +1 -0
- package/dist/indexer/extractors/dart.js +80 -0
- package/dist/indexer/extractors/dart.js.map +1 -0
- package/dist/indexer/extractors/elixir.d.ts +12 -0
- package/dist/indexer/extractors/elixir.d.ts.map +1 -0
- package/dist/indexer/extractors/elixir.js +87 -0
- package/dist/indexer/extractors/elixir.js.map +1 -0
- package/dist/indexer/extractors/elm.d.ts +12 -0
- package/dist/indexer/extractors/elm.d.ts.map +1 -0
- package/dist/indexer/extractors/elm.js +87 -0
- package/dist/indexer/extractors/elm.js.map +1 -0
- package/dist/indexer/extractors/go.d.ts +12 -0
- package/dist/indexer/extractors/go.d.ts.map +1 -0
- package/dist/indexer/extractors/go.js +158 -0
- package/dist/indexer/extractors/go.js.map +1 -0
- package/dist/indexer/extractors/haskell.d.ts +12 -0
- package/dist/indexer/extractors/haskell.d.ts.map +1 -0
- package/dist/indexer/extractors/haskell.js +104 -0
- package/dist/indexer/extractors/haskell.js.map +1 -0
- package/dist/indexer/extractors/java.d.ts +12 -0
- package/dist/indexer/extractors/java.d.ts.map +1 -0
- package/dist/indexer/extractors/java.js +68 -0
- package/dist/indexer/extractors/java.js.map +1 -0
- package/dist/indexer/extractors/javascript.d.ts +13 -0
- package/dist/indexer/extractors/javascript.d.ts.map +1 -0
- package/dist/indexer/extractors/javascript.js +180 -0
- package/dist/indexer/extractors/javascript.js.map +1 -0
- package/dist/indexer/extractors/julia.d.ts +12 -0
- package/dist/indexer/extractors/julia.d.ts.map +1 -0
- package/dist/indexer/extractors/julia.js +94 -0
- package/dist/indexer/extractors/julia.js.map +1 -0
- package/dist/indexer/extractors/kotlin.d.ts +12 -0
- package/dist/indexer/extractors/kotlin.d.ts.map +1 -0
- package/dist/indexer/extractors/kotlin.js +71 -0
- package/dist/indexer/extractors/kotlin.js.map +1 -0
- package/dist/indexer/extractors/lua.d.ts +12 -0
- package/dist/indexer/extractors/lua.d.ts.map +1 -0
- package/dist/indexer/extractors/lua.js +68 -0
- package/dist/indexer/extractors/lua.js.map +1 -0
- package/dist/indexer/extractors/objc.d.ts +12 -0
- package/dist/indexer/extractors/objc.d.ts.map +1 -0
- package/dist/indexer/extractors/objc.js +129 -0
- package/dist/indexer/extractors/objc.js.map +1 -0
- package/dist/indexer/extractors/ocaml.d.ts +12 -0
- package/dist/indexer/extractors/ocaml.d.ts.map +1 -0
- package/dist/indexer/extractors/ocaml.js +92 -0
- package/dist/indexer/extractors/ocaml.js.map +1 -0
- package/dist/indexer/extractors/php.d.ts +12 -0
- package/dist/indexer/extractors/php.d.ts.map +1 -0
- package/dist/indexer/extractors/php.js +99 -0
- package/dist/indexer/extractors/php.js.map +1 -0
- package/dist/indexer/extractors/python.d.ts +12 -0
- package/dist/indexer/extractors/python.d.ts.map +1 -0
- package/dist/indexer/extractors/python.js +129 -0
- package/dist/indexer/extractors/python.js.map +1 -0
- package/dist/indexer/extractors/ruby.d.ts +12 -0
- package/dist/indexer/extractors/ruby.d.ts.map +1 -0
- package/dist/indexer/extractors/ruby.js +100 -0
- package/dist/indexer/extractors/ruby.js.map +1 -0
- package/dist/indexer/extractors/rust.d.ts +12 -0
- package/dist/indexer/extractors/rust.d.ts.map +1 -0
- package/dist/indexer/extractors/rust.js +82 -0
- package/dist/indexer/extractors/rust.js.map +1 -0
- package/dist/indexer/extractors/scala.d.ts +12 -0
- package/dist/indexer/extractors/scala.d.ts.map +1 -0
- package/dist/indexer/extractors/scala.js +91 -0
- package/dist/indexer/extractors/scala.js.map +1 -0
- package/dist/indexer/extractors/swift.d.ts +12 -0
- package/dist/indexer/extractors/swift.d.ts.map +1 -0
- package/dist/indexer/extractors/swift.js +90 -0
- package/dist/indexer/extractors/swift.js.map +1 -0
- package/dist/indexer/extractors/types.d.ts +118 -0
- package/dist/indexer/extractors/types.d.ts.map +1 -0
- package/dist/indexer/extractors/types.js +43 -0
- package/dist/indexer/extractors/types.js.map +1 -0
- package/dist/indexer/extractors/typescript.d.ts +14 -0
- package/dist/indexer/extractors/typescript.d.ts.map +1 -0
- package/dist/indexer/extractors/typescript.js +172 -0
- package/dist/indexer/extractors/typescript.js.map +1 -0
- package/dist/indexer/extractors/zig.d.ts +12 -0
- package/dist/indexer/extractors/zig.d.ts.map +1 -0
- package/dist/indexer/extractors/zig.js +95 -0
- package/dist/indexer/extractors/zig.js.map +1 -0
- package/dist/indexer/git-history.d.ts +23 -0
- package/dist/indexer/git-history.d.ts.map +1 -0
- package/dist/indexer/git-history.js +144 -0
- package/dist/indexer/git-history.js.map +1 -0
- package/dist/indexer/git-hooks.d.ts +19 -0
- package/dist/indexer/git-hooks.d.ts.map +1 -0
- package/dist/indexer/git-hooks.js +74 -0
- package/dist/indexer/git-hooks.js.map +1 -0
- package/dist/indexer/index.d.ts +83 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +431 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/parser.d.ts +30 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +114 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/poller.d.ts +50 -0
- package/dist/indexer/poller.d.ts.map +1 -0
- package/dist/indexer/poller.js +140 -0
- package/dist/indexer/poller.js.map +1 -0
- package/dist/indexer/resolver.d.ts +52 -0
- package/dist/indexer/resolver.d.ts.map +1 -0
- package/dist/indexer/resolver.js +271 -0
- package/dist/indexer/resolver.js.map +1 -0
- package/dist/indexer/test-mapper.d.ts +6 -0
- package/dist/indexer/test-mapper.d.ts.map +1 -0
- package/dist/indexer/test-mapper.js +48 -0
- package/dist/indexer/test-mapper.js.map +1 -0
- package/dist/indexer/walker.d.ts +51 -0
- package/dist/indexer/walker.d.ts.map +1 -0
- package/dist/indexer/walker.js +100 -0
- package/dist/indexer/walker.js.map +1 -0
- package/dist/indexer/watcher.d.ts +51 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +107 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/kb-server/db.d.ts +241 -0
- package/dist/kb-server/db.d.ts.map +1 -0
- package/dist/kb-server/db.js +659 -0
- package/dist/kb-server/db.js.map +1 -0
- package/dist/kb-server/server.d.ts +35 -0
- package/dist/kb-server/server.d.ts.map +1 -0
- package/dist/kb-server/server.js +240 -0
- package/dist/kb-server/server.js.map +1 -0
- package/dist/kb-server/tools/annotations.d.ts +40 -0
- package/dist/kb-server/tools/annotations.d.ts.map +1 -0
- package/dist/kb-server/tools/annotations.js +35 -0
- package/dist/kb-server/tools/annotations.js.map +1 -0
- package/dist/kb-server/tools/architecture.d.ts +60 -0
- package/dist/kb-server/tools/architecture.d.ts.map +1 -0
- package/dist/kb-server/tools/architecture.js +174 -0
- package/dist/kb-server/tools/architecture.js.map +1 -0
- package/dist/kb-server/tools/blame.d.ts +67 -0
- package/dist/kb-server/tools/blame.d.ts.map +1 -0
- package/dist/kb-server/tools/blame.js +162 -0
- package/dist/kb-server/tools/blame.js.map +1 -0
- package/dist/kb-server/tools/coverage.d.ts +67 -0
- package/dist/kb-server/tools/coverage.d.ts.map +1 -0
- package/dist/kb-server/tools/coverage.js +74 -0
- package/dist/kb-server/tools/coverage.js.map +1 -0
- package/dist/kb-server/tools/graph.d.ts +56 -0
- package/dist/kb-server/tools/graph.d.ts.map +1 -0
- package/dist/kb-server/tools/graph.js +188 -0
- package/dist/kb-server/tools/graph.js.map +1 -0
- package/dist/kb-server/tools/history.d.ts +47 -0
- package/dist/kb-server/tools/history.d.ts.map +1 -0
- package/dist/kb-server/tools/history.js +91 -0
- package/dist/kb-server/tools/history.js.map +1 -0
- package/dist/kb-server/tools/lookup.d.ts +36 -0
- package/dist/kb-server/tools/lookup.d.ts.map +1 -0
- package/dist/kb-server/tools/lookup.js +45 -0
- package/dist/kb-server/tools/lookup.js.map +1 -0
- package/dist/kb-server/tools/metrics.d.ts +73 -0
- package/dist/kb-server/tools/metrics.d.ts.map +1 -0
- package/dist/kb-server/tools/metrics.js +79 -0
- package/dist/kb-server/tools/metrics.js.map +1 -0
- package/dist/kb-server/tools/notes.d.ts +165 -0
- package/dist/kb-server/tools/notes.d.ts.map +1 -0
- package/dist/kb-server/tools/notes.js +175 -0
- package/dist/kb-server/tools/notes.js.map +1 -0
- package/dist/kb-server/tools/routes.d.ts +38 -0
- package/dist/kb-server/tools/routes.d.ts.map +1 -0
- package/dist/kb-server/tools/routes.js +38 -0
- package/dist/kb-server/tools/routes.js.map +1 -0
- package/dist/kb-server/tools/search.d.ts +60 -0
- package/dist/kb-server/tools/search.d.ts.map +1 -0
- package/dist/kb-server/tools/search.js +170 -0
- package/dist/kb-server/tools/search.js.map +1 -0
- package/dist/kb-server/tools/snippet.d.ts +44 -0
- package/dist/kb-server/tools/snippet.d.ts.map +1 -0
- package/dist/kb-server/tools/snippet.js +49 -0
- package/dist/kb-server/tools/snippet.js.map +1 -0
- package/dist/kb-server/tools/test-map.d.ts +38 -0
- package/dist/kb-server/tools/test-map.d.ts.map +1 -0
- package/dist/kb-server/tools/test-map.js +32 -0
- package/dist/kb-server/tools/test-map.js.map +1 -0
- package/dist/kb-server/tools/writeback.d.ts +49 -0
- package/dist/kb-server/tools/writeback.d.ts.map +1 -0
- package/dist/kb-server/tools/writeback.js +68 -0
- package/dist/kb-server/tools/writeback.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../../src/indexer/poller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACvD;AAUD;;;;;;;;;;;GAWG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAEtE,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB;IAQnF,uEAAuE;IACvE,KAAK,IAAI,IAAI;IAKb,iCAAiC;IACjC,IAAI,IAAI,IAAI;YASE,IAAI;CAuFnB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/poller
|
|
3
|
+
*
|
|
4
|
+
* FilePoller periodically walks the directory tree, diffs file mtimes against
|
|
5
|
+
* a stored snapshot, and calls `IndexBuilder.update()` for any files that were
|
|
6
|
+
* created, modified, or deleted since the last poll.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { IndexBuilder } from './index.js';
|
|
11
|
+
import { walkFiles } from './walker.js';
|
|
12
|
+
const COVERAGE_REPORT_RELATIVE_PATHS = [
|
|
13
|
+
'coverage/lcov.info',
|
|
14
|
+
'coverage/cobertura-coverage.xml',
|
|
15
|
+
'coverage.xml',
|
|
16
|
+
];
|
|
17
|
+
// ─── FilePoller ───────────────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Polls a directory tree on a configurable interval, compares mtimes against
|
|
20
|
+
* a snapshot, and triggers incremental index updates via `IndexBuilder.update()`.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const poller = new FilePoller('/path/to/kb.db', { rootDir: '/path/to/src' });
|
|
25
|
+
* poller.start();
|
|
26
|
+
* // ...later...
|
|
27
|
+
* poller.stop();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class FilePoller {
|
|
31
|
+
dbPath;
|
|
32
|
+
walkerConfig;
|
|
33
|
+
intervalMs;
|
|
34
|
+
enabled;
|
|
35
|
+
history;
|
|
36
|
+
/** Maps absolute path → last seen mtime (ms since epoch). */
|
|
37
|
+
snapshot = new Map();
|
|
38
|
+
timer = null;
|
|
39
|
+
pollRunning = false;
|
|
40
|
+
constructor(dbPath, walkerConfig, options = {}) {
|
|
41
|
+
this.dbPath = dbPath;
|
|
42
|
+
this.walkerConfig = walkerConfig;
|
|
43
|
+
this.intervalMs = options.intervalMs ?? 5000;
|
|
44
|
+
this.enabled = options.enabled ?? true;
|
|
45
|
+
this.history = options.history ?? false;
|
|
46
|
+
}
|
|
47
|
+
/** Begin polling `walkerConfig.rootDir` at the configured interval. */
|
|
48
|
+
start() {
|
|
49
|
+
if (!this.enabled || this.timer !== null)
|
|
50
|
+
return;
|
|
51
|
+
this.timer = setInterval(() => this.poll(), this.intervalMs);
|
|
52
|
+
}
|
|
53
|
+
/** Stop the polling interval. */
|
|
54
|
+
stop() {
|
|
55
|
+
if (this.timer !== null) {
|
|
56
|
+
clearInterval(this.timer);
|
|
57
|
+
this.timer = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ─── Private helpers ──────────────────────────────────────────────────────
|
|
61
|
+
async poll() {
|
|
62
|
+
if (this.pollRunning)
|
|
63
|
+
return;
|
|
64
|
+
this.pollRunning = true;
|
|
65
|
+
try {
|
|
66
|
+
let errorCount = 0;
|
|
67
|
+
const changed = [];
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = await walkFiles(this.walkerConfig);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
process.stderr.write(JSON.stringify({ level: 'error', source: 'FilePoller', message: String(err) }) + '\n');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const currentPaths = new Set();
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
currentPaths.add(entry.path);
|
|
79
|
+
let mtime;
|
|
80
|
+
try {
|
|
81
|
+
mtime = fs.statSync(entry.path).mtimeMs;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
continue; // file vanished between walk and stat
|
|
85
|
+
}
|
|
86
|
+
const prev = this.snapshot.get(entry.path);
|
|
87
|
+
if (prev === undefined || prev !== mtime) {
|
|
88
|
+
changed.push(entry.path);
|
|
89
|
+
this.snapshot.set(entry.path, mtime);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const relPath of COVERAGE_REPORT_RELATIVE_PATHS) {
|
|
93
|
+
const coveragePath = path.join(this.walkerConfig.rootDir, relPath);
|
|
94
|
+
let mtime;
|
|
95
|
+
try {
|
|
96
|
+
mtime = fs.statSync(coveragePath).mtimeMs;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
currentPaths.add(coveragePath);
|
|
102
|
+
const prev = this.snapshot.get(coveragePath);
|
|
103
|
+
if (prev === undefined || prev !== mtime) {
|
|
104
|
+
changed.push(coveragePath);
|
|
105
|
+
this.snapshot.set(coveragePath, mtime);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Detect deletions: paths in snapshot that are no longer on disk
|
|
109
|
+
for (const [p] of this.snapshot) {
|
|
110
|
+
if (!currentPaths.has(p)) {
|
|
111
|
+
changed.push(p);
|
|
112
|
+
this.snapshot.delete(p);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (changed.length > 0) {
|
|
116
|
+
const builder = new IndexBuilder(this.dbPath, this.walkerConfig, undefined, {
|
|
117
|
+
history: this.history,
|
|
118
|
+
});
|
|
119
|
+
try {
|
|
120
|
+
await builder.update(changed);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
errorCount++;
|
|
124
|
+
process.stderr.write(JSON.stringify({ level: 'error', source: 'FilePoller', message: String(err) }) + '\n');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
process.stderr.write(JSON.stringify({
|
|
128
|
+
level: 'info',
|
|
129
|
+
source: 'FilePoller',
|
|
130
|
+
message: 'poll cycle complete',
|
|
131
|
+
changed: changed.length,
|
|
132
|
+
errors: errorCount,
|
|
133
|
+
}) + '\n');
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
this.pollRunning = false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=poller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/indexer/poller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/resolver
|
|
3
|
+
*
|
|
4
|
+
* Converts raw import strings extracted from source files into resolved file
|
|
5
|
+
* paths (or marks them as external dependencies when resolution fails).
|
|
6
|
+
*
|
|
7
|
+
* Resolution strategies are language-specific. When a manifest file
|
|
8
|
+
* (package.json, go.mod, Cargo.toml) is present in the root directory its
|
|
9
|
+
* declared dependencies are used as a fast-path to classify an import as
|
|
10
|
+
* external without attempting disk access.
|
|
11
|
+
*/
|
|
12
|
+
import type { RawImport } from './extractors/types.js';
|
|
13
|
+
export interface ResolvedImport {
|
|
14
|
+
/** Original raw import string. */
|
|
15
|
+
rawSource: string;
|
|
16
|
+
/** Absolute resolved file path (present when the import maps to a project file). */
|
|
17
|
+
resolvedPath?: string;
|
|
18
|
+
/** True when the import is an external (third-party / stdlib) dependency. */
|
|
19
|
+
isExternal: boolean;
|
|
20
|
+
/** Name of the external package/module (same as rawSource for most languages). */
|
|
21
|
+
externalName?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class ImportResolver {
|
|
24
|
+
/** Cache of parsed manifest dependency sets, keyed by rootDir. */
|
|
25
|
+
private readonly manifestCache;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a single raw import extracted from `fromFile`.
|
|
28
|
+
*
|
|
29
|
+
* @param rawImport The import object produced by a SymbolExtractor.
|
|
30
|
+
* @param fromFile Absolute path of the file that contains the import.
|
|
31
|
+
* @param rootDir Absolute path to the project root directory.
|
|
32
|
+
* @param language Language identifier (e.g. `'typescript'`, `'go'`).
|
|
33
|
+
*/
|
|
34
|
+
resolve(rawImport: RawImport, fromFile: string, rootDir: string, language: string): ResolvedImport;
|
|
35
|
+
private resolveJs;
|
|
36
|
+
private resolveGo;
|
|
37
|
+
private resolvePython;
|
|
38
|
+
private resolveRust;
|
|
39
|
+
private resolveJava;
|
|
40
|
+
private resolveCSharp;
|
|
41
|
+
private resolveC;
|
|
42
|
+
private parsePackageJson;
|
|
43
|
+
private parseGoMod;
|
|
44
|
+
/** Returns the set of crate names declared in Cargo.toml [dependencies]. */
|
|
45
|
+
private parseCargoToml;
|
|
46
|
+
private resolveRelative;
|
|
47
|
+
private tryPythonModule;
|
|
48
|
+
private fileExists;
|
|
49
|
+
private dirExists;
|
|
50
|
+
private markExternal;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/indexer/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,WAAW,cAAc;IAC7B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,qBAAa,cAAc;IACzB,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE;;;;;;;OAOG;IACH,OAAO,CACL,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,cAAc;IAkCjB,OAAO,CAAC,SAAS;IA+BjB,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,UAAU;IAuBlB,4EAA4E;IAC5E,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/resolver
|
|
3
|
+
*
|
|
4
|
+
* Converts raw import strings extracted from source files into resolved file
|
|
5
|
+
* paths (or marks them as external dependencies when resolution fails).
|
|
6
|
+
*
|
|
7
|
+
* Resolution strategies are language-specific. When a manifest file
|
|
8
|
+
* (package.json, go.mod, Cargo.toml) is present in the root directory its
|
|
9
|
+
* declared dependencies are used as a fast-path to classify an import as
|
|
10
|
+
* external without attempting disk access.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
// ─── ImportResolver ───────────────────────────────────────────────────────────
|
|
15
|
+
export class ImportResolver {
|
|
16
|
+
/** Cache of parsed manifest dependency sets, keyed by rootDir. */
|
|
17
|
+
manifestCache = new Map();
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a single raw import extracted from `fromFile`.
|
|
20
|
+
*
|
|
21
|
+
* @param rawImport The import object produced by a SymbolExtractor.
|
|
22
|
+
* @param fromFile Absolute path of the file that contains the import.
|
|
23
|
+
* @param rootDir Absolute path to the project root directory.
|
|
24
|
+
* @param language Language identifier (e.g. `'typescript'`, `'go'`).
|
|
25
|
+
*/
|
|
26
|
+
resolve(rawImport, fromFile, rootDir, language) {
|
|
27
|
+
const source = rawImport.source;
|
|
28
|
+
switch (language) {
|
|
29
|
+
case 'typescript':
|
|
30
|
+
case 'javascript':
|
|
31
|
+
return this.resolveJs(source, fromFile, rootDir);
|
|
32
|
+
case 'go':
|
|
33
|
+
return this.resolveGo(source, fromFile, rootDir);
|
|
34
|
+
case 'python':
|
|
35
|
+
return this.resolvePython(source, fromFile, rootDir);
|
|
36
|
+
case 'rust':
|
|
37
|
+
return this.resolveRust(source, fromFile, rootDir);
|
|
38
|
+
case 'java':
|
|
39
|
+
return this.resolveJava(source, fromFile, rootDir);
|
|
40
|
+
case 'csharp':
|
|
41
|
+
return this.resolveCSharp(source, fromFile, rootDir);
|
|
42
|
+
case 'c':
|
|
43
|
+
case 'cpp':
|
|
44
|
+
return this.resolveC(source, fromFile, rootDir);
|
|
45
|
+
default:
|
|
46
|
+
return this.markExternal(source);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ─── Language-specific strategies ────────────────────────────────────────
|
|
50
|
+
resolveJs(source, fromFile, rootDir) {
|
|
51
|
+
if (source.startsWith('.')) {
|
|
52
|
+
// Relative import
|
|
53
|
+
const resolved = this.resolveRelative(source, fromFile, [
|
|
54
|
+
'',
|
|
55
|
+
'.ts',
|
|
56
|
+
'.tsx',
|
|
57
|
+
'.js',
|
|
58
|
+
'.jsx',
|
|
59
|
+
'/index.ts',
|
|
60
|
+
'/index.js',
|
|
61
|
+
]);
|
|
62
|
+
if (resolved)
|
|
63
|
+
return { rawSource: source, resolvedPath: resolved, isExternal: false };
|
|
64
|
+
return this.markExternal(source);
|
|
65
|
+
}
|
|
66
|
+
// Absolute / bare specifier — check package.json
|
|
67
|
+
const pkgDeps = this.parsePackageJson(rootDir);
|
|
68
|
+
const pkgName = source.split('/')[0] ?? source;
|
|
69
|
+
if (pkgDeps.has(pkgName) || pkgDeps.size === 0) {
|
|
70
|
+
return this.markExternal(source);
|
|
71
|
+
}
|
|
72
|
+
// Could be a path alias or workspace package — fall back to external
|
|
73
|
+
return this.markExternal(source);
|
|
74
|
+
}
|
|
75
|
+
resolveGo(source, _fromFile, rootDir) {
|
|
76
|
+
const moduleName = this.parseGoMod(rootDir);
|
|
77
|
+
if (moduleName && source.startsWith(moduleName)) {
|
|
78
|
+
// Internal package: module/sub/pkg → rootDir/sub/pkg
|
|
79
|
+
const rel = source.slice(moduleName.length).replace(/^\//, '');
|
|
80
|
+
const candidate = path.join(rootDir, rel);
|
|
81
|
+
if (this.dirExists(candidate)) {
|
|
82
|
+
return { rawSource: source, resolvedPath: candidate, isExternal: false };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return this.markExternal(source);
|
|
86
|
+
}
|
|
87
|
+
resolvePython(source, fromFile, rootDir) {
|
|
88
|
+
if (source.startsWith('.')) {
|
|
89
|
+
// Relative import (e.g. `.utils`, `..models`)
|
|
90
|
+
const dots = source.match(/^\.+/)?.[0].length ?? 1;
|
|
91
|
+
const modPath = source.slice(dots).replace(/\./g, '/');
|
|
92
|
+
let base = path.dirname(fromFile);
|
|
93
|
+
for (let i = 1; i < dots; i++)
|
|
94
|
+
base = path.dirname(base);
|
|
95
|
+
const candidate = path.join(base, modPath.length ? modPath : '');
|
|
96
|
+
const resolved = this.tryPythonModule(candidate);
|
|
97
|
+
if (resolved)
|
|
98
|
+
return { rawSource: source, resolvedPath: resolved, isExternal: false };
|
|
99
|
+
return this.markExternal(source);
|
|
100
|
+
}
|
|
101
|
+
// Absolute — try to find in rootDir
|
|
102
|
+
const candidate = path.join(rootDir, source.replace(/\./g, '/'));
|
|
103
|
+
const resolved = this.tryPythonModule(candidate);
|
|
104
|
+
if (resolved)
|
|
105
|
+
return { rawSource: source, resolvedPath: resolved, isExternal: false };
|
|
106
|
+
return this.markExternal(source);
|
|
107
|
+
}
|
|
108
|
+
resolveRust(source, _fromFile, rootDir) {
|
|
109
|
+
// `use crate::…` and `use self::…` are always internal but we cannot
|
|
110
|
+
// resolve to a file path without walking the crate graph.
|
|
111
|
+
if (source.startsWith('crate::') || source.startsWith('self::') || source.startsWith('super::')) {
|
|
112
|
+
return { rawSource: source, isExternal: false };
|
|
113
|
+
}
|
|
114
|
+
// Check Cargo.toml to distinguish workspace crates from third-party deps.
|
|
115
|
+
const cargoDeps = this.parseCargoToml(rootDir);
|
|
116
|
+
const crateName = source.split('::')[0] ?? source;
|
|
117
|
+
if (cargoDeps.has(crateName)) {
|
|
118
|
+
return { rawSource: source, isExternal: true };
|
|
119
|
+
}
|
|
120
|
+
// If the crate name isn't in Cargo.toml [dependencies], assume it's
|
|
121
|
+
// a workspace-internal crate or stdlib crate — mark as external since
|
|
122
|
+
// we can't resolve the file path without a full crate graph.
|
|
123
|
+
return this.markExternal(source);
|
|
124
|
+
}
|
|
125
|
+
resolveJava(source, _fromFile, rootDir) {
|
|
126
|
+
// Java imports are fully-qualified class names.
|
|
127
|
+
// Try to find matching .java file under rootDir/src.
|
|
128
|
+
const rel = source.replace(/\./g, '/') + '.java';
|
|
129
|
+
for (const srcRoot of ['src/main/java', 'src', '']) {
|
|
130
|
+
const candidate = path.join(rootDir, srcRoot, rel);
|
|
131
|
+
if (this.fileExists(candidate)) {
|
|
132
|
+
return { rawSource: source, resolvedPath: candidate, isExternal: false };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return this.markExternal(source);
|
|
136
|
+
}
|
|
137
|
+
resolveCSharp(source, _fromFile, _rootDir) {
|
|
138
|
+
// C# `using` directives are namespace identifiers, not file paths.
|
|
139
|
+
// We cannot reliably map them to files without a project model.
|
|
140
|
+
return this.markExternal(source);
|
|
141
|
+
}
|
|
142
|
+
resolveC(source, fromFile, rootDir) {
|
|
143
|
+
// Quoted includes are relative; angle-bracket includes are system/external.
|
|
144
|
+
if (!source.startsWith('<')) {
|
|
145
|
+
const resolved = this.resolveRelative('./' + source, fromFile, ['']) ??
|
|
146
|
+
this.resolveRelative('./' + source, rootDir + '/fake', ['']);
|
|
147
|
+
if (resolved)
|
|
148
|
+
return { rawSource: source, resolvedPath: resolved, isExternal: false };
|
|
149
|
+
}
|
|
150
|
+
return this.markExternal(source);
|
|
151
|
+
}
|
|
152
|
+
// ─── Manifest parsers ─────────────────────────────────────────────────────
|
|
153
|
+
parsePackageJson(rootDir) {
|
|
154
|
+
const cacheKey = `npm:${rootDir}`;
|
|
155
|
+
if (this.manifestCache.has(cacheKey))
|
|
156
|
+
return this.manifestCache.get(cacheKey);
|
|
157
|
+
const deps = new Set();
|
|
158
|
+
const pkgPath = path.join(rootDir, 'package.json');
|
|
159
|
+
try {
|
|
160
|
+
const raw = fs.readFileSync(pkgPath, 'utf8');
|
|
161
|
+
const pkg = JSON.parse(raw);
|
|
162
|
+
for (const section of ['dependencies', 'devDependencies', 'peerDependencies']) {
|
|
163
|
+
const obj = pkg[section];
|
|
164
|
+
if (obj && typeof obj === 'object') {
|
|
165
|
+
for (const name of Object.keys(obj)) {
|
|
166
|
+
deps.add(name);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// No package.json or unreadable — treat all bare specifiers as external
|
|
173
|
+
}
|
|
174
|
+
this.manifestCache.set(cacheKey, deps);
|
|
175
|
+
return deps;
|
|
176
|
+
}
|
|
177
|
+
parseGoMod(rootDir) {
|
|
178
|
+
const cacheKey = `go:${rootDir}`;
|
|
179
|
+
if (this.manifestCache.has(cacheKey)) {
|
|
180
|
+
const cached = this.manifestCache.get(cacheKey);
|
|
181
|
+
return cached.size > 0 ? [...cached][0] : null;
|
|
182
|
+
}
|
|
183
|
+
let moduleName = null;
|
|
184
|
+
const modPath = path.join(rootDir, 'go.mod');
|
|
185
|
+
try {
|
|
186
|
+
const raw = fs.readFileSync(modPath, 'utf8');
|
|
187
|
+
const match = raw.match(/^module\s+(\S+)/m);
|
|
188
|
+
if (match)
|
|
189
|
+
moduleName = match[1] ?? null;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// No go.mod
|
|
193
|
+
}
|
|
194
|
+
const set = new Set();
|
|
195
|
+
if (moduleName)
|
|
196
|
+
set.add(moduleName);
|
|
197
|
+
this.manifestCache.set(cacheKey, set);
|
|
198
|
+
return moduleName;
|
|
199
|
+
}
|
|
200
|
+
/** Returns the set of crate names declared in Cargo.toml [dependencies]. */
|
|
201
|
+
parseCargoToml(rootDir) {
|
|
202
|
+
const cacheKey = `cargo:${rootDir}`;
|
|
203
|
+
if (this.manifestCache.has(cacheKey))
|
|
204
|
+
return this.manifestCache.get(cacheKey);
|
|
205
|
+
const deps = new Set();
|
|
206
|
+
const cargoPath = path.join(rootDir, 'Cargo.toml');
|
|
207
|
+
try {
|
|
208
|
+
const raw = fs.readFileSync(cargoPath, 'utf8');
|
|
209
|
+
// Minimal TOML parsing: grab names from [dependencies] section lines
|
|
210
|
+
let inDeps = false;
|
|
211
|
+
for (const line of raw.split('\n')) {
|
|
212
|
+
if (/^\[dependencies\]/.test(line)) {
|
|
213
|
+
inDeps = true;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (/^\[/.test(line)) {
|
|
217
|
+
inDeps = false;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (inDeps) {
|
|
221
|
+
const m = line.match(/^([A-Za-z0-9_-]+)\s*=/);
|
|
222
|
+
if (m)
|
|
223
|
+
deps.add(m[1]);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// No Cargo.toml
|
|
229
|
+
}
|
|
230
|
+
this.manifestCache.set(cacheKey, deps);
|
|
231
|
+
return deps;
|
|
232
|
+
}
|
|
233
|
+
// ─── Low-level helpers ────────────────────────────────────────────────────
|
|
234
|
+
resolveRelative(source, fromFile, extensions) {
|
|
235
|
+
const base = path.resolve(path.dirname(fromFile), source);
|
|
236
|
+
for (const ext of extensions) {
|
|
237
|
+
const candidate = base + ext;
|
|
238
|
+
if (this.fileExists(candidate))
|
|
239
|
+
return candidate;
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
tryPythonModule(base) {
|
|
244
|
+
for (const suffix of ['.py', '/__init__.py']) {
|
|
245
|
+
const candidate = base + suffix;
|
|
246
|
+
if (this.fileExists(candidate))
|
|
247
|
+
return candidate;
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
fileExists(p) {
|
|
252
|
+
try {
|
|
253
|
+
return fs.statSync(p).isFile();
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
dirExists(p) {
|
|
260
|
+
try {
|
|
261
|
+
return fs.statSync(p).isDirectory();
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
markExternal(source) {
|
|
268
|
+
return { rawSource: source, isExternal: true, externalName: source };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/indexer/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Database } from './db.js';
|
|
2
|
+
export type TestMappingConfidence = 'import' | 'coverage' | 'heuristic';
|
|
3
|
+
export declare const TEST_MAPPING_CONFIDENCES: readonly TestMappingConfidence[];
|
|
4
|
+
export declare function isTestFilePath(filePath: string): boolean;
|
|
5
|
+
export declare function refreshTestMappings(db: Database.Database, branch: string): void;
|
|
6
|
+
//# sourceMappingURL=test-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-mapper.d.ts","sourceRoot":"","sources":["../../src/indexer/test-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAExE,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAIpE,CAAC;AAIF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBxD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmC/E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export const TEST_MAPPING_CONFIDENCES = [
|
|
2
|
+
'import',
|
|
3
|
+
'coverage',
|
|
4
|
+
'heuristic',
|
|
5
|
+
];
|
|
6
|
+
const TEST_DIRECTORY_SEGMENTS = new Set(['tests', '__tests__', 'spec']);
|
|
7
|
+
export function isTestFilePath(filePath) {
|
|
8
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
9
|
+
const normalizedLowerPath = normalizedPath.toLowerCase();
|
|
10
|
+
const fileName = normalizedPath.split('/').pop() ?? '';
|
|
11
|
+
const fileNameLower = fileName.toLowerCase();
|
|
12
|
+
const pathSegments = normalizedLowerPath.split('/');
|
|
13
|
+
if (pathSegments.some((segment) => TEST_DIRECTORY_SEGMENTS.has(segment))) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (fileNameLower.includes('.test.') || fileNameLower.includes('.spec.')) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
if (fileNameLower.startsWith('test_')) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
return fileNameLower.includes('_test.');
|
|
23
|
+
}
|
|
24
|
+
export function refreshTestMappings(db, branch) {
|
|
25
|
+
const tx = db.transaction(() => {
|
|
26
|
+
db.prepare(`DELETE FROM test_mappings
|
|
27
|
+
WHERE test_file_id IN (SELECT id FROM files WHERE branch = ?)
|
|
28
|
+
OR source_file_id IN (SELECT id FROM files WHERE branch = ?)`).run(branch, branch);
|
|
29
|
+
const rows = db
|
|
30
|
+
.prepare(`SELECT DISTINCT fi.file_id AS test_file_id, fi.resolved_id AS source_file_id, test_files.path AS test_file_path
|
|
31
|
+
FROM file_imports fi
|
|
32
|
+
JOIN files test_files ON test_files.id = fi.file_id
|
|
33
|
+
JOIN files source_files ON source_files.id = fi.resolved_id
|
|
34
|
+
WHERE test_files.branch = ?
|
|
35
|
+
AND source_files.branch = ?
|
|
36
|
+
AND fi.resolved_id IS NOT NULL`)
|
|
37
|
+
.all(branch, branch);
|
|
38
|
+
const insert = db.prepare(`INSERT OR REPLACE INTO test_mappings (test_file_id, source_file_id, confidence)
|
|
39
|
+
VALUES (?, ?, 'import')`);
|
|
40
|
+
for (const row of rows) {
|
|
41
|
+
if (!isTestFilePath(row.test_file_path))
|
|
42
|
+
continue;
|
|
43
|
+
insert.run(row.test_file_id, row.source_file_id);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
tx();
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=test-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-mapper.js","sourceRoot":"","sources":["../../src/indexer/test-mapper.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,QAAQ;IACR,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAqB,EAAE,MAAc;IACvE,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7B,EAAE,CAAC,OAAO,CACR;;uEAEiE,CAClE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;;;;;0CAMkC,CACnC;aACA,GAAG,CAAC,MAAM,EAAE,MAAM,CAInB,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;+BACyB,CAC1B,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;gBAAE,SAAS;YAClD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,EAAE,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module indexer/walker
|
|
3
|
+
*
|
|
4
|
+
* Walks a directory tree using fast-glob and maps each file to a detected
|
|
5
|
+
* programming language based on its extension.
|
|
6
|
+
*/
|
|
7
|
+
/** Configuration for a `walkFiles` call. */
|
|
8
|
+
export interface WalkerConfig {
|
|
9
|
+
/** Absolute path to the directory to scan. */
|
|
10
|
+
rootDir: string;
|
|
11
|
+
/**
|
|
12
|
+
* Glob patterns (relative to `rootDir`) for files to include.
|
|
13
|
+
* Defaults to `['**\/*']` when empty or omitted.
|
|
14
|
+
*/
|
|
15
|
+
includeGlobs?: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Glob patterns (relative to `rootDir`) for paths to exclude.
|
|
18
|
+
* Merged with the built-in default exclusion list.
|
|
19
|
+
*/
|
|
20
|
+
excludeGlobs?: string[];
|
|
21
|
+
/**
|
|
22
|
+
* Explicit file extensions to accept (with leading dot, e.g. `'.ts'`).
|
|
23
|
+
* When provided, files whose extension is not in this list are skipped.
|
|
24
|
+
* When omitted, all extensions that map to a known language are accepted.
|
|
25
|
+
*/
|
|
26
|
+
extensions?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* Git branch name to associate with indexed files.
|
|
29
|
+
* When omitted, indexing resolves the current branch from git.
|
|
30
|
+
*/
|
|
31
|
+
branch?: string;
|
|
32
|
+
}
|
|
33
|
+
/** A single file discovered by `walkFiles`. */
|
|
34
|
+
export interface FileEntry {
|
|
35
|
+
/** Absolute path to the file. */
|
|
36
|
+
path: string;
|
|
37
|
+
/** Detected programming language (lower-case identifier). */
|
|
38
|
+
language: string;
|
|
39
|
+
}
|
|
40
|
+
export declare const EXT_TO_LANG: Record<string, string>;
|
|
41
|
+
/**
|
|
42
|
+
* Walks `config.rootDir` and returns every source file that can be mapped
|
|
43
|
+
* to a known programming language.
|
|
44
|
+
*/
|
|
45
|
+
export declare function walkFiles(config: WalkerConfig): Promise<FileEntry[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Detect the Lore language for a single file path using extension mapping.
|
|
48
|
+
* Returns `undefined` when the extension is unknown or filtered out.
|
|
49
|
+
*/
|
|
50
|
+
export declare function detectLanguageForPath(filePath: string, config?: Pick<WalkerConfig, 'extensions'>): string | undefined;
|
|
51
|
+
//# sourceMappingURL=walker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../../src/indexer/walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyC9C,CAAC;AAcF;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkC1E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,GAAG,SAAS,CAIrH"}
|