snatching amp's walkthrough for my own purposes mwhahaha traverse.dunkirk.sh/diagram/6121f05c-a5ef-4ecf-8ffc-02534c5e767c
at main 81 lines 2.4 kB view raw
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}