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';
7import { errorMessage } from './error-format.js';
8
9const vitJsonPath = configPath('vit.json');
10
11export function loadConfig() {
12 if (!existsSync(vitJsonPath)) return {};
13 try {
14 return JSON.parse(readFileSync(vitJsonPath, 'utf-8'));
15 } catch (err) {
16 console.warn(`warning: failed to read ${vitJsonPath}: ${errorMessage(err)}`);
17 return {};
18 }
19}
20
21export function saveConfig(obj) {
22 const now = Math.floor(Date.now() / 1000);
23 if (!obj.created_at) obj.created_at = now;
24 obj.updated_at = now;
25 mkdirSync(configDir, { recursive: true });
26 writeFileSync(vitJsonPath, JSON.stringify(obj, null, 2) + '\n');
27}
28
29export function requireDid(opts) {
30 if (opts?.did) return opts.did;
31 const localLogin = join(process.cwd(), '.vit', 'login.json');
32 try {
33 if (existsSync(localLogin)) {
34 const local = JSON.parse(readFileSync(localLogin, 'utf-8'));
35 if (local.did) return local.did;
36 }
37 } catch (err) {
38 console.warn(`warning: failed to read ${localLogin}: ${errorMessage(err)}`);
39 }
40 const did = loadConfig().did;
41 if (!did) {
42 console.error("no DID configured. run 'vit login <handle>' first or pass --did.");
43 process.exitCode = 1;
44 }
45 return did;
46}
47
48export function getScalars(obj) {
49 return Object.entries(obj).filter(
50 ([, v]) => typeof v !== 'object' || v === null
51 );
52}