/ opencodehub / src / lib / config.ts
Swadhin Biswas Feature/ai code reviewer (#74) · 8/5/2026
739f935
68 lines · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import fs from "fs";
import path from "path";

// Keep config in the DATA_DIR (which defaults to ./data)
const DATA_DIR = process.env.DATA_DIR || path.join(process.cwd(), "data");
const CONFIG_PATH = path.join(DATA_DIR, "config.json");

export function loadConfig() {
  if (fs.existsSync(CONFIG_PATH)) {
    try {
      const config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8"));
      
      // Only set env vars from config.json if they aren't already set in the
      // environment.  CI injects DATABASE_URL etc. via process.env and those
      // must never be overridden by a stale data/config.json on disk.
      if (config.DATABASE_URL && !process.env.DATABASE_URL) process.env.DATABASE_URL = config.DATABASE_URL;
      if (config.DATABASE_DRIVER && !process.env.DATABASE_DRIVER) process.env.DATABASE_DRIVER = config.DATABASE_DRIVER;
      if (config.REDIS_URL && !process.env.REDIS_URL) process.env.REDIS_URL = config.REDIS_URL;
      
      // Store flag in process.env so we don't need to read FS constantly
      process.env.OPENCODEHUB_CONFIGURED = "true";
      
      return true;
    } catch (e) {
      console.error("Failed to parse config.json", e);
    }
  }
  return false;
}

export function saveConfig(config: {
  DATABASE_URL?: string;
  DATABASE_DRIVER?: string;
  REDIS_URL?: string;
}) {
  if (!fs.existsSync(DATA_DIR)) {
    fs.mkdirSync(DATA_DIR, { recursive: true });
  }
  
  // Read existing to merge
  let existing = {};
  if (fs.existsSync(CONFIG_PATH)) {
    try {
      existing = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf8"));
    } catch(e) {}
  }
  
  const merged = { ...existing, ...config };
  fs.writeFileSync(CONFIG_PATH, JSON.stringify(merged, null, 2), "utf8");
  
  // Update process.env immediately
  if (merged.DATABASE_URL) process.env.DATABASE_URL = merged.DATABASE_URL;
  if (merged.DATABASE_DRIVER) process.env.DATABASE_DRIVER = merged.DATABASE_DRIVER;
  if (merged.REDIS_URL) process.env.REDIS_URL = merged.REDIS_URL;
  
  process.env.OPENCODEHUB_CONFIGURED = "true";
}

export function isConfigured() {
  if (process.env.OPENCODEHUB_CONFIGURED === "true") return true;
  if (process.env.DATABASE_URL) return true;
  return loadConfig();
}

export function isOfflineMode() {
  return process.env.OFFLINE_MODE === "true" || process.env.OFFLINE_MODE === "1";
}