@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.
- package/LICENSE.md +21 -0
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +190 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/fix.d.ts +3 -0
- package/dist/commands/fix.d.ts.map +1 -0
- package/dist/commands/fix.js +146 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/fixactions.d.ts +12 -0
- package/dist/commands/fixactions.d.ts.map +1 -0
- package/dist/commands/fixactions.js +176 -0
- package/dist/commands/fixactions.js.map +1 -0
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +0 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/observed.d.ts +18 -0
- package/dist/commands/observed.d.ts.map +1 -0
- package/dist/commands/observed.js +254 -0
- package/dist/commands/observed.js.map +1 -0
- package/dist/commands/pick.d.ts +3 -0
- package/dist/commands/pick.d.ts.map +1 -0
- package/dist/commands/pick.js +18 -0
- package/dist/commands/pick.js.map +1 -0
- package/dist/commands/repo.d.ts +12 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +330 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/scan.d.ts +9 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +98 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +250 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/client.d.ts +87 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +235 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +85 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/credentials.d.ts +17 -0
- package/dist/core/credentials.d.ts.map +1 -0
- package/dist/core/credentials.js +139 -0
- package/dist/core/credentials.js.map +1 -0
- package/dist/core/discovery.d.ts +8 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +62 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/errors.d.ts +32 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +56 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/oauth.d.ts +20 -0
- package/dist/core/oauth.d.ts.map +1 -0
- package/dist/core/oauth.js +218 -0
- package/dist/core/oauth.js.map +1 -0
- package/dist/core/repo.d.ts +24 -0
- package/dist/core/repo.d.ts.map +1 -0
- package/dist/core/repo.js +101 -0
- package/dist/core/repo.js.map +1 -0
- package/dist/core/session.d.ts +24 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +32 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/types.d.ts +309 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/browser.d.ts +30 -0
- package/dist/ui/browser.d.ts.map +1 -0
- package/dist/ui/browser.js +350 -0
- package/dist/ui/browser.js.map +1 -0
- package/dist/ui/format.d.ts +15 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +131 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/output.d.ts +16 -0
- package/dist/ui/output.d.ts.map +1 -0
- package/dist/ui/output.js +63 -0
- package/dist/ui/output.js.map +1 -0
- package/dist/ui/prompts.d.ts +39 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +76 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/screen.d.ts +27 -0
- package/dist/ui/screen.d.ts.map +1 -0
- package/dist/ui/screen.js +120 -0
- package/dist/ui/screen.js.map +1 -0
- package/dist/ui/spinner.d.ts +8 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +98 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +14 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +47 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/theme.d.ts +44 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +85 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- 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":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAgB,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IAC/D,IAAI,aAAa,EAAE;QAAE,OAAO;IAC5B,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,iCAAiC,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,MAAM,CAAI,KAAiB;IAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,cAAc,EAAE,CAAC;IACtD,OAAO,KAAU,CAAC;AACpB,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAI5B;IACC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,wCAAwC,CAAC,CAAC;IAC9E,OAAO,MAAM,CACX,MAAM,KAAK,CAAC,MAAM,CAAS;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAKjC;IACC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,uCAAuC,CAAC,CAAC;IAC7E,OAAO,MAAM,CACX,MAAM,KAAK,CAAC,WAAW,CAAS;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;QAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;KACpC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAI7B;IACC,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,0CAA0C,CAAC,CAAC;IAChF,OAAO,MAAM,CACX,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,CAC/F,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAK1B;IACC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,wCAAwC,CAAC,CAAC;IAC9E,OAAO,MAAM,CACX,MAAM,KAAK,CAAC,IAAI,CAAC;QACf,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACxB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,SAAS;KACd,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAIrC;IACC,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,0CAA0C,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,WAAW,EAAE,OAAO,CAAC,QAAQ;KAC9B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE;IACvC,IAAI,aAAa,EAAE;QAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE;IACvC,IAAI,aAAa,EAAE;QAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE;IACnD,IAAI,aAAa,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC"}
|
|
@@ -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"}
|
package/dist/ui/table.js
ADDED
|
@@ -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"}
|
package/dist/ui/theme.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/version.js
ADDED
|
@@ -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
|