@wrongstack/tools 0.296.2 → 0.296.4
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/dist/browser/artifacts.d.ts +2 -0
- package/dist/browser/artifacts.d.ts.map +1 -1
- package/dist/browser/index.js +41 -0
- package/dist/browser/index.js.map +2 -2
- package/dist/builtin.js +1812 -1426
- package/dist/builtin.js.map +4 -4
- package/dist/codebase-index/background-indexer.d.ts.map +1 -1
- package/dist/codebase-index/dead-code-scan.d.ts +2 -2
- package/dist/codebase-index/dead-code-scan.d.ts.map +1 -1
- package/dist/codebase-index/index.d.ts +1 -0
- package/dist/codebase-index/index.d.ts.map +1 -1
- package/dist/codebase-index/index.js +1827 -1542
- package/dist/codebase-index/index.js.map +4 -4
- package/dist/codebase-index/project-server-client.d.ts +13 -1
- package/dist/codebase-index/project-server-client.d.ts.map +1 -1
- package/dist/codebase-index/project-server-endpoint.d.ts +29 -1
- package/dist/codebase-index/project-server-endpoint.d.ts.map +1 -1
- package/dist/codebase-index/project-server.js +226 -152
- package/dist/codebase-index/project-server.js.map +4 -4
- package/dist/codebase-index/refs-extractor.d.ts.map +1 -1
- package/dist/codebase-index/ts-parser.d.ts.map +1 -1
- package/dist/codebase-index/worker.js +214 -145
- package/dist/codebase-index/worker.js.map +3 -3
- package/dist/codebase-index/writer.d.ts +19 -1
- package/dist/codebase-index/writer.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1851 -1462
- package/dist/index.js.map +4 -4
- package/dist/pack.js +1812 -1426
- package/dist/pack.js.map +4 -4
- package/dist/read.d.ts +31 -0
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +5465 -78
- package/dist/read.js.map +4 -4
- package/dist/tool-tier.js +1812 -1426
- package/dist/tool-tier.js.map +4 -4
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs-extractor.d.ts","sourceRoot":"","sources":["../../src/codebase-index/refs-extractor.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAO5E,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsFnD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"refs-extractor.d.ts","sourceRoot":"","sources":["../../src/codebase-index/refs-extractor.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAO5E,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsFnD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAuKD,uFAAuF;AACvF,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAU1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-parser.d.ts","sourceRoot":"","sources":["../../src/codebase-index/ts-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,WAAW,EAA0C,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ts-parser.d.ts","sourceRoot":"","sources":["../../src/codebase-index/ts-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,WAAW,EAA0C,UAAU,EAAE,MAAM,aAAa,CAAC;AAmInG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAyH3E;AA+GD,6EAA6E;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -252,11 +252,18 @@ async function parseSymbols(opts) {
|
|
|
252
252
|
} else if (ts.isHeritageClause(node)) {
|
|
253
253
|
for (const t of node.types) {
|
|
254
254
|
const name = getTypeName(t.expression);
|
|
255
|
-
if (name)
|
|
255
|
+
if (name)
|
|
256
|
+
refs.push({
|
|
257
|
+
fromId: 0,
|
|
258
|
+
toName: name,
|
|
259
|
+
callType: node.token === ts.SyntaxKind.ExtendsKeyword ? "inherit" : "implement",
|
|
260
|
+
line: lineNum
|
|
261
|
+
});
|
|
256
262
|
}
|
|
257
263
|
} else if (ts.isImportDeclaration(node)) {
|
|
258
|
-
|
|
259
|
-
|
|
264
|
+
emitImportSpecifierRefs(node, refs, lineNum);
|
|
265
|
+
} else if (ts.isExportDeclaration(node) && node.moduleSpecifier) {
|
|
266
|
+
emitExportSpecifierRefs(node, refs, lineNum);
|
|
260
267
|
}
|
|
261
268
|
const scopeIdx = scopeParts.length;
|
|
262
269
|
pushScopeName(node, scopeParts);
|
|
@@ -272,11 +279,6 @@ function getTypeName(name) {
|
|
|
272
279
|
if (ts.isQualifiedName(name)) return `${getTypeName(name.left)}.${name.right.text}`;
|
|
273
280
|
return "";
|
|
274
281
|
}
|
|
275
|
-
function getModuleName(node) {
|
|
276
|
-
const moduleSpecifier = node.moduleSpecifier;
|
|
277
|
-
if (ts.isStringLiteral(moduleSpecifier)) return moduleSpecifier.text;
|
|
278
|
-
return "";
|
|
279
|
-
}
|
|
280
282
|
function deduplicateRefs(refs) {
|
|
281
283
|
const seen = /* @__PURE__ */ new Set();
|
|
282
284
|
return refs.filter((r) => {
|
|
@@ -286,6 +288,44 @@ function deduplicateRefs(refs) {
|
|
|
286
288
|
return true;
|
|
287
289
|
});
|
|
288
290
|
}
|
|
291
|
+
function getImportSpecifierName(spec) {
|
|
292
|
+
return spec.propertyName?.text ?? spec.name.text;
|
|
293
|
+
}
|
|
294
|
+
function emitImportSpecifierRefs(node, refs, lineNum) {
|
|
295
|
+
const clause = node.importClause;
|
|
296
|
+
if (!clause) return;
|
|
297
|
+
if (clause.name) {
|
|
298
|
+
refs.push({ fromId: 0, toName: clause.name.text, callType: "import", line: lineNum });
|
|
299
|
+
}
|
|
300
|
+
const bindings = clause.namedBindings;
|
|
301
|
+
if (!bindings) return;
|
|
302
|
+
if (ts.isNamedImports(bindings)) {
|
|
303
|
+
for (const element of bindings.elements) {
|
|
304
|
+
refs.push({
|
|
305
|
+
fromId: 0,
|
|
306
|
+
toName: getImportSpecifierName(element),
|
|
307
|
+
callType: "import",
|
|
308
|
+
line: lineNum
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
} else if (ts.isNamespaceImport(bindings)) {
|
|
312
|
+
refs.push({ fromId: 0, toName: bindings.name.text, callType: "import", line: lineNum });
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
function emitExportSpecifierRefs(node, refs, lineNum) {
|
|
316
|
+
const clause = node.exportClause;
|
|
317
|
+
if (clause && ts.isNamespaceExport(clause)) {
|
|
318
|
+
refs.push({ fromId: 0, toName: clause.name.text, callType: "import", line: lineNum });
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (clause && ts.isNamedExports(clause)) {
|
|
322
|
+
for (const element of clause.elements) {
|
|
323
|
+
const originalName = element.propertyName?.text ?? element.name.text;
|
|
324
|
+
refs.push({ fromId: 0, toName: originalName, callType: "import", line: lineNum });
|
|
325
|
+
}
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
289
329
|
var ts, tsLoad, kindMapCache;
|
|
290
330
|
var init_ts_parser = __esm({
|
|
291
331
|
"src/codebase-index/ts-parser.ts"() {
|
|
@@ -2042,42 +2082,6 @@ import { expectDefined as expectDefined4 } from "@wrongstack/core/utils";
|
|
|
2042
2082
|
import * as fs7 from "node:fs";
|
|
2043
2083
|
import * as path10 from "node:path";
|
|
2044
2084
|
|
|
2045
|
-
// src/codebase-index/schema.ts
|
|
2046
|
-
var SCHEMA_VERSION = 3;
|
|
2047
|
-
|
|
2048
|
-
// src/codebase-index/lsp-kind.ts
|
|
2049
|
-
function lspKindToInternalKind(k) {
|
|
2050
|
-
switch (k) {
|
|
2051
|
-
case 5 /* Class */:
|
|
2052
|
-
return "class";
|
|
2053
|
-
case 6 /* Method */:
|
|
2054
|
-
return "method";
|
|
2055
|
-
case 7 /* Property */:
|
|
2056
|
-
case 8 /* Field */:
|
|
2057
|
-
return "property";
|
|
2058
|
-
case 9 /* Constructor */:
|
|
2059
|
-
return "class";
|
|
2060
|
-
case 10 /* Enum */:
|
|
2061
|
-
return "enum";
|
|
2062
|
-
case 11 /* Interface */:
|
|
2063
|
-
return "interface";
|
|
2064
|
-
case 12 /* Function */:
|
|
2065
|
-
return "function";
|
|
2066
|
-
case 13 /* Variable */:
|
|
2067
|
-
return "var";
|
|
2068
|
-
case 14 /* Constant */:
|
|
2069
|
-
return "const";
|
|
2070
|
-
case 22 /* EnumMember */:
|
|
2071
|
-
return "enum";
|
|
2072
|
-
case 26 /* TypeParameter */:
|
|
2073
|
-
return "type";
|
|
2074
|
-
case 3 /* Namespace */:
|
|
2075
|
-
return "namespace";
|
|
2076
|
-
default:
|
|
2077
|
-
return null;
|
|
2078
|
-
}
|
|
2079
|
-
}
|
|
2080
|
-
|
|
2081
2085
|
// src/codebase-index/bm25.ts
|
|
2082
2086
|
var K1 = 1.5;
|
|
2083
2087
|
var B = 0.75;
|
|
@@ -2167,6 +2171,42 @@ var Bm25Index = class {
|
|
|
2167
2171
|
}
|
|
2168
2172
|
};
|
|
2169
2173
|
|
|
2174
|
+
// src/codebase-index/lsp-kind.ts
|
|
2175
|
+
function lspKindToInternalKind(k) {
|
|
2176
|
+
switch (k) {
|
|
2177
|
+
case 5 /* Class */:
|
|
2178
|
+
return "class";
|
|
2179
|
+
case 6 /* Method */:
|
|
2180
|
+
return "method";
|
|
2181
|
+
case 7 /* Property */:
|
|
2182
|
+
case 8 /* Field */:
|
|
2183
|
+
return "property";
|
|
2184
|
+
case 9 /* Constructor */:
|
|
2185
|
+
return "class";
|
|
2186
|
+
case 10 /* Enum */:
|
|
2187
|
+
return "enum";
|
|
2188
|
+
case 11 /* Interface */:
|
|
2189
|
+
return "interface";
|
|
2190
|
+
case 12 /* Function */:
|
|
2191
|
+
return "function";
|
|
2192
|
+
case 13 /* Variable */:
|
|
2193
|
+
return "var";
|
|
2194
|
+
case 14 /* Constant */:
|
|
2195
|
+
return "const";
|
|
2196
|
+
case 22 /* EnumMember */:
|
|
2197
|
+
return "enum";
|
|
2198
|
+
case 26 /* TypeParameter */:
|
|
2199
|
+
return "type";
|
|
2200
|
+
case 3 /* Namespace */:
|
|
2201
|
+
return "namespace";
|
|
2202
|
+
default:
|
|
2203
|
+
return null;
|
|
2204
|
+
}
|
|
2205
|
+
}
|
|
2206
|
+
|
|
2207
|
+
// src/codebase-index/schema.ts
|
|
2208
|
+
var SCHEMA_VERSION = 3;
|
|
2209
|
+
|
|
2170
2210
|
// src/codebase-index/sqlite-runtime.ts
|
|
2171
2211
|
import { createRequire } from "node:module";
|
|
2172
2212
|
import { toErrorMessage } from "@wrongstack/core/utils";
|
|
@@ -2310,92 +2350,6 @@ function runSqliteWithRetry(fn) {
|
|
|
2310
2350
|
throw lastError;
|
|
2311
2351
|
}
|
|
2312
2352
|
|
|
2313
|
-
// src/codebase-index/writer-helpers.ts
|
|
2314
|
-
import { resolveWstackPaths } from "@wrongstack/core/utils";
|
|
2315
|
-
function escapeLike(value) {
|
|
2316
|
-
return value.replace(/[\\%_]/g, (char) => `\\${char}`);
|
|
2317
|
-
}
|
|
2318
|
-
function assignRefsToSymbols(refs, symbols) {
|
|
2319
|
-
if (refs.length === 0 || symbols.length === 0) return [];
|
|
2320
|
-
const ordered = [...symbols].sort((a, b) => a.line - b.line || a.col - b.col || a.id - b.id);
|
|
2321
|
-
const seen = /* @__PURE__ */ new Set();
|
|
2322
|
-
const assigned = [];
|
|
2323
|
-
for (const ref of refs) {
|
|
2324
|
-
let owner;
|
|
2325
|
-
for (const symbol of ordered) {
|
|
2326
|
-
if (symbol.line > ref.line) break;
|
|
2327
|
-
owner = symbol;
|
|
2328
|
-
}
|
|
2329
|
-
if (!owner && ref.callType === "import") owner = ordered[0];
|
|
2330
|
-
if (!owner || owner.id <= 0) continue;
|
|
2331
|
-
const key = `${owner.id}:${ref.toName}:${ref.callType}`;
|
|
2332
|
-
if (seen.has(key)) continue;
|
|
2333
|
-
seen.add(key);
|
|
2334
|
-
assigned.push({ ...ref, fromId: owner.id });
|
|
2335
|
-
}
|
|
2336
|
-
return assigned;
|
|
2337
|
-
}
|
|
2338
|
-
function resolveIndexDir(projectRoot, override) {
|
|
2339
|
-
return override ?? resolveWstackPaths({ projectRoot }).projectCodebaseIndex;
|
|
2340
|
-
}
|
|
2341
|
-
|
|
2342
|
-
// src/codebase-index/writer-schema.ts
|
|
2343
|
-
var METADATA_TABLE_SQL = `
|
|
2344
|
-
CREATE TABLE IF NOT EXISTS metadata (
|
|
2345
|
-
key TEXT PRIMARY KEY,
|
|
2346
|
-
value TEXT NOT NULL
|
|
2347
|
-
);
|
|
2348
|
-
`;
|
|
2349
|
-
var CORE_TABLES_SQL = `
|
|
2350
|
-
CREATE TABLE IF NOT EXISTS files (
|
|
2351
|
-
file TEXT PRIMARY KEY,
|
|
2352
|
-
lang TEXT NOT NULL,
|
|
2353
|
-
mtime_ms INTEGER NOT NULL,
|
|
2354
|
-
symbol_count INTEGER NOT NULL DEFAULT 0,
|
|
2355
|
-
last_indexed INTEGER NOT NULL
|
|
2356
|
-
);
|
|
2357
|
-
CREATE TABLE IF NOT EXISTS symbols (
|
|
2358
|
-
id INTEGER PRIMARY KEY,
|
|
2359
|
-
lang TEXT NOT NULL,
|
|
2360
|
-
kind TEXT NOT NULL,
|
|
2361
|
-
name TEXT NOT NULL,
|
|
2362
|
-
file TEXT NOT NULL,
|
|
2363
|
-
line INTEGER NOT NULL,
|
|
2364
|
-
col INTEGER NOT NULL,
|
|
2365
|
-
signature TEXT NOT NULL DEFAULT '',
|
|
2366
|
-
doc_comment TEXT NOT NULL DEFAULT '',
|
|
2367
|
-
scope TEXT NOT NULL DEFAULT '',
|
|
2368
|
-
text TEXT NOT NULL DEFAULT '',
|
|
2369
|
-
file_fk TEXT NOT NULL
|
|
2370
|
-
);
|
|
2371
|
-
`;
|
|
2372
|
-
var SYMBOL_INDEX_SQL = [
|
|
2373
|
-
"CREATE INDEX IF NOT EXISTS idx_s_name ON symbols(name)",
|
|
2374
|
-
"CREATE INDEX IF NOT EXISTS idx_s_kind ON symbols(kind)",
|
|
2375
|
-
"CREATE INDEX IF NOT EXISTS idx_s_lang ON symbols(lang)",
|
|
2376
|
-
"CREATE INDEX IF NOT EXISTS idx_s_file ON symbols(file)",
|
|
2377
|
-
"CREATE INDEX IF NOT EXISTS idx_s_lang_kind ON symbols(lang, kind)",
|
|
2378
|
-
"CREATE INDEX IF NOT EXISTS idx_s_file_fk ON symbols(file_fk)",
|
|
2379
|
-
"CREATE INDEX IF NOT EXISTS idx_s_name_id ON symbols(name, id)"
|
|
2380
|
-
];
|
|
2381
|
-
var REFS_TABLE_SQL = `
|
|
2382
|
-
CREATE TABLE IF NOT EXISTS refs (
|
|
2383
|
-
id INTEGER PRIMARY KEY,
|
|
2384
|
-
from_id INTEGER NOT NULL,
|
|
2385
|
-
to_name TEXT NOT NULL,
|
|
2386
|
-
to_id INTEGER,
|
|
2387
|
-
call_type TEXT NOT NULL,
|
|
2388
|
-
line INTEGER NOT NULL
|
|
2389
|
-
);
|
|
2390
|
-
`;
|
|
2391
|
-
var REFS_INDEX_SQL = [
|
|
2392
|
-
"CREATE INDEX IF NOT EXISTS idx_r_from ON refs(from_id)",
|
|
2393
|
-
"CREATE INDEX IF NOT EXISTS idx_r_to_id ON refs(to_id)",
|
|
2394
|
-
"CREATE INDEX IF NOT EXISTS idx_r_to_name ON refs(to_name)",
|
|
2395
|
-
"CREATE INDEX IF NOT EXISTS idx_r_call_type ON refs(call_type)"
|
|
2396
|
-
];
|
|
2397
|
-
var SYMBOLS_FTS_SQL = "CREATE VIRTUAL TABLE IF NOT EXISTS symbols_fts USING fts5(text, tokenize = 'unicode61')";
|
|
2398
|
-
|
|
2399
2353
|
// src/codebase-index/writer-admin.ts
|
|
2400
2354
|
import * as fs6 from "node:fs";
|
|
2401
2355
|
import * as path8 from "node:path";
|
|
@@ -2868,6 +2822,35 @@ function getSymbolGraphWithStatement(stmt, fileFilter) {
|
|
|
2868
2822
|
return { nodes, edges };
|
|
2869
2823
|
}
|
|
2870
2824
|
|
|
2825
|
+
// src/codebase-index/writer-helpers.ts
|
|
2826
|
+
import { resolveWstackPaths } from "@wrongstack/core/utils";
|
|
2827
|
+
function escapeLike(value) {
|
|
2828
|
+
return value.replace(/[\\%_]/g, (char) => `\\${char}`);
|
|
2829
|
+
}
|
|
2830
|
+
function assignRefsToSymbols(refs, symbols) {
|
|
2831
|
+
if (refs.length === 0 || symbols.length === 0) return [];
|
|
2832
|
+
const ordered = [...symbols].sort((a, b) => a.line - b.line || a.col - b.col || a.id - b.id);
|
|
2833
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2834
|
+
const assigned = [];
|
|
2835
|
+
for (const ref of refs) {
|
|
2836
|
+
let owner;
|
|
2837
|
+
for (const symbol of ordered) {
|
|
2838
|
+
if (symbol.line > ref.line) break;
|
|
2839
|
+
owner = symbol;
|
|
2840
|
+
}
|
|
2841
|
+
if (!owner && ref.callType === "import") owner = ordered[0];
|
|
2842
|
+
if (!owner || owner.id <= 0) continue;
|
|
2843
|
+
const key = `${owner.id}:${ref.toName}:${ref.callType}`;
|
|
2844
|
+
if (seen.has(key)) continue;
|
|
2845
|
+
seen.add(key);
|
|
2846
|
+
assigned.push({ ...ref, fromId: owner.id });
|
|
2847
|
+
}
|
|
2848
|
+
return assigned;
|
|
2849
|
+
}
|
|
2850
|
+
function resolveIndexDir(projectRoot, override) {
|
|
2851
|
+
return override ?? resolveWstackPaths({ projectRoot }).projectCodebaseIndex;
|
|
2852
|
+
}
|
|
2853
|
+
|
|
2871
2854
|
// src/codebase-index/writer-pragmas.ts
|
|
2872
2855
|
import { sqliteCachePragmas } from "@wrongstack/core/utils";
|
|
2873
2856
|
function applyIndexStorePragmas(db) {
|
|
@@ -2886,6 +2869,63 @@ function applyIndexStorePragmas(db) {
|
|
|
2886
2869
|
}
|
|
2887
2870
|
}
|
|
2888
2871
|
|
|
2872
|
+
// src/codebase-index/writer-schema.ts
|
|
2873
|
+
var METADATA_TABLE_SQL = `
|
|
2874
|
+
CREATE TABLE IF NOT EXISTS metadata (
|
|
2875
|
+
key TEXT PRIMARY KEY,
|
|
2876
|
+
value TEXT NOT NULL
|
|
2877
|
+
);
|
|
2878
|
+
`;
|
|
2879
|
+
var CORE_TABLES_SQL = `
|
|
2880
|
+
CREATE TABLE IF NOT EXISTS files (
|
|
2881
|
+
file TEXT PRIMARY KEY,
|
|
2882
|
+
lang TEXT NOT NULL,
|
|
2883
|
+
mtime_ms INTEGER NOT NULL,
|
|
2884
|
+
symbol_count INTEGER NOT NULL DEFAULT 0,
|
|
2885
|
+
last_indexed INTEGER NOT NULL
|
|
2886
|
+
);
|
|
2887
|
+
CREATE TABLE IF NOT EXISTS symbols (
|
|
2888
|
+
id INTEGER PRIMARY KEY,
|
|
2889
|
+
lang TEXT NOT NULL,
|
|
2890
|
+
kind TEXT NOT NULL,
|
|
2891
|
+
name TEXT NOT NULL,
|
|
2892
|
+
file TEXT NOT NULL,
|
|
2893
|
+
line INTEGER NOT NULL,
|
|
2894
|
+
col INTEGER NOT NULL,
|
|
2895
|
+
signature TEXT NOT NULL DEFAULT '',
|
|
2896
|
+
doc_comment TEXT NOT NULL DEFAULT '',
|
|
2897
|
+
scope TEXT NOT NULL DEFAULT '',
|
|
2898
|
+
text TEXT NOT NULL DEFAULT '',
|
|
2899
|
+
file_fk TEXT NOT NULL
|
|
2900
|
+
);
|
|
2901
|
+
`;
|
|
2902
|
+
var SYMBOL_INDEX_SQL = [
|
|
2903
|
+
"CREATE INDEX IF NOT EXISTS idx_s_name ON symbols(name)",
|
|
2904
|
+
"CREATE INDEX IF NOT EXISTS idx_s_kind ON symbols(kind)",
|
|
2905
|
+
"CREATE INDEX IF NOT EXISTS idx_s_lang ON symbols(lang)",
|
|
2906
|
+
"CREATE INDEX IF NOT EXISTS idx_s_file ON symbols(file)",
|
|
2907
|
+
"CREATE INDEX IF NOT EXISTS idx_s_lang_kind ON symbols(lang, kind)",
|
|
2908
|
+
"CREATE INDEX IF NOT EXISTS idx_s_file_fk ON symbols(file_fk)",
|
|
2909
|
+
"CREATE INDEX IF NOT EXISTS idx_s_name_id ON symbols(name, id)"
|
|
2910
|
+
];
|
|
2911
|
+
var REFS_TABLE_SQL = `
|
|
2912
|
+
CREATE TABLE IF NOT EXISTS refs (
|
|
2913
|
+
id INTEGER PRIMARY KEY,
|
|
2914
|
+
from_id INTEGER NOT NULL,
|
|
2915
|
+
to_name TEXT NOT NULL,
|
|
2916
|
+
to_id INTEGER,
|
|
2917
|
+
call_type TEXT NOT NULL,
|
|
2918
|
+
line INTEGER NOT NULL
|
|
2919
|
+
);
|
|
2920
|
+
`;
|
|
2921
|
+
var REFS_INDEX_SQL = [
|
|
2922
|
+
"CREATE INDEX IF NOT EXISTS idx_r_from ON refs(from_id)",
|
|
2923
|
+
"CREATE INDEX IF NOT EXISTS idx_r_to_id ON refs(to_id)",
|
|
2924
|
+
"CREATE INDEX IF NOT EXISTS idx_r_to_name ON refs(to_name)",
|
|
2925
|
+
"CREATE INDEX IF NOT EXISTS idx_r_call_type ON refs(call_type)"
|
|
2926
|
+
];
|
|
2927
|
+
var SYMBOLS_FTS_SQL = "CREATE VIRTUAL TABLE IF NOT EXISTS symbols_fts USING fts5(text, tokenize = 'unicode61')";
|
|
2928
|
+
|
|
2889
2929
|
// src/codebase-index/writer-search-helpers.ts
|
|
2890
2930
|
function normalizeSearchLimit(limit) {
|
|
2891
2931
|
return typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.trunc(limit)) : void 0;
|
|
@@ -3094,9 +3134,15 @@ var IndexStore = class _IndexStore {
|
|
|
3094
3134
|
DROP TABLE IF EXISTS refs;
|
|
3095
3135
|
`);
|
|
3096
3136
|
this.db.exec("DROP TABLE IF EXISTS symbols_fts");
|
|
3097
|
-
this.stmt("UPDATE metadata SET value = ? WHERE key = ?").run(
|
|
3137
|
+
this.stmt("UPDATE metadata SET value = ? WHERE key = ?").run(
|
|
3138
|
+
String(SCHEMA_VERSION),
|
|
3139
|
+
"version"
|
|
3140
|
+
);
|
|
3098
3141
|
} else if (storedVersion === null) {
|
|
3099
|
-
this.stmt("INSERT INTO metadata(key, value) VALUES (?, ?)").run(
|
|
3142
|
+
this.stmt("INSERT INTO metadata(key, value) VALUES (?, ?)").run(
|
|
3143
|
+
"version",
|
|
3144
|
+
String(SCHEMA_VERSION)
|
|
3145
|
+
);
|
|
3100
3146
|
}
|
|
3101
3147
|
this.db.exec(CORE_TABLES_SQL);
|
|
3102
3148
|
for (const sql of SYMBOL_INDEX_SQL) this.db.exec(sql);
|
|
@@ -3113,7 +3159,9 @@ var IndexStore = class _IndexStore {
|
|
|
3113
3159
|
);
|
|
3114
3160
|
if (symbolCount !== ftsCount) {
|
|
3115
3161
|
this.db.exec("DELETE FROM symbols_fts");
|
|
3116
|
-
const rows = this.stmt(
|
|
3162
|
+
const rows = this.stmt(
|
|
3163
|
+
"SELECT id, name, signature, doc_comment FROM symbols ORDER BY id"
|
|
3164
|
+
).all();
|
|
3117
3165
|
bulkInsertFtsWithStatement(
|
|
3118
3166
|
(sql) => this.stmt(sql),
|
|
3119
3167
|
_IndexStore.MAX_SQL_VARS,
|
|
@@ -3335,7 +3383,9 @@ var IndexStore = class _IndexStore {
|
|
|
3335
3383
|
const limitSql = limit !== void 0 ? " LIMIT ?" : "";
|
|
3336
3384
|
const sql = `SELECT id, lang, kind, name, file, line, col, signature, doc_comment, text FROM symbols ${where}${limitSql}`;
|
|
3337
3385
|
const binds = limit !== void 0 ? [...values, limit] : values;
|
|
3338
|
-
const rows = this.stmt(sql).all(
|
|
3386
|
+
const rows = this.stmt(sql).all(
|
|
3387
|
+
...binds
|
|
3388
|
+
);
|
|
3339
3389
|
return rows.map((row) => mapWriterSearchRow(row, filter?.lspKind));
|
|
3340
3390
|
}
|
|
3341
3391
|
/** Shared WHERE builder for {@link search} / empty-query ranked totals. */
|
|
@@ -3511,7 +3561,9 @@ var IndexStore = class _IndexStore {
|
|
|
3511
3561
|
}
|
|
3512
3562
|
setLastIndexed(ts2) {
|
|
3513
3563
|
this.runWithRetry(() => {
|
|
3514
|
-
this.stmt("INSERT OR REPLACE INTO metadata(key, value) VALUES('last_indexed', ?)").run(
|
|
3564
|
+
this.stmt("INSERT OR REPLACE INTO metadata(key, value) VALUES('last_indexed', ?)").run(
|
|
3565
|
+
String(ts2)
|
|
3566
|
+
);
|
|
3515
3567
|
});
|
|
3516
3568
|
}
|
|
3517
3569
|
getMetadata(key) {
|
|
@@ -3622,7 +3674,9 @@ var IndexStore = class _IndexStore {
|
|
|
3622
3674
|
this.stmt(
|
|
3623
3675
|
`DELETE FROM refs WHERE from_id IN (SELECT id FROM symbols WHERE file IN (${placeholders}))`
|
|
3624
3676
|
).run(...options.deleteForFiles);
|
|
3625
|
-
this.stmt(`DELETE FROM symbols WHERE file IN (${placeholders})`).run(
|
|
3677
|
+
this.stmt(`DELETE FROM symbols WHERE file IN (${placeholders})`).run(
|
|
3678
|
+
...options.deleteForFiles
|
|
3679
|
+
);
|
|
3626
3680
|
}
|
|
3627
3681
|
const totalSymbols = entries.reduce((n, e) => n + e.symbols.length, 0);
|
|
3628
3682
|
let nextId = this.allocateSymbolIds(totalSymbols);
|
|
@@ -3666,11 +3720,7 @@ var IndexStore = class _IndexStore {
|
|
|
3666
3720
|
this.ftsAvailable,
|
|
3667
3721
|
ftsRows
|
|
3668
3722
|
);
|
|
3669
|
-
bulkInsertRefsWithStatement(
|
|
3670
|
-
(sql) => this.stmt(sql),
|
|
3671
|
-
_IndexStore.MAX_SQL_VARS,
|
|
3672
|
-
refsToInsert
|
|
3673
|
-
);
|
|
3723
|
+
bulkInsertRefsWithStatement((sql) => this.stmt(sql), _IndexStore.MAX_SQL_VARS, refsToInsert);
|
|
3674
3724
|
const upsertStmt = this.stmt(
|
|
3675
3725
|
`INSERT INTO files(file, lang, mtime_ms, symbol_count, last_indexed)
|
|
3676
3726
|
VALUES (?, ?, ?, ?, ?)
|
|
@@ -3699,7 +3749,9 @@ var IndexStore = class _IndexStore {
|
|
|
3699
3749
|
*/
|
|
3700
3750
|
deleteRefsForFile(file) {
|
|
3701
3751
|
this.runWithRetry(() => {
|
|
3702
|
-
this.stmt("DELETE FROM refs WHERE from_id IN (SELECT id FROM symbols WHERE file = ?)").run(
|
|
3752
|
+
this.stmt("DELETE FROM refs WHERE from_id IN (SELECT id FROM symbols WHERE file = ?)").run(
|
|
3753
|
+
file
|
|
3754
|
+
);
|
|
3703
3755
|
});
|
|
3704
3756
|
}
|
|
3705
3757
|
/**
|
|
@@ -3854,9 +3906,7 @@ var IndexStore = class _IndexStore {
|
|
|
3854
3906
|
* build the full symbol universe for the reachability scan.
|
|
3855
3907
|
*/
|
|
3856
3908
|
getAllSymbols() {
|
|
3857
|
-
return this.stmt(
|
|
3858
|
-
"SELECT id, name, file, kind, line FROM symbols ORDER BY id"
|
|
3859
|
-
).all().map((r) => ({ ...r, kind: r.kind }));
|
|
3909
|
+
return this.stmt("SELECT id, name, file, kind, line FROM symbols ORDER BY id").all().map((r) => ({ ...r, kind: r.kind }));
|
|
3860
3910
|
}
|
|
3861
3911
|
/**
|
|
3862
3912
|
* Returns every resolved reference (to_id IS NOT NULL). Used by
|
|
@@ -3868,6 +3918,25 @@ var IndexStore = class _IndexStore {
|
|
|
3868
3918
|
"SELECT from_id AS fromId, to_id AS toId, call_type AS callType FROM refs WHERE to_id IS NOT NULL"
|
|
3869
3919
|
).all();
|
|
3870
3920
|
}
|
|
3921
|
+
/**
|
|
3922
|
+
* Returns ALL import refs (including unresolved) with their source-file
|
|
3923
|
+
* path and resolved target id. Used by the dead-code scan's file-level
|
|
3924
|
+
* graph traversal to handle barrel-only entry points where no symbol
|
|
3925
|
+
* carries the ref.
|
|
3926
|
+
*
|
|
3927
|
+
* Refs whose `from_id` doesn't match a known symbol (e.g. pure-barrel
|
|
3928
|
+
* files with no declarations) will have `sourceFile === null`.
|
|
3929
|
+
*/
|
|
3930
|
+
getAllImportRefs() {
|
|
3931
|
+
return this.stmt(
|
|
3932
|
+
`SELECT s.file AS sourceFile, r.to_name AS toName, r.to_id AS toId,
|
|
3933
|
+
r.call_type AS callType, r.line
|
|
3934
|
+
FROM refs r
|
|
3935
|
+
LEFT JOIN symbols s ON r.from_id = s.id
|
|
3936
|
+
WHERE r.call_type = 'import'
|
|
3937
|
+
ORDER BY r.line`
|
|
3938
|
+
).all();
|
|
3939
|
+
}
|
|
3871
3940
|
close() {
|
|
3872
3941
|
this.stmtCache.clear();
|
|
3873
3942
|
this.bm25Dirty = true;
|