@zincapp/znvault-cli 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +310 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +660 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/apikey.d.ts +3 -0
- package/dist/commands/apikey.d.ts.map +1 -0
- package/dist/commands/apikey.js +767 -0
- package/dist/commands/apikey.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +147 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +426 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/cert.d.ts +3 -0
- package/dist/commands/cert.d.ts.map +1 -0
- package/dist/commands/cert.js +398 -0
- package/dist/commands/cert.js.map +1 -0
- package/dist/commands/cluster.d.ts +3 -0
- package/dist/commands/cluster.d.ts.map +1 -0
- package/dist/commands/cluster.js +228 -0
- package/dist/commands/cluster.js.map +1 -0
- package/dist/commands/emergency.d.ts +3 -0
- package/dist/commands/emergency.d.ts.map +1 -0
- package/dist/commands/emergency.js +223 -0
- package/dist/commands/emergency.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +188 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/lockdown.d.ts +3 -0
- package/dist/commands/lockdown.d.ts.map +1 -0
- package/dist/commands/lockdown.js +232 -0
- package/dist/commands/lockdown.js.map +1 -0
- package/dist/commands/permissions.d.ts +3 -0
- package/dist/commands/permissions.d.ts.map +1 -0
- package/dist/commands/permissions.js +168 -0
- package/dist/commands/permissions.js.map +1 -0
- package/dist/commands/policy.d.ts +3 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +660 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/superadmin.d.ts +3 -0
- package/dist/commands/superadmin.d.ts.map +1 -0
- package/dist/commands/superadmin.js +203 -0
- package/dist/commands/superadmin.js.map +1 -0
- package/dist/commands/tenant.d.ts +3 -0
- package/dist/commands/tenant.d.ts.map +1 -0
- package/dist/commands/tenant.js +277 -0
- package/dist/commands/tenant.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +359 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +363 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/client.d.ts +246 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +734 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +130 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +342 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/db.d.ts +111 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +698 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/local.d.ts +41 -0
- package/dist/lib/local.d.ts.map +1 -0
- package/dist/lib/local.js +236 -0
- package/dist/lib/local.js.map +1 -0
- package/dist/lib/mode.d.ts +210 -0
- package/dist/lib/mode.d.ts.map +1 -0
- package/dist/lib/mode.js +389 -0
- package/dist/lib/mode.js.map +1 -0
- package/dist/lib/output.d.ts +61 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +190 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompts.d.ts +32 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +96 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/services/auto-update-daemon.d.ts +48 -0
- package/dist/services/auto-update-daemon.d.ts.map +1 -0
- package/dist/services/auto-update-daemon.js +296 -0
- package/dist/services/auto-update-daemon.js.map +1 -0
- package/dist/services/signature-verifier.d.ts +38 -0
- package/dist/services/signature-verifier.d.ts.map +1 -0
- package/dist/services/signature-verifier.js +209 -0
- package/dist/services/signature-verifier.js.map +1 -0
- package/dist/services/update-checker.d.ts +39 -0
- package/dist/services/update-checker.d.ts.map +1 -0
- package/dist/services/update-checker.js +198 -0
- package/dist/services/update-checker.js.map +1 -0
- package/dist/services/update-installer.d.ts +54 -0
- package/dist/services/update-installer.d.ts.map +1 -0
- package/dist/services/update-installer.js +360 -0
- package/dist/services/update-installer.js.map +1 -0
- package/dist/types/index.d.ts +411 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/update.d.ts +137 -0
- package/dist/types/update.d.ts.map +1 -0
- package/dist/types/update.js +27 -0
- package/dist/types/update.js.map +1 -0
- package/dist/utils/platform.d.ts +35 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +115 -0
- package/dist/utils/platform.js.map +1 -0
- package/package.json +59 -0
package/dist/lib/mode.js
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { client } from './client.js';
|
|
2
|
+
import { LocalDBClient } from './db.js';
|
|
3
|
+
import { isLocalModeAvailable, getLocalModeStatus } from './local.js';
|
|
4
|
+
import { hasApiKey, getCredentials, hasEnvCredentials } from './config.js';
|
|
5
|
+
let _forceMode = null;
|
|
6
|
+
let _localClient = null;
|
|
7
|
+
/**
|
|
8
|
+
* Force a specific mode (for testing)
|
|
9
|
+
*/
|
|
10
|
+
export function setMode(mode) {
|
|
11
|
+
_forceMode = mode;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Determine which mode to use
|
|
15
|
+
*/
|
|
16
|
+
export function getMode() {
|
|
17
|
+
if (_forceMode) {
|
|
18
|
+
return _forceMode;
|
|
19
|
+
}
|
|
20
|
+
// Check if local mode is available (running on vault node with sudo or DATABASE_URL set)
|
|
21
|
+
if (isLocalModeAvailable()) {
|
|
22
|
+
return 'local';
|
|
23
|
+
}
|
|
24
|
+
// Fall back to API mode
|
|
25
|
+
return 'api';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if any authentication is available for API mode
|
|
29
|
+
*/
|
|
30
|
+
export function hasApiAuth() {
|
|
31
|
+
return hasApiKey() || !!getCredentials() || hasEnvCredentials();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get a description of current mode for display
|
|
35
|
+
*/
|
|
36
|
+
export function getModeDescription() {
|
|
37
|
+
const mode = getMode();
|
|
38
|
+
if (mode === 'local') {
|
|
39
|
+
const status = getLocalModeStatus();
|
|
40
|
+
const nodeId = status.nodeId ? ` (${status.nodeId})` : '';
|
|
41
|
+
return `Local mode${nodeId} - direct database access`;
|
|
42
|
+
}
|
|
43
|
+
if (hasApiKey()) {
|
|
44
|
+
return 'API mode - using API key';
|
|
45
|
+
}
|
|
46
|
+
const creds = getCredentials();
|
|
47
|
+
if (creds) {
|
|
48
|
+
return `API mode - logged in as ${creds.username}`;
|
|
49
|
+
}
|
|
50
|
+
if (hasEnvCredentials()) {
|
|
51
|
+
return 'API mode - using environment credentials';
|
|
52
|
+
}
|
|
53
|
+
return 'API mode - no authentication configured';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the local database client (singleton)
|
|
57
|
+
*/
|
|
58
|
+
function getLocalClient() {
|
|
59
|
+
if (!_localClient) {
|
|
60
|
+
_localClient = new LocalDBClient();
|
|
61
|
+
}
|
|
62
|
+
return _localClient;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Close local client connection
|
|
66
|
+
*/
|
|
67
|
+
export async function closeLocalClient() {
|
|
68
|
+
if (_localClient) {
|
|
69
|
+
await _localClient.close();
|
|
70
|
+
_localClient = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ============ Unified Operations ============
|
|
74
|
+
/**
|
|
75
|
+
* Health check
|
|
76
|
+
*/
|
|
77
|
+
export async function health() {
|
|
78
|
+
if (getMode() === 'local') {
|
|
79
|
+
return getLocalClient().health();
|
|
80
|
+
}
|
|
81
|
+
return client.health();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Leader health check (API only - local mode returns regular health)
|
|
85
|
+
*/
|
|
86
|
+
export async function leaderHealth() {
|
|
87
|
+
if (getMode() === 'local') {
|
|
88
|
+
// In local mode, we just return regular health
|
|
89
|
+
return getLocalClient().health();
|
|
90
|
+
}
|
|
91
|
+
return client.leaderHealth();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Cluster status
|
|
95
|
+
*/
|
|
96
|
+
export async function clusterStatus() {
|
|
97
|
+
if (getMode() === 'local') {
|
|
98
|
+
return getLocalClient().clusterStatus();
|
|
99
|
+
}
|
|
100
|
+
return client.clusterStatus();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* List tenants
|
|
104
|
+
*/
|
|
105
|
+
export async function listTenants(options) {
|
|
106
|
+
if (getMode() === 'local') {
|
|
107
|
+
return getLocalClient().listTenants(options);
|
|
108
|
+
}
|
|
109
|
+
return client.listTenants(options);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get tenant
|
|
113
|
+
*/
|
|
114
|
+
export async function getTenant(id, withUsage) {
|
|
115
|
+
if (getMode() === 'local') {
|
|
116
|
+
return getLocalClient().getTenant(id, withUsage);
|
|
117
|
+
}
|
|
118
|
+
const tenant = await client.getTenant(id, withUsage);
|
|
119
|
+
return tenant || null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get tenant usage
|
|
123
|
+
*/
|
|
124
|
+
export async function getTenantUsage(id) {
|
|
125
|
+
if (getMode() === 'local') {
|
|
126
|
+
return getLocalClient().getTenantUsage(id);
|
|
127
|
+
}
|
|
128
|
+
return client.getTenantUsage(id);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* List users
|
|
132
|
+
*/
|
|
133
|
+
export async function listUsers(options) {
|
|
134
|
+
if (getMode() === 'local') {
|
|
135
|
+
return getLocalClient().listUsers(options);
|
|
136
|
+
}
|
|
137
|
+
return client.listUsers(options);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get user
|
|
141
|
+
*/
|
|
142
|
+
export async function getUser(id) {
|
|
143
|
+
if (getMode() === 'local') {
|
|
144
|
+
return getLocalClient().getUser(id);
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
return await client.getUser(id);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* List superadmins
|
|
155
|
+
*/
|
|
156
|
+
export async function listSuperadmins() {
|
|
157
|
+
if (getMode() === 'local') {
|
|
158
|
+
return getLocalClient().listSuperadmins();
|
|
159
|
+
}
|
|
160
|
+
return client.listSuperadmins();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get lockdown status
|
|
164
|
+
*/
|
|
165
|
+
export async function getLockdownStatus() {
|
|
166
|
+
if (getMode() === 'local') {
|
|
167
|
+
return getLocalClient().getLockdownStatus();
|
|
168
|
+
}
|
|
169
|
+
return client.getLockdownStatus();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get lockdown history
|
|
173
|
+
*/
|
|
174
|
+
export async function getLockdownHistory(limit) {
|
|
175
|
+
if (getMode() === 'local') {
|
|
176
|
+
return getLocalClient().getLockdownHistory(limit);
|
|
177
|
+
}
|
|
178
|
+
return client.getLockdownHistory(limit);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get threat events
|
|
182
|
+
*/
|
|
183
|
+
export async function getThreats(options) {
|
|
184
|
+
if (getMode() === 'local') {
|
|
185
|
+
return getLocalClient().getThreats(options);
|
|
186
|
+
}
|
|
187
|
+
return client.getThreats(options);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* List audit entries
|
|
191
|
+
*/
|
|
192
|
+
export async function listAudit(options) {
|
|
193
|
+
if (getMode() === 'local') {
|
|
194
|
+
return getLocalClient().listAudit(options);
|
|
195
|
+
}
|
|
196
|
+
return client.listAudit(options);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Verify audit chain
|
|
200
|
+
*/
|
|
201
|
+
export async function verifyAuditChain() {
|
|
202
|
+
if (getMode() === 'local') {
|
|
203
|
+
return getLocalClient().verifyAuditChain();
|
|
204
|
+
}
|
|
205
|
+
return client.verifyAuditChain();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Test database connection (local mode only)
|
|
209
|
+
*/
|
|
210
|
+
export async function testConnection() {
|
|
211
|
+
if (getMode() === 'local') {
|
|
212
|
+
return getLocalClient().testConnection();
|
|
213
|
+
}
|
|
214
|
+
// In API mode, just do a health check
|
|
215
|
+
try {
|
|
216
|
+
await client.health();
|
|
217
|
+
return { success: true, message: 'API connection successful' };
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
return { success: false, message: err instanceof Error ? err.message : String(err) };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get user status (local mode only returns full status)
|
|
225
|
+
*/
|
|
226
|
+
export async function getUserStatus(username) {
|
|
227
|
+
if (getMode() === 'local') {
|
|
228
|
+
return getLocalClient().getUserStatus(username);
|
|
229
|
+
}
|
|
230
|
+
// API mode - try to get user info
|
|
231
|
+
try {
|
|
232
|
+
const users = await client.listUsers();
|
|
233
|
+
const user = users.find(u => u.username === username || u.email === username);
|
|
234
|
+
if (user) {
|
|
235
|
+
return {
|
|
236
|
+
found: true,
|
|
237
|
+
user: {
|
|
238
|
+
id: user.id,
|
|
239
|
+
username: user.username,
|
|
240
|
+
email: user.email ?? null,
|
|
241
|
+
role: user.role,
|
|
242
|
+
status: user.status,
|
|
243
|
+
totpEnabled: user.totpEnabled,
|
|
244
|
+
failedAttempts: user.failedAttempts,
|
|
245
|
+
lockedUntil: user.lockedUntil ?? null,
|
|
246
|
+
lastLogin: user.lastLogin ?? null,
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return { found: false };
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return { found: false };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Reset user password (local mode only)
|
|
258
|
+
*/
|
|
259
|
+
export async function resetPassword(username, newPassword) {
|
|
260
|
+
if (getMode() !== 'local') {
|
|
261
|
+
return { success: false, message: 'Password reset requires local mode (sudo on vault node)' };
|
|
262
|
+
}
|
|
263
|
+
return getLocalClient().resetPassword(username, newPassword);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Unlock user (local mode only)
|
|
267
|
+
*/
|
|
268
|
+
export async function unlockUser(username) {
|
|
269
|
+
if (getMode() !== 'local') {
|
|
270
|
+
return { success: false, message: 'Unlock requires local mode (sudo on vault node)' };
|
|
271
|
+
}
|
|
272
|
+
return getLocalClient().unlockUser(username);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Disable TOTP (local mode only)
|
|
276
|
+
*/
|
|
277
|
+
export async function disableTotp(username) {
|
|
278
|
+
if (getMode() !== 'local') {
|
|
279
|
+
return { success: false, message: 'Disable TOTP requires local mode (sudo on vault node)' };
|
|
280
|
+
}
|
|
281
|
+
return getLocalClient().disableTotp(username);
|
|
282
|
+
}
|
|
283
|
+
// ============ API-only operations (require authentication) ============
|
|
284
|
+
/**
|
|
285
|
+
* Trigger lockdown (API only - requires authenticated admin action)
|
|
286
|
+
*/
|
|
287
|
+
export async function triggerLockdown(level, reason) {
|
|
288
|
+
if (getMode() === 'local') {
|
|
289
|
+
return { success: false, status: 'Lockdown trigger requires API mode with authentication' };
|
|
290
|
+
}
|
|
291
|
+
return client.triggerLockdown(level, reason);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Clear lockdown (API only - requires authenticated admin action)
|
|
295
|
+
*/
|
|
296
|
+
export async function clearLockdown(reason) {
|
|
297
|
+
if (getMode() === 'local') {
|
|
298
|
+
return { success: false, previousStatus: 'Lockdown clear requires API mode with authentication' };
|
|
299
|
+
}
|
|
300
|
+
return client.clearLockdown(reason);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Cluster takeover (API only)
|
|
304
|
+
*/
|
|
305
|
+
export async function clusterTakeover() {
|
|
306
|
+
if (getMode() === 'local') {
|
|
307
|
+
return { success: false, message: 'Cluster takeover requires API mode', nodeId: '' };
|
|
308
|
+
}
|
|
309
|
+
return client.clusterTakeover();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Cluster release (API only)
|
|
313
|
+
*/
|
|
314
|
+
export async function clusterRelease() {
|
|
315
|
+
if (getMode() === 'local') {
|
|
316
|
+
return { success: false, message: 'Cluster release requires API mode' };
|
|
317
|
+
}
|
|
318
|
+
return client.clusterRelease();
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Cluster maintenance mode (API only)
|
|
322
|
+
*/
|
|
323
|
+
export async function clusterMaintenance(enable) {
|
|
324
|
+
if (getMode() === 'local') {
|
|
325
|
+
return { success: false, maintenanceMode: false };
|
|
326
|
+
}
|
|
327
|
+
return client.clusterMaintenance(enable);
|
|
328
|
+
}
|
|
329
|
+
// ============ Generic API methods for certificate and other operations ============
|
|
330
|
+
/**
|
|
331
|
+
* Generic GET request (API mode only)
|
|
332
|
+
*/
|
|
333
|
+
export async function apiGet(endpoint) {
|
|
334
|
+
if (getMode() === 'local') {
|
|
335
|
+
throw new Error('This operation requires API mode');
|
|
336
|
+
}
|
|
337
|
+
return client.get(endpoint);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Generic POST request (API mode only)
|
|
341
|
+
*/
|
|
342
|
+
export async function apiPost(endpoint, body) {
|
|
343
|
+
if (getMode() === 'local') {
|
|
344
|
+
throw new Error('This operation requires API mode');
|
|
345
|
+
}
|
|
346
|
+
return client.post(endpoint, body);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Generic DELETE request (API mode only)
|
|
350
|
+
*/
|
|
351
|
+
export async function apiDelete(endpoint) {
|
|
352
|
+
if (getMode() === 'local') {
|
|
353
|
+
throw new Error('This operation requires API mode');
|
|
354
|
+
}
|
|
355
|
+
return client.delete(endpoint);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Generic PATCH request (API mode only)
|
|
359
|
+
*/
|
|
360
|
+
export async function apiPatch(endpoint, body) {
|
|
361
|
+
if (getMode() === 'local') {
|
|
362
|
+
throw new Error('This operation requires API mode');
|
|
363
|
+
}
|
|
364
|
+
return client.patch(endpoint, body);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get WebSocket URL for a given endpoint path
|
|
368
|
+
*/
|
|
369
|
+
export async function getWebSocketUrl(wsPath) {
|
|
370
|
+
if (getMode() === 'local') {
|
|
371
|
+
// In local mode, use env var or default localhost
|
|
372
|
+
const localUrl = process.env.ZNVAULT_BASE_URL || 'https://localhost:8443';
|
|
373
|
+
return localUrl.replace(/^https?:/, 'wss:') + wsPath;
|
|
374
|
+
}
|
|
375
|
+
// API mode - use configured vault URL
|
|
376
|
+
return client.getWebSocketUrl(wsPath);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get authentication headers for WebSocket connection
|
|
380
|
+
*/
|
|
381
|
+
export async function getAuthHeaders() {
|
|
382
|
+
if (getMode() === 'local') {
|
|
383
|
+
// Local mode doesn't need auth headers for local connections
|
|
384
|
+
return {};
|
|
385
|
+
}
|
|
386
|
+
// API mode - get auth from client
|
|
387
|
+
return client.getAuthHeaders();
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/lib/mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { OutputFormat } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Print success message
|
|
4
|
+
*/
|
|
5
|
+
export declare function success(message: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Print error message
|
|
8
|
+
*/
|
|
9
|
+
export declare function error(message: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Print warning message
|
|
12
|
+
*/
|
|
13
|
+
export declare function warn(message: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Print info message
|
|
16
|
+
*/
|
|
17
|
+
export declare function info(message: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Print data as JSON
|
|
20
|
+
*/
|
|
21
|
+
export declare function json(data: unknown): void;
|
|
22
|
+
/**
|
|
23
|
+
* Print data as a table
|
|
24
|
+
*/
|
|
25
|
+
export declare function table(headers: string[], rows: (string | number | boolean | null | undefined)[][]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Print key-value pairs
|
|
28
|
+
*/
|
|
29
|
+
export declare function keyValue(data: Record<string, unknown>, indent?: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Format status with color
|
|
32
|
+
*/
|
|
33
|
+
export declare function formatStatus(status: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Format boolean as yes/no
|
|
36
|
+
*/
|
|
37
|
+
export declare function formatBool(value: boolean): string;
|
|
38
|
+
/**
|
|
39
|
+
* Format date/time
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatDate(date: string | Date | undefined | null): string;
|
|
42
|
+
/**
|
|
43
|
+
* Format relative time
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatRelativeTime(date: string | Date): string;
|
|
46
|
+
/**
|
|
47
|
+
* Print data in the specified format
|
|
48
|
+
*/
|
|
49
|
+
export declare function printData(data: unknown, format: OutputFormat, tableConfig?: {
|
|
50
|
+
headers: string[];
|
|
51
|
+
getRow: (item: unknown) => (string | number | boolean | null | undefined)[];
|
|
52
|
+
}): void;
|
|
53
|
+
/**
|
|
54
|
+
* Print a section header
|
|
55
|
+
*/
|
|
56
|
+
export declare function section(title: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Print a horizontal rule
|
|
59
|
+
*/
|
|
60
|
+
export declare function hr(): void;
|
|
61
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,CAWvG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAI,GAAG,IAAI,CAcxE;AA+BD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAIzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAa9D;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,CAAA;CAAE,GAC/G,IAAI,CA2BN;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED;;GAEG;AACH,wBAAgB,EAAE,IAAI,IAAI,CAEzB"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import Table from 'cli-table3';
|
|
3
|
+
/**
|
|
4
|
+
* Print success message
|
|
5
|
+
*/
|
|
6
|
+
export function success(message) {
|
|
7
|
+
console.log(chalk.green('✓'), message);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Print error message
|
|
11
|
+
*/
|
|
12
|
+
export function error(message) {
|
|
13
|
+
console.error(chalk.red('✗'), message);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Print warning message
|
|
17
|
+
*/
|
|
18
|
+
export function warn(message) {
|
|
19
|
+
console.warn(chalk.yellow('⚠'), message);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Print info message
|
|
23
|
+
*/
|
|
24
|
+
export function info(message) {
|
|
25
|
+
console.log(chalk.blue('ℹ'), message);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Print data as JSON
|
|
29
|
+
*/
|
|
30
|
+
export function json(data) {
|
|
31
|
+
console.log(JSON.stringify(data, null, 2));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Print data as a table
|
|
35
|
+
*/
|
|
36
|
+
export function table(headers, rows) {
|
|
37
|
+
const t = new Table({
|
|
38
|
+
head: headers.map(h => chalk.cyan(h)),
|
|
39
|
+
style: { head: [], border: [] },
|
|
40
|
+
});
|
|
41
|
+
for (const row of rows) {
|
|
42
|
+
t.push(row.map(cell => formatCell(cell)));
|
|
43
|
+
}
|
|
44
|
+
console.log(t.toString());
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Print key-value pairs
|
|
48
|
+
*/
|
|
49
|
+
export function keyValue(data, indent = 0) {
|
|
50
|
+
const prefix = ' '.repeat(indent);
|
|
51
|
+
for (const [key, value] of Object.entries(data)) {
|
|
52
|
+
if (value === null || value === undefined) {
|
|
53
|
+
console.log(`${prefix}${chalk.gray(key)}: ${chalk.dim('-')}`);
|
|
54
|
+
}
|
|
55
|
+
else if (typeof value === 'object' && !Array.isArray(value)) {
|
|
56
|
+
console.log(`${prefix}${chalk.gray(key)}:`);
|
|
57
|
+
keyValue(value, indent + 1);
|
|
58
|
+
}
|
|
59
|
+
else if (Array.isArray(value)) {
|
|
60
|
+
console.log(`${prefix}${chalk.gray(key)}: ${value.join(', ')}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(`${prefix}${chalk.gray(key)}: ${formatValue(value)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format a cell value for table display
|
|
69
|
+
*/
|
|
70
|
+
function formatCell(value) {
|
|
71
|
+
if (value === null || value === undefined) {
|
|
72
|
+
return chalk.dim('-');
|
|
73
|
+
}
|
|
74
|
+
if (typeof value === 'boolean') {
|
|
75
|
+
return value ? chalk.green('yes') : chalk.red('no');
|
|
76
|
+
}
|
|
77
|
+
if (typeof value === 'number') {
|
|
78
|
+
return value.toLocaleString();
|
|
79
|
+
}
|
|
80
|
+
return String(value);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Format a value for key-value display
|
|
84
|
+
*/
|
|
85
|
+
function formatValue(value) {
|
|
86
|
+
if (typeof value === 'boolean') {
|
|
87
|
+
return value ? chalk.green('yes') : chalk.red('no');
|
|
88
|
+
}
|
|
89
|
+
if (typeof value === 'number') {
|
|
90
|
+
return chalk.yellow(value.toLocaleString());
|
|
91
|
+
}
|
|
92
|
+
return String(value);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format status with color
|
|
96
|
+
*/
|
|
97
|
+
export function formatStatus(status) {
|
|
98
|
+
const statusLower = status.toLowerCase();
|
|
99
|
+
if (['active', 'ok', 'healthy', 'normal', 'enabled'].includes(statusLower)) {
|
|
100
|
+
return chalk.green(status);
|
|
101
|
+
}
|
|
102
|
+
if (['disabled', 'suspended', 'alert', 'restrict'].includes(statusLower)) {
|
|
103
|
+
return chalk.yellow(status);
|
|
104
|
+
}
|
|
105
|
+
if (['locked', 'error', 'lockdown', 'panic', 'archived'].includes(statusLower)) {
|
|
106
|
+
return chalk.red(status);
|
|
107
|
+
}
|
|
108
|
+
return status;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Format boolean as yes/no
|
|
112
|
+
*/
|
|
113
|
+
export function formatBool(value) {
|
|
114
|
+
return value ? chalk.green('yes') : chalk.red('no');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format date/time
|
|
118
|
+
*/
|
|
119
|
+
export function formatDate(date) {
|
|
120
|
+
if (!date)
|
|
121
|
+
return chalk.dim('-');
|
|
122
|
+
const d = typeof date === 'string' ? new Date(date) : date;
|
|
123
|
+
return d.toLocaleString();
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Format relative time
|
|
127
|
+
*/
|
|
128
|
+
export function formatRelativeTime(date) {
|
|
129
|
+
const d = typeof date === 'string' ? new Date(date) : date;
|
|
130
|
+
const now = new Date();
|
|
131
|
+
const diffMs = now.getTime() - d.getTime();
|
|
132
|
+
const diffSec = Math.floor(diffMs / 1000);
|
|
133
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
134
|
+
const diffHour = Math.floor(diffMin / 60);
|
|
135
|
+
const diffDay = Math.floor(diffHour / 24);
|
|
136
|
+
if (diffSec < 60)
|
|
137
|
+
return `${diffSec}s ago`;
|
|
138
|
+
if (diffMin < 60)
|
|
139
|
+
return `${diffMin}m ago`;
|
|
140
|
+
if (diffHour < 24)
|
|
141
|
+
return `${diffHour}h ago`;
|
|
142
|
+
return `${diffDay}d ago`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Print data in the specified format
|
|
146
|
+
*/
|
|
147
|
+
export function printData(data, format, tableConfig) {
|
|
148
|
+
if (format === 'json') {
|
|
149
|
+
json(data);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (format === 'yaml') {
|
|
153
|
+
// Simple YAML-like output
|
|
154
|
+
if (Array.isArray(data)) {
|
|
155
|
+
for (const item of data) {
|
|
156
|
+
console.log('---');
|
|
157
|
+
keyValue(item);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
keyValue(data);
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// Table format
|
|
166
|
+
if (tableConfig && Array.isArray(data)) {
|
|
167
|
+
table(tableConfig.headers, data.map(tableConfig.getRow));
|
|
168
|
+
}
|
|
169
|
+
else if (typeof data === 'object' && data !== null) {
|
|
170
|
+
keyValue(data);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
console.log(data);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Print a section header
|
|
178
|
+
*/
|
|
179
|
+
export function section(title) {
|
|
180
|
+
console.log();
|
|
181
|
+
console.log(chalk.bold.underline(title));
|
|
182
|
+
console.log();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Print a horizontal rule
|
|
186
|
+
*/
|
|
187
|
+
export function hr() {
|
|
188
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|