@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.
Files changed (122) hide show
  1. package/README.md +310 -0
  2. package/dist/commands/agent.d.ts +3 -0
  3. package/dist/commands/agent.d.ts.map +1 -0
  4. package/dist/commands/agent.js +660 -0
  5. package/dist/commands/agent.js.map +1 -0
  6. package/dist/commands/apikey.d.ts +3 -0
  7. package/dist/commands/apikey.d.ts.map +1 -0
  8. package/dist/commands/apikey.js +767 -0
  9. package/dist/commands/apikey.js.map +1 -0
  10. package/dist/commands/audit.d.ts +3 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +147 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/auth.d.ts +3 -0
  15. package/dist/commands/auth.d.ts.map +1 -0
  16. package/dist/commands/auth.js +426 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/cert.d.ts +3 -0
  19. package/dist/commands/cert.d.ts.map +1 -0
  20. package/dist/commands/cert.js +398 -0
  21. package/dist/commands/cert.js.map +1 -0
  22. package/dist/commands/cluster.d.ts +3 -0
  23. package/dist/commands/cluster.d.ts.map +1 -0
  24. package/dist/commands/cluster.js +228 -0
  25. package/dist/commands/cluster.js.map +1 -0
  26. package/dist/commands/emergency.d.ts +3 -0
  27. package/dist/commands/emergency.d.ts.map +1 -0
  28. package/dist/commands/emergency.js +223 -0
  29. package/dist/commands/emergency.js.map +1 -0
  30. package/dist/commands/health.d.ts +3 -0
  31. package/dist/commands/health.d.ts.map +1 -0
  32. package/dist/commands/health.js +188 -0
  33. package/dist/commands/health.js.map +1 -0
  34. package/dist/commands/lockdown.d.ts +3 -0
  35. package/dist/commands/lockdown.d.ts.map +1 -0
  36. package/dist/commands/lockdown.js +232 -0
  37. package/dist/commands/lockdown.js.map +1 -0
  38. package/dist/commands/permissions.d.ts +3 -0
  39. package/dist/commands/permissions.d.ts.map +1 -0
  40. package/dist/commands/permissions.js +168 -0
  41. package/dist/commands/permissions.js.map +1 -0
  42. package/dist/commands/policy.d.ts +3 -0
  43. package/dist/commands/policy.d.ts.map +1 -0
  44. package/dist/commands/policy.js +660 -0
  45. package/dist/commands/policy.js.map +1 -0
  46. package/dist/commands/superadmin.d.ts +3 -0
  47. package/dist/commands/superadmin.d.ts.map +1 -0
  48. package/dist/commands/superadmin.js +203 -0
  49. package/dist/commands/superadmin.js.map +1 -0
  50. package/dist/commands/tenant.d.ts +3 -0
  51. package/dist/commands/tenant.d.ts.map +1 -0
  52. package/dist/commands/tenant.js +277 -0
  53. package/dist/commands/tenant.js.map +1 -0
  54. package/dist/commands/update.d.ts +9 -0
  55. package/dist/commands/update.d.ts.map +1 -0
  56. package/dist/commands/update.js +359 -0
  57. package/dist/commands/update.js.map +1 -0
  58. package/dist/commands/user.d.ts +3 -0
  59. package/dist/commands/user.d.ts.map +1 -0
  60. package/dist/commands/user.js +363 -0
  61. package/dist/commands/user.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +82 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/client.d.ts +246 -0
  67. package/dist/lib/client.d.ts.map +1 -0
  68. package/dist/lib/client.js +734 -0
  69. package/dist/lib/client.js.map +1 -0
  70. package/dist/lib/config.d.ts +130 -0
  71. package/dist/lib/config.d.ts.map +1 -0
  72. package/dist/lib/config.js +342 -0
  73. package/dist/lib/config.js.map +1 -0
  74. package/dist/lib/db.d.ts +111 -0
  75. package/dist/lib/db.d.ts.map +1 -0
  76. package/dist/lib/db.js +698 -0
  77. package/dist/lib/db.js.map +1 -0
  78. package/dist/lib/local.d.ts +41 -0
  79. package/dist/lib/local.d.ts.map +1 -0
  80. package/dist/lib/local.js +236 -0
  81. package/dist/lib/local.js.map +1 -0
  82. package/dist/lib/mode.d.ts +210 -0
  83. package/dist/lib/mode.d.ts.map +1 -0
  84. package/dist/lib/mode.js +389 -0
  85. package/dist/lib/mode.js.map +1 -0
  86. package/dist/lib/output.d.ts +61 -0
  87. package/dist/lib/output.d.ts.map +1 -0
  88. package/dist/lib/output.js +190 -0
  89. package/dist/lib/output.js.map +1 -0
  90. package/dist/lib/prompts.d.ts +32 -0
  91. package/dist/lib/prompts.d.ts.map +1 -0
  92. package/dist/lib/prompts.js +96 -0
  93. package/dist/lib/prompts.js.map +1 -0
  94. package/dist/services/auto-update-daemon.d.ts +48 -0
  95. package/dist/services/auto-update-daemon.d.ts.map +1 -0
  96. package/dist/services/auto-update-daemon.js +296 -0
  97. package/dist/services/auto-update-daemon.js.map +1 -0
  98. package/dist/services/signature-verifier.d.ts +38 -0
  99. package/dist/services/signature-verifier.d.ts.map +1 -0
  100. package/dist/services/signature-verifier.js +209 -0
  101. package/dist/services/signature-verifier.js.map +1 -0
  102. package/dist/services/update-checker.d.ts +39 -0
  103. package/dist/services/update-checker.d.ts.map +1 -0
  104. package/dist/services/update-checker.js +198 -0
  105. package/dist/services/update-checker.js.map +1 -0
  106. package/dist/services/update-installer.d.ts +54 -0
  107. package/dist/services/update-installer.d.ts.map +1 -0
  108. package/dist/services/update-installer.js +360 -0
  109. package/dist/services/update-installer.js.map +1 -0
  110. package/dist/types/index.d.ts +411 -0
  111. package/dist/types/index.d.ts.map +1 -0
  112. package/dist/types/index.js +2 -0
  113. package/dist/types/index.js.map +1 -0
  114. package/dist/types/update.d.ts +137 -0
  115. package/dist/types/update.d.ts.map +1 -0
  116. package/dist/types/update.js +27 -0
  117. package/dist/types/update.js.map +1 -0
  118. package/dist/utils/platform.d.ts +35 -0
  119. package/dist/utils/platform.d.ts.map +1 -0
  120. package/dist/utils/platform.js +115 -0
  121. package/dist/utils/platform.js.map +1 -0
  122. package/package.json +59 -0
@@ -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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"}