litmus-cli 1.4.26 → 1.4.27
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/dist/commands/setup-check.d.ts +4 -0
- package/dist/commands/setup-check.d.ts.map +1 -1
- package/dist/commands/setup-check.js +16 -6
- package/dist/commands/setup-check.js.map +1 -1
- package/dist/lib/wrap.d.ts +48 -0
- package/dist/lib/wrap.d.ts.map +1 -0
- package/dist/lib/wrap.js +111 -0
- package/dist/lib/wrap.js.map +1 -0
- package/package.json +1 -1
|
@@ -12,6 +12,10 @@
|
|
|
12
12
|
* removes, and phones home nothing. Output is doctor's "Key: value" grammar
|
|
13
13
|
* and ends with either "Ready" or one sentence naming the fix. Exit 0 when
|
|
14
14
|
* ready, 1 when something needs the candidate.
|
|
15
|
+
*
|
|
16
|
+
* Long lines wrap under their own indent (ENG-2305): the plain text is
|
|
17
|
+
* wrapped to the terminal width first and painted after, so a red fix line
|
|
18
|
+
* reads as one block instead of spilling to column 0.
|
|
15
19
|
*/
|
|
16
20
|
export declare function runSetupCheck(opts?: {
|
|
17
21
|
verbose?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-check.d.ts","sourceRoot":"","sources":["../../src/commands/setup-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup-check.d.ts","sourceRoot":"","sources":["../../src/commands/setup-check.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCnF"}
|
|
@@ -2,6 +2,7 @@ import chalk from "chalk";
|
|
|
2
2
|
import { resolveApiBase } from "../lib/api-base.js";
|
|
3
3
|
import { CLI_VERSION } from "../lib/version.js";
|
|
4
4
|
import { runEnvironmentChecks } from "../lib/environment-checks.js";
|
|
5
|
+
import { terminalWidth, wrapIndented } from "../lib/wrap.js";
|
|
5
6
|
/**
|
|
6
7
|
* `litmus setup-check` — the command a candidate runs BEFORE they have an
|
|
7
8
|
* assessment: from the reminder email before a live interview, or from the
|
|
@@ -16,10 +17,19 @@ import { runEnvironmentChecks } from "../lib/environment-checks.js";
|
|
|
16
17
|
* removes, and phones home nothing. Output is doctor's "Key: value" grammar
|
|
17
18
|
* and ends with either "Ready" or one sentence naming the fix. Exit 0 when
|
|
18
19
|
* ready, 1 when something needs the candidate.
|
|
20
|
+
*
|
|
21
|
+
* Long lines wrap under their own indent (ENG-2305): the plain text is
|
|
22
|
+
* wrapped to the terminal width first and painted after, so a red fix line
|
|
23
|
+
* reads as one block instead of spilling to column 0.
|
|
19
24
|
*/
|
|
20
25
|
export async function runSetupCheck(opts = {}) {
|
|
21
26
|
const verbose = opts.verbose === true;
|
|
22
27
|
const apiBase = resolveApiBase(process.env.LITMUS_API_URL);
|
|
28
|
+
const width = terminalWidth();
|
|
29
|
+
const line = (indent, text, paint = (s) => s) => {
|
|
30
|
+
// paint is called per line with ONE argument: chalk accepts variadic args and would join map's index and array in.
|
|
31
|
+
console.log(wrapIndented(text, { indent, width }).split("\n").map((l) => paint(l)).join("\n"));
|
|
32
|
+
};
|
|
23
33
|
console.log();
|
|
24
34
|
console.log(chalk.bold(" Litmus setup check"));
|
|
25
35
|
console.log();
|
|
@@ -27,21 +37,21 @@ export async function runSetupCheck(opts = {}) {
|
|
|
27
37
|
apiBase,
|
|
28
38
|
record: (r) => {
|
|
29
39
|
const paint = r.status === "fail" ? chalk.red : r.status === "warn" ? chalk.yellow : (s) => s;
|
|
30
|
-
|
|
40
|
+
line(" ", r.detail, paint);
|
|
31
41
|
if (verbose && r.verbose)
|
|
32
|
-
|
|
42
|
+
line(" ", r.verbose, chalk.dim);
|
|
33
43
|
},
|
|
34
44
|
});
|
|
35
45
|
const problems = results.filter((r) => r.status === "fail");
|
|
36
46
|
console.log();
|
|
37
47
|
if (problems.length === 0) {
|
|
38
|
-
|
|
48
|
+
line(" ", "Ready. Your machine can run the Litmus CLI.", chalk.green);
|
|
39
49
|
}
|
|
40
50
|
else {
|
|
41
|
-
|
|
42
|
-
|
|
51
|
+
line(" ", `${problems.length} thing${problems.length === 1 ? "" : "s"} to fix before you start.`, chalk.red);
|
|
52
|
+
line(" ", "Copy this whole output into an email to support@litmushiring.com if you need help.", chalk.dim);
|
|
43
53
|
}
|
|
44
|
-
|
|
54
|
+
line(" ", `setup-check v${CLI_VERSION}: ${results.map((r) => `${r.name}=${r.status}`).join(" ")}`, chalk.dim);
|
|
45
55
|
console.log();
|
|
46
56
|
process.exitCode = problems.length > 0 ? 1 : 0;
|
|
47
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-check.js","sourceRoot":"","sources":["../../src/commands/setup-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAyB,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"setup-check.js","sourceRoot":"","sources":["../../src/commands/setup-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal word-wrap with a hanging indent (ENG-2305).
|
|
3
|
+
*
|
|
4
|
+
* The CLI prints "Key: value" lines four spaces in. Left to the terminal, a
|
|
5
|
+
* line longer than the window wraps to column 0, so the continuation sits to
|
|
6
|
+
* the LEFT of where the line began and the block reads as two things. This
|
|
7
|
+
* wraps at word boundaries to the terminal width and starts every
|
|
8
|
+
* continuation line under the first character of the text.
|
|
9
|
+
*
|
|
10
|
+
* Two rules from review (Greptile on #2416). **Text that fits is emitted
|
|
11
|
+
* verbatim**, whitespace included: the verbose blocks are raw watcher log
|
|
12
|
+
* lines and exception messages, and collapsing their spacing would make a
|
|
13
|
+
* pasted diagnostic differ from the file it came from. A line that must wrap
|
|
14
|
+
* is SLICED at a space, never split and rejoined, so the spacing inside each
|
|
15
|
+
* piece is untouched too. And **width is measured in terminal columns, not
|
|
16
|
+
* characters**: a CJK glyph or an emoji occupies two cells and a combining
|
|
17
|
+
* mark none, so `String.length` would let a line through that the terminal
|
|
18
|
+
* then wraps to column 0, which is the exact bug this exists to remove.
|
|
19
|
+
*
|
|
20
|
+
* Callers wrap the PLAIN string and paint the colour afterwards: ANSI escape
|
|
21
|
+
* codes have no width on screen but would be measured here.
|
|
22
|
+
*/
|
|
23
|
+
/** Width to wrap to, or null when stdout is not a terminal (piped output stays one line per record). */
|
|
24
|
+
export declare function terminalWidth(stream?: {
|
|
25
|
+
isTTY?: boolean;
|
|
26
|
+
columns?: number;
|
|
27
|
+
}): number | null;
|
|
28
|
+
/**
|
|
29
|
+
* Terminal cells a plain string occupies: 0 for combining and zero-width
|
|
30
|
+
* marks, 2 for East Asian wide/fullwidth glyphs and the common emoji blocks,
|
|
31
|
+
* 1 otherwise. Tabs count as 1 (the terminal decides; we cannot know the
|
|
32
|
+
* column). Deliberately dependency-free and approximate at the edges.
|
|
33
|
+
*/
|
|
34
|
+
export declare function displayWidth(text: string): number;
|
|
35
|
+
/**
|
|
36
|
+
* Wrap `text` so that every output line, indent included, fits in `width`
|
|
37
|
+
* columns. The first line is prefixed with `indent`; continuation lines with
|
|
38
|
+
* `indent` plus `hang` extra spaces (default 0, i.e. flush with the first
|
|
39
|
+
* line's text). A single word wider than the available room is left whole
|
|
40
|
+
* on its own line rather than broken mid-word, so a URL stays pasteable.
|
|
41
|
+
* `width` null means no wrapping.
|
|
42
|
+
*/
|
|
43
|
+
export declare function wrapIndented(text: string, opts: {
|
|
44
|
+
indent: string;
|
|
45
|
+
width: number | null;
|
|
46
|
+
hang?: number;
|
|
47
|
+
}): string;
|
|
48
|
+
//# sourceMappingURL=wrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/lib/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,wGAAwG;AACxG,wBAAgB,aAAa,CAAC,MAAM,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAmB,GAAG,MAAM,GAAG,IAAI,CAI3G;AAmBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAwChH"}
|
package/dist/lib/wrap.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal word-wrap with a hanging indent (ENG-2305).
|
|
3
|
+
*
|
|
4
|
+
* The CLI prints "Key: value" lines four spaces in. Left to the terminal, a
|
|
5
|
+
* line longer than the window wraps to column 0, so the continuation sits to
|
|
6
|
+
* the LEFT of where the line began and the block reads as two things. This
|
|
7
|
+
* wraps at word boundaries to the terminal width and starts every
|
|
8
|
+
* continuation line under the first character of the text.
|
|
9
|
+
*
|
|
10
|
+
* Two rules from review (Greptile on #2416). **Text that fits is emitted
|
|
11
|
+
* verbatim**, whitespace included: the verbose blocks are raw watcher log
|
|
12
|
+
* lines and exception messages, and collapsing their spacing would make a
|
|
13
|
+
* pasted diagnostic differ from the file it came from. A line that must wrap
|
|
14
|
+
* is SLICED at a space, never split and rejoined, so the spacing inside each
|
|
15
|
+
* piece is untouched too. And **width is measured in terminal columns, not
|
|
16
|
+
* characters**: a CJK glyph or an emoji occupies two cells and a combining
|
|
17
|
+
* mark none, so `String.length` would let a line through that the terminal
|
|
18
|
+
* then wraps to column 0, which is the exact bug this exists to remove.
|
|
19
|
+
*
|
|
20
|
+
* Callers wrap the PLAIN string and paint the colour afterwards: ANSI escape
|
|
21
|
+
* codes have no width on screen but would be measured here.
|
|
22
|
+
*/
|
|
23
|
+
/** Width to wrap to, or null when stdout is not a terminal (piped output stays one line per record). */
|
|
24
|
+
export function terminalWidth(stream = process.stdout) {
|
|
25
|
+
if (!stream.isTTY)
|
|
26
|
+
return null;
|
|
27
|
+
const cols = stream.columns;
|
|
28
|
+
return typeof cols === "number" && cols > 0 ? cols : null;
|
|
29
|
+
}
|
|
30
|
+
const ZERO_WIDTH = /[\u200B-\u200D\uFEFF]|\p{M}/u;
|
|
31
|
+
function isWide(cp) {
|
|
32
|
+
return ((cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo
|
|
33
|
+
(cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) || // CJK radicals .. Yi
|
|
34
|
+
(cp >= 0xac00 && cp <= 0xd7a3) || // Hangul syllables
|
|
35
|
+
(cp >= 0xf900 && cp <= 0xfaff) || // CJK compatibility ideographs
|
|
36
|
+
(cp >= 0xfe30 && cp <= 0xfe4f) || // CJK compatibility forms
|
|
37
|
+
(cp >= 0xff00 && cp <= 0xff60) || // fullwidth forms
|
|
38
|
+
(cp >= 0xffe0 && cp <= 0xffe6) ||
|
|
39
|
+
(cp >= 0x1f300 && cp <= 0x1f64f) || // emoji blocks
|
|
40
|
+
(cp >= 0x1f900 && cp <= 0x1f9ff) ||
|
|
41
|
+
(cp >= 0x20000 && cp <= 0x3fffd) // CJK extension B..
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Terminal cells a plain string occupies: 0 for combining and zero-width
|
|
46
|
+
* marks, 2 for East Asian wide/fullwidth glyphs and the common emoji blocks,
|
|
47
|
+
* 1 otherwise. Tabs count as 1 (the terminal decides; we cannot know the
|
|
48
|
+
* column). Deliberately dependency-free and approximate at the edges.
|
|
49
|
+
*/
|
|
50
|
+
export function displayWidth(text) {
|
|
51
|
+
let w = 0;
|
|
52
|
+
for (const ch of text) {
|
|
53
|
+
if (ZERO_WIDTH.test(ch))
|
|
54
|
+
continue;
|
|
55
|
+
w += isWide(ch.codePointAt(0)) ? 2 : 1;
|
|
56
|
+
}
|
|
57
|
+
return w;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Wrap `text` so that every output line, indent included, fits in `width`
|
|
61
|
+
* columns. The first line is prefixed with `indent`; continuation lines with
|
|
62
|
+
* `indent` plus `hang` extra spaces (default 0, i.e. flush with the first
|
|
63
|
+
* line's text). A single word wider than the available room is left whole
|
|
64
|
+
* on its own line rather than broken mid-word, so a URL stays pasteable.
|
|
65
|
+
* `width` null means no wrapping.
|
|
66
|
+
*/
|
|
67
|
+
export function wrapIndented(text, opts) {
|
|
68
|
+
const { indent, width } = opts;
|
|
69
|
+
const contIndent = indent + " ".repeat(opts.hang ?? 0);
|
|
70
|
+
if (width === null)
|
|
71
|
+
return indent + text;
|
|
72
|
+
if (width - displayWidth(indent) < 8)
|
|
73
|
+
return indent + text; // absurdly narrow; wrapping would be worse than overflow
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const paragraph of text.split("\n")) {
|
|
76
|
+
let rest = paragraph;
|
|
77
|
+
let first = true;
|
|
78
|
+
for (;;) {
|
|
79
|
+
const prefix = first ? indent : contIndent;
|
|
80
|
+
const room = width - displayWidth(prefix);
|
|
81
|
+
if (displayWidth(rest) <= room) {
|
|
82
|
+
out.push(prefix + rest); // fits: verbatim, whitespace and all
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
// Longest prefix of `rest` that fits, cut back to the last space in it.
|
|
86
|
+
let cells = 0;
|
|
87
|
+
let fitEnd = 0;
|
|
88
|
+
for (const ch of rest) {
|
|
89
|
+
const w = displayWidth(ch);
|
|
90
|
+
if (cells + w > room)
|
|
91
|
+
break;
|
|
92
|
+
cells += w;
|
|
93
|
+
fitEnd += ch.length;
|
|
94
|
+
}
|
|
95
|
+
let cut = rest.lastIndexOf(" ", fitEnd);
|
|
96
|
+
if (cut <= 0) {
|
|
97
|
+
// No space inside the room: take the whole first word rather than
|
|
98
|
+
// breaking it, so a long URL or path stays intact.
|
|
99
|
+
const nextSpace = rest.indexOf(" ", fitEnd);
|
|
100
|
+
cut = nextSpace === -1 ? rest.length : nextSpace;
|
|
101
|
+
}
|
|
102
|
+
out.push(prefix + rest.slice(0, cut).replace(/ +$/, ""));
|
|
103
|
+
rest = rest.slice(cut).replace(/^ +/, "");
|
|
104
|
+
first = false;
|
|
105
|
+
if (rest.length === 0)
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return out.join("\n");
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../src/lib/wrap.ts"],"names":[],"mappings":"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"}
|