@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.
@@ -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
- async function listGitSubmoduleDirectories(projectRoot, opts) {
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
- for (const record2 of stdout.split("\0").filter(Boolean)) {
14028
- if (!record2.startsWith("160000 "))
14029
- continue;
14030
- const tabIndex = record2.indexOf(" ");
14031
- if (tabIndex < 0)
14032
- continue;
14033
- const rel = record2.slice(tabIndex + 1);
14034
- if (rel)
14035
- direct.push(normalizePath(path8.resolve(projectRoot, rel)));
14036
- }
14037
- if (!opts?.recurse || !direct.length)
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 literalSegments = ignoreGlob.split("/").filter((segment) => segment && !segment.includes("*"));
14214
- if (!literalSegments.length)
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
- return literalSegments.every((segment) => includeSegments.includes(segment));
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, submoduleDirectories] = await Promise.all([
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
- listGitSubmoduleDirectories(gitRoot, { recurse: true })
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
- gitignoreFiles: await findGitIgnoreSources(sourceRoots),
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.files } : {},
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
- return !ignoreMatchers.some((matcher) => matcher(relativePath3));
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.files,
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
- const statement = new SqliteStatement(this.db.prepare(sql));
31929
- this.statements.set(sql, statement);
31930
- return statement;
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
- logWithLevel(logLevel, "error", "Disk cache requires the Node.js built-in node:sqlite module. Use Node.js >= 22.16, or set --cache off/memory.", error51);
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
- db.pragma("journal_mode = WAL");
32669
- db.pragma("synchronous = NORMAL");
32670
- ensureModuleCacheSchema(db, projectRoot);
32671
- db.exec("CREATE TEMP TABLE IF NOT EXISTS live_module_cache_files(file TEXT PRIMARY KEY) WITHOUT ROWID;");
32672
- const cache = {
32673
- db,
32674
- load: db.prepare("SELECT sig, version, payload FROM module_cache WHERE file = ?"),
32675
- write: db.prepare(`INSERT INTO module_cache (file, sig, version, payload, updated_at)
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
- clearLiveFiles: db.prepare("DELETE FROM live_module_cache_files"),
32683
- insertLiveFile: db.prepare("INSERT OR IGNORE INTO live_module_cache_files(file) VALUES (?)"),
32684
- pruneStaleFiles: db.prepare("DELETE FROM module_cache WHERE NOT EXISTS (SELECT 1 FROM live_module_cache_files WHERE file = module_cache.file)")
32685
- };
32686
- diskModuleCaches.set(dbPath, cache);
32687
- return cache;
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
- const statement = new SqliteStatement(this.db.prepare(sql));
120
- this.statements.set(sql, statement);
121
- return statement;
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":"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"}
1
+ {"version":3,"file":"unitCache.d.ts","sourceRoot":"","sources":["../../src/duplicates/unitCache.ts"],"names":[],"mappings":"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"}