snatching amp's walkthrough for my own purposes mwhahaha
traverse.dunkirk.sh/diagram/6121f05c-a5ef-4ecf-8ffc-02534c5e767c
1import { join } from "node:path";
2import { homedir } from "node:os";
3import type { TraverseConfig } from "./types.ts";
4
5const DEFAULTS: TraverseConfig = {
6 shareServerUrl: "https://traverse.dunkirk.sh",
7 port: 4173,
8 mode: "local",
9};
10
11function getConfigDir(): string {
12 const platform = process.platform;
13 if (platform === "darwin") {
14 return join(homedir(), "Library", "Application Support", "traverse");
15 }
16 const xdg = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
17 return join(xdg, "traverse");
18}
19
20export function loadConfig(): TraverseConfig {
21 let fileConfig: Partial<TraverseConfig> = {};
22
23 const configPath = join(getConfigDir(), "config.json");
24 try {
25 const text = require("node:fs").readFileSync(configPath, "utf-8");
26 fileConfig = JSON.parse(text);
27 } catch {
28 // no config file, use defaults
29 }
30
31 // Env vars override config file, config file overrides defaults
32 return {
33 shareServerUrl: process.env.TRAVERSE_SHARE_URL || fileConfig.shareServerUrl || DEFAULTS.shareServerUrl,
34 port: parseInt(process.env.TRAVERSE_PORT || String(fileConfig.port || DEFAULTS.port), 10),
35 mode: (process.env.TRAVERSE_MODE || fileConfig.mode || DEFAULTS.mode) as "local" | "server",
36 };
37}