scip-query 0.4.3 → 0.6.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/dist/chunk-2DSS2NGF.js +10 -0
- package/dist/chunk-2RLP74AO.js +2 -0
- package/dist/chunk-4QJ7LVW5.js +2 -0
- package/dist/chunk-4TYGGOLO.js +5 -0
- package/dist/chunk-5IADAU5B.js +7 -0
- package/dist/chunk-7754WFFV.js +18 -0
- package/dist/chunk-7VOF4ZG6.js +2 -0
- package/dist/chunk-7Z4COVMC.js +2 -0
- package/dist/chunk-AJ5PWKD4.js +2 -0
- package/dist/chunk-BDBRZPX3.js +7 -0
- package/dist/chunk-BE6EQIWY.js +2 -0
- package/dist/chunk-BQ3INTYT.js +8 -0
- package/dist/chunk-D7KLLMPB.js +2 -0
- package/dist/chunk-D7YBWSON.js +29 -0
- package/dist/chunk-DE5ZBHMK.js +39 -0
- package/dist/chunk-DHYIJHXZ.js +33 -0
- package/dist/chunk-EEF3YEHW.js +2 -0
- package/dist/chunk-F2LLHRRZ.js +2 -0
- package/dist/chunk-FCC3XJTI.js +2 -0
- package/dist/chunk-GNXRLK5G.js +2 -0
- package/dist/chunk-GXVB36TG.js +62 -0
- package/dist/chunk-HMKJTAZD.js +2 -0
- package/dist/chunk-IBGBI3VU.js +2 -0
- package/dist/chunk-IYFZS4PV.js +84 -0
- package/dist/chunk-JH3A7HTU.js +2 -0
- package/dist/chunk-JS2RNIC7.js +2 -0
- package/dist/chunk-K5FQFCSN.js +41 -0
- package/dist/chunk-K6GBKEQE.js +6 -0
- package/dist/chunk-KO7YJRWP.js +12 -0
- package/dist/chunk-KYT47WU2.js +4 -0
- package/dist/chunk-LORWXBOO.js +2 -0
- package/dist/chunk-LX4H4LLG.js +89 -0
- package/dist/chunk-N3Z2SJCR.js +2 -0
- package/dist/chunk-NTDA4A2D.js +25 -0
- package/dist/chunk-NXMYYHDO.js +24 -0
- package/dist/chunk-PZ6ESKRH.js +7 -0
- package/dist/chunk-QXE6EDY2.js +6 -0
- package/dist/chunk-RJ7SPBJ5.js +5 -0
- package/dist/chunk-RWE6FHG3.js +3 -0
- package/dist/chunk-SDX6MDBL.js +2 -0
- package/dist/chunk-SG35Y7J2.js +2 -0
- package/dist/chunk-STOGKRJH.js +4 -0
- package/dist/chunk-TINPMWJK.js +2 -0
- package/dist/chunk-UJB62HV3.js +2 -0
- package/dist/chunk-VEUMRDHW.js +2 -0
- package/dist/chunk-WCDXJGYT.js +65 -0
- package/dist/chunk-WTSTDJZ7.js +6 -0
- package/dist/chunk-XAZTIDST.js +2 -0
- package/dist/chunk-XVDASCN7.js +35 -0
- package/dist/chunk-Y7H6D2EV.js +2 -0
- package/dist/chunk-Y7LOQSWY.js +2 -0
- package/dist/chunk-YIPCV7M7.js +70 -0
- package/dist/chunk-ZSRXMNMK.js +5 -0
- package/dist/chunk-ZXKURFVB.js +56 -0
- package/dist/cli.js +509 -8938
- package/dist/{db-6F9R9e_t.d.ts → db-BSTtBG_H.d.ts} +146 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.js +13 -1616
- package/dist/postinstall.js +4 -100
- package/dist/queries/affected.d.ts +1 -1
- package/dist/queries/affected.js +1 -8
- package/dist/queries/bottlenecks.d.ts +1 -1
- package/dist/queries/bottlenecks.js +1 -8
- package/dist/queries/by-kind.d.ts +1 -4
- package/dist/queries/by-kind.js +1 -10
- package/dist/queries/call-graph.d.ts +1 -1
- package/dist/queries/call-graph.js +1 -8
- package/dist/queries/change-surface.d.ts +4 -1
- package/dist/queries/change-surface.js +1 -8
- package/dist/queries/code.d.ts +1 -1
- package/dist/queries/code.js +1 -8
- package/dist/queries/complexity-hotspots.d.ts +5 -3
- package/dist/queries/complexity-hotspots.js +1 -8
- package/dist/queries/complexity.d.ts +1 -1
- package/dist/queries/complexity.js +1 -8
- package/dist/queries/convergence.d.ts +1 -1
- package/dist/queries/convergence.js +1 -8
- package/dist/queries/coupling.d.ts +1 -1
- package/dist/queries/coupling.js +1 -10
- package/dist/queries/cycles.d.ts +1 -1
- package/dist/queries/cycles.js +1 -8
- package/dist/queries/dataflow.d.ts +1 -1
- package/dist/queries/dataflow.js +1 -8
- package/dist/queries/dead.d.ts +1 -1
- package/dist/queries/dead.js +1 -9
- package/dist/queries/deep-chains.d.ts +9 -1
- package/dist/queries/deep-chains.js +1 -8
- package/dist/queries/deps.d.ts +1 -1
- package/dist/queries/deps.js +1 -10
- package/dist/queries/diff-impact.d.ts +1 -1
- package/dist/queries/diff-impact.js +1 -7
- package/dist/queries/drift.d.ts +1 -1
- package/dist/queries/drift.js +1 -8
- package/dist/queries/extract-candidates.d.ts +1 -1
- package/dist/queries/extract-candidates.js +1 -8
- package/dist/queries/fan.d.ts +1 -1
- package/dist/queries/fan.js +1 -14
- package/dist/queries/files.d.ts +1 -1
- package/dist/queries/files.js +1 -6
- package/dist/queries/health.d.ts +1 -1
- package/dist/queries/health.js +1 -20
- package/dist/queries/hierarchy.d.ts +1 -1
- package/dist/queries/hierarchy.js +1 -8
- package/dist/queries/hotspots.d.ts +1 -1
- package/dist/queries/hotspots.js +1 -8
- package/dist/queries/imports.d.ts +1 -1
- package/dist/queries/imports.js +1 -12
- package/dist/queries/index.d.ts +1 -1
- package/dist/queries/index.js +1 -197
- package/dist/queries/isolated.d.ts +1 -1
- package/dist/queries/isolated.js +1 -9
- package/dist/queries/members.d.ts +4 -1
- package/dist/queries/members.js +1 -8
- package/dist/queries/methods.d.ts +1 -1
- package/dist/queries/methods.js +1 -8
- package/dist/queries/outline.d.ts +4 -1
- package/dist/queries/outline.js +1 -8
- package/dist/queries/passthrough-candidates.d.ts +1 -1
- package/dist/queries/passthrough-candidates.js +1 -8
- package/dist/queries/redundant-reexports.d.ts +1 -1
- package/dist/queries/redundant-reexports.js +1 -9
- package/dist/queries/refs.d.ts +1 -1
- package/dist/queries/refs.js +1 -8
- package/dist/queries/similar-chains.d.ts +1 -1
- package/dist/queries/similar-chains.js +1 -8
- package/dist/queries/similar-files.d.ts +1 -1
- package/dist/queries/similar-files.js +1 -8
- package/dist/queries/similar-signatures.d.ts +1 -1
- package/dist/queries/similar-signatures.js +1 -8
- package/dist/queries/similar.d.ts +1 -1
- package/dist/queries/similar.js +1 -10
- package/dist/queries/slice.d.ts +1 -1
- package/dist/queries/slice.js +1 -8
- package/dist/queries/stale-abstractions.d.ts +15 -5
- package/dist/queries/stale-abstractions.js +1 -8
- package/dist/queries/stats.d.ts +1 -1
- package/dist/queries/stats.js +1 -6
- package/dist/queries/surface.d.ts +1 -1
- package/dist/queries/surface.js +1 -8
- package/dist/queries/symbols.d.ts +1 -1
- package/dist/queries/symbols.js +1 -9
- package/dist/queries/system.d.ts +6 -2
- package/dist/queries/system.js +1 -9
- package/dist/queries/trace.d.ts +1 -1
- package/dist/queries/trace.js +1 -9
- package/dist/queries/wrapper-candidates.d.ts +1 -1
- package/dist/queries/wrapper-candidates.js +1 -8
- package/dist/reindex-worker.js +7 -672
- package/package.json +20 -2
- package/dist/chunk-334PCFO3.js +0 -221
- package/dist/chunk-46ZTW4AI.js +0 -61
- package/dist/chunk-4TYLS5XX.js +0 -10
- package/dist/chunk-4YN3PE57.js +0 -124
- package/dist/chunk-5YB6UXQ3.js +0 -101
- package/dist/chunk-6PVHJ332.js +0 -44
- package/dist/chunk-74RFWB5T.js +0 -24
- package/dist/chunk-7KGTWDAX.js +0 -87
- package/dist/chunk-7OGXSMLY.js +0 -105
- package/dist/chunk-AEBM56CO.js +0 -69
- package/dist/chunk-B747RITP.js +0 -38
- package/dist/chunk-B7LDMCUS.js +0 -110
- package/dist/chunk-C2VSV54P.js +0 -110
- package/dist/chunk-DIYEUFVP.js +0 -81
- package/dist/chunk-E74RY6AQ.js +0 -93
- package/dist/chunk-FIMTTUGE.js +0 -165
- package/dist/chunk-FMAYH7GS.js +0 -2542
- package/dist/chunk-FO2CBB7U.js +0 -23
- package/dist/chunk-HESWGDIV.js +0 -162
- package/dist/chunk-HL2LXSBW.js +0 -34
- package/dist/chunk-HW76DVE4.js +0 -216
- package/dist/chunk-IC5NTO47.js +0 -53
- package/dist/chunk-J34HAAEQ.js +0 -59
- package/dist/chunk-JSXGC2EH.js +0 -151
- package/dist/chunk-LQXBFCP2.js +0 -87
- package/dist/chunk-NML6M5AS.js +0 -37
- package/dist/chunk-NNFP4ZRF.js +0 -72
- package/dist/chunk-NWXTQGUE.js +0 -49
- package/dist/chunk-NYZ6INK3.js +0 -95
- package/dist/chunk-OMVF3BHY.js +0 -84
- package/dist/chunk-P3VCDYMJ.js +0 -269
- package/dist/chunk-PGQXIAJF.js +0 -79
- package/dist/chunk-PKDFXASW.js +0 -76
- package/dist/chunk-PSK5BPFE.js +0 -82
- package/dist/chunk-QZ4FRB65.js +0 -341
- package/dist/chunk-R2QBMQQN.js +0 -185
- package/dist/chunk-T3ALCNCP.js +0 -113
- package/dist/chunk-T6UVM534.js +0 -213
- package/dist/chunk-U74VYTLX.js +0 -46
- package/dist/chunk-UIRCHPOU.js +0 -34
- package/dist/chunk-UNS6ZQVX.js +0 -71
- package/dist/chunk-VJMTX3OR.js +0 -115
- package/dist/chunk-XJSPWHNT.js +0 -64
- package/dist/chunk-XMZAC2VU.js +0 -84
- package/dist/chunk-Y7FKURZG.js +0 -130
- package/dist/chunk-YMSJCSRG.js +0 -213
- package/dist/chunk-YQIWS5V6.js +0 -172
- package/dist/chunk-ZPEI7DRJ.js +0 -66
- package/dist/queries/clean-signature.d.ts +0 -9
- package/dist/queries/clean-signature.js +0 -7
package/dist/chunk-VJMTX3OR.js
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
findFirstSymbolMatch,
|
|
3
|
-
getSourceReferenceSites,
|
|
4
|
-
getSourceText
|
|
5
|
-
} from "./chunk-FMAYH7GS.js";
|
|
6
|
-
import {
|
|
7
|
-
isFunctionLikeSymbol
|
|
8
|
-
} from "./chunk-YMSJCSRG.js";
|
|
9
|
-
|
|
10
|
-
// src/queries/refs.ts
|
|
11
|
-
function refs(db, symbolPattern) {
|
|
12
|
-
const match = findFirstSymbolMatch(db, symbolPattern);
|
|
13
|
-
if (match) {
|
|
14
|
-
const includeDefinitionSite = !isFunctionLikeSymbol(match.symbol);
|
|
15
|
-
const definitionRows = includeDefinitionSite ? [{
|
|
16
|
-
relativePath: match.relativePath,
|
|
17
|
-
line: match.startLine
|
|
18
|
-
}] : [];
|
|
19
|
-
const sourceSites = getSourceReferenceSites(db, match).filter((site) => !db.isIgnored(site.file)).map((site) => ({
|
|
20
|
-
relativePath: site.file,
|
|
21
|
-
line: site.line
|
|
22
|
-
}));
|
|
23
|
-
if (sourceSites.length > 0) {
|
|
24
|
-
const seen2 = /* @__PURE__ */ new Set();
|
|
25
|
-
const rows2 = [...definitionRows, ...sourceSites, ...getRubySemanticRefs(db, match)].filter((site) => {
|
|
26
|
-
const key = `${site.relativePath}:${site.line}`;
|
|
27
|
-
if (seen2.has(key)) return false;
|
|
28
|
-
seen2.add(key);
|
|
29
|
-
return true;
|
|
30
|
-
});
|
|
31
|
-
return rows2;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
const rows = db.all(
|
|
35
|
-
`SELECT DISTINCT d.relative_path, c.start_line
|
|
36
|
-
FROM mentions m
|
|
37
|
-
JOIN chunks c ON m.chunk_id = c.id
|
|
38
|
-
JOIN documents d ON c.document_id = d.id
|
|
39
|
-
JOIN global_symbols gs ON m.symbol_id = gs.id
|
|
40
|
-
WHERE m.symbol_id = ?
|
|
41
|
-
AND ${db.localSymbolPredicate}
|
|
42
|
-
AND m.role != 1
|
|
43
|
-
ORDER BY d.relative_path, c.start_line`,
|
|
44
|
-
match?.symbolId ?? -1
|
|
45
|
-
);
|
|
46
|
-
const referenceRows = rows.filter((r) => !db.isIgnored(r.relative_path)).map((r) => ({
|
|
47
|
-
relativePath: r.relative_path,
|
|
48
|
-
line: r.start_line
|
|
49
|
-
}));
|
|
50
|
-
if (!match || db.isIgnored(match.relativePath) || isFunctionLikeSymbol(match.symbol)) {
|
|
51
|
-
return referenceRows;
|
|
52
|
-
}
|
|
53
|
-
const seen = new Set(referenceRows.map((row) => `${row.relativePath}:${row.line}`));
|
|
54
|
-
if (!seen.has(`${match.relativePath}:${match.startLine}`)) {
|
|
55
|
-
referenceRows.unshift({
|
|
56
|
-
relativePath: match.relativePath,
|
|
57
|
-
line: match.startLine
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
for (const row of getRubySemanticRefs(db, match)) {
|
|
61
|
-
const key = `${row.relativePath}:${row.line}`;
|
|
62
|
-
if (seen.has(key)) continue;
|
|
63
|
-
seen.add(key);
|
|
64
|
-
referenceRows.push(row);
|
|
65
|
-
}
|
|
66
|
-
return referenceRows;
|
|
67
|
-
}
|
|
68
|
-
function getRubySemanticRefs(db, match) {
|
|
69
|
-
if (!match.relativePath.endsWith(".rb")) {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
const tokens = rubyReferenceTokens(match.symbol);
|
|
73
|
-
if (tokens.length === 0) {
|
|
74
|
-
return [];
|
|
75
|
-
}
|
|
76
|
-
const rows = db.all(
|
|
77
|
-
`SELECT relative_path
|
|
78
|
-
FROM documents
|
|
79
|
-
WHERE relative_path LIKE '%.rb'
|
|
80
|
-
${db.pathExclusionsFor("documents")}
|
|
81
|
-
ORDER BY relative_path`
|
|
82
|
-
);
|
|
83
|
-
const results = [];
|
|
84
|
-
for (const row of rows) {
|
|
85
|
-
if (db.isIgnored(row.relative_path)) continue;
|
|
86
|
-
const source = getSourceText(db, row.relative_path);
|
|
87
|
-
if (!source) continue;
|
|
88
|
-
const lines = source.split("\n");
|
|
89
|
-
for (let index = 0; index < lines.length; index++) {
|
|
90
|
-
const line = lines[index] ?? "";
|
|
91
|
-
if (tokens.some((token) => new RegExp(`@${token}\\b|\\b${token}:`).test(line))) {
|
|
92
|
-
results.push({
|
|
93
|
-
relativePath: row.relative_path,
|
|
94
|
-
line: index
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return results;
|
|
100
|
-
}
|
|
101
|
-
function rubyReferenceTokens(rawSymbol) {
|
|
102
|
-
const leaf = rawSymbol.split(":").pop() ?? rawSymbol;
|
|
103
|
-
const snake = leaf.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/[^A-Za-z0-9_]+/g, "_").toLowerCase().replace(/^_+|_+$/g, "");
|
|
104
|
-
const parts = snake.split("_").filter(Boolean);
|
|
105
|
-
const candidates = /* @__PURE__ */ new Set();
|
|
106
|
-
if (snake) candidates.add(snake);
|
|
107
|
-
if (parts.length >= 1) candidates.add(parts[parts.length - 1]);
|
|
108
|
-
if (parts.length >= 2) candidates.add(parts.slice(-2).join("_"));
|
|
109
|
-
return [...candidates];
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export {
|
|
113
|
-
refs
|
|
114
|
-
};
|
|
115
|
-
//# sourceMappingURL=chunk-VJMTX3OR.js.map
|
package/dist/chunk-XJSPWHNT.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getScopedDefinitions
|
|
3
|
-
} from "./chunk-FMAYH7GS.js";
|
|
4
|
-
import {
|
|
5
|
-
shortenSymbol
|
|
6
|
-
} from "./chunk-YMSJCSRG.js";
|
|
7
|
-
|
|
8
|
-
// src/queries/stale-abstractions.ts
|
|
9
|
-
function staleAbstractions(db, opts) {
|
|
10
|
-
const { scope, minLoc = 3, limit = 30 } = opts ?? {};
|
|
11
|
-
const rows = getScopedDefinitions(db, scope).filter((definition) => definition.isTypeLike && definitionLoc(definition) >= minLoc).map((definition) => ({
|
|
12
|
-
symbol: definition.symbol,
|
|
13
|
-
file: definition.relativePath,
|
|
14
|
-
start_line: definition.startLine,
|
|
15
|
-
end_line: definition.endLine,
|
|
16
|
-
loc: definitionLoc(definition),
|
|
17
|
-
consumers: countCrossFileConsumers(db, definition)
|
|
18
|
-
})).filter((row) => row.consumers <= 1).sort((left, right) => right.loc - left.loc || left.file.localeCompare(right.file) || left.start_line - right.start_line);
|
|
19
|
-
const filesWithFunctions = getFilesWithFunctions(db, scope);
|
|
20
|
-
return rows.filter((r) => !db.isIgnored(r.file)).filter((r) => isTrueStaleAbstraction(r, filesWithFunctions)).map((r) => ({
|
|
21
|
-
symbol: r.symbol,
|
|
22
|
-
shortName: shortenSymbol(r.symbol),
|
|
23
|
-
file: r.file,
|
|
24
|
-
startLine: r.start_line,
|
|
25
|
-
endLine: r.end_line,
|
|
26
|
-
loc: r.loc,
|
|
27
|
-
consumers: r.consumers
|
|
28
|
-
})).slice(0, limit);
|
|
29
|
-
}
|
|
30
|
-
function getFilesWithFunctions(db, scope) {
|
|
31
|
-
return new Set(getScopedDefinitions(db, scope).filter((definition) => definition.isFunctionLike).map((definition) => definition.relativePath));
|
|
32
|
-
}
|
|
33
|
-
function isTrueStaleAbstraction(row, filesWithFunctions) {
|
|
34
|
-
const basename = row.file.split("/").pop() ?? "";
|
|
35
|
-
const isTypeFile = basename.includes("types") || row.file.includes("/types/");
|
|
36
|
-
if (isTypeFile && row.consumers > 0) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
if (row.consumers === 0 && filesWithFunctions.has(row.file)) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
function countCrossFileConsumers(db, definition) {
|
|
45
|
-
const callers = db.all(
|
|
46
|
-
`SELECT DISTINCT d.relative_path
|
|
47
|
-
FROM mentions m
|
|
48
|
-
JOIN chunks c ON m.chunk_id = c.id
|
|
49
|
-
JOIN documents d ON c.document_id = d.id
|
|
50
|
-
WHERE m.symbol_id = ?
|
|
51
|
-
AND m.role != 1
|
|
52
|
-
${db.pathExclusionsFor("d")}`,
|
|
53
|
-
definition.symbolId
|
|
54
|
-
).map((row) => row.relative_path).filter((relativePath) => relativePath !== definition.relativePath && !db.isIgnored(relativePath));
|
|
55
|
-
return new Set(callers).size;
|
|
56
|
-
}
|
|
57
|
-
function definitionLoc(definition) {
|
|
58
|
-
return definition.endLine - definition.startLine + 1;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export {
|
|
62
|
-
staleAbstractions
|
|
63
|
-
};
|
|
64
|
-
//# sourceMappingURL=chunk-XJSPWHNT.js.map
|
package/dist/chunk-XMZAC2VU.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
resolveIndexedFile
|
|
3
|
-
} from "./chunk-FMAYH7GS.js";
|
|
4
|
-
|
|
5
|
-
// src/queries/coupling.ts
|
|
6
|
-
function coupling(db, file1, file2) {
|
|
7
|
-
const resolvedFile1 = resolveIndexedFile(db, file1) ?? file1;
|
|
8
|
-
const resolvedFile2 = resolveIndexedFile(db, file2) ?? file2;
|
|
9
|
-
const row = db.get(
|
|
10
|
-
`SELECT COUNT(DISTINCT gs.id) AS shared
|
|
11
|
-
FROM global_symbols gs
|
|
12
|
-
WHERE (
|
|
13
|
-
-- Defined in file1, referenced in file2
|
|
14
|
-
EXISTS (
|
|
15
|
-
SELECT 1 FROM defn_enclosing_ranges der
|
|
16
|
-
JOIN documents d ON der.document_id = d.id
|
|
17
|
-
WHERE der.symbol_id = gs.id AND d.relative_path = ?
|
|
18
|
-
)
|
|
19
|
-
AND EXISTS (
|
|
20
|
-
SELECT 1 FROM mentions m
|
|
21
|
-
JOIN chunks c ON m.chunk_id = c.id
|
|
22
|
-
JOIN documents d ON c.document_id = d.id
|
|
23
|
-
WHERE m.symbol_id = gs.id AND m.role != 1 AND d.relative_path = ?
|
|
24
|
-
)
|
|
25
|
-
) OR (
|
|
26
|
-
-- Defined in file2, referenced in file1
|
|
27
|
-
EXISTS (
|
|
28
|
-
SELECT 1 FROM defn_enclosing_ranges der
|
|
29
|
-
JOIN documents d ON der.document_id = d.id
|
|
30
|
-
WHERE der.symbol_id = gs.id AND d.relative_path = ?
|
|
31
|
-
)
|
|
32
|
-
AND EXISTS (
|
|
33
|
-
SELECT 1 FROM mentions m
|
|
34
|
-
JOIN chunks c ON m.chunk_id = c.id
|
|
35
|
-
JOIN documents d ON c.document_id = d.id
|
|
36
|
-
WHERE m.symbol_id = gs.id AND m.role != 1 AND d.relative_path = ?
|
|
37
|
-
)
|
|
38
|
-
)`,
|
|
39
|
-
resolvedFile1,
|
|
40
|
-
resolvedFile2,
|
|
41
|
-
resolvedFile2,
|
|
42
|
-
resolvedFile1
|
|
43
|
-
);
|
|
44
|
-
return {
|
|
45
|
-
file1: resolvedFile1,
|
|
46
|
-
file2: resolvedFile2,
|
|
47
|
-
sharedSymbols: row?.shared ?? 0
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
function topCoupling(db, opts = {}) {
|
|
51
|
-
const { limit = 20, scope } = opts;
|
|
52
|
-
const scopeFilter = scope ? `AND d1.relative_path LIKE '%${scope}%' AND d2.relative_path LIKE '%${scope}%'` : "";
|
|
53
|
-
const rows = db.all(
|
|
54
|
-
`SELECT
|
|
55
|
-
def_d.relative_path AS file1,
|
|
56
|
-
ref_d.relative_path AS file2,
|
|
57
|
-
COUNT(DISTINCT gs.id) AS shared
|
|
58
|
-
FROM mentions m
|
|
59
|
-
JOIN chunks c ON m.chunk_id = c.id
|
|
60
|
-
JOIN documents ref_d ON c.document_id = ref_d.id
|
|
61
|
-
JOIN global_symbols gs ON m.symbol_id = gs.id
|
|
62
|
-
JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
|
|
63
|
-
JOIN documents def_d ON der.document_id = def_d.id
|
|
64
|
-
WHERE m.role != 1
|
|
65
|
-
AND def_d.id != ref_d.id
|
|
66
|
-
${db.pathExclusionsFor("def_d", "ref_d")}
|
|
67
|
-
${scopeFilter}
|
|
68
|
-
GROUP BY def_d.id, ref_d.id
|
|
69
|
-
ORDER BY shared DESC
|
|
70
|
-
LIMIT ?`,
|
|
71
|
-
limit
|
|
72
|
-
);
|
|
73
|
-
return rows.filter((r) => !db.isIgnored(r.file1) && !db.isIgnored(r.file2)).map((r) => ({
|
|
74
|
-
file1: r.file1,
|
|
75
|
-
file2: r.file2,
|
|
76
|
-
sharedSymbols: r.shared
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export {
|
|
81
|
-
coupling,
|
|
82
|
-
topCoupling
|
|
83
|
-
};
|
|
84
|
-
//# sourceMappingURL=chunk-XMZAC2VU.js.map
|
package/dist/chunk-Y7FKURZG.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getAllDefinitions,
|
|
3
|
-
getCalleeRowsForSymbol,
|
|
4
|
-
getCallerRowsForSymbol,
|
|
5
|
-
testFileExclusionSql
|
|
6
|
-
} from "./chunk-FMAYH7GS.js";
|
|
7
|
-
import {
|
|
8
|
-
shortenSymbol
|
|
9
|
-
} from "./chunk-YMSJCSRG.js";
|
|
10
|
-
|
|
11
|
-
// src/queries/complexity-hotspots.ts
|
|
12
|
-
function complexityHotspots(db, opts) {
|
|
13
|
-
const { scope, minLoc = 10, limit = 30 } = opts ?? {};
|
|
14
|
-
const scopeFilter = scope ? `AND d.relative_path LIKE '%${scope}%'` : "";
|
|
15
|
-
const rows = db.all(
|
|
16
|
-
`SELECT
|
|
17
|
-
gs.symbol,
|
|
18
|
-
d.relative_path AS file,
|
|
19
|
-
der.start_line,
|
|
20
|
-
der.end_line,
|
|
21
|
-
(der.end_line - der.start_line + 1) AS loc,
|
|
22
|
-
-- fanIn: distinct files that reference this symbol
|
|
23
|
-
(SELECT COUNT(DISTINCT ref_c.document_id)
|
|
24
|
-
FROM mentions ref_m
|
|
25
|
-
JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
|
|
26
|
-
WHERE ref_m.symbol_id = gs.id AND ref_m.role != 1
|
|
27
|
-
) AS fan_in,
|
|
28
|
-
-- fanOut: distinct symbols referenced within this definition range
|
|
29
|
-
-- that are defined in different files
|
|
30
|
-
(SELECT COUNT(DISTINCT out_gs.id)
|
|
31
|
-
FROM mentions out_m
|
|
32
|
-
JOIN chunks out_c ON out_m.chunk_id = out_c.id
|
|
33
|
-
JOIN global_symbols out_gs ON out_m.symbol_id = out_gs.id
|
|
34
|
-
JOIN defn_enclosing_ranges out_der ON out_gs.id = out_der.symbol_id
|
|
35
|
-
WHERE out_c.document_id = der.document_id
|
|
36
|
-
AND out_c.start_line >= der.start_line
|
|
37
|
-
AND out_c.end_line <= der.end_line
|
|
38
|
-
AND out_m.role != 1
|
|
39
|
-
AND out_gs.id != gs.id
|
|
40
|
-
AND out_der.document_id != der.document_id
|
|
41
|
-
) AS fan_out,
|
|
42
|
-
-- calleeCount: total distinct callees within definition range
|
|
43
|
-
(SELECT COUNT(DISTINCT callee_gs.id)
|
|
44
|
-
FROM mentions callee_m
|
|
45
|
-
JOIN chunks callee_c ON callee_m.chunk_id = callee_c.id
|
|
46
|
-
JOIN global_symbols callee_gs ON callee_m.symbol_id = callee_gs.id
|
|
47
|
-
WHERE callee_c.document_id = der.document_id
|
|
48
|
-
AND callee_c.start_line >= der.start_line
|
|
49
|
-
AND callee_c.end_line <= der.end_line
|
|
50
|
-
AND callee_m.role != 1
|
|
51
|
-
AND callee_gs.id != gs.id
|
|
52
|
-
) AS callee_count
|
|
53
|
-
FROM global_symbols gs
|
|
54
|
-
JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
|
|
55
|
-
JOIN documents d ON der.document_id = d.id
|
|
56
|
-
WHERE 1 = 1
|
|
57
|
-
${db.pathExclusionsFor("d")}
|
|
58
|
-
AND ${testFileExclusionSql("d")}
|
|
59
|
-
${db.symbolNoiseFor("gs")}
|
|
60
|
-
AND (der.end_line - der.start_line + 1) >= ?
|
|
61
|
-
${scopeFilter}
|
|
62
|
-
ORDER BY (
|
|
63
|
-
CAST((der.end_line - der.start_line + 1) AS REAL) / 50.0
|
|
64
|
-
* CAST((SELECT COUNT(DISTINCT ref_c2.document_id)
|
|
65
|
-
FROM mentions ref_m2
|
|
66
|
-
JOIN chunks ref_c2 ON ref_m2.chunk_id = ref_c2.id
|
|
67
|
-
WHERE ref_m2.symbol_id = gs.id AND ref_m2.role != 1
|
|
68
|
-
) AS REAL) / 5.0
|
|
69
|
-
* MAX(CAST((SELECT COUNT(DISTINCT out_gs2.id)
|
|
70
|
-
FROM mentions out_m2
|
|
71
|
-
JOIN chunks out_c2 ON out_m2.chunk_id = out_c2.id
|
|
72
|
-
JOIN global_symbols out_gs2 ON out_m2.symbol_id = out_gs2.id
|
|
73
|
-
JOIN defn_enclosing_ranges out_der2 ON out_gs2.id = out_der2.symbol_id
|
|
74
|
-
WHERE out_c2.document_id = der.document_id
|
|
75
|
-
AND out_c2.start_line >= der.start_line
|
|
76
|
-
AND out_c2.end_line <= der.end_line
|
|
77
|
-
AND out_m2.role != 1
|
|
78
|
-
AND out_gs2.id != gs.id
|
|
79
|
-
AND out_der2.document_id != der.document_id
|
|
80
|
-
) AS REAL) / 5.0, 1.0)
|
|
81
|
-
) DESC
|
|
82
|
-
LIMIT ?`,
|
|
83
|
-
minLoc,
|
|
84
|
-
limit
|
|
85
|
-
);
|
|
86
|
-
const indexedResults = rows.filter((r) => !db.isIgnored(r.file)).map((r) => ({
|
|
87
|
-
symbol: r.symbol,
|
|
88
|
-
shortName: shortenSymbol(r.symbol),
|
|
89
|
-
file: r.file,
|
|
90
|
-
startLine: r.start_line,
|
|
91
|
-
endLine: r.end_line,
|
|
92
|
-
loc: r.loc,
|
|
93
|
-
fanIn: r.fan_in,
|
|
94
|
-
fanOut: r.fan_out,
|
|
95
|
-
calleeCount: r.callee_count,
|
|
96
|
-
score: Math.round(
|
|
97
|
-
r.loc / 50 * (r.fan_in / 5) * Math.max(r.fan_out / 5, 1) * 100
|
|
98
|
-
) / 100
|
|
99
|
-
}));
|
|
100
|
-
if (indexedResults.length > 0) {
|
|
101
|
-
return indexedResults;
|
|
102
|
-
}
|
|
103
|
-
return getAllDefinitions(db, { scope }).filter((definition) => !db.isIgnored(definition.relativePath)).map((definition) => {
|
|
104
|
-
const loc = definition.endLine - definition.startLine + 1;
|
|
105
|
-
const callerRows = getCallerRowsForSymbol(db, definition, { limit: 500 });
|
|
106
|
-
const calleeRows = getCalleeRowsForSymbol(db, definition, { limit: 500 });
|
|
107
|
-
const fanIn = new Set(callerRows.map((row) => row.file)).size;
|
|
108
|
-
const fanOut = new Set(
|
|
109
|
-
calleeRows.filter((row) => row.file !== definition.relativePath).map((row) => `${row.symbol}|${row.file}`)
|
|
110
|
-
).size;
|
|
111
|
-
const calleeCount = new Set(calleeRows.map((row) => `${row.symbol}|${row.file}`)).size;
|
|
112
|
-
return {
|
|
113
|
-
symbol: definition.symbol,
|
|
114
|
-
shortName: shortenSymbol(definition.symbol),
|
|
115
|
-
file: definition.relativePath,
|
|
116
|
-
startLine: definition.startLine,
|
|
117
|
-
endLine: definition.endLine,
|
|
118
|
-
loc,
|
|
119
|
-
fanIn,
|
|
120
|
-
fanOut,
|
|
121
|
-
calleeCount,
|
|
122
|
-
score: Math.round(loc / 50 * (fanIn / 5) * Math.max(fanOut / 5, 1) * 100) / 100
|
|
123
|
-
};
|
|
124
|
-
}).filter((row) => row.loc >= minLoc).sort((left, right) => right.score - left.score || right.loc - left.loc).slice(0, limit);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export {
|
|
128
|
-
complexityHotspots
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=chunk-Y7FKURZG.js.map
|
package/dist/chunk-YMSJCSRG.js
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
// src/symbol-parser.ts
|
|
2
|
-
var SUFFIX_MAP = {
|
|
3
|
-
"/": "namespace",
|
|
4
|
-
"#": "type",
|
|
5
|
-
".": "term",
|
|
6
|
-
"[": "type-param",
|
|
7
|
-
":": "meta",
|
|
8
|
-
"!": "macro"
|
|
9
|
-
};
|
|
10
|
-
function parseSymbol(raw) {
|
|
11
|
-
if (raw.startsWith("local ")) {
|
|
12
|
-
return { kind: "local", id: raw.slice(6), raw };
|
|
13
|
-
}
|
|
14
|
-
const parts = raw.split(" ");
|
|
15
|
-
if (parts.length < 4) {
|
|
16
|
-
return {
|
|
17
|
-
scheme: parts[0] ?? "",
|
|
18
|
-
manager: parts[1] ?? "",
|
|
19
|
-
packageName: parts[2] ?? "",
|
|
20
|
-
version: "",
|
|
21
|
-
descriptors: [],
|
|
22
|
-
raw
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
const scheme = parts[0];
|
|
26
|
-
const manager = parts[1];
|
|
27
|
-
let restAfterManager = raw.slice(scheme.length + 1 + manager.length + 1);
|
|
28
|
-
let packageName;
|
|
29
|
-
if (restAfterManager.startsWith("`")) {
|
|
30
|
-
const closingTick = restAfterManager.indexOf("`", 1);
|
|
31
|
-
if (closingTick === -1) {
|
|
32
|
-
packageName = restAfterManager.slice(1);
|
|
33
|
-
restAfterManager = "";
|
|
34
|
-
} else {
|
|
35
|
-
packageName = restAfterManager.slice(1, closingTick);
|
|
36
|
-
restAfterManager = restAfterManager.slice(closingTick + 2);
|
|
37
|
-
}
|
|
38
|
-
} else {
|
|
39
|
-
const spaceIdx = restAfterManager.indexOf(" ");
|
|
40
|
-
if (spaceIdx === -1) {
|
|
41
|
-
packageName = restAfterManager;
|
|
42
|
-
restAfterManager = "";
|
|
43
|
-
} else {
|
|
44
|
-
packageName = restAfterManager.slice(0, spaceIdx);
|
|
45
|
-
restAfterManager = restAfterManager.slice(spaceIdx + 1);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
let version;
|
|
49
|
-
const versionSpaceIdx = restAfterManager.indexOf(" ");
|
|
50
|
-
if (versionSpaceIdx === -1) {
|
|
51
|
-
version = restAfterManager;
|
|
52
|
-
restAfterManager = "";
|
|
53
|
-
} else {
|
|
54
|
-
version = restAfterManager.slice(0, versionSpaceIdx);
|
|
55
|
-
restAfterManager = restAfterManager.slice(versionSpaceIdx + 1);
|
|
56
|
-
}
|
|
57
|
-
const descriptors = parseDescriptors(restAfterManager);
|
|
58
|
-
return { scheme, manager, packageName, version, descriptors, raw };
|
|
59
|
-
}
|
|
60
|
-
function parseDescriptors(input) {
|
|
61
|
-
const descriptors = [];
|
|
62
|
-
let i = 0;
|
|
63
|
-
while (i < input.length) {
|
|
64
|
-
if (input[i] === "[") {
|
|
65
|
-
const closeBracket = input.indexOf("]", i + 1);
|
|
66
|
-
if (closeBracket === -1) {
|
|
67
|
-
descriptors.push({ name: input.slice(i + 1), suffix: "type-param" });
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
descriptors.push({ name: input.slice(i + 1, closeBracket), suffix: "type-param" });
|
|
71
|
-
i = closeBracket + 1;
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (input[i] === "(" && (descriptors.length === 0 || i === 0 || isSuffixChar(input[i - 1]))) {
|
|
75
|
-
const closeParen = input.indexOf(")", i + 1);
|
|
76
|
-
if (closeParen !== -1 && input[closeParen + 1] !== ".") {
|
|
77
|
-
descriptors.push({ name: input.slice(i + 1, closeParen), suffix: "parameter" });
|
|
78
|
-
i = closeParen + 1;
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
let name;
|
|
83
|
-
if (input[i] === "`") {
|
|
84
|
-
const closingTick = input.indexOf("`", i + 1);
|
|
85
|
-
if (closingTick === -1) {
|
|
86
|
-
name = input.slice(i + 1);
|
|
87
|
-
descriptors.push({ name, suffix: "term" });
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
name = input.slice(i + 1, closingTick);
|
|
91
|
-
i = closingTick + 1;
|
|
92
|
-
} else {
|
|
93
|
-
const start = i;
|
|
94
|
-
while (i < input.length && !isSuffixChar(input[i])) {
|
|
95
|
-
i++;
|
|
96
|
-
}
|
|
97
|
-
name = input.slice(start, i);
|
|
98
|
-
}
|
|
99
|
-
if (i >= input.length) {
|
|
100
|
-
if (name) descriptors.push({ name, suffix: "term" });
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
const char = input[i];
|
|
104
|
-
if (char === "(") {
|
|
105
|
-
const closeParen = input.indexOf(")", i + 1);
|
|
106
|
-
if (closeParen !== -1 && input[closeParen + 1] === ".") {
|
|
107
|
-
descriptors.push({ name, suffix: "method" });
|
|
108
|
-
i = closeParen + 2;
|
|
109
|
-
} else if (closeParen !== -1) {
|
|
110
|
-
descriptors.push({ name, suffix: "method" });
|
|
111
|
-
i = closeParen + 1;
|
|
112
|
-
} else {
|
|
113
|
-
descriptors.push({ name, suffix: "term" });
|
|
114
|
-
i++;
|
|
115
|
-
}
|
|
116
|
-
} else {
|
|
117
|
-
const suffix = SUFFIX_MAP[char];
|
|
118
|
-
if (suffix) {
|
|
119
|
-
descriptors.push({ name, suffix });
|
|
120
|
-
i += 1;
|
|
121
|
-
} else {
|
|
122
|
-
i += 1;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return descriptors;
|
|
127
|
-
}
|
|
128
|
-
function isSuffixChar(c) {
|
|
129
|
-
return c === "/" || c === "#" || c === "." || c === "(" || c === "[" || c === ":" || c === "!";
|
|
130
|
-
}
|
|
131
|
-
function shortenSymbol(raw) {
|
|
132
|
-
const parsed = parseSymbol(raw);
|
|
133
|
-
if ("kind" in parsed && parsed.kind === "local") {
|
|
134
|
-
return `local:${parsed.id}`;
|
|
135
|
-
}
|
|
136
|
-
const sym = parsed;
|
|
137
|
-
if (sym.descriptors.length === 0) return sym.raw;
|
|
138
|
-
const parts = [];
|
|
139
|
-
for (const desc of sym.descriptors) {
|
|
140
|
-
let name = desc.name;
|
|
141
|
-
if (desc.suffix === "namespace") {
|
|
142
|
-
name = name.replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/, "").replace(/\.(py|pyi)$/, "").replace(/\.(rs)$/, "").replace(/\.(java|scala|kt|kts)$/, "").replace(/\.(rb)$/, "").replace(/\.(go)$/, "").replace(/\.(cs|vb)$/, "").replace(/\.(dart)$/, "").replace(/\.(php)$/, "").replace(/\.(c|cc|cpp|cxx|h|hpp)$/, "");
|
|
143
|
-
}
|
|
144
|
-
if (!name) continue;
|
|
145
|
-
if (desc.suffix === "method") {
|
|
146
|
-
parts.push(`${name}()`);
|
|
147
|
-
} else {
|
|
148
|
-
parts.push(name);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return parts.join(":");
|
|
152
|
-
}
|
|
153
|
-
function leafName(raw) {
|
|
154
|
-
const parsed = parseSymbol(raw);
|
|
155
|
-
if ("kind" in parsed && parsed.kind === "local") {
|
|
156
|
-
return parsed.id;
|
|
157
|
-
}
|
|
158
|
-
const sym = parsed;
|
|
159
|
-
if (sym.descriptors.length === 0) return "";
|
|
160
|
-
const last = sym.descriptors[sym.descriptors.length - 1];
|
|
161
|
-
return last.name;
|
|
162
|
-
}
|
|
163
|
-
function leafSuffix(raw) {
|
|
164
|
-
const parsed = parseSymbol(raw);
|
|
165
|
-
if ("kind" in parsed && parsed.kind === "local") {
|
|
166
|
-
return null;
|
|
167
|
-
}
|
|
168
|
-
const sym = parsed;
|
|
169
|
-
const last = sym.descriptors[sym.descriptors.length - 1];
|
|
170
|
-
return last?.suffix ?? null;
|
|
171
|
-
}
|
|
172
|
-
function isCallableSymbol(raw) {
|
|
173
|
-
return raw.endsWith("().") || leafSuffix(raw) === "method";
|
|
174
|
-
}
|
|
175
|
-
function isFunctionLikeSymbol(raw) {
|
|
176
|
-
const suffix = leafSuffix(raw);
|
|
177
|
-
return suffix === "method" || suffix === "term";
|
|
178
|
-
}
|
|
179
|
-
function isModuleLikeSymbol(raw) {
|
|
180
|
-
return leafSuffix(raw) === "namespace";
|
|
181
|
-
}
|
|
182
|
-
function isDirectChildSymbol(parentRaw, candidateRaw) {
|
|
183
|
-
const parent = parseSymbol(parentRaw);
|
|
184
|
-
const candidate = parseSymbol(candidateRaw);
|
|
185
|
-
if ("kind" in parent || "kind" in candidate) {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
const parentDescriptors = parent.descriptors;
|
|
189
|
-
const candidateDescriptors = candidate.descriptors;
|
|
190
|
-
if (candidateDescriptors.length !== parentDescriptors.length + 1) {
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
for (let i = 0; i < parentDescriptors.length; i++) {
|
|
194
|
-
const parentDesc = parentDescriptors[i];
|
|
195
|
-
const candidateDesc = candidateDescriptors[i];
|
|
196
|
-
if (parentDesc.name !== candidateDesc.name || parentDesc.suffix !== candidateDesc.suffix) {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
export {
|
|
204
|
-
parseSymbol,
|
|
205
|
-
shortenSymbol,
|
|
206
|
-
leafName,
|
|
207
|
-
leafSuffix,
|
|
208
|
-
isCallableSymbol,
|
|
209
|
-
isFunctionLikeSymbol,
|
|
210
|
-
isModuleLikeSymbol,
|
|
211
|
-
isDirectChildSymbol
|
|
212
|
-
};
|
|
213
|
-
//# sourceMappingURL=chunk-YMSJCSRG.js.map
|