@lzehrung/codegraph 2.3.10 → 2.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/codegraph-skill/codegraph/SKILL.md +1 -1
- package/dist/bin/cli.js +234 -51
- package/dist/bin/rawQueryWorker.js +82 -3
- package/dist/duplicates/unitCache.d.ts.map +1 -1
- package/dist/duplicates/unitCache.js +7 -2
- package/dist/duplicates/unitCache.js.map +1 -1
- package/dist/indexer/build-cache/module-cache.d.ts +4 -0
- package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
- package/dist/indexer/build-cache/module-cache.js +74 -17
- package/dist/indexer/build-cache/module-cache.js.map +1 -1
- package/dist/sqlite-driver.d.ts +27 -0
- package/dist/sqlite-driver.d.ts.map +1 -1
- package/dist/sqlite-driver.js +86 -3
- package/dist/sqlite-driver.js.map +1 -1
- package/dist/util/git.d.ts +17 -0
- package/dist/util/git.d.ts.map +1 -1
- package/dist/util/git.js +52 -26
- package/dist/util/git.js.map +1 -1
- package/dist/util/projectFiles.d.ts +5 -2
- package/dist/util/projectFiles.d.ts.map +1 -1
- package/dist/util/projectFiles.js +93 -17
- package/dist/util/projectFiles.js.map +1 -1
- package/package.json +3 -3
|
@@ -255,7 +255,7 @@ Lifecycle commands accept either one positional project path or `--root <path>`,
|
|
|
255
255
|
|
|
256
256
|
## Installation
|
|
257
257
|
|
|
258
|
-
For normal CLI and MCP use, install from public npm with Node.js 22.16 or newer:
|
|
258
|
+
For normal CLI and MCP use, install from public npm with Node.js 22.16 or newer. Disk cache uses Node's standard-library `node:sqlite` module; builds below 22.16 may load it without the statement APIs Codegraph needs and then disable disk cache after one warning.
|
|
259
259
|
|
|
260
260
|
```bash
|
|
261
261
|
npm install -g @lzehrung/codegraph
|
package/dist/bin/cli.js
CHANGED
|
@@ -13556,6 +13556,7 @@ __export(git_exports, {
|
|
|
13556
13556
|
listChangedFiles: () => listChangedFiles,
|
|
13557
13557
|
listGitExcludeFiles: () => listGitExcludeFiles,
|
|
13558
13558
|
listGitIgnoreFiles: () => listGitIgnoreFiles,
|
|
13559
|
+
listGitStageSpecialPaths: () => listGitStageSpecialPaths,
|
|
13559
13560
|
listGitSubmoduleDirectories: () => listGitSubmoduleDirectories,
|
|
13560
13561
|
listTrackedFiles: () => listTrackedFiles,
|
|
13561
13562
|
listUntrackedFiles: () => listUntrackedFiles,
|
|
@@ -13994,7 +13995,7 @@ async function listTrackedFiles(projectRoot, opts) {
|
|
|
13994
13995
|
async function listGitIgnoreFiles(projectRoot, opts) {
|
|
13995
13996
|
if (!(opts?.gitAvailable ?? true))
|
|
13996
13997
|
return [];
|
|
13997
|
-
const pathspec = [".gitignore", ":(glob)**/.gitignore"];
|
|
13998
|
+
const pathspec = [".gitignore", ":(glob)**/.gitignore", ...opts?.excludePathspecs ?? []];
|
|
13998
13999
|
const commands = [
|
|
13999
14000
|
["ls-files", "--cached", "-z", "--", ...pathspec],
|
|
14000
14001
|
["ls-files", "--others", "--exclude-standard", "-z", "--", ...pathspec],
|
|
@@ -14017,31 +14018,49 @@ async function listGitIgnoreFiles(projectRoot, opts) {
|
|
|
14017
14018
|
}
|
|
14018
14019
|
return Array.from(new Set(out));
|
|
14019
14020
|
}
|
|
14020
|
-
|
|
14021
|
+
function parseGitStageSpecialPaths(projectRoot, stdout) {
|
|
14022
|
+
const gitlinks = [];
|
|
14023
|
+
const symlinks = [];
|
|
14024
|
+
for (const record2 of stdout.split("\0").filter(Boolean)) {
|
|
14025
|
+
const tabIndex = record2.indexOf(" ");
|
|
14026
|
+
if (tabIndex < 0)
|
|
14027
|
+
continue;
|
|
14028
|
+
const rel = record2.slice(tabIndex + 1);
|
|
14029
|
+
if (!rel)
|
|
14030
|
+
continue;
|
|
14031
|
+
const abs = normalizePath(path8.resolve(projectRoot, rel));
|
|
14032
|
+
if (record2.startsWith("160000 "))
|
|
14033
|
+
gitlinks.push(abs);
|
|
14034
|
+
else if (record2.startsWith("120000 "))
|
|
14035
|
+
symlinks.push(abs);
|
|
14036
|
+
}
|
|
14037
|
+
return { gitlinks, symlinks };
|
|
14038
|
+
}
|
|
14039
|
+
async function listGitStageSpecialPaths(projectRoot, opts) {
|
|
14021
14040
|
if (!(opts?.gitAvailable ?? true))
|
|
14022
|
-
return [];
|
|
14041
|
+
return { gitlinks: [], symlinks: [] };
|
|
14023
14042
|
const args = ["ls-files", "--stage", "-z"];
|
|
14024
14043
|
try {
|
|
14025
14044
|
const { stdout } = await runGit(projectRoot, args, { maxBuffer: 64 * 1024 * 1024 });
|
|
14026
|
-
const direct =
|
|
14027
|
-
|
|
14028
|
-
|
|
14029
|
-
|
|
14030
|
-
|
|
14031
|
-
|
|
14032
|
-
|
|
14033
|
-
|
|
14034
|
-
|
|
14035
|
-
|
|
14036
|
-
|
|
14037
|
-
|
|
14038
|
-
return Array.from(new Set(direct));
|
|
14039
|
-
const nested = await Promise.all(direct.map(async (directory) => await listGitSubmoduleDirectories(directory, opts)));
|
|
14040
|
-
return Array.from(/* @__PURE__ */ new Set([...direct, ...nested.flat()]));
|
|
14045
|
+
const direct = parseGitStageSpecialPaths(projectRoot, stdout);
|
|
14046
|
+
if (!opts?.recurse || !direct.gitlinks.length) {
|
|
14047
|
+
return {
|
|
14048
|
+
gitlinks: Array.from(new Set(direct.gitlinks)),
|
|
14049
|
+
symlinks: Array.from(new Set(direct.symlinks))
|
|
14050
|
+
};
|
|
14051
|
+
}
|
|
14052
|
+
const nested = await Promise.all(direct.gitlinks.map(async (directory) => await listGitStageSpecialPaths(directory, opts)));
|
|
14053
|
+
return {
|
|
14054
|
+
gitlinks: Array.from(/* @__PURE__ */ new Set([...direct.gitlinks, ...nested.flatMap((entry) => entry.gitlinks)])),
|
|
14055
|
+
symlinks: Array.from(/* @__PURE__ */ new Set([...direct.symlinks, ...nested.flatMap((entry) => entry.symlinks)]))
|
|
14056
|
+
};
|
|
14041
14057
|
} catch (error51) {
|
|
14042
14058
|
throw createGitError(projectRoot, args, error51);
|
|
14043
14059
|
}
|
|
14044
14060
|
}
|
|
14061
|
+
async function listGitSubmoduleDirectories(projectRoot, opts) {
|
|
14062
|
+
return (await listGitStageSpecialPaths(projectRoot, opts)).gitlinks;
|
|
14063
|
+
}
|
|
14045
14064
|
async function listGitExcludeFiles(projectRoot, opts) {
|
|
14046
14065
|
if (!(opts?.gitAvailable ?? true))
|
|
14047
14066
|
return [];
|
|
@@ -14209,13 +14228,49 @@ function isPresent(value) {
|
|
|
14209
14228
|
function normalizeGlobPattern(globPattern) {
|
|
14210
14229
|
return globPattern.trim().replace(/\\/g, "/");
|
|
14211
14230
|
}
|
|
14231
|
+
function defaultIgnoreGitExcludePathspecs(includeGlobs = []) {
|
|
14232
|
+
const activeIgnores = includeGlobs.length ? DEFAULT_PROJECT_FILE_IGNORES.filter((ignoreGlob) => !isIgnoreGlobReopenedByIncludes(ignoreGlob, includeGlobs)) : DEFAULT_PROJECT_FILE_IGNORES;
|
|
14233
|
+
return activeIgnores.map((globPattern) => `:(exclude,glob)${normalizeGlobPattern(globPattern)}`);
|
|
14234
|
+
}
|
|
14235
|
+
function couldBeDirectorySymlink(filePath) {
|
|
14236
|
+
const basename2 = path9.posix.basename(normalizePath(filePath));
|
|
14237
|
+
if (DIRECTORY_METADATA_BASENAMES.has(basename2.toLowerCase()))
|
|
14238
|
+
return true;
|
|
14239
|
+
const extension = path9.posix.extname(basename2);
|
|
14240
|
+
if (!extension)
|
|
14241
|
+
return true;
|
|
14242
|
+
return DIRECTORY_METADATA_EXTENSIONS.has(extension.toLowerCase());
|
|
14243
|
+
}
|
|
14244
|
+
function globLiteralPrefix(globPattern) {
|
|
14245
|
+
const prefix = [];
|
|
14246
|
+
let seenLiteral = false;
|
|
14247
|
+
for (const segment of globPattern.split("/")) {
|
|
14248
|
+
if (!segment)
|
|
14249
|
+
continue;
|
|
14250
|
+
if (!seenLiteral && segment === "**")
|
|
14251
|
+
continue;
|
|
14252
|
+
if (segment.includes("*") || segment.includes("?"))
|
|
14253
|
+
break;
|
|
14254
|
+
seenLiteral = true;
|
|
14255
|
+
prefix.push(segment);
|
|
14256
|
+
}
|
|
14257
|
+
return prefix;
|
|
14258
|
+
}
|
|
14259
|
+
function isSegmentPrefix(prefix, pathSegments) {
|
|
14260
|
+
if (!prefix.length || prefix.length > pathSegments.length)
|
|
14261
|
+
return false;
|
|
14262
|
+
return prefix.every((segment, index) => pathSegments[index] === segment);
|
|
14263
|
+
}
|
|
14212
14264
|
function isIgnoreGlobReopenedByIncludes(ignoreGlob, includeGlobs) {
|
|
14213
|
-
const
|
|
14214
|
-
if (!
|
|
14265
|
+
const ignoreLiterals = ignoreGlob.split("/").filter((segment) => segment && !segment.includes("*"));
|
|
14266
|
+
if (!ignoreLiterals.length)
|
|
14215
14267
|
return false;
|
|
14216
14268
|
return includeGlobs.some((includeGlob) => {
|
|
14217
14269
|
const includeSegments = includeGlob.split("/");
|
|
14218
|
-
|
|
14270
|
+
if (ignoreLiterals.every((segment) => includeSegments.includes(segment)))
|
|
14271
|
+
return true;
|
|
14272
|
+
const includePrefix = globLiteralPrefix(includeGlob);
|
|
14273
|
+
return isSegmentPrefix(includePrefix, ignoreLiterals) || isSegmentPrefix(ignoreLiterals, includePrefix);
|
|
14219
14274
|
});
|
|
14220
14275
|
}
|
|
14221
14276
|
function isLocationIndependentGlob(globPattern) {
|
|
@@ -14428,7 +14483,7 @@ function collectCandidateAncestorDirectories(root, files) {
|
|
|
14428
14483
|
}
|
|
14429
14484
|
return directories;
|
|
14430
14485
|
}
|
|
14431
|
-
async function findGitIgnoreSources(sourceRoots) {
|
|
14486
|
+
async function findGitIgnoreSources(sourceRoots, excludePathspecs = defaultIgnoreGitExcludePathspecs()) {
|
|
14432
14487
|
const roots = Array.from(new Map(sourceRoots.map(({ path: sourceRoot, repositoryRoot }) => [
|
|
14433
14488
|
fileIdentityKey(sourceRoot),
|
|
14434
14489
|
{ path: normalizePath(sourceRoot), repositoryRoot: normalizePath(repositoryRoot) }
|
|
@@ -14436,7 +14491,7 @@ async function findGitIgnoreSources(sourceRoots) {
|
|
|
14436
14491
|
const sources = [];
|
|
14437
14492
|
for (const { path: sourceRoot, repositoryRoot } of roots) {
|
|
14438
14493
|
const [gitignoreFiles, excludeFiles] = await Promise.all([
|
|
14439
|
-
listGitIgnoreFiles(sourceRoot),
|
|
14494
|
+
listGitIgnoreFiles(sourceRoot, { excludePathspecs }),
|
|
14440
14495
|
listGitExcludeFiles(sourceRoot)
|
|
14441
14496
|
]);
|
|
14442
14497
|
sources.push(...gitignoreFiles.map((file2) => ({
|
|
@@ -14452,7 +14507,7 @@ async function findGitIgnoreSources(sourceRoots) {
|
|
|
14452
14507
|
}
|
|
14453
14508
|
return sources;
|
|
14454
14509
|
}
|
|
14455
|
-
async function listGitCandidateFiles(root, logLevel) {
|
|
14510
|
+
async function listGitCandidateFiles(root, logLevel, opts) {
|
|
14456
14511
|
try {
|
|
14457
14512
|
const realRoot = normalizePath(await fsp5.realpath(root));
|
|
14458
14513
|
const gitRoot = await isGitRepo(root) ? root : realRoot;
|
|
@@ -14463,11 +14518,12 @@ async function listGitCandidateFiles(root, logLevel) {
|
|
|
14463
14518
|
const gitRepositoryRoot = await getGitRepositoryRoot(gitRoot);
|
|
14464
14519
|
if (!gitRepositoryRoot)
|
|
14465
14520
|
return null;
|
|
14466
|
-
const [tracked, untracked,
|
|
14521
|
+
const [tracked, untracked, stageSpecial] = await Promise.all([
|
|
14467
14522
|
listTrackedFiles(gitRoot, { recurseSubmodules: true, ...logLevel === void 0 ? {} : { logLevel } }),
|
|
14468
14523
|
listUntrackedFiles(gitRoot, { respectGitignore: true }),
|
|
14469
|
-
|
|
14524
|
+
listGitStageSpecialPaths(gitRoot, { recurse: true })
|
|
14470
14525
|
]);
|
|
14526
|
+
const submoduleDirectories = stageSpecial.gitlinks;
|
|
14471
14527
|
const submoduleRoots = await Promise.all(submoduleDirectories.map(async (logicalPath) => ({
|
|
14472
14528
|
logicalPath: normalizePath(logicalPath),
|
|
14473
14529
|
physicalPath: normalizePath(await fsp5.realpath(logicalPath).catch(() => logicalPath))
|
|
@@ -14476,6 +14532,8 @@ async function listGitCandidateFiles(root, logLevel) {
|
|
|
14476
14532
|
const rawFiles = Array.from(/* @__PURE__ */ new Set([...tracked, ...untracked, ...submoduleUntracked.flat()])).sort();
|
|
14477
14533
|
const needsLogicalRemap = normalizePath(gitRoot) !== normalizePath(root);
|
|
14478
14534
|
const files = Array.from(new Set(rawFiles.map((file2) => needsLogicalRemap && isFilePathWithinRoot(realRoot, file2) ? normalizePath(path9.resolve(root, path9.relative(realRoot, file2))) : normalizePath(file2)))).sort();
|
|
14535
|
+
const remapGitPath = (file2) => needsLogicalRemap && isFilePathWithinRoot(realRoot, file2) ? normalizePath(path9.resolve(root, path9.relative(realRoot, file2))) : normalizePath(file2);
|
|
14536
|
+
const symlinkCandidatePaths = Array.from(/* @__PURE__ */ new Set([...stageSpecial.symlinks.map(remapGitPath), ...files.filter((file2) => couldBeDirectorySymlink(file2))])).sort();
|
|
14479
14537
|
const gitignoreRoots = [gitRepositoryRoot, ...submoduleRoots.map(({ physicalPath }) => physicalPath)].map(normalizePath);
|
|
14480
14538
|
const sourceRoots = [
|
|
14481
14539
|
{ path: root, repositoryRoot: gitRepositoryRoot },
|
|
@@ -14488,7 +14546,8 @@ async function listGitCandidateFiles(root, logLevel) {
|
|
|
14488
14546
|
];
|
|
14489
14547
|
return {
|
|
14490
14548
|
files,
|
|
14491
|
-
|
|
14549
|
+
symlinkCandidatePaths,
|
|
14550
|
+
gitignoreFiles: await findGitIgnoreSources(sourceRoots, defaultIgnoreGitExcludePathspecs(opts?.includeGlobs ?? [])),
|
|
14492
14551
|
gitignoreRoots,
|
|
14493
14552
|
gitignoreAliases: sourceRoots
|
|
14494
14553
|
};
|
|
@@ -14522,7 +14581,7 @@ async function listProjectFilesInternal(projectRoot, patterns = DEFAULT_PROJECT_
|
|
|
14522
14581
|
const useGitignore = options?.useGitignore ?? true;
|
|
14523
14582
|
const realRoot = await fsp5.realpath(root);
|
|
14524
14583
|
const attemptedGitCandidates = useGitignore && options?.gitignoreRoot === void 0 && normalizePath(realRoot) === normalizePath(root);
|
|
14525
|
-
const gitCandidates = attemptedGitCandidates ? await listGitCandidateFiles(root, options?.logLevel) : null;
|
|
14584
|
+
const gitCandidates = attemptedGitCandidates ? await listGitCandidateFiles(root, options?.logLevel, { includeGlobs }) : null;
|
|
14526
14585
|
if (attemptedGitCandidates) {
|
|
14527
14586
|
options?.onGitCandidatesDiscovered?.(gitCandidates);
|
|
14528
14587
|
}
|
|
@@ -14551,7 +14610,7 @@ async function listProjectFilesInternal(projectRoot, patterns = DEFAULT_PROJECT_
|
|
|
14551
14610
|
const reportSourcePathChecks = options?.onDiscoveryProgress ? (current, total) => options.onDiscoveryProgress?.({ activity: "Checking source file paths", current, total }) : void 0;
|
|
14552
14611
|
const symlinkOptions = {
|
|
14553
14612
|
globRoot,
|
|
14554
|
-
...gitCandidates ? { candidatePaths: gitCandidates.
|
|
14613
|
+
...gitCandidates ? { candidatePaths: gitCandidates.symlinkCandidatePaths } : {},
|
|
14555
14614
|
...options?.knownSymlinkDirectories !== void 0 ? { knownSymlinkDirectories: options.knownSymlinkDirectories } : {},
|
|
14556
14615
|
...options?.onSymlinkDirectoriesDiscovered ? { onSymlinkDirectoriesDiscovered: options.onSymlinkDirectoriesDiscovered } : {},
|
|
14557
14616
|
...reportSourceSymlinkChecks ? { onPathCheckProgress: reportSourceSymlinkChecks } : {}
|
|
@@ -14663,7 +14722,9 @@ async function resolveSafeSymlinkDirectories(root, realRoot, ignore, options) {
|
|
|
14663
14722
|
const relativePath3 = normalizePath(path9.relative(root, candidatePath));
|
|
14664
14723
|
if (!isRelativePathInside(relativePath3))
|
|
14665
14724
|
return false;
|
|
14666
|
-
|
|
14725
|
+
if (ignoreMatchers.some((matcher) => matcher(relativePath3)))
|
|
14726
|
+
return false;
|
|
14727
|
+
return true;
|
|
14667
14728
|
});
|
|
14668
14729
|
const discovered2 = await verifySafeSymlinkDirectories(root, realRoot, candidatePaths, options.onPathCheckProgress);
|
|
14669
14730
|
options.onSymlinkDirectoriesDiscovered?.(discovered2, "git-candidates");
|
|
@@ -14803,7 +14864,7 @@ async function discoverProjectFilesInternal(projectRoot, options) {
|
|
|
14803
14864
|
return normalizePath(realPath) === filePath || !isIgnoredByGitignore(realPath, gitignoreIndex, isDirectory2);
|
|
14804
14865
|
}).map(({ filePath }) => filePath);
|
|
14805
14866
|
const symlinkOptions = {
|
|
14806
|
-
candidatePaths: gitCandidates.
|
|
14867
|
+
candidatePaths: gitCandidates.symlinkCandidatePaths,
|
|
14807
14868
|
...options?.knownSymlinkDirectories !== void 0 ? { knownSymlinkDirectories: options.knownSymlinkDirectories } : {},
|
|
14808
14869
|
...options?.onSymlinkDirectoriesDiscovered ? { onSymlinkDirectoriesDiscovered: options.onSymlinkDirectoriesDiscovered } : {},
|
|
14809
14870
|
...reportMetadataSymlinkChecks ? { onPathCheckProgress: reportMetadataSymlinkChecks } : {}
|
|
@@ -14884,7 +14945,7 @@ async function discoverProjectFilesInternal(projectRoot, options) {
|
|
|
14884
14945
|
throw new Error(`Failed to discover project files in ${root}: ${stringifyUnknown(error51)}`);
|
|
14885
14946
|
}
|
|
14886
14947
|
}
|
|
14887
|
-
var import_fast_glob2, import_picomatch, DEFAULT_PROJECT_FILE_IGNORES, DEFAULT_PROJECT_MANIFESTS, DEFAULT_PROJECT_PATTERNS, REALPATH_FILTER_CONCURRENCY, EMPTY_GITIGNORE_INDEX;
|
|
14948
|
+
var import_fast_glob2, import_picomatch, DEFAULT_PROJECT_FILE_IGNORES, DEFAULT_PROJECT_MANIFESTS, DEFAULT_PROJECT_PATTERNS, REALPATH_FILTER_CONCURRENCY, DIRECTORY_METADATA_EXTENSIONS, DIRECTORY_METADATA_BASENAMES, EMPTY_GITIGNORE_INDEX;
|
|
14888
14949
|
var init_projectFiles = __esm({
|
|
14889
14950
|
"dist/util/projectFiles.js"() {
|
|
14890
14951
|
"use strict";
|
|
@@ -14986,6 +15047,23 @@ var init_projectFiles = __esm({
|
|
|
14986
15047
|
...DEFAULT_PROJECT_MANIFESTS.map((name) => `**/${name}`)
|
|
14987
15048
|
];
|
|
14988
15049
|
REALPATH_FILTER_CONCURRENCY = 64;
|
|
15050
|
+
DIRECTORY_METADATA_EXTENSIONS = /* @__PURE__ */ new Set();
|
|
15051
|
+
DIRECTORY_METADATA_BASENAMES = /* @__PURE__ */ new Set();
|
|
15052
|
+
for (const definition of PROJECT_FILE_DEFINITIONS) {
|
|
15053
|
+
if (definition.kind !== "dir")
|
|
15054
|
+
continue;
|
|
15055
|
+
for (const pattern of definition.patterns) {
|
|
15056
|
+
if (!pattern.includes("*") && !pattern.includes("?")) {
|
|
15057
|
+
DIRECTORY_METADATA_BASENAMES.add(pattern.toLowerCase());
|
|
15058
|
+
continue;
|
|
15059
|
+
}
|
|
15060
|
+
const trimmed = pattern.replaceAll("*", "").replaceAll("?", "");
|
|
15061
|
+
const lastDot = trimmed.lastIndexOf(".");
|
|
15062
|
+
if (lastDot < 0)
|
|
15063
|
+
continue;
|
|
15064
|
+
DIRECTORY_METADATA_EXTENSIONS.add(trimmed.slice(lastDot).toLowerCase());
|
|
15065
|
+
}
|
|
15066
|
+
}
|
|
14989
15067
|
EMPTY_GITIGNORE_INDEX = {
|
|
14990
15068
|
hasRules: false,
|
|
14991
15069
|
repositoryRoots: [],
|
|
@@ -31824,6 +31902,48 @@ function isNodeSqliteUnavailableError(error51) {
|
|
|
31824
31902
|
const message = errorMessage(error51);
|
|
31825
31903
|
return /node:sqlite|No such built-in module:\s*node:sqlite|setReturnArrays is not a function|columns is not a function/i.test(message);
|
|
31826
31904
|
}
|
|
31905
|
+
function markNodeSqliteUnavailable(error51) {
|
|
31906
|
+
if (nodeSqliteUnsupportedError)
|
|
31907
|
+
return;
|
|
31908
|
+
nodeSqliteUnsupportedError = error51 instanceof Error ? error51 : new Error(String(error51));
|
|
31909
|
+
}
|
|
31910
|
+
function nodeSqliteUnavailableError() {
|
|
31911
|
+
return nodeSqliteUnsupportedError ?? sqliteLoadError;
|
|
31912
|
+
}
|
|
31913
|
+
function requireNodeSqliteStatement(statement) {
|
|
31914
|
+
const candidate = statement;
|
|
31915
|
+
if (typeof candidate.setReturnArrays !== "function") {
|
|
31916
|
+
throw new TypeError("setReturnArrays is not a function");
|
|
31917
|
+
}
|
|
31918
|
+
if (typeof candidate.columns !== "function") {
|
|
31919
|
+
throw new TypeError("columns is not a function");
|
|
31920
|
+
}
|
|
31921
|
+
return candidate;
|
|
31922
|
+
}
|
|
31923
|
+
function isNodeSqliteUsable() {
|
|
31924
|
+
if (nodeSqliteUnavailableError()) {
|
|
31925
|
+
nodeSqliteUsable = false;
|
|
31926
|
+
return false;
|
|
31927
|
+
}
|
|
31928
|
+
if (nodeSqliteUsable !== void 0)
|
|
31929
|
+
return nodeSqliteUsable;
|
|
31930
|
+
try {
|
|
31931
|
+
const sqlite = loadNodeSqlite();
|
|
31932
|
+
const probe = new sqlite.DatabaseSync(":memory:");
|
|
31933
|
+
try {
|
|
31934
|
+
const statement = requireNodeSqliteStatement(probe.prepare("SELECT 1"));
|
|
31935
|
+
statement.setReturnArrays(false);
|
|
31936
|
+
statement.columns();
|
|
31937
|
+
nodeSqliteUsable = true;
|
|
31938
|
+
} finally {
|
|
31939
|
+
probe.close();
|
|
31940
|
+
}
|
|
31941
|
+
} catch (error51) {
|
|
31942
|
+
markNodeSqliteUnavailable(error51);
|
|
31943
|
+
nodeSqliteUsable = false;
|
|
31944
|
+
}
|
|
31945
|
+
return nodeSqliteUsable;
|
|
31946
|
+
}
|
|
31827
31947
|
function canInstallReadonlyAuthorizer(constants2) {
|
|
31828
31948
|
return READONLY_AUTHORIZER_CONSTANTS.every((name) => typeof constants2[name] === "number");
|
|
31829
31949
|
}
|
|
@@ -31836,7 +31956,7 @@ function isReadOnlySqliteError(error51) {
|
|
|
31836
31956
|
const message = error51.message.toLowerCase();
|
|
31837
31957
|
return message.includes("not authorized") || message.includes("read-only") || message.includes("readonly") || message.includes("attempt to write");
|
|
31838
31958
|
}
|
|
31839
|
-
var requireNodeModule, sqliteModule, reportedReadonlyAuthorizerDegradation, sqliteLoadError, READONLY_AUTHORIZER_CONSTANTS, isSqliteValueArray, normalizeParams, SqliteStatement, SqliteDatabase;
|
|
31959
|
+
var requireNodeModule, sqliteModule, reportedReadonlyAuthorizerDegradation, sqliteLoadError, nodeSqliteUnsupportedError, nodeSqliteUsable, READONLY_AUTHORIZER_CONSTANTS, isSqliteValueArray, normalizeParams, SqliteStatement, SqliteDatabase;
|
|
31840
31960
|
var init_sqlite_driver = __esm({
|
|
31841
31961
|
"dist/sqlite-driver.js"() {
|
|
31842
31962
|
"use strict";
|
|
@@ -31900,6 +32020,9 @@ var init_sqlite_driver = __esm({
|
|
|
31900
32020
|
db;
|
|
31901
32021
|
statements = /* @__PURE__ */ new Map();
|
|
31902
32022
|
constructor(filePath, options) {
|
|
32023
|
+
if (!isNodeSqliteUsable()) {
|
|
32024
|
+
throw nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
32025
|
+
}
|
|
31903
32026
|
const sqlite = loadNodeSqlite();
|
|
31904
32027
|
this.db = new sqlite.DatabaseSync(filePath, {
|
|
31905
32028
|
readOnly: options?.readonly,
|
|
@@ -31925,9 +32048,15 @@ var init_sqlite_driver = __esm({
|
|
|
31925
32048
|
const cached2 = this.statements.get(sql);
|
|
31926
32049
|
if (cached2)
|
|
31927
32050
|
return cached2;
|
|
31928
|
-
|
|
31929
|
-
|
|
31930
|
-
|
|
32051
|
+
try {
|
|
32052
|
+
const statement = new SqliteStatement(this.db.prepare(sql));
|
|
32053
|
+
this.statements.set(sql, statement);
|
|
32054
|
+
return statement;
|
|
32055
|
+
} catch (error51) {
|
|
32056
|
+
if (isNodeSqliteUnavailableError(error51))
|
|
32057
|
+
markNodeSqliteUnavailable(error51);
|
|
32058
|
+
throw error51;
|
|
32059
|
+
}
|
|
31931
32060
|
}
|
|
31932
32061
|
transaction(fn) {
|
|
31933
32062
|
return () => {
|
|
@@ -32582,10 +32711,16 @@ function clearMemoryCacheForProject(projectRoot) {
|
|
|
32582
32711
|
}
|
|
32583
32712
|
}
|
|
32584
32713
|
function reportMissingNodeSqlite(logLevel, error51) {
|
|
32714
|
+
markNodeSqliteUnavailable(error51);
|
|
32585
32715
|
if (warnedMissingNodeSqlite)
|
|
32586
32716
|
return;
|
|
32587
32717
|
warnedMissingNodeSqlite = true;
|
|
32588
|
-
|
|
32718
|
+
const missingStatementApi = /setReturnArrays is not a function|columns is not a function/i.test(errorMessage(error51));
|
|
32719
|
+
let detail = "The built-in node:sqlite module is unavailable (requires Node.js >= 22.16).";
|
|
32720
|
+
if (missingStatementApi) {
|
|
32721
|
+
detail = "The built-in node:sqlite module is missing statement APIs Codegraph needs (requires Node.js >= 22.16).";
|
|
32722
|
+
}
|
|
32723
|
+
logWithLevel(logLevel, "warn", `Warning: Disk cache disabled for this run. ${detail} Pass --cache memory or --cache off to skip this check.`);
|
|
32589
32724
|
}
|
|
32590
32725
|
function cacheRelativePath(projectRoot, file2) {
|
|
32591
32726
|
const root = path37.resolve(projectRoot);
|
|
@@ -32605,6 +32740,11 @@ function diskCacheDatabasePath(projectRoot, opts) {
|
|
|
32605
32740
|
function diskModuleCacheExists(projectRoot, opts) {
|
|
32606
32741
|
if ((opts?.cache ?? "off") !== "disk")
|
|
32607
32742
|
return false;
|
|
32743
|
+
if (!isNodeSqliteUsable()) {
|
|
32744
|
+
const error51 = nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
32745
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
32746
|
+
return false;
|
|
32747
|
+
}
|
|
32608
32748
|
return fs17.existsSync(diskCacheDatabasePath(projectRoot, opts));
|
|
32609
32749
|
}
|
|
32610
32750
|
function createModuleCacheTable(db) {
|
|
@@ -32655,6 +32795,11 @@ function getDiskModuleCache(projectRoot, opts) {
|
|
|
32655
32795
|
const existing = diskModuleCaches.get(dbPath);
|
|
32656
32796
|
if (existing)
|
|
32657
32797
|
return existing;
|
|
32798
|
+
if (!isNodeSqliteUsable()) {
|
|
32799
|
+
const error51 = nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
32800
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
32801
|
+
throw error51;
|
|
32802
|
+
}
|
|
32658
32803
|
fs17.mkdirSync(path37.dirname(dbPath), { recursive: true });
|
|
32659
32804
|
let db;
|
|
32660
32805
|
try {
|
|
@@ -32665,26 +32810,37 @@ function getDiskModuleCache(projectRoot, opts) {
|
|
|
32665
32810
|
}
|
|
32666
32811
|
throw error51;
|
|
32667
32812
|
}
|
|
32668
|
-
|
|
32669
|
-
|
|
32670
|
-
|
|
32671
|
-
|
|
32672
|
-
|
|
32673
|
-
|
|
32674
|
-
|
|
32675
|
-
|
|
32813
|
+
try {
|
|
32814
|
+
db.pragma("journal_mode = WAL");
|
|
32815
|
+
db.pragma("synchronous = NORMAL");
|
|
32816
|
+
ensureModuleCacheSchema(db, projectRoot);
|
|
32817
|
+
db.exec("CREATE TEMP TABLE IF NOT EXISTS live_module_cache_files(file TEXT PRIMARY KEY) WITHOUT ROWID;");
|
|
32818
|
+
const cache = {
|
|
32819
|
+
db,
|
|
32820
|
+
load: db.prepare("SELECT sig, version, payload FROM module_cache WHERE file = ?"),
|
|
32821
|
+
write: db.prepare(`INSERT INTO module_cache (file, sig, version, payload, updated_at)
|
|
32676
32822
|
VALUES (?, ?, ?, ?, ?)
|
|
32677
32823
|
ON CONFLICT(file) DO UPDATE SET
|
|
32678
32824
|
sig = excluded.sig,
|
|
32679
32825
|
version = excluded.version,
|
|
32680
32826
|
payload = excluded.payload,
|
|
32681
32827
|
updated_at = excluded.updated_at`),
|
|
32682
|
-
|
|
32683
|
-
|
|
32684
|
-
|
|
32685
|
-
|
|
32686
|
-
|
|
32687
|
-
|
|
32828
|
+
clearLiveFiles: db.prepare("DELETE FROM live_module_cache_files"),
|
|
32829
|
+
insertLiveFile: db.prepare("INSERT OR IGNORE INTO live_module_cache_files(file) VALUES (?)"),
|
|
32830
|
+
pruneStaleFiles: db.prepare("DELETE FROM module_cache WHERE NOT EXISTS (SELECT 1 FROM live_module_cache_files WHERE file = module_cache.file)")
|
|
32831
|
+
};
|
|
32832
|
+
diskModuleCaches.set(dbPath, cache);
|
|
32833
|
+
return cache;
|
|
32834
|
+
} catch (error51) {
|
|
32835
|
+
try {
|
|
32836
|
+
db.close();
|
|
32837
|
+
} catch {
|
|
32838
|
+
}
|
|
32839
|
+
if (isNodeSqliteUnavailableError(error51)) {
|
|
32840
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
32841
|
+
}
|
|
32842
|
+
throw error51;
|
|
32843
|
+
}
|
|
32688
32844
|
}
|
|
32689
32845
|
function closeDiskCacheDatabase(projectRoot, opts) {
|
|
32690
32846
|
clearMemoryCacheForProject(projectRoot);
|
|
@@ -32705,6 +32861,11 @@ function closeDiskCacheDatabase(projectRoot, opts) {
|
|
|
32705
32861
|
function pruneDiskModuleCache(projectRoot, liveFiles, opts) {
|
|
32706
32862
|
if ((opts?.cache ?? "off") !== "disk")
|
|
32707
32863
|
return 0;
|
|
32864
|
+
if (!isNodeSqliteUsable()) {
|
|
32865
|
+
const error51 = nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
32866
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
32867
|
+
return 0;
|
|
32868
|
+
}
|
|
32708
32869
|
if (!diskModuleCacheExists(projectRoot, opts))
|
|
32709
32870
|
return 0;
|
|
32710
32871
|
try {
|
|
@@ -32722,6 +32883,10 @@ function pruneDiskModuleCache(projectRoot, liveFiles, opts) {
|
|
|
32722
32883
|
}
|
|
32723
32884
|
return deleted;
|
|
32724
32885
|
} catch (error51) {
|
|
32886
|
+
if (isNodeSqliteUnavailableError(error51)) {
|
|
32887
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
32888
|
+
return 0;
|
|
32889
|
+
}
|
|
32725
32890
|
logWithLevel(opts?.logLevel, "warn", "Warning: Failed to prune module cache:", error51);
|
|
32726
32891
|
return 0;
|
|
32727
32892
|
}
|
|
@@ -32882,6 +33047,13 @@ function tryLoadFromCache(projectRoot, file2, sig, opts, report, diskCacheAvaila
|
|
|
32882
33047
|
cacheReport.misses += 1;
|
|
32883
33048
|
return null;
|
|
32884
33049
|
}
|
|
33050
|
+
if (!isNodeSqliteUsable()) {
|
|
33051
|
+
const error51 = nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
33052
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
33053
|
+
if (cacheEnabled && cacheReport)
|
|
33054
|
+
cacheReport.misses += 1;
|
|
33055
|
+
return null;
|
|
33056
|
+
}
|
|
32885
33057
|
try {
|
|
32886
33058
|
const cache = getDiskModuleCache(projectRoot, opts);
|
|
32887
33059
|
const row = cache.load.get(cacheRelativePath(projectRoot, file2));
|
|
@@ -32914,6 +33086,11 @@ function writeModulesToCache(projectRoot, writes, opts) {
|
|
|
32914
33086
|
lruMapSet(memoryCache, memoryCacheKey(projectRoot, write.file), { version: PARSED_CACHE_VERSION, sig: write.sig, mod: write.mod }, MAX_MEMORY_CACHE_ENTRIES);
|
|
32915
33087
|
}
|
|
32916
33088
|
} else if (mode === "disk") {
|
|
33089
|
+
if (!isNodeSqliteUsable()) {
|
|
33090
|
+
const error51 = nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
33091
|
+
reportMissingNodeSqlite(opts?.logLevel, error51);
|
|
33092
|
+
return;
|
|
33093
|
+
}
|
|
32917
33094
|
try {
|
|
32918
33095
|
const cache = getDiskModuleCache(projectRoot, opts);
|
|
32919
33096
|
const now = Date.now();
|
|
@@ -32949,6 +33126,7 @@ var init_module_cache = __esm({
|
|
|
32949
33126
|
init_languages();
|
|
32950
33127
|
init_treeSitterNative();
|
|
32951
33128
|
init_logging();
|
|
33129
|
+
init_errors();
|
|
32952
33130
|
init_sqlite_driver();
|
|
32953
33131
|
init_bloomFilter();
|
|
32954
33132
|
init_sqliteSchema();
|
|
@@ -33183,6 +33361,11 @@ function maintainDuplicateUnitDiskCache(index) {
|
|
|
33183
33361
|
function duplicateUnitDiskCache(index) {
|
|
33184
33362
|
if (index.cacheMode !== "disk" || !index.cacheRootDir)
|
|
33185
33363
|
return null;
|
|
33364
|
+
if (!isNodeSqliteUsable()) {
|
|
33365
|
+
const error51 = nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
33366
|
+
reportMissingNodeSqlite(void 0, error51);
|
|
33367
|
+
return null;
|
|
33368
|
+
}
|
|
33186
33369
|
const dbPath = duplicateUnitCacheDatabasePathForRoot(index.cacheRootDir);
|
|
33187
33370
|
let entry = duplicateUnitDiskDatabases.get(dbPath);
|
|
33188
33371
|
if (!entry) {
|
|
@@ -4,6 +4,28 @@ const require = __codegraphCreateRequire(import.meta.url);
|
|
|
4
4
|
|
|
5
5
|
// dist/sqlite-driver.js
|
|
6
6
|
import { createRequire } from "node:module";
|
|
7
|
+
|
|
8
|
+
// dist/util/errors.js
|
|
9
|
+
function errorMessage(error) {
|
|
10
|
+
if (error instanceof Error)
|
|
11
|
+
return error.message;
|
|
12
|
+
if (typeof error === "string")
|
|
13
|
+
return error;
|
|
14
|
+
if (error === null || error === void 0)
|
|
15
|
+
return String(error);
|
|
16
|
+
if (typeof error === "object") {
|
|
17
|
+
try {
|
|
18
|
+
const serialized = JSON.stringify(error);
|
|
19
|
+
if (serialized)
|
|
20
|
+
return serialized;
|
|
21
|
+
} catch {
|
|
22
|
+
return String(error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return String(error);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// dist/sqlite-driver.js
|
|
7
29
|
var requireNodeModule = createRequire(import.meta.url);
|
|
8
30
|
var sqliteModule;
|
|
9
31
|
var reportedReadonlyAuthorizerDegradation = false;
|
|
@@ -28,6 +50,54 @@ function loadNodeSqlite() {
|
|
|
28
50
|
throw sqliteLoadError;
|
|
29
51
|
}
|
|
30
52
|
}
|
|
53
|
+
function isNodeSqliteUnavailableError(error) {
|
|
54
|
+
const message = errorMessage(error);
|
|
55
|
+
return /node:sqlite|No such built-in module:\s*node:sqlite|setReturnArrays is not a function|columns is not a function/i.test(message);
|
|
56
|
+
}
|
|
57
|
+
var nodeSqliteUnsupportedError;
|
|
58
|
+
function markNodeSqliteUnavailable(error) {
|
|
59
|
+
if (nodeSqliteUnsupportedError)
|
|
60
|
+
return;
|
|
61
|
+
nodeSqliteUnsupportedError = error instanceof Error ? error : new Error(String(error));
|
|
62
|
+
}
|
|
63
|
+
function nodeSqliteUnavailableError() {
|
|
64
|
+
return nodeSqliteUnsupportedError ?? sqliteLoadError;
|
|
65
|
+
}
|
|
66
|
+
var nodeSqliteUsable;
|
|
67
|
+
function requireNodeSqliteStatement(statement) {
|
|
68
|
+
const candidate = statement;
|
|
69
|
+
if (typeof candidate.setReturnArrays !== "function") {
|
|
70
|
+
throw new TypeError("setReturnArrays is not a function");
|
|
71
|
+
}
|
|
72
|
+
if (typeof candidate.columns !== "function") {
|
|
73
|
+
throw new TypeError("columns is not a function");
|
|
74
|
+
}
|
|
75
|
+
return candidate;
|
|
76
|
+
}
|
|
77
|
+
function isNodeSqliteUsable() {
|
|
78
|
+
if (nodeSqliteUnavailableError()) {
|
|
79
|
+
nodeSqliteUsable = false;
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (nodeSqliteUsable !== void 0)
|
|
83
|
+
return nodeSqliteUsable;
|
|
84
|
+
try {
|
|
85
|
+
const sqlite = loadNodeSqlite();
|
|
86
|
+
const probe = new sqlite.DatabaseSync(":memory:");
|
|
87
|
+
try {
|
|
88
|
+
const statement = requireNodeSqliteStatement(probe.prepare("SELECT 1"));
|
|
89
|
+
statement.setReturnArrays(false);
|
|
90
|
+
statement.columns();
|
|
91
|
+
nodeSqliteUsable = true;
|
|
92
|
+
} finally {
|
|
93
|
+
probe.close();
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {
|
|
96
|
+
markNodeSqliteUnavailable(error);
|
|
97
|
+
nodeSqliteUsable = false;
|
|
98
|
+
}
|
|
99
|
+
return nodeSqliteUsable;
|
|
100
|
+
}
|
|
31
101
|
var READONLY_AUTHORIZER_CONSTANTS = [
|
|
32
102
|
"SQLITE_DENY",
|
|
33
103
|
"SQLITE_FUNCTION",
|
|
@@ -91,6 +161,9 @@ var SqliteDatabase = class {
|
|
|
91
161
|
db;
|
|
92
162
|
statements = /* @__PURE__ */ new Map();
|
|
93
163
|
constructor(filePath, options) {
|
|
164
|
+
if (!isNodeSqliteUsable()) {
|
|
165
|
+
throw nodeSqliteUnavailableError() ?? new Error("node:sqlite is unavailable");
|
|
166
|
+
}
|
|
94
167
|
const sqlite = loadNodeSqlite();
|
|
95
168
|
this.db = new sqlite.DatabaseSync(filePath, {
|
|
96
169
|
readOnly: options?.readonly,
|
|
@@ -116,9 +189,15 @@ var SqliteDatabase = class {
|
|
|
116
189
|
const cached = this.statements.get(sql);
|
|
117
190
|
if (cached)
|
|
118
191
|
return cached;
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
192
|
+
try {
|
|
193
|
+
const statement = new SqliteStatement(this.db.prepare(sql));
|
|
194
|
+
this.statements.set(sql, statement);
|
|
195
|
+
return statement;
|
|
196
|
+
} catch (error) {
|
|
197
|
+
if (isNodeSqliteUnavailableError(error))
|
|
198
|
+
markNodeSqliteUnavailable(error);
|
|
199
|
+
throw error;
|
|
200
|
+
}
|
|
122
201
|
}
|
|
123
202
|
transaction(fn) {
|
|
124
203
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unitCache.d.ts","sourceRoot":"","sources":["../../src/duplicates/unitCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMtE,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"unitCache.d.ts","sourceRoot":"","sources":["../../src/duplicates/unitCache.ts"],"names":[],"mappings":"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"}
|