open source is social v-it.org
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 sol pbc
3
4import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from 'node:fs';
5import { join } from 'node:path';
6
7export function vitDir() {
8 return join(process.cwd(), '.vit');
9}
10
11export function readProjectConfig() {
12 const p = join(vitDir(), 'config.json');
13 if (!existsSync(p)) return {};
14 try {
15 return JSON.parse(readFileSync(p, 'utf-8'));
16 } catch {
17 return {};
18 }
19}
20
21export function readBeaconSet() {
22 const config = readProjectConfig();
23 const set = new Set();
24 if (config.beacon) set.add(config.beacon);
25 if (config.secondaryBeacon) set.add(config.secondaryBeacon);
26 return set;
27}
28
29export function writeProjectConfig(obj, baseDir) {
30 const dir = baseDir ? join(baseDir, '.vit') : vitDir();
31 mkdirSync(dir, { recursive: true });
32 writeFileSync(join(dir, 'config.json'), JSON.stringify(obj, null, 2) + '\n');
33}
34
35export function appendLog(filename, record) {
36 const dir = vitDir();
37 mkdirSync(dir, { recursive: true });
38 appendFileSync(join(dir, filename), JSON.stringify(record) + '\n');
39}
40
41export function readLog(filename) {
42 const p = join(vitDir(), filename);
43 if (!existsSync(p)) return [];
44 try {
45 return readFileSync(p, 'utf-8')
46 .split('\n')
47 .filter(line => line.trim())
48 .map(line => { try { return JSON.parse(line); } catch { return null; } })
49 .filter(Boolean);
50 } catch {
51 return [];
52 }
53}
54
55export function readFollowing() {
56 const p = join(vitDir(), 'following.json');
57 if (!existsSync(p)) return [];
58 try {
59 return JSON.parse(readFileSync(p, 'utf-8'));
60 } catch {
61 return [];
62 }
63}
64
65export function writeFollowing(list) {
66 const dir = vitDir();
67 mkdirSync(dir, { recursive: true });
68 writeFileSync(join(dir, 'following.json'), JSON.stringify(list, null, 2) + '\n');
69}