diff --git a/src/config.ts b/src/config.ts index 6304e20..72fff90 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,7 +2,11 @@ import { join } from "node:path"; import { homedir } from "node:os"; import type { TraverseConfig } from "./types.ts"; -const DEFAULT_SHARE_URL = "https://traverse.dunkirk.sh"; +const DEFAULTS: TraverseConfig = { + shareServerUrl: "https://traverse.dunkirk.sh", + port: 4173, + mode: "local", +}; function getConfigDir(): string { const platform = process.platform; @@ -14,19 +18,20 @@ function getConfigDir(): string { } export function loadConfig(): TraverseConfig { - if (process.env.TRAVERSE_SHARE_URL) { - return { shareServerUrl: process.env.TRAVERSE_SHARE_URL }; - } + let fileConfig: Partial = {}; const configPath = join(getConfigDir(), "config.json"); - try { const text = require("node:fs").readFileSync(configPath, "utf-8"); - const parsed = JSON.parse(text); - return { - shareServerUrl: parsed.shareServerUrl || DEFAULT_SHARE_URL, - }; + fileConfig = JSON.parse(text); } catch { - return { shareServerUrl: DEFAULT_SHARE_URL }; + // no config file, use defaults } + + // Env vars override config file, config file overrides defaults + return { + shareServerUrl: process.env.TRAVERSE_SHARE_URL || fileConfig.shareServerUrl || DEFAULTS.shareServerUrl, + port: parseInt(process.env.TRAVERSE_PORT || String(fileConfig.port || DEFAULTS.port), 10), + mode: (process.env.TRAVERSE_MODE || fileConfig.mode || DEFAULTS.mode) as "local" | "server", + }; } diff --git a/src/index.ts b/src/index.ts index 4e9409c..6b874fd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,12 +7,10 @@ import { initDb, loadAllDiagrams, saveDiagram, deleteDiagramFromDb, generateId, import { generateOgImage } from "./og.ts"; import { loadConfig } from "./config.ts"; -const PORT = parseInt(process.env.TRAVERSE_PORT || "4173", 10); -const MODE = (process.env.TRAVERSE_MODE || "local") as "local" | "server"; -const GIT_HASH = await Bun.$`git rev-parse --short HEAD`.text().then(s => s.trim()).catch(() => "dev"); - -// Load config and init persistence const config = loadConfig(); +const PORT = config.port; +const MODE = config.mode; +const GIT_HASH = await Bun.$`git rev-parse --short HEAD`.text().then(s => s.trim()).catch(() => "dev"); initDb(); // Load persisted diagrams diff --git a/src/types.ts b/src/types.ts index 36268d3..c06b39d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -19,4 +19,6 @@ export interface WalkthroughDiagram { export interface TraverseConfig { shareServerUrl: string; + port: number; + mode: "local" | "server"; }