@repo-map/core 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/dist/entry-detector.d.ts +20 -0
- package/dist/entry-detector.js +192 -0
- package/dist/entry-detector.js.map +1 -0
- package/dist/file-index.d.ts +27 -0
- package/dist/file-index.js +132 -0
- package/dist/file-index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/keyword-extractor.d.ts +21 -0
- package/dist/keyword-extractor.js +449 -0
- package/dist/keyword-extractor.js.map +1 -0
- package/dist/meta.d.ts +16 -0
- package/dist/meta.js +10 -0
- package/dist/meta.js.map +1 -0
- package/dist/module-detector.d.ts +16 -0
- package/dist/module-detector.js +424 -0
- package/dist/module-detector.js.map +1 -0
- package/dist/module-index.d.ts +9 -0
- package/dist/module-index.js +21 -0
- package/dist/module-index.js.map +1 -0
- package/dist/query.d.ts +28 -0
- package/dist/query.js +156 -0
- package/dist/query.js.map +1 -0
- package/dist/summary.d.ts +12 -0
- package/dist/summary.js +143 -0
- package/dist/summary.js.map +1 -0
- package/dist/walker.d.ts +16 -0
- package/dist/walker.js +321 -0
- package/dist/walker.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
const DEFAULT_WORKSPACE_PATTERNS = ["packages/*", "apps/*", "services/*", "libs/*"];
|
|
4
|
+
const NODE_EXTENSIONS = new Set([
|
|
5
|
+
".js",
|
|
6
|
+
".jsx",
|
|
7
|
+
".ts",
|
|
8
|
+
".tsx",
|
|
9
|
+
".mjs",
|
|
10
|
+
".cjs",
|
|
11
|
+
".mts",
|
|
12
|
+
".cts"
|
|
13
|
+
]);
|
|
14
|
+
const PYTHON_EXTENSIONS = new Set([".py", ".pyw"]);
|
|
15
|
+
const GO_EXTENSIONS = new Set([".go"]);
|
|
16
|
+
const PYPROJECT_FILES = new Set([
|
|
17
|
+
"pyproject.toml",
|
|
18
|
+
"pyproject.yaml",
|
|
19
|
+
"pyproject.yml"
|
|
20
|
+
]);
|
|
21
|
+
const normalizePosixPath = (value) => {
|
|
22
|
+
let normalized = value.replace(/\\/g, "/").trim();
|
|
23
|
+
if (normalized.startsWith("./")) {
|
|
24
|
+
normalized = normalized.slice(2);
|
|
25
|
+
}
|
|
26
|
+
while (normalized.endsWith("/") && normalized.length > 1) {
|
|
27
|
+
normalized = normalized.slice(0, -1);
|
|
28
|
+
}
|
|
29
|
+
return normalized;
|
|
30
|
+
};
|
|
31
|
+
const normalizeDirPath = (value) => {
|
|
32
|
+
const normalized = normalizePosixPath(value);
|
|
33
|
+
if (normalized.length === 0 || normalized === ".")
|
|
34
|
+
return ".";
|
|
35
|
+
return normalized;
|
|
36
|
+
};
|
|
37
|
+
const compareNames = (left, right) => {
|
|
38
|
+
if (left === right)
|
|
39
|
+
return 0;
|
|
40
|
+
return left < right ? -1 : 1;
|
|
41
|
+
};
|
|
42
|
+
const reportError = (err, targetPath, onError) => {
|
|
43
|
+
if (!onError)
|
|
44
|
+
return;
|
|
45
|
+
const error = err;
|
|
46
|
+
if (error?.code === "ENOENT")
|
|
47
|
+
return;
|
|
48
|
+
onError(error, targetPath);
|
|
49
|
+
};
|
|
50
|
+
const readTextFile = async (targetPath, onError) => {
|
|
51
|
+
try {
|
|
52
|
+
let content = await fs.readFile(targetPath, "utf8");
|
|
53
|
+
if (content.startsWith("\uFEFF")) {
|
|
54
|
+
content = content.slice(1);
|
|
55
|
+
}
|
|
56
|
+
return content;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
const error = err;
|
|
60
|
+
if (error?.code === "ENOENT")
|
|
61
|
+
return null;
|
|
62
|
+
reportError(err, targetPath, onError);
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const readJsonFile = async (targetPath, onError) => {
|
|
67
|
+
const content = await readTextFile(targetPath, onError);
|
|
68
|
+
if (content === null)
|
|
69
|
+
return null;
|
|
70
|
+
try {
|
|
71
|
+
return JSON.parse(content);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
reportError(err, targetPath, onError);
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const extractWorkspaces = (pkg) => {
|
|
79
|
+
const workspaces = pkg.workspaces;
|
|
80
|
+
if (Array.isArray(workspaces))
|
|
81
|
+
return workspaces.filter(isString);
|
|
82
|
+
if (workspaces &&
|
|
83
|
+
typeof workspaces === "object" &&
|
|
84
|
+
Array.isArray(workspaces.packages)) {
|
|
85
|
+
const packages = workspaces.packages;
|
|
86
|
+
return Array.isArray(packages) ? packages.filter(isString) : [];
|
|
87
|
+
}
|
|
88
|
+
return [];
|
|
89
|
+
};
|
|
90
|
+
const parsePnpmWorkspace = (content) => {
|
|
91
|
+
const lines = content.split(/\r?\n/);
|
|
92
|
+
const patterns = [];
|
|
93
|
+
let packagesIndent = null;
|
|
94
|
+
for (const line of lines) {
|
|
95
|
+
if (line.trim().length === 0 || line.trim().startsWith("#"))
|
|
96
|
+
continue;
|
|
97
|
+
const indent = line.match(/^\s*/)?.[0].length ?? 0;
|
|
98
|
+
const trimmed = line.trim();
|
|
99
|
+
if (trimmed.startsWith("packages:")) {
|
|
100
|
+
packagesIndent = indent;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (packagesIndent !== null) {
|
|
104
|
+
if (indent <= packagesIndent) {
|
|
105
|
+
packagesIndent = null;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (trimmed.startsWith("-")) {
|
|
109
|
+
let value = trimmed.slice(1).trim();
|
|
110
|
+
if (value.startsWith("-"))
|
|
111
|
+
value = value.slice(1).trim();
|
|
112
|
+
value = value.replace(/^['"]|['"]$/g, "");
|
|
113
|
+
if (value.length > 0)
|
|
114
|
+
patterns.push(value);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return patterns;
|
|
119
|
+
};
|
|
120
|
+
const normalizeGlobPattern = (value) => {
|
|
121
|
+
let pattern = value.trim();
|
|
122
|
+
if (pattern.length === 0)
|
|
123
|
+
return "";
|
|
124
|
+
const negated = pattern.startsWith("!");
|
|
125
|
+
if (negated)
|
|
126
|
+
pattern = pattern.slice(1);
|
|
127
|
+
pattern = normalizePosixPath(pattern);
|
|
128
|
+
if (pattern === ".")
|
|
129
|
+
pattern = "";
|
|
130
|
+
return negated ? `!${pattern}` : pattern;
|
|
131
|
+
};
|
|
132
|
+
const normalizeGlobList = (patterns) => {
|
|
133
|
+
const normalized = patterns
|
|
134
|
+
.map(normalizeGlobPattern)
|
|
135
|
+
.filter((pattern) => pattern.length > 0);
|
|
136
|
+
return Array.from(new Set(normalized));
|
|
137
|
+
};
|
|
138
|
+
const normalizeRootList = (roots) => {
|
|
139
|
+
const normalized = roots
|
|
140
|
+
.map((root) => normalizeDirPath(root))
|
|
141
|
+
.filter((root) => root.length > 0);
|
|
142
|
+
return Array.from(new Set(normalized));
|
|
143
|
+
};
|
|
144
|
+
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
145
|
+
const globToRegExp = (pattern) => {
|
|
146
|
+
let regex = "^";
|
|
147
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
148
|
+
const char = pattern[index];
|
|
149
|
+
if (char === "*") {
|
|
150
|
+
const next = pattern[index + 1];
|
|
151
|
+
if (next === "*") {
|
|
152
|
+
while (pattern[index + 1] === "*")
|
|
153
|
+
index += 1;
|
|
154
|
+
regex += ".*";
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
regex += "[^/]*";
|
|
158
|
+
}
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (char === "?") {
|
|
162
|
+
regex += "[^/]";
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
regex += escapeRegExp(char);
|
|
166
|
+
}
|
|
167
|
+
regex += "$";
|
|
168
|
+
return new RegExp(regex);
|
|
169
|
+
};
|
|
170
|
+
const compileGlobMatchers = (patterns) => patterns.map((pattern) => {
|
|
171
|
+
const negated = pattern.startsWith("!");
|
|
172
|
+
const value = negated ? pattern.slice(1) : pattern;
|
|
173
|
+
return {
|
|
174
|
+
negated,
|
|
175
|
+
regex: globToRegExp(value)
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
const matchesPatterns = (value, matchers) => {
|
|
179
|
+
if (matchers.length === 0)
|
|
180
|
+
return false;
|
|
181
|
+
let included = false;
|
|
182
|
+
for (const matcher of matchers) {
|
|
183
|
+
if (matcher.regex.test(value)) {
|
|
184
|
+
included = !matcher.negated;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return included;
|
|
188
|
+
};
|
|
189
|
+
const resolveModuleRoot = (filePath, candidateRoots, cache) => {
|
|
190
|
+
let dir = path.posix.dirname(filePath);
|
|
191
|
+
if (dir === ".")
|
|
192
|
+
dir = ".";
|
|
193
|
+
const visited = [];
|
|
194
|
+
while (true) {
|
|
195
|
+
const cached = cache.get(dir);
|
|
196
|
+
if (cached) {
|
|
197
|
+
for (const entry of visited)
|
|
198
|
+
cache.set(entry, cached);
|
|
199
|
+
return cached;
|
|
200
|
+
}
|
|
201
|
+
visited.push(dir);
|
|
202
|
+
if (candidateRoots.has(dir)) {
|
|
203
|
+
for (const entry of visited)
|
|
204
|
+
cache.set(entry, dir);
|
|
205
|
+
return dir;
|
|
206
|
+
}
|
|
207
|
+
if (dir === ".") {
|
|
208
|
+
for (const entry of visited)
|
|
209
|
+
cache.set(entry, ".");
|
|
210
|
+
return ".";
|
|
211
|
+
}
|
|
212
|
+
dir = path.posix.dirname(dir);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
const countLanguageFromExt = (ext) => {
|
|
216
|
+
if (NODE_EXTENSIONS.has(ext))
|
|
217
|
+
return "node";
|
|
218
|
+
if (PYTHON_EXTENSIONS.has(ext))
|
|
219
|
+
return "python";
|
|
220
|
+
if (GO_EXTENSIONS.has(ext))
|
|
221
|
+
return "go";
|
|
222
|
+
return null;
|
|
223
|
+
};
|
|
224
|
+
const resolveLanguage = (aggregate, markers) => {
|
|
225
|
+
if (markers && markers.size > 1)
|
|
226
|
+
return "mixed";
|
|
227
|
+
if (markers && markers.size === 1)
|
|
228
|
+
return Array.from(markers)[0];
|
|
229
|
+
const total = aggregate.extCounts.node +
|
|
230
|
+
aggregate.extCounts.python +
|
|
231
|
+
aggregate.extCounts.go;
|
|
232
|
+
if (total === 0)
|
|
233
|
+
return "unknown";
|
|
234
|
+
const entries = [
|
|
235
|
+
["node", aggregate.extCounts.node],
|
|
236
|
+
["python", aggregate.extCounts.python],
|
|
237
|
+
["go", aggregate.extCounts.go]
|
|
238
|
+
];
|
|
239
|
+
entries.sort((a, b) => b[1] - a[1]);
|
|
240
|
+
const [topLang, topCount] = entries[0];
|
|
241
|
+
if (topCount / total >= 0.6)
|
|
242
|
+
return topLang;
|
|
243
|
+
return "mixed";
|
|
244
|
+
};
|
|
245
|
+
const resolveAbsolutePath = (repoRoot, posixPath) => {
|
|
246
|
+
const segments = posixPath === "." ? [] : posixPath.split("/");
|
|
247
|
+
return path.resolve(repoRoot, ...segments);
|
|
248
|
+
};
|
|
249
|
+
const readModuleName = async (repoRoot, modulePath, onError) => {
|
|
250
|
+
const packagePath = resolveAbsolutePath(repoRoot, path.posix.join(modulePath, "package.json"));
|
|
251
|
+
const pkg = await readJsonFile(packagePath, onError);
|
|
252
|
+
if (pkg && typeof pkg.name === "string") {
|
|
253
|
+
return pkg.name;
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
};
|
|
257
|
+
const isString = (value) => typeof value === "string";
|
|
258
|
+
const getWorkspaceConfig = async (repoRoot, onError) => {
|
|
259
|
+
const globs = [];
|
|
260
|
+
const roots = [];
|
|
261
|
+
const pkg = await readJsonFile(path.resolve(repoRoot, "package.json"), onError);
|
|
262
|
+
if (pkg) {
|
|
263
|
+
globs.push(...extractWorkspaces(pkg));
|
|
264
|
+
}
|
|
265
|
+
const pnpmWorkspace = await readTextFile(path.resolve(repoRoot, "pnpm-workspace.yaml"), onError);
|
|
266
|
+
if (pnpmWorkspace) {
|
|
267
|
+
globs.push(...parsePnpmWorkspace(pnpmWorkspace));
|
|
268
|
+
}
|
|
269
|
+
const lerna = await readJsonFile(path.resolve(repoRoot, "lerna.json"), onError);
|
|
270
|
+
if (lerna && Array.isArray(lerna.packages)) {
|
|
271
|
+
globs.push(...lerna.packages.filter(isString));
|
|
272
|
+
}
|
|
273
|
+
const rush = await readJsonFile(path.resolve(repoRoot, "rush.json"), onError);
|
|
274
|
+
if (rush && Array.isArray(rush.projects)) {
|
|
275
|
+
for (const project of rush.projects) {
|
|
276
|
+
const projectFolder = project.projectFolder;
|
|
277
|
+
if (typeof projectFolder === "string")
|
|
278
|
+
roots.push(projectFolder);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const nx = await readJsonFile(path.resolve(repoRoot, "nx.json"), onError);
|
|
282
|
+
if (nx) {
|
|
283
|
+
const workspaceLayout = nx.workspaceLayout;
|
|
284
|
+
const appsDir = workspaceLayout?.appsDir;
|
|
285
|
+
const libsDir = workspaceLayout?.libsDir;
|
|
286
|
+
if (typeof appsDir === "string")
|
|
287
|
+
globs.push(`${appsDir}/*`);
|
|
288
|
+
if (typeof libsDir === "string")
|
|
289
|
+
globs.push(`${libsDir}/*`);
|
|
290
|
+
}
|
|
291
|
+
const workspaceJson = await readJsonFile(path.resolve(repoRoot, "workspace.json"), onError);
|
|
292
|
+
if (workspaceJson && typeof workspaceJson.projects === "object") {
|
|
293
|
+
for (const project of Object.values(workspaceJson.projects)) {
|
|
294
|
+
const root = project?.root;
|
|
295
|
+
if (typeof root === "string")
|
|
296
|
+
roots.push(root);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
globs: normalizeGlobList(globs),
|
|
301
|
+
roots: normalizeRootList(roots)
|
|
302
|
+
};
|
|
303
|
+
};
|
|
304
|
+
export async function detectModules(options) {
|
|
305
|
+
const repoRoot = path.resolve(options.repoRoot);
|
|
306
|
+
const onError = options.onError;
|
|
307
|
+
const fileList = Array.isArray(options.files)
|
|
308
|
+
? options.files.map(normalizePosixPath)
|
|
309
|
+
: Array.from(options.files, normalizePosixPath);
|
|
310
|
+
const dirSet = new Set();
|
|
311
|
+
const topLevelDirs = new Set();
|
|
312
|
+
const markerMap = new Map();
|
|
313
|
+
for (const filePath of fileList) {
|
|
314
|
+
if (!filePath || filePath === ".")
|
|
315
|
+
continue;
|
|
316
|
+
const dirPath = normalizeDirPath(path.posix.dirname(filePath));
|
|
317
|
+
let current = dirPath;
|
|
318
|
+
while (true) {
|
|
319
|
+
if (dirSet.has(current))
|
|
320
|
+
break;
|
|
321
|
+
dirSet.add(current);
|
|
322
|
+
if (current === ".")
|
|
323
|
+
break;
|
|
324
|
+
current = path.posix.dirname(current);
|
|
325
|
+
}
|
|
326
|
+
if (filePath.includes("/")) {
|
|
327
|
+
const topLevel = filePath.split("/")[0];
|
|
328
|
+
if (topLevel)
|
|
329
|
+
topLevelDirs.add(topLevel);
|
|
330
|
+
}
|
|
331
|
+
const baseName = path.posix.basename(filePath);
|
|
332
|
+
if (baseName === "package.json") {
|
|
333
|
+
const marker = markerMap.get(dirPath) ?? new Set();
|
|
334
|
+
marker.add("node");
|
|
335
|
+
markerMap.set(dirPath, marker);
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (baseName === "go.mod") {
|
|
339
|
+
const marker = markerMap.get(dirPath) ?? new Set();
|
|
340
|
+
marker.add("go");
|
|
341
|
+
markerMap.set(dirPath, marker);
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
if (PYPROJECT_FILES.has(baseName)) {
|
|
345
|
+
const marker = markerMap.get(dirPath) ?? new Set();
|
|
346
|
+
marker.add("python");
|
|
347
|
+
markerMap.set(dirPath, marker);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
const useWorkspaceConfig = options.useWorkspaceConfig ?? true;
|
|
351
|
+
const workspaceConfig = useWorkspaceConfig
|
|
352
|
+
? await getWorkspaceConfig(repoRoot, onError)
|
|
353
|
+
: { globs: [], roots: [] };
|
|
354
|
+
const fallbackWorkspacePatterns = options.fallbackWorkspacePatterns ?? DEFAULT_WORKSPACE_PATTERNS;
|
|
355
|
+
const workspaceGlobs = options.workspacePatterns && options.workspacePatterns.length > 0
|
|
356
|
+
? normalizeGlobList(options.workspacePatterns)
|
|
357
|
+
: workspaceConfig.globs.length > 0
|
|
358
|
+
? workspaceConfig.globs
|
|
359
|
+
: normalizeGlobList(fallbackWorkspacePatterns);
|
|
360
|
+
const candidateRoots = new Set(markerMap.keys());
|
|
361
|
+
const explicitRoots = new Set(workspaceConfig.roots);
|
|
362
|
+
for (const root of explicitRoots) {
|
|
363
|
+
candidateRoots.add(root);
|
|
364
|
+
}
|
|
365
|
+
if (workspaceGlobs.length > 0) {
|
|
366
|
+
const matchers = compileGlobMatchers(workspaceGlobs);
|
|
367
|
+
for (const dirPath of dirSet) {
|
|
368
|
+
if (matchesPatterns(dirPath, matchers)) {
|
|
369
|
+
candidateRoots.add(dirPath);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
const hasNonRootMarkers = Array.from(markerMap.keys()).some((root) => root !== ".");
|
|
374
|
+
const hasWorkspaceHints = workspaceGlobs.length > 0 || explicitRoots.size > 0;
|
|
375
|
+
if (!hasNonRootMarkers && !hasWorkspaceHints && topLevelDirs.size > 0) {
|
|
376
|
+
for (const dir of topLevelDirs)
|
|
377
|
+
candidateRoots.add(dir);
|
|
378
|
+
}
|
|
379
|
+
candidateRoots.add(".");
|
|
380
|
+
const moduleMap = new Map();
|
|
381
|
+
const dirCache = new Map();
|
|
382
|
+
for (const filePath of fileList) {
|
|
383
|
+
if (!filePath || filePath === ".")
|
|
384
|
+
continue;
|
|
385
|
+
const moduleRoot = resolveModuleRoot(filePath, candidateRoots, dirCache);
|
|
386
|
+
const aggregate = moduleMap.get(moduleRoot) ??
|
|
387
|
+
{
|
|
388
|
+
path: moduleRoot,
|
|
389
|
+
fileCount: 0,
|
|
390
|
+
extCounts: { node: 0, python: 0, go: 0 }
|
|
391
|
+
};
|
|
392
|
+
aggregate.fileCount += 1;
|
|
393
|
+
const ext = path.posix.extname(filePath);
|
|
394
|
+
const language = countLanguageFromExt(ext);
|
|
395
|
+
if (language)
|
|
396
|
+
aggregate.extCounts[language] += 1;
|
|
397
|
+
moduleMap.set(moduleRoot, aggregate);
|
|
398
|
+
}
|
|
399
|
+
const repoName = path.basename(repoRoot);
|
|
400
|
+
const modules = [];
|
|
401
|
+
const sortedPaths = Array.from(moduleMap.keys()).sort(compareNames);
|
|
402
|
+
for (const modulePath of sortedPaths) {
|
|
403
|
+
const aggregate = moduleMap.get(modulePath);
|
|
404
|
+
if (!aggregate)
|
|
405
|
+
continue;
|
|
406
|
+
const markers = markerMap.get(modulePath);
|
|
407
|
+
const language = resolveLanguage(aggregate, markers);
|
|
408
|
+
let name = null;
|
|
409
|
+
if (markers?.has("node")) {
|
|
410
|
+
name = await readModuleName(repoRoot, modulePath, onError);
|
|
411
|
+
}
|
|
412
|
+
if (!name) {
|
|
413
|
+
name = modulePath === "." ? repoName : path.posix.basename(modulePath);
|
|
414
|
+
}
|
|
415
|
+
modules.push({
|
|
416
|
+
name,
|
|
417
|
+
path: modulePath,
|
|
418
|
+
language,
|
|
419
|
+
fileCount: aggregate.fileCount
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
return modules;
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=module-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-detector.js","sourceRoot":"","sources":["../src/module-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ModuleInfo } from "./module-detector.js";
|
|
2
|
+
import type { ModuleKeywords } from "./keyword-extractor.js";
|
|
3
|
+
export interface ModuleIndexEntry extends ModuleInfo {
|
|
4
|
+
keywords: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ModuleIndex {
|
|
7
|
+
modules: ModuleIndexEntry[];
|
|
8
|
+
}
|
|
9
|
+
export declare const buildModuleIndex: (modules: ModuleInfo[], keywords: ModuleKeywords[]) => ModuleIndex;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const compareNames = (left, right) => {
|
|
2
|
+
if (left === right)
|
|
3
|
+
return 0;
|
|
4
|
+
return left < right ? -1 : 1;
|
|
5
|
+
};
|
|
6
|
+
export const buildModuleIndex = (modules, keywords) => {
|
|
7
|
+
const keywordMap = new Map();
|
|
8
|
+
for (const entry of keywords) {
|
|
9
|
+
keywordMap.set(entry.path, entry.keywords);
|
|
10
|
+
}
|
|
11
|
+
const entries = modules.map((module) => ({
|
|
12
|
+
name: module.name,
|
|
13
|
+
path: module.path,
|
|
14
|
+
language: module.language,
|
|
15
|
+
fileCount: module.fileCount,
|
|
16
|
+
keywords: keywordMap.get(module.path) ?? []
|
|
17
|
+
}));
|
|
18
|
+
entries.sort((a, b) => compareNames(a.path, b.path));
|
|
19
|
+
return { modules: entries };
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=module-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-index.js","sourceRoot":"","sources":["../src/module-index.ts"],"names":[],"mappings":"AAWA,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;IACnD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,CAAC;IAC7B,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAqB,EACrB,QAA0B,EACb,EAAE;IACf,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;KAC5C,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC,CAAC"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EntryMap } from "./entry-detector.js";
|
|
2
|
+
import type { ModuleIndex } from "./module-index.js";
|
|
3
|
+
export type QueryMatchField = "name" | "path" | "keyword" | "entry" | "entry-type";
|
|
4
|
+
export interface QueryMatch {
|
|
5
|
+
field: QueryMatchField;
|
|
6
|
+
value: string;
|
|
7
|
+
}
|
|
8
|
+
export interface QueryResultEntry {
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
language: string;
|
|
12
|
+
fileCount: number;
|
|
13
|
+
score: number;
|
|
14
|
+
matches: QueryMatch[];
|
|
15
|
+
}
|
|
16
|
+
export interface QueryResult {
|
|
17
|
+
query: string;
|
|
18
|
+
tokens: string[];
|
|
19
|
+
results: QueryResultEntry[];
|
|
20
|
+
}
|
|
21
|
+
export interface QueryOptions {
|
|
22
|
+
query: string;
|
|
23
|
+
moduleIndex: ModuleIndex;
|
|
24
|
+
entryMap?: EntryMap | null;
|
|
25
|
+
maxResults?: number;
|
|
26
|
+
minScore?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare const queryModules: (options: QueryOptions) => QueryResult;
|
package/dist/query.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
const DEFAULT_MAX_RESULTS = 50;
|
|
2
|
+
const DEFAULT_MIN_SCORE = 1;
|
|
3
|
+
const MAX_MATCHES = 24;
|
|
4
|
+
const MATCH_FIELD_ORDER = [
|
|
5
|
+
"name",
|
|
6
|
+
"path",
|
|
7
|
+
"keyword",
|
|
8
|
+
"entry",
|
|
9
|
+
"entry-type"
|
|
10
|
+
];
|
|
11
|
+
const compareNames = (left, right) => {
|
|
12
|
+
if (left === right)
|
|
13
|
+
return 0;
|
|
14
|
+
return left < right ? -1 : 1;
|
|
15
|
+
};
|
|
16
|
+
const normalizeForSearch = (value) => {
|
|
17
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
18
|
+
};
|
|
19
|
+
const tokenizeQuery = (value) => {
|
|
20
|
+
const normalized = normalizeForSearch(value);
|
|
21
|
+
if (!normalized)
|
|
22
|
+
return [];
|
|
23
|
+
const parts = normalized.split(/\s+/).filter(Boolean);
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const tokens = [];
|
|
26
|
+
for (const part of parts) {
|
|
27
|
+
if (seen.has(part))
|
|
28
|
+
continue;
|
|
29
|
+
seen.add(part);
|
|
30
|
+
tokens.push(part);
|
|
31
|
+
}
|
|
32
|
+
return tokens;
|
|
33
|
+
};
|
|
34
|
+
const buildEntryMap = (entryMap) => {
|
|
35
|
+
const map = new Map();
|
|
36
|
+
if (!entryMap)
|
|
37
|
+
return map;
|
|
38
|
+
for (const moduleEntry of entryMap.modules) {
|
|
39
|
+
map.set(moduleEntry.path, moduleEntry.entries ?? []);
|
|
40
|
+
}
|
|
41
|
+
return map;
|
|
42
|
+
};
|
|
43
|
+
const flattenMatches = (matchMap) => {
|
|
44
|
+
const matches = [];
|
|
45
|
+
for (const field of MATCH_FIELD_ORDER) {
|
|
46
|
+
const values = Array.from(matchMap.get(field) ?? []).sort(compareNames);
|
|
47
|
+
for (const value of values) {
|
|
48
|
+
matches.push({ field, value });
|
|
49
|
+
if (matches.length >= MAX_MATCHES)
|
|
50
|
+
return matches;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return matches;
|
|
54
|
+
};
|
|
55
|
+
const scoreModule = (module, tokens, entries) => {
|
|
56
|
+
let score = 0;
|
|
57
|
+
let matchCount = 0;
|
|
58
|
+
const matchMap = new Map();
|
|
59
|
+
const addMatch = (field, value, weight) => {
|
|
60
|
+
if (!value)
|
|
61
|
+
return;
|
|
62
|
+
const set = matchMap.get(field) ?? new Set();
|
|
63
|
+
if (set.has(value))
|
|
64
|
+
return;
|
|
65
|
+
set.add(value);
|
|
66
|
+
matchMap.set(field, set);
|
|
67
|
+
score += weight;
|
|
68
|
+
matchCount += 1;
|
|
69
|
+
};
|
|
70
|
+
const nameNormalized = normalizeForSearch(module.name);
|
|
71
|
+
const pathNormalized = normalizeForSearch(module.path);
|
|
72
|
+
const keywordNormalized = module.keywords.map((keyword) => ({
|
|
73
|
+
value: keyword,
|
|
74
|
+
normalized: normalizeForSearch(keyword)
|
|
75
|
+
}));
|
|
76
|
+
for (const token of tokens) {
|
|
77
|
+
if (!token)
|
|
78
|
+
continue;
|
|
79
|
+
if (nameNormalized === token)
|
|
80
|
+
addMatch("name", module.name, 12);
|
|
81
|
+
else if (nameNormalized.includes(token))
|
|
82
|
+
addMatch("name", module.name, 8);
|
|
83
|
+
if (pathNormalized === token)
|
|
84
|
+
addMatch("path", module.path, 6);
|
|
85
|
+
else if (pathNormalized.includes(token))
|
|
86
|
+
addMatch("path", module.path, 4);
|
|
87
|
+
for (const keyword of keywordNormalized) {
|
|
88
|
+
if (!keyword.normalized)
|
|
89
|
+
continue;
|
|
90
|
+
if (keyword.normalized === token)
|
|
91
|
+
addMatch("keyword", keyword.value, 6);
|
|
92
|
+
else if (keyword.normalized.includes(token))
|
|
93
|
+
addMatch("keyword", keyword.value, 3);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (entries.length > 0 && matchCount < MAX_MATCHES) {
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
const entryPathNormalized = normalizeForSearch(entry.path);
|
|
99
|
+
const entryTypeNormalized = normalizeForSearch(entry.type);
|
|
100
|
+
const entryTypeTokens = entryTypeNormalized
|
|
101
|
+
? entryTypeNormalized.split(/\s+/).filter(Boolean)
|
|
102
|
+
: [];
|
|
103
|
+
for (const token of tokens) {
|
|
104
|
+
if (!token)
|
|
105
|
+
continue;
|
|
106
|
+
if (entryPathNormalized.includes(token)) {
|
|
107
|
+
addMatch("entry", entry.path, 4);
|
|
108
|
+
}
|
|
109
|
+
if (entryTypeTokens.includes(token)) {
|
|
110
|
+
addMatch("entry-type", entry.type, 2);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
score,
|
|
117
|
+
matches: flattenMatches(matchMap)
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
export const queryModules = (options) => {
|
|
121
|
+
const query = options.query ?? "";
|
|
122
|
+
const tokens = tokenizeQuery(query);
|
|
123
|
+
if (tokens.length === 0) {
|
|
124
|
+
return { query, tokens, results: [] };
|
|
125
|
+
}
|
|
126
|
+
const maxResults = options.maxResults === undefined ? DEFAULT_MAX_RESULTS : options.maxResults;
|
|
127
|
+
const minScore = options.minScore === undefined ? DEFAULT_MIN_SCORE : options.minScore;
|
|
128
|
+
const entryMap = buildEntryMap(options.entryMap);
|
|
129
|
+
const results = [];
|
|
130
|
+
for (const module of options.moduleIndex.modules) {
|
|
131
|
+
const entries = entryMap.get(module.path) ?? [];
|
|
132
|
+
const scored = scoreModule(module, tokens, entries);
|
|
133
|
+
if (scored.score < minScore)
|
|
134
|
+
continue;
|
|
135
|
+
results.push({
|
|
136
|
+
name: module.name,
|
|
137
|
+
path: module.path,
|
|
138
|
+
language: module.language,
|
|
139
|
+
fileCount: module.fileCount,
|
|
140
|
+
score: scored.score,
|
|
141
|
+
matches: scored.matches
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
results.sort((a, b) => {
|
|
145
|
+
if (a.score !== b.score)
|
|
146
|
+
return b.score - a.score;
|
|
147
|
+
return compareNames(a.path, b.path);
|
|
148
|
+
});
|
|
149
|
+
const limited = maxResults > 0 ? results.slice(0, maxResults) : results.slice();
|
|
150
|
+
return {
|
|
151
|
+
query,
|
|
152
|
+
tokens,
|
|
153
|
+
results: limited
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=query.js.map
|