@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,39 @@
1
+ import { type Spinner } from "./spinner.js";
2
+ export declare function requireInteractive(what: string, flagHint: string): void;
3
+ export interface Choice {
4
+ value: string;
5
+ label: string;
6
+ hint?: string;
7
+ }
8
+ export declare function select(options: {
9
+ message: string;
10
+ choices: Choice[];
11
+ initialValue?: string;
12
+ }): Promise<string>;
13
+ export declare function multiselect(options: {
14
+ message: string;
15
+ choices: Choice[];
16
+ initialValues?: string[];
17
+ required?: boolean;
18
+ }): Promise<string[]>;
19
+ export declare function confirm(options: {
20
+ message: string;
21
+ initialValue?: boolean;
22
+ assumeYes?: boolean;
23
+ }): Promise<boolean>;
24
+ export declare function text(options: {
25
+ message: string;
26
+ placeholder?: string;
27
+ initialValue?: string;
28
+ validate?: (value: string) => string | undefined;
29
+ }): Promise<string>;
30
+ export declare function confirmByTyping(options: {
31
+ message: string;
32
+ expected: string;
33
+ assumeYes?: boolean;
34
+ }): Promise<boolean>;
35
+ export declare function spinner(): Spinner;
36
+ export declare const intro: (message: string) => void;
37
+ export declare const outro: (message: string) => void;
38
+ export declare const note: (body: string, title?: string) => void;
39
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGvE;AAOD,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CASlB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUpB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnB;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAClD,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,SAEpC,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,SAAS,MAAM,SAEpC,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,SAGhD,CAAC"}
@@ -0,0 +1,76 @@
1
+ import * as clack from "@clack/prompts";
2
+ import { CancelledError, UsageError } from "../core/errors.js";
3
+ import { isInteractive } from "./screen.js";
4
+ import { createSpinner } from "./spinner.js";
5
+ export function requireInteractive(what, flagHint) {
6
+ if (isInteractive())
7
+ return;
8
+ throw new UsageError(`${what} needs an interactive terminal.`, flagHint);
9
+ }
10
+ function unwrap(value) {
11
+ if (clack.isCancel(value))
12
+ throw new CancelledError();
13
+ return value;
14
+ }
15
+ export async function select(options) {
16
+ requireInteractive(options.message, "Pass the value as an argument instead.");
17
+ return unwrap(await clack.select({
18
+ message: options.message,
19
+ options: options.choices,
20
+ initialValue: options.initialValue,
21
+ }));
22
+ }
23
+ export async function multiselect(options) {
24
+ requireInteractive(options.message, "Pass the values as arguments instead.");
25
+ return unwrap(await clack.multiselect({
26
+ message: options.message,
27
+ options: options.choices,
28
+ initialValues: options.initialValues ?? [],
29
+ required: options.required ?? false,
30
+ }));
31
+ }
32
+ export async function confirm(options) {
33
+ if (options.assumeYes)
34
+ return true;
35
+ requireInteractive(options.message, "Pass --yes to confirm without prompting.");
36
+ return unwrap(await clack.confirm({ message: options.message, initialValue: options.initialValue ?? false }));
37
+ }
38
+ export async function text(options) {
39
+ requireInteractive(options.message, "Pass the value as an argument instead.");
40
+ return unwrap(await clack.text({
41
+ message: options.message,
42
+ placeholder: options.placeholder,
43
+ initialValue: options.initialValue,
44
+ validate: options.validate
45
+ ? (value) => options.validate(String(value ?? ""))
46
+ : undefined,
47
+ }));
48
+ }
49
+ export async function confirmByTyping(options) {
50
+ if (options.assumeYes)
51
+ return true;
52
+ requireInteractive(options.message, "Pass --yes to confirm without prompting.");
53
+ const answer = await text({
54
+ message: options.message,
55
+ placeholder: options.expected,
56
+ });
57
+ return answer.trim() === options.expected;
58
+ }
59
+ export function spinner() {
60
+ return createSpinner();
61
+ }
62
+ export const intro = (message) => {
63
+ if (isInteractive())
64
+ clack.intro(message);
65
+ };
66
+ export const outro = (message) => {
67
+ if (isInteractive())
68
+ clack.outro(message);
69
+ };
70
+ export const note = (body, title) => {
71
+ if (isInteractive())
72
+ clack.note(body, title);
73
+ else
74
+ process.stdout.write(`${body}\n`);
75
+ };
76
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface Key {
2
+ name: string;
3
+ sequence: string;
4
+ ctrl: boolean;
5
+ printable: string | null;
6
+ }
7
+ export declare const ansi: {
8
+ altScreenOn: string;
9
+ altScreenOff: string;
10
+ hideCursor: string;
11
+ showCursor: string;
12
+ clear: string;
13
+ home: string;
14
+ clearBelow: string;
15
+ };
16
+ export declare function write(value: string): void;
17
+ export declare function parseKey(sequence: string): Key;
18
+ export interface InputSession {
19
+ close(): void;
20
+ }
21
+ export declare function readKeys(handler: (key: Key) => void): InputSession;
22
+ export declare function enterFullScreen(): void;
23
+ export declare function exitFullScreen(): void;
24
+ export declare function isFullScreen(): boolean;
25
+ export declare function paint(lines: string[]): void;
26
+ export declare function isInteractive(): boolean;
27
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/ui/screen.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,IAAI;;;;;;;;CAQhB,CAAC;AAEF,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzC;AAiBD,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAsB9C;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,IAAI,CAAC;CACf;AAID,wBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,YAAY,CA+BlE;AAKD,wBAAgB,eAAe,IAAI,IAAI,CAQtC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAG3C;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC"}
@@ -0,0 +1,120 @@
1
+ const ESC = String.fromCharCode(27);
2
+ const CTRL_C = String.fromCharCode(3);
3
+ const CTRL_D = String.fromCharCode(4);
4
+ const DELETE = String.fromCharCode(127);
5
+ const CSI = ESC + "[";
6
+ export const ansi = {
7
+ altScreenOn: CSI + "?1049h",
8
+ altScreenOff: CSI + "?1049l",
9
+ hideCursor: CSI + "?25l",
10
+ showCursor: CSI + "?25h",
11
+ clear: CSI + "2J" + CSI + "H",
12
+ home: CSI + "H",
13
+ clearBelow: CSI + "0J",
14
+ };
15
+ export function write(value) {
16
+ process.stdout.write(value);
17
+ }
18
+ const NAMED_SEQUENCES = {
19
+ A: "up",
20
+ B: "down",
21
+ C: "right",
22
+ D: "left",
23
+ H: "home",
24
+ F: "end",
25
+ Z: "shift-tab",
26
+ "5~": "pageup",
27
+ "6~": "pagedown",
28
+ "1~": "home",
29
+ "4~": "end",
30
+ "3~": "delete",
31
+ };
32
+ export function parseKey(sequence) {
33
+ const base = { sequence, ctrl: false, printable: null };
34
+ if (sequence === CTRL_C)
35
+ return { ...base, name: "ctrl-c", ctrl: true };
36
+ if (sequence === CTRL_D)
37
+ return { ...base, name: "ctrl-d", ctrl: true };
38
+ if (sequence === "\r" || sequence === "\n")
39
+ return { ...base, name: "enter" };
40
+ if (sequence === "\t")
41
+ return { ...base, name: "tab" };
42
+ if (sequence === DELETE || sequence === "\b")
43
+ return { ...base, name: "backspace" };
44
+ if (sequence === " ")
45
+ return { ...base, name: "space", printable: " " };
46
+ if (sequence === ESC)
47
+ return { ...base, name: "escape" };
48
+ if (sequence.startsWith(CSI) || sequence.startsWith(ESC + "O")) {
49
+ return { ...base, name: NAMED_SEQUENCES[sequence.slice(2)] ?? "unknown" };
50
+ }
51
+ if (sequence.length === 1) {
52
+ const code = sequence.charCodeAt(0);
53
+ if (code < 32)
54
+ return { ...base, name: "ctrl-" + String.fromCharCode(code + 96), ctrl: true };
55
+ return { ...base, name: sequence.toLowerCase(), printable: sequence };
56
+ }
57
+ return { ...base, name: "unknown" };
58
+ }
59
+ const SEQUENCE_PATTERN = new RegExp("^" + ESC + "(?:\\[[0-9;]*[A-Za-z~]|O[A-Za-z])");
60
+ export function readKeys(handler) {
61
+ const stdin = process.stdin;
62
+ const wasRaw = Boolean(stdin.isRaw);
63
+ if (stdin.isTTY)
64
+ stdin.setRawMode(true);
65
+ stdin.resume();
66
+ stdin.setEncoding("utf8");
67
+ const onData = (chunk) => {
68
+ let index = 0;
69
+ while (index < chunk.length) {
70
+ let sequence;
71
+ if (chunk[index] === ESC) {
72
+ const match = chunk.slice(index).match(SEQUENCE_PATTERN);
73
+ sequence = match ? match[0] : ESC;
74
+ }
75
+ else {
76
+ sequence = chunk[index];
77
+ }
78
+ handler(parseKey(sequence));
79
+ index += sequence.length;
80
+ }
81
+ };
82
+ stdin.on("data", onData);
83
+ return {
84
+ close() {
85
+ stdin.removeListener("data", onData);
86
+ if (stdin.isTTY)
87
+ stdin.setRawMode(wasRaw);
88
+ stdin.pause();
89
+ },
90
+ };
91
+ }
92
+ let exitHookInstalled = false;
93
+ let active = false;
94
+ export function enterFullScreen() {
95
+ if (active)
96
+ return;
97
+ active = true;
98
+ write(ansi.altScreenOn + ansi.hideCursor + ansi.clear);
99
+ if (!exitHookInstalled) {
100
+ exitHookInstalled = true;
101
+ process.on("exit", exitFullScreen);
102
+ }
103
+ }
104
+ export function exitFullScreen() {
105
+ if (!active)
106
+ return;
107
+ active = false;
108
+ write(ansi.showCursor + ansi.altScreenOff);
109
+ }
110
+ export function isFullScreen() {
111
+ return active;
112
+ }
113
+ export function paint(lines) {
114
+ const rows = process.stdout.rows ?? lines.length;
115
+ write(ansi.home + ansi.clearBelow + lines.slice(0, rows).join("\n"));
116
+ }
117
+ export function isInteractive() {
118
+ return Boolean(process.stdout.isTTY && process.stdin.isTTY);
119
+ }
120
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/ui/screen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type SpinnerTone = "ok" | "warn" | "fail" | "none";
2
+ export interface Spinner {
3
+ start(message?: string): void;
4
+ message(value: string): void;
5
+ stop(message?: string, tone?: SpinnerTone): void;
6
+ }
7
+ export declare function createSpinner(): Spinner;
8
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAClD;AASD,wBAAgB,aAAa,IAAI,OAAO,CA2DvC"}
@@ -0,0 +1,98 @@
1
+ import { c } from "./theme.js";
2
+ import { isInteractive } from "./screen.js";
3
+ const ESC = String.fromCharCode(27);
4
+ const CLEAR_LINE = `${ESC}[2K${ESC}[1G`;
5
+ const HIDE_CURSOR = `${ESC}[?25l`;
6
+ const SHOW_CURSOR = `${ESC}[?25h`;
7
+ const TRACK = 7;
8
+ const FRAME_MS = 90;
9
+ function sweepFrames() {
10
+ const frames = [];
11
+ const positions = [...Array(TRACK).keys(), ...[...Array(TRACK).keys()].reverse().slice(1, -1)];
12
+ for (const head of positions) {
13
+ let frame = "";
14
+ for (let index = 0; index < TRACK; index += 1) {
15
+ const distance = Math.abs(index - head);
16
+ if (distance === 0)
17
+ frame += c.cyan("▰");
18
+ else if (distance === 1)
19
+ frame += c.dim(c.cyan("▰"));
20
+ else
21
+ frame += c.dim("▱");
22
+ }
23
+ frames.push(frame);
24
+ }
25
+ return frames;
26
+ }
27
+ function toneMark(tone) {
28
+ if (tone === "ok")
29
+ return `${c.green("\u2713")} `;
30
+ if (tone === "warn")
31
+ return `${c.yellow("!")} `;
32
+ if (tone === "fail")
33
+ return `${c.red("\u2717")} `;
34
+ return "";
35
+ }
36
+ export function createSpinner() {
37
+ if (!isInteractive()) {
38
+ let last = "";
39
+ return {
40
+ start(message) {
41
+ if (message)
42
+ process.stderr.write(` ${message}\n`);
43
+ },
44
+ message(value) {
45
+ last = value;
46
+ },
47
+ stop(message, tone = "ok") {
48
+ const final = message ?? last;
49
+ if (final)
50
+ process.stderr.write(` ${toneMark(tone)}${final}\n`);
51
+ },
52
+ };
53
+ }
54
+ const frames = sweepFrames();
55
+ let index = 0;
56
+ let text = "";
57
+ let timer = null;
58
+ let running = false;
59
+ const draw = () => {
60
+ process.stderr.write(`${CLEAR_LINE} ${frames[index % frames.length]} ${text}`);
61
+ index += 1;
62
+ };
63
+ const cleanup = () => {
64
+ if (timer)
65
+ clearInterval(timer);
66
+ timer = null;
67
+ running = false;
68
+ };
69
+ process.on("exit", () => {
70
+ if (running)
71
+ process.stderr.write(`${CLEAR_LINE}${SHOW_CURSOR}`);
72
+ });
73
+ return {
74
+ start(message = "") {
75
+ if (running)
76
+ return;
77
+ running = true;
78
+ text = message;
79
+ process.stderr.write(HIDE_CURSOR);
80
+ draw();
81
+ timer = setInterval(draw, FRAME_MS);
82
+ timer.unref();
83
+ },
84
+ message(value) {
85
+ text = value;
86
+ if (!running)
87
+ return;
88
+ draw();
89
+ },
90
+ stop(message, tone = "ok") {
91
+ cleanup();
92
+ process.stderr.write(`${CLEAR_LINE}${SHOW_CURSOR}`);
93
+ if (message)
94
+ process.stderr.write(` ${toneMark(tone)}${message}\n`);
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface Column<T> {
2
+ header: string;
3
+ value: (row: T) => string;
4
+ align?: "left" | "right";
5
+ min?: number;
6
+ max?: number;
7
+ }
8
+ export declare function renderTable<T>(rows: T[], columns: Column<T>[], options: {
9
+ width: number;
10
+ gap?: number;
11
+ header?: boolean;
12
+ }): string[];
13
+ export declare function keyValue(pairs: Array<[string, string]>, labelWidth?: number): string[];
14
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/ui/table.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,CAAC,EAAE,EACT,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACzD,MAAM,EAAE,CA4CV;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAGtF"}
@@ -0,0 +1,47 @@
1
+ import { padEnd, padStart, truncate, visibleLength } from "./format.js";
2
+ import { c } from "./theme.js";
3
+ export function renderTable(rows, columns, options) {
4
+ if (rows.length === 0)
5
+ return [];
6
+ const gap = options.gap ?? 2;
7
+ const cells = rows.map((row) => columns.map((column) => column.value(row)));
8
+ const widths = columns.map((column, index) => {
9
+ const longest = Math.max(options.header === false ? 0 : visibleLength(column.header), ...cells.map((row) => visibleLength(row[index] ?? "")));
10
+ return Math.min(column.max ?? Number.MAX_SAFE_INTEGER, Math.max(column.min ?? 0, longest));
11
+ });
12
+ const totalGap = gap * (columns.length - 1);
13
+ let overflow = widths.reduce((sum, value) => sum + value, 0) + totalGap - options.width;
14
+ if (overflow > 0) {
15
+ const order = columns
16
+ .map((column, index) => ({ index, width: widths[index] }))
17
+ .sort((left, right) => right.width - left.width);
18
+ for (const entry of order) {
19
+ if (overflow <= 0)
20
+ break;
21
+ const floor = columns[entry.index].min ?? 8;
22
+ const reduce = Math.min(overflow, Math.max(0, widths[entry.index] - floor));
23
+ widths[entry.index] = widths[entry.index] - reduce;
24
+ overflow -= reduce;
25
+ }
26
+ }
27
+ const line = (values) => values
28
+ .map((value, index) => {
29
+ const width = widths[index];
30
+ const clipped = truncate(value, width);
31
+ return columns[index].align === "right" ? padStart(clipped, width) : padEnd(clipped, width);
32
+ })
33
+ .join(" ".repeat(gap))
34
+ .trimEnd();
35
+ const output = [];
36
+ if (options.header !== false) {
37
+ output.push(c.dim(line(columns.map((column) => column.header.toUpperCase()))));
38
+ }
39
+ for (const row of cells)
40
+ output.push(line(row));
41
+ return output;
42
+ }
43
+ export function keyValue(pairs, labelWidth) {
44
+ const width = labelWidth ?? Math.max(...pairs.map(([label]) => label.length));
45
+ return pairs.map(([label, value]) => `${c.dim(padEnd(label, width))} ${value}`);
46
+ }
47
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/ui/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { WireSeverity } from "../core/types.js";
2
+ export declare function setColorEnabled(value: boolean): void;
3
+ export declare function colorEnabled(): boolean;
4
+ type Style = (value: string) => string;
5
+ export declare const c: {
6
+ bold: Style;
7
+ dim: Style;
8
+ italic: Style;
9
+ underline: Style;
10
+ red: Style;
11
+ green: Style;
12
+ yellow: Style;
13
+ blue: Style;
14
+ magenta: Style;
15
+ cyan: Style;
16
+ white: Style;
17
+ gray: Style;
18
+ inverse: Style;
19
+ };
20
+ export type DisplaySeverity = "Critical" | "High" | "Watch" | "Info";
21
+ export declare function displaySeverity(severity: WireSeverity | string): DisplaySeverity;
22
+ export declare function severityRank(severity: WireSeverity | string): number;
23
+ export declare function severityColor(severity: WireSeverity | string): Style;
24
+ export declare const glyph: {
25
+ dot: string;
26
+ ring: string;
27
+ check: string;
28
+ cross: string;
29
+ warn: string;
30
+ arrow: string;
31
+ star: string;
32
+ up: string;
33
+ down: string;
34
+ ellipsis: string;
35
+ block: string;
36
+ track: string;
37
+ rule: string;
38
+ pulse: string;
39
+ pulseOff: string;
40
+ };
41
+ export declare function severityBadge(severity: WireSeverity | string): string;
42
+ export declare function scanStatusLabel(status: string | null | undefined): string;
43
+ export {};
44
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEpD;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAMvC,eAAO,MAAM,CAAC;;;;;;;;;;;;;;CAcb,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAErE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,eAAe,CAKhF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,CAGpE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,KAAK,CAMpE;AAED,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;CAgBjB,CAAC;AAEF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,MAAM,CAGrE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAazE"}
@@ -0,0 +1,85 @@
1
+ import pc from "picocolors";
2
+ let enabled = pc.isColorSupported;
3
+ export function setColorEnabled(value) {
4
+ enabled = value;
5
+ }
6
+ export function colorEnabled() {
7
+ return enabled;
8
+ }
9
+ function wrap(style) {
10
+ return (value) => (enabled ? style(value) : value);
11
+ }
12
+ export const c = {
13
+ bold: wrap(pc.bold),
14
+ dim: wrap(pc.dim),
15
+ italic: wrap(pc.italic),
16
+ underline: wrap(pc.underline),
17
+ red: wrap(pc.red),
18
+ green: wrap(pc.green),
19
+ yellow: wrap(pc.yellow),
20
+ blue: wrap(pc.blue),
21
+ magenta: wrap(pc.magenta),
22
+ cyan: wrap(pc.cyan),
23
+ white: wrap(pc.white),
24
+ gray: wrap(pc.gray),
25
+ inverse: wrap(pc.inverse),
26
+ };
27
+ export function displaySeverity(severity) {
28
+ if (severity === "critical")
29
+ return "Critical";
30
+ if (severity === "high")
31
+ return "High";
32
+ if (severity === "medium")
33
+ return "Watch";
34
+ return "Info";
35
+ }
36
+ export function severityRank(severity) {
37
+ const label = displaySeverity(severity);
38
+ return label === "Critical" ? 0 : label === "High" ? 1 : label === "Watch" ? 2 : 3;
39
+ }
40
+ export function severityColor(severity) {
41
+ const label = displaySeverity(severity);
42
+ if (label === "Critical")
43
+ return c.red;
44
+ if (label === "High")
45
+ return c.yellow;
46
+ if (label === "Watch")
47
+ return c.cyan;
48
+ return c.gray;
49
+ }
50
+ export const glyph = {
51
+ dot: "●",
52
+ ring: "○",
53
+ check: "✓",
54
+ cross: "✗",
55
+ warn: "!",
56
+ arrow: "›",
57
+ star: "✦",
58
+ up: "↑",
59
+ down: "↓",
60
+ ellipsis: "…",
61
+ block: "\u2588",
62
+ track: "\u00B7",
63
+ rule: "\u2500",
64
+ pulse: "\u25B0",
65
+ pulseOff: "\u25B1",
66
+ };
67
+ export function severityBadge(severity) {
68
+ const label = displaySeverity(severity);
69
+ return severityColor(severity)(`${glyph.dot} ${label.toLowerCase().padEnd(8)}`);
70
+ }
71
+ export function scanStatusLabel(status) {
72
+ switch (status) {
73
+ case "queued":
74
+ return c.cyan(`${glyph.ring} queued`);
75
+ case "running":
76
+ return c.cyan(`${glyph.pulse} scanning`);
77
+ case "completed":
78
+ return c.green(`${glyph.check} ready`);
79
+ case "failed":
80
+ return c.red(`${glyph.cross} failed`);
81
+ default:
82
+ return c.dim(`${glyph.track} never`);
83
+ }
84
+ }
85
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const VERSION: string;
2
+ export declare const USER_AGENT: string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,OAAO,QAAgB,CAAC;AAErC,eAAO,MAAM,UAAU,QAAgG,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ function readVersion() {
5
+ try {
6
+ const here = dirname(fileURLToPath(import.meta.url));
7
+ const raw = readFileSync(join(here, "..", "package.json"), "utf8");
8
+ const parsed = JSON.parse(raw);
9
+ return typeof parsed.version === "string" ? parsed.version : "0.0.0";
10
+ }
11
+ catch {
12
+ return "0.0.0";
13
+ }
14
+ }
15
+ export const VERSION = readVersion();
16
+ export const USER_AGENT = `cefense-cli/${VERSION} (node/${process.versions.node}; ${process.platform} ${process.arch})`;
17
+ //# sourceMappingURL=version.js.map