snatching amp's walkthrough for my own purposes mwhahaha
traverse.dunkirk.sh/diagram/6121f05c-a5ef-4ecf-8ffc-02534c5e767c
1import { Database } from "bun:sqlite";
2import { mkdirSync, existsSync } from "node:fs";
3import { join } from "node:path";
4import { homedir } from "node:os";
5import type { WalkthroughDiagram } from "./types.ts";
6
7export function getDataDir(): string {
8 if (process.env.TRAVERSE_DATA_DIR) return process.env.TRAVERSE_DATA_DIR;
9
10 const platform = process.platform;
11 if (platform === "darwin") {
12 return join(homedir(), "Library", "Application Support", "traverse");
13 }
14 // Linux / other: XDG_DATA_HOME or fallback
15 const xdg = process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
16 return join(xdg, "traverse");
17}
18
19let db: Database;
20
21export function initDb(): Database {
22 const dataDir = getDataDir();
23 if (!existsSync(dataDir)) {
24 mkdirSync(dataDir, { recursive: true });
25 }
26
27 const dbPath = join(dataDir, "traverse.db");
28 db = new Database(dbPath);
29 db.run(`
30 CREATE TABLE IF NOT EXISTS diagrams (
31 id TEXT PRIMARY KEY,
32 summary TEXT,
33 data TEXT,
34 created_at TEXT
35 )
36 `);
37 db.run(`
38 CREATE TABLE IF NOT EXISTS shared_urls (
39 local_id TEXT PRIMARY KEY,
40 remote_url TEXT,
41 shared_at TEXT
42 )
43 `);
44 return db;
45}
46
47export function loadAllDiagrams(): Map<string, WalkthroughDiagram> {
48 const rows = db.query("SELECT id, data FROM diagrams").all() as { id: string; data: string }[];
49 const map = new Map<string, WalkthroughDiagram>();
50 for (const row of rows) {
51 map.set(row.id, JSON.parse(row.data));
52 }
53 return map;
54}
55
56export function saveDiagram(id: string, diagram: WalkthroughDiagram): void {
57 db.run(
58 "INSERT OR REPLACE INTO diagrams (id, summary, data, created_at) VALUES (?, ?, ?, ?)",
59 [id, diagram.summary, JSON.stringify(diagram), new Date().toISOString()]
60 );
61}
62
63export function deleteDiagramFromDb(id: string): void {
64 db.run("DELETE FROM diagrams WHERE id = ?", [id]);
65}
66
67export function getSharedUrl(localId: string): string | null {
68 const row = db.query("SELECT remote_url FROM shared_urls WHERE local_id = ?").get(localId) as { remote_url: string } | null;
69 return row?.remote_url ?? null;
70}
71
72export function saveSharedUrl(localId: string, remoteUrl: string): void {
73 db.run(
74 "INSERT OR REPLACE INTO shared_urls (local_id, remote_url, shared_at) VALUES (?, ?, ?)",
75 [localId, remoteUrl, new Date().toISOString()]
76 );
77}
78
79export function generateId(): string {
80 return crypto.randomUUID();
81}