@cefense-npm/cefense-cli 0.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 (118) hide show
  1. package/LICENSE.md +21 -0
  2. package/dist/commands/auth.d.ts +9 -0
  3. package/dist/commands/auth.d.ts.map +1 -0
  4. package/dist/commands/auth.js +190 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/fix.d.ts +3 -0
  7. package/dist/commands/fix.d.ts.map +1 -0
  8. package/dist/commands/fix.js +146 -0
  9. package/dist/commands/fix.js.map +1 -0
  10. package/dist/commands/fixactions.d.ts +12 -0
  11. package/dist/commands/fixactions.d.ts.map +1 -0
  12. package/dist/commands/fixactions.js +176 -0
  13. package/dist/commands/fixactions.js.map +1 -0
  14. package/dist/commands/link.d.ts +8 -0
  15. package/dist/commands/link.d.ts.map +1 -0
  16. package/dist/commands/link.js +0 -0
  17. package/dist/commands/link.js.map +1 -0
  18. package/dist/commands/observed.d.ts +18 -0
  19. package/dist/commands/observed.d.ts.map +1 -0
  20. package/dist/commands/observed.js +254 -0
  21. package/dist/commands/observed.js.map +1 -0
  22. package/dist/commands/pick.d.ts +3 -0
  23. package/dist/commands/pick.d.ts.map +1 -0
  24. package/dist/commands/pick.js +18 -0
  25. package/dist/commands/pick.js.map +1 -0
  26. package/dist/commands/repo.d.ts +12 -0
  27. package/dist/commands/repo.d.ts.map +1 -0
  28. package/dist/commands/repo.js +330 -0
  29. package/dist/commands/repo.js.map +1 -0
  30. package/dist/commands/scan.d.ts +9 -0
  31. package/dist/commands/scan.d.ts.map +1 -0
  32. package/dist/commands/scan.js +98 -0
  33. package/dist/commands/scan.js.map +1 -0
  34. package/dist/commands/status.d.ts +5 -0
  35. package/dist/commands/status.d.ts.map +1 -0
  36. package/dist/commands/status.js +250 -0
  37. package/dist/commands/status.js.map +1 -0
  38. package/dist/core/client.d.ts +87 -0
  39. package/dist/core/client.d.ts.map +1 -0
  40. package/dist/core/client.js +235 -0
  41. package/dist/core/client.js.map +1 -0
  42. package/dist/core/config.d.ts +24 -0
  43. package/dist/core/config.d.ts.map +1 -0
  44. package/dist/core/config.js +85 -0
  45. package/dist/core/config.js.map +1 -0
  46. package/dist/core/credentials.d.ts +17 -0
  47. package/dist/core/credentials.d.ts.map +1 -0
  48. package/dist/core/credentials.js +139 -0
  49. package/dist/core/credentials.js.map +1 -0
  50. package/dist/core/discovery.d.ts +8 -0
  51. package/dist/core/discovery.d.ts.map +1 -0
  52. package/dist/core/discovery.js +62 -0
  53. package/dist/core/discovery.js.map +1 -0
  54. package/dist/core/errors.d.ts +32 -0
  55. package/dist/core/errors.d.ts.map +1 -0
  56. package/dist/core/errors.js +56 -0
  57. package/dist/core/errors.js.map +1 -0
  58. package/dist/core/index.d.ts +10 -0
  59. package/dist/core/index.d.ts.map +1 -0
  60. package/dist/core/index.js +9 -0
  61. package/dist/core/index.js.map +1 -0
  62. package/dist/core/oauth.d.ts +20 -0
  63. package/dist/core/oauth.d.ts.map +1 -0
  64. package/dist/core/oauth.js +218 -0
  65. package/dist/core/oauth.js.map +1 -0
  66. package/dist/core/repo.d.ts +24 -0
  67. package/dist/core/repo.d.ts.map +1 -0
  68. package/dist/core/repo.js +101 -0
  69. package/dist/core/repo.js.map +1 -0
  70. package/dist/core/session.d.ts +24 -0
  71. package/dist/core/session.d.ts.map +1 -0
  72. package/dist/core/session.js +32 -0
  73. package/dist/core/session.js.map +1 -0
  74. package/dist/core/types.d.ts +309 -0
  75. package/dist/core/types.d.ts.map +1 -0
  76. package/dist/core/types.js +2 -0
  77. package/dist/core/types.js.map +1 -0
  78. package/dist/index.d.ts +3 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +148 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/ui/browser.d.ts +30 -0
  83. package/dist/ui/browser.d.ts.map +1 -0
  84. package/dist/ui/browser.js +350 -0
  85. package/dist/ui/browser.js.map +1 -0
  86. package/dist/ui/format.d.ts +15 -0
  87. package/dist/ui/format.d.ts.map +1 -0
  88. package/dist/ui/format.js +131 -0
  89. package/dist/ui/format.js.map +1 -0
  90. package/dist/ui/output.d.ts +16 -0
  91. package/dist/ui/output.d.ts.map +1 -0
  92. package/dist/ui/output.js +63 -0
  93. package/dist/ui/output.js.map +1 -0
  94. package/dist/ui/prompts.d.ts +39 -0
  95. package/dist/ui/prompts.d.ts.map +1 -0
  96. package/dist/ui/prompts.js +76 -0
  97. package/dist/ui/prompts.js.map +1 -0
  98. package/dist/ui/screen.d.ts +27 -0
  99. package/dist/ui/screen.d.ts.map +1 -0
  100. package/dist/ui/screen.js +120 -0
  101. package/dist/ui/screen.js.map +1 -0
  102. package/dist/ui/spinner.d.ts +8 -0
  103. package/dist/ui/spinner.d.ts.map +1 -0
  104. package/dist/ui/spinner.js +98 -0
  105. package/dist/ui/spinner.js.map +1 -0
  106. package/dist/ui/table.d.ts +14 -0
  107. package/dist/ui/table.d.ts.map +1 -0
  108. package/dist/ui/table.js +47 -0
  109. package/dist/ui/table.js.map +1 -0
  110. package/dist/ui/theme.d.ts +44 -0
  111. package/dist/ui/theme.d.ts.map +1 -0
  112. package/dist/ui/theme.js +85 -0
  113. package/dist/ui/theme.js.map +1 -0
  114. package/dist/version.d.ts +3 -0
  115. package/dist/version.d.ts.map +1 -0
  116. package/dist/version.js +17 -0
  117. package/dist/version.js.map +1 -0
  118. package/package.json +54 -0
@@ -0,0 +1,350 @@
1
+ import { terminalHeight, terminalWidth, truncate } from "./format.js";
2
+ import { c, glyph } from "./theme.js";
3
+ import { enterFullScreen, exitFullScreen, isInteractive, paint, readKeys, } from "./screen.js";
4
+ const RESERVED = new Set(["up", "down", "left", "right", "pageup", "pagedown", "home", "end", "enter", "escape", "ctrl-c", "backspace", "tab", "/"]);
5
+ export async function browse(initial, spec) {
6
+ let items = initial;
7
+ let cursor = 0;
8
+ let top = 0;
9
+ let detailOpen = false;
10
+ let detailScroll = 0;
11
+ let filtering = false;
12
+ let query = "";
13
+ let status = null;
14
+ let closed = false;
15
+ let suspended = false;
16
+ const actions = spec.actions ?? [];
17
+ const filtered = () => {
18
+ if (!query || !spec.filterText)
19
+ return items;
20
+ const needle = query.toLowerCase();
21
+ return items.filter((item) => spec.filterText(item).toLowerCase().includes(needle));
22
+ };
23
+ const current = () => filtered()[cursor] ?? null;
24
+ const labelFor = (action, item) => typeof action.label === "function" ? action.label(item) : action.label;
25
+ const availableActions = (where) => {
26
+ const item = current();
27
+ const usable = [];
28
+ for (const action of actions) {
29
+ if (where === "list" && action.inList === false)
30
+ continue;
31
+ if (where === "detail" && action.inDetail === false)
32
+ continue;
33
+ const label = labelFor(action, item);
34
+ if (label)
35
+ usable.push({ action, label });
36
+ }
37
+ return usable;
38
+ };
39
+ const footerLine = () => {
40
+ if (filtering) {
41
+ return c.dim("filter: ") + query + c.dim("_ enter apply esc clear");
42
+ }
43
+ const hints = [];
44
+ if (detailOpen) {
45
+ hints.push(`${glyph.up}${glyph.down} scroll`);
46
+ for (const entry of availableActions("detail"))
47
+ hints.push(`${entry.action.key} ${entry.label}`);
48
+ hints.push("esc back");
49
+ }
50
+ else {
51
+ hints.push(`${glyph.up}${glyph.down} move`);
52
+ if (spec.renderDetail)
53
+ hints.push("enter open");
54
+ if (spec.filterText)
55
+ hints.push("/ filter");
56
+ for (const entry of availableActions("list"))
57
+ hints.push(`${entry.action.key} ${entry.label}`);
58
+ hints.push("q quit");
59
+ }
60
+ return c.dim(hints.join(" "));
61
+ };
62
+ const render = () => {
63
+ const width = terminalWidth();
64
+ const height = terminalHeight();
65
+ const visible = filtered();
66
+ const lines = [];
67
+ if (detailOpen && spec.renderDetail && current()) {
68
+ const detail = spec.renderDetail(current(), width);
69
+ const room = Math.max(1, height - 3);
70
+ detailScroll = Math.max(0, Math.min(detailScroll, Math.max(0, detail.length - room)));
71
+ lines.push(...detail.slice(detailScroll, detailScroll + room).map((line) => truncate(line, width)));
72
+ while (lines.length < room)
73
+ lines.push("");
74
+ if (detail.length > room) {
75
+ const position = Math.min(100, Math.round(((detailScroll + room) / detail.length) * 100));
76
+ lines.push(c.dim(`${position}%`));
77
+ }
78
+ else {
79
+ lines.push("");
80
+ }
81
+ lines.push(status ? c.cyan(truncate(status, width)) : "");
82
+ lines.push(footerLine());
83
+ paint(lines);
84
+ return;
85
+ }
86
+ const header = spec.header(visible).map((line) => truncate(line, width));
87
+ lines.push(...header);
88
+ const room = Math.max(1, height - header.length - 3);
89
+ const blocks = visible.map((item, index) => spec.renderRow(item, index === cursor, width));
90
+ if (cursor < top)
91
+ top = cursor;
92
+ let used = 0;
93
+ let last = top;
94
+ for (let index = top; index < blocks.length; index += 1) {
95
+ const size = blocks[index].length;
96
+ if (used + size > room)
97
+ break;
98
+ used += size;
99
+ last = index;
100
+ }
101
+ while (cursor > last && top < blocks.length - 1) {
102
+ top += 1;
103
+ used = 0;
104
+ last = top;
105
+ for (let index = top; index < blocks.length; index += 1) {
106
+ const size = blocks[index].length;
107
+ if (used + size > room)
108
+ break;
109
+ used += size;
110
+ last = index;
111
+ }
112
+ }
113
+ if (visible.length === 0) {
114
+ lines.push("");
115
+ lines.push(c.dim(` ${spec.emptyMessage}`));
116
+ used = 2;
117
+ }
118
+ else {
119
+ for (let index = top; index <= last; index += 1) {
120
+ lines.push(...blocks[index].map((line) => truncate(line, width)));
121
+ }
122
+ }
123
+ while (lines.length < height - 2)
124
+ lines.push("");
125
+ const counter = visible.length > 0 && visible.length !== items.length
126
+ ? c.dim(`${visible.length} of ${items.length}`)
127
+ : "";
128
+ lines.push(status ? c.cyan(truncate(status, width)) : counter);
129
+ lines.push(footerLine());
130
+ paint(lines);
131
+ };
132
+ const context = {
133
+ get items() {
134
+ return items;
135
+ },
136
+ get selected() {
137
+ return current();
138
+ },
139
+ async refresh() {
140
+ if (!spec.refresh)
141
+ return;
142
+ items = await spec.refresh();
143
+ const visible = filtered();
144
+ if (cursor >= visible.length)
145
+ cursor = Math.max(0, visible.length - 1);
146
+ render();
147
+ },
148
+ setStatus(message) {
149
+ status = message;
150
+ if (!suspended)
151
+ render();
152
+ },
153
+ close() {
154
+ closed = true;
155
+ },
156
+ openDetail() {
157
+ detailOpen = Boolean(spec.renderDetail);
158
+ detailScroll = 0;
159
+ },
160
+ closeDetail() {
161
+ detailOpen = false;
162
+ },
163
+ async suspend(run) {
164
+ suspended = true;
165
+ input?.close();
166
+ exitFullScreen();
167
+ try {
168
+ return await run();
169
+ }
170
+ finally {
171
+ enterFullScreen();
172
+ input = readKeys(onKey);
173
+ suspended = false;
174
+ render();
175
+ }
176
+ },
177
+ };
178
+ let resolveDone = null;
179
+ const done = new Promise((resolve) => {
180
+ resolveDone = resolve;
181
+ });
182
+ const finish = () => {
183
+ if (!closed)
184
+ closed = true;
185
+ resolveDone?.();
186
+ };
187
+ const runAction = async (action) => {
188
+ try {
189
+ await action.run(current(), context);
190
+ }
191
+ catch (error) {
192
+ status = error instanceof Error ? error.message : String(error);
193
+ suspended = false;
194
+ }
195
+ };
196
+ const onKey = (key) => {
197
+ if (suspended)
198
+ return;
199
+ void handleKey(key);
200
+ };
201
+ const handleKey = async (key) => {
202
+ const visible = filtered();
203
+ if (filtering) {
204
+ if (key.name === "enter") {
205
+ filtering = false;
206
+ }
207
+ else if (key.name === "escape") {
208
+ filtering = false;
209
+ query = "";
210
+ cursor = 0;
211
+ }
212
+ else if (key.name === "backspace") {
213
+ query = query.slice(0, -1);
214
+ cursor = 0;
215
+ }
216
+ else if (key.printable) {
217
+ query += key.printable;
218
+ cursor = 0;
219
+ }
220
+ else if (key.name === "ctrl-c") {
221
+ finish();
222
+ return;
223
+ }
224
+ render();
225
+ return;
226
+ }
227
+ if (key.name === "ctrl-c") {
228
+ finish();
229
+ return;
230
+ }
231
+ if (detailOpen) {
232
+ if (key.name === "escape" || key.name === "q") {
233
+ detailOpen = false;
234
+ render();
235
+ return;
236
+ }
237
+ if (key.name === "up" || key.name === "k")
238
+ detailScroll = Math.max(0, detailScroll - 1);
239
+ else if (key.name === "down" || key.name === "j")
240
+ detailScroll += 1;
241
+ else if (key.name === "pageup")
242
+ detailScroll = Math.max(0, detailScroll - 10);
243
+ else if (key.name === "pagedown")
244
+ detailScroll += 10;
245
+ else if (key.name === "left" && cursor > 0) {
246
+ cursor -= 1;
247
+ detailScroll = 0;
248
+ }
249
+ else if (key.name === "right" && cursor < visible.length - 1) {
250
+ cursor += 1;
251
+ detailScroll = 0;
252
+ }
253
+ else {
254
+ const action = availableActions("detail").find((entry) => entry.action.key === key.name)?.action;
255
+ if (action) {
256
+ status = null;
257
+ await runAction(action);
258
+ if (closed) {
259
+ finish();
260
+ return;
261
+ }
262
+ }
263
+ }
264
+ render();
265
+ return;
266
+ }
267
+ if (key.name === "q" || key.name === "escape") {
268
+ if (query) {
269
+ query = "";
270
+ cursor = 0;
271
+ render();
272
+ return;
273
+ }
274
+ finish();
275
+ return;
276
+ }
277
+ if (key.name === "/" && spec.filterText) {
278
+ filtering = true;
279
+ render();
280
+ return;
281
+ }
282
+ if (key.name === "up" || key.name === "k")
283
+ cursor = Math.max(0, cursor - 1);
284
+ else if (key.name === "down" || key.name === "j")
285
+ cursor = Math.min(visible.length - 1, cursor + 1);
286
+ else if (key.name === "pageup")
287
+ cursor = Math.max(0, cursor - 10);
288
+ else if (key.name === "pagedown")
289
+ cursor = Math.min(visible.length - 1, cursor + 10);
290
+ else if (key.name === "home")
291
+ cursor = 0;
292
+ else if (key.name === "end")
293
+ cursor = Math.max(0, visible.length - 1);
294
+ else if (key.name === "enter" && spec.renderDetail && visible.length > 0) {
295
+ detailOpen = true;
296
+ detailScroll = 0;
297
+ }
298
+ else if (!RESERVED.has(key.name)) {
299
+ const action = availableActions("list").find((entry) => entry.action.key === key.name)?.action;
300
+ if (action) {
301
+ status = null;
302
+ await runAction(action);
303
+ if (closed) {
304
+ finish();
305
+ return;
306
+ }
307
+ }
308
+ }
309
+ render();
310
+ };
311
+ if (!isInteractive()) {
312
+ const width = terminalWidth();
313
+ const plain = [
314
+ ...spec.header(items),
315
+ ...(items.length === 0
316
+ ? [` ${spec.emptyMessage}`]
317
+ : items.flatMap((item) => spec.renderRow(item, false, width))),
318
+ ];
319
+ process.stdout.write(`${plain.map((entry) => truncate(entry, width)).join("\n")}\n`);
320
+ return;
321
+ }
322
+ enterFullScreen();
323
+ let input = readKeys(onKey);
324
+ const onResize = () => render();
325
+ process.stdout.on("resize", onResize);
326
+ let timer = null;
327
+ if (spec.refresh && spec.refreshIntervalMs) {
328
+ timer = setInterval(() => {
329
+ if (suspended || closed)
330
+ return;
331
+ if (spec.shouldKeepRefreshing && !spec.shouldKeepRefreshing(items))
332
+ return;
333
+ void context.refresh().catch(() => undefined);
334
+ }, spec.refreshIntervalMs);
335
+ timer.unref();
336
+ }
337
+ render();
338
+ try {
339
+ await done;
340
+ }
341
+ finally {
342
+ if (timer)
343
+ clearInterval(timer);
344
+ process.stdout.removeListener("resize", onResize);
345
+ input?.close();
346
+ input = null;
347
+ exitFullScreen();
348
+ }
349
+ }
350
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/ui/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare function terminalWidth(fallback?: number): number;
2
+ export declare function terminalHeight(fallback?: number): number;
3
+ export declare function stripAnsi(value: string): string;
4
+ export declare function visibleLength(value: string): number;
5
+ export declare function truncate(value: string, width: number): string;
6
+ export declare function padEnd(value: string, width: number): string;
7
+ export declare function padStart(value: string, width: number): string;
8
+ export declare function relativeTime(value: string | null | undefined): string;
9
+ export declare function absoluteDate(value: string | null | undefined): string;
10
+ export declare function elapsed(fromIso: string | null | undefined, toIso?: string | null): string;
11
+ export declare function progressBar(done: number, total: number, width?: number): string;
12
+ export declare function pluralise(count: number, singular: string, plural?: string): string;
13
+ export declare function money(amount: number | null, currency: string | null): string;
14
+ export declare function wrapText(value: string, width: number, indent?: string): string[];
15
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,QAAQ,SAAK,GAAG,MAAM,CAGnD;AAED,wBAAgB,cAAc,CAAC,QAAQ,SAAK,GAAG,MAAM,CAGpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAgBrE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKrE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQzF;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAS3E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAW5E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAoB5E"}
@@ -0,0 +1,131 @@
1
+ import { glyph } from "./theme.js";
2
+ const ANSI = new RegExp(String.fromCharCode(27) + "\\[[0-9;]*m", "g");
3
+ export function terminalWidth(fallback = 80) {
4
+ const width = process.stdout.columns;
5
+ return typeof width === "number" && width > 20 ? width : fallback;
6
+ }
7
+ export function terminalHeight(fallback = 24) {
8
+ const height = process.stdout.rows;
9
+ return typeof height === "number" && height > 6 ? height : fallback;
10
+ }
11
+ export function stripAnsi(value) {
12
+ return value.replace(ANSI, "");
13
+ }
14
+ export function visibleLength(value) {
15
+ return stripAnsi(value).length;
16
+ }
17
+ export function truncate(value, width) {
18
+ const plain = stripAnsi(value);
19
+ if (plain.length <= width)
20
+ return value;
21
+ if (width <= 1)
22
+ return plain.slice(0, Math.max(0, width));
23
+ return plain.slice(0, width - 1) + glyph.ellipsis;
24
+ }
25
+ export function padEnd(value, width) {
26
+ const length = visibleLength(value);
27
+ return length >= width ? value : value + " ".repeat(width - length);
28
+ }
29
+ export function padStart(value, width) {
30
+ const length = visibleLength(value);
31
+ return length >= width ? value : " ".repeat(width - length) + value;
32
+ }
33
+ export function relativeTime(value) {
34
+ if (!value)
35
+ return "never";
36
+ const then = new Date(value).getTime();
37
+ if (Number.isNaN(then))
38
+ return "never";
39
+ const seconds = Math.round((Date.now() - then) / 1000);
40
+ if (seconds < 0)
41
+ return "just now";
42
+ if (seconds < 60)
43
+ return `${seconds}s ago`;
44
+ const minutes = Math.round(seconds / 60);
45
+ if (minutes < 60)
46
+ return `${minutes}m ago`;
47
+ const hours = Math.round(minutes / 60);
48
+ if (hours < 24)
49
+ return `${hours}h ago`;
50
+ const days = Math.round(hours / 24);
51
+ if (days < 30)
52
+ return `${days}d ago`;
53
+ const months = Math.round(days / 30);
54
+ if (months < 12)
55
+ return `${months}mo ago`;
56
+ return `${Math.round(months / 12)}y ago`;
57
+ }
58
+ export function absoluteDate(value) {
59
+ if (!value)
60
+ return "never";
61
+ const date = new Date(value);
62
+ if (Number.isNaN(date.getTime()))
63
+ return "never";
64
+ return date.toLocaleDateString(undefined, { day: "numeric", month: "short", year: "numeric" });
65
+ }
66
+ export function elapsed(fromIso, toIso) {
67
+ if (!fromIso)
68
+ return "";
69
+ const from = new Date(fromIso).getTime();
70
+ const to = toIso ? new Date(toIso).getTime() : Date.now();
71
+ if (Number.isNaN(from) || Number.isNaN(to) || to < from)
72
+ return "";
73
+ const seconds = Math.floor((to - from) / 1000);
74
+ const pad = (value) => String(value).padStart(2, "0");
75
+ return `${pad(Math.floor(seconds / 3600))}:${pad(Math.floor(seconds / 60) % 60)}:${pad(seconds % 60)}`;
76
+ }
77
+ const EIGHTHS = ["", "\u258F", "\u258E", "\u258D", "\u258C", "\u258B", "\u258A", "\u2589"];
78
+ export function progressBar(done, total, width = 24) {
79
+ if (total <= 0)
80
+ return "";
81
+ const ratio = Math.max(0, Math.min(1, done / total));
82
+ const exact = ratio * width;
83
+ const whole = Math.floor(exact);
84
+ const remainder = EIGHTHS[Math.floor((exact - whole) * 8)] ?? "";
85
+ const filled = glyph.block.repeat(whole) + remainder;
86
+ const track = glyph.track.repeat(Math.max(0, width - whole - (remainder ? 1 : 0)));
87
+ return filled + track;
88
+ }
89
+ export function pluralise(count, singular, plural) {
90
+ return count === 1 ? singular : (plural ?? `${singular}s`);
91
+ }
92
+ export function money(amount, currency) {
93
+ if (amount === null || !currency)
94
+ return "";
95
+ try {
96
+ return new Intl.NumberFormat(undefined, {
97
+ style: "currency",
98
+ currency: currency.toUpperCase(),
99
+ maximumFractionDigits: amount % 100 === 0 ? 0 : 2,
100
+ }).format(amount / 100);
101
+ }
102
+ catch {
103
+ return `${(amount / 100).toFixed(2)} ${currency.toUpperCase()}`;
104
+ }
105
+ }
106
+ export function wrapText(value, width, indent = "") {
107
+ const paragraphs = value.split(/\n\s*\n/);
108
+ const lines = [];
109
+ for (const paragraph of paragraphs) {
110
+ const words = paragraph.split(/\s+/).filter(Boolean);
111
+ if (words.length === 0)
112
+ continue;
113
+ if (lines.length > 0)
114
+ lines.push("");
115
+ let current = "";
116
+ for (const word of words) {
117
+ const candidate = current ? `${current} ${word}` : word;
118
+ if (candidate.length > Math.max(8, width - indent.length) && current) {
119
+ lines.push(indent + current);
120
+ current = word;
121
+ }
122
+ else {
123
+ current = candidate;
124
+ }
125
+ }
126
+ if (current)
127
+ lines.push(indent + current);
128
+ }
129
+ return lines;
130
+ }
131
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/ui/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function setJsonMode(value: boolean): void;
2
+ export declare function isJsonMode(): boolean;
3
+ export declare function line(value?: string): void;
4
+ export declare function lines(values: string[]): void;
5
+ export declare function json(value: unknown): void;
6
+ export declare function heading(title: string, subtitle?: string): void;
7
+ export declare function section(title: string): void;
8
+ export declare function rule(width?: number): void;
9
+ export declare function success(message: string): void;
10
+ export declare function warn(message: string): void;
11
+ export declare function info(message: string): void;
12
+ export declare function bullet(message: string): void;
13
+ export declare function hint(message: string): void;
14
+ export declare function renderError(error: unknown): void;
15
+ export declare function isPiped(): boolean;
16
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,IAAI,CAAC,KAAK,SAAK,GAAG,IAAI,CAErC;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAE5C;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEzC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAI9D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG3C;AAED,wBAAgB,IAAI,CAAC,KAAK,SAAsB,GAAG,IAAI,CAEtD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAUhD;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC"}
@@ -0,0 +1,63 @@
1
+ import { CefenseError } from "../core/errors.js";
2
+ import { terminalWidth } from "./format.js";
3
+ import { c, glyph } from "./theme.js";
4
+ let jsonMode = false;
5
+ export function setJsonMode(value) {
6
+ jsonMode = value;
7
+ }
8
+ export function isJsonMode() {
9
+ return jsonMode;
10
+ }
11
+ export function line(value = "") {
12
+ process.stdout.write(`${value}\n`);
13
+ }
14
+ export function lines(values) {
15
+ for (const value of values)
16
+ line(value);
17
+ }
18
+ export function json(value) {
19
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
20
+ }
21
+ export function heading(title, subtitle) {
22
+ line();
23
+ line(` ${c.bold(title)}${subtitle ? ` ${c.dim(subtitle)}` : ""}`);
24
+ line();
25
+ }
26
+ export function section(title) {
27
+ line();
28
+ line(` ${c.dim(title.toUpperCase())}`);
29
+ }
30
+ export function rule(width = terminalWidth() - 4) {
31
+ line(` ${c.dim(glyph.rule.repeat(Math.max(4, width)))}`);
32
+ }
33
+ export function success(message) {
34
+ line(` ${c.green(glyph.check)} ${message}`);
35
+ }
36
+ export function warn(message) {
37
+ line(` ${c.yellow(glyph.warn)} ${message}`);
38
+ }
39
+ export function info(message) {
40
+ line(` ${message}`);
41
+ }
42
+ export function bullet(message) {
43
+ line(` ${c.dim(glyph.arrow)} ${message}`);
44
+ }
45
+ export function hint(message) {
46
+ line(` ${c.dim(message)}`);
47
+ }
48
+ export function renderError(error) {
49
+ const stream = process.stderr;
50
+ if (error instanceof CefenseError) {
51
+ stream.write(`\n ${c.red(glyph.cross)} ${error.message}\n`);
52
+ if (error.remedy)
53
+ stream.write(` ${c.dim(error.remedy)}\n`);
54
+ stream.write("\n");
55
+ return;
56
+ }
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ stream.write(`\n ${c.red(glyph.cross)} ${message}\n\n`);
59
+ }
60
+ export function isPiped() {
61
+ return !process.stdout.isTTY;
62
+ }
63
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/ui/output.ts"],"names":[],"mappings":"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"}