open source is social v-it.org
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 sol pbc
3
4import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
5import { join } from 'node:path';
6import { configDir, configPath } from './paths.js';
7
8const vitJsonPath = configPath('vit.json');
9
10export function loadConfig() {
11 if (!existsSync(vitJsonPath)) return {};
12 try {
13 return JSON.parse(readFileSync(vitJsonPath, 'utf-8'));
14 } catch {
15 return {};
16 }
17}
18
19export function saveConfig(obj) {
20 const now = Math.floor(Date.now() / 1000);
21 if (!obj.created_at) obj.created_at = now;
22 obj.updated_at = now;
23 mkdirSync(configDir, { recursive: true });
24 writeFileSync(vitJsonPath, JSON.stringify(obj, null, 2) + '\n');
25}
26
27export function requireDid(opts) {
28 if (opts?.did) return opts.did;
29 try {
30 const localLogin = join(process.cwd(), '.vit', 'login.json');
31 if (existsSync(localLogin)) {
32 const local = JSON.parse(readFileSync(localLogin, 'utf-8'));
33 if (local.did) return local.did;
34 }
35 } catch {}
36 const did = loadConfig().did;
37 if (!did) {
38 console.error("no DID configured. run 'vit login <handle>' first or pass --did.");
39 process.exitCode = 1;
40 }
41 return did;
42}
43
44export function getScalars(obj) {
45 return Object.entries(obj).filter(
46 ([, v]) => typeof v !== 'object' || v === null
47 );
48}