Skip to content

Commit 23b15ef

Browse files
committed
not overflow when use formatter
1 parent 65fcfce commit 23b15ef

File tree

3 files changed

+109
-19
lines changed

3 files changed

+109
-19
lines changed

packages/prompts/src/note.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,22 @@ export interface NoteOptions extends CommonOptions {
1919

2020
const defaultNoteFormatter = (line: string): string => color.dim(line);
2121

22+
const wrapWithFormat = (message: string, width: number, format: NoteOptions["format"]): string => {
23+
const wrapMsg = wrapAnsi(message, width).split("\n");
24+
const maxWidthNormal = wrapMsg.reduce((sum, ln) => Math.max(strip(ln).length, sum), 0);
25+
const maxWidthFormat = wrapMsg.map(format).reduce((sum, ln) => Math.max(strip(ln).length, sum), 0);
26+
const wrapWidth = maxWidthNormal - (maxWidthFormat - maxWidthNormal);
27+
return wrapAnsi(message, wrapWidth);
28+
}
29+
2230
export const note = (message = '', title = '', opts?: NoteOptions) => {
2331
const output: Writable = opts?.output ?? process.stdout;
2432
const format = opts?.format ?? defaultNoteFormatter;
25-
const wrapMsg = wrapAnsi(message, output.columns - 6);
33+
const wrapMsg = wrapWithFormat(message, output.columns - 6, format);
2634
const lines = ['', ...wrapMsg.split('\n').map(format), ''];
2735
const titleLen = strip(title).length;
2836
const len = Math.max(
29-
lines.reduce((sum, ln) => {
30-
const line = strip(ln);
31-
return line.length > sum ? line.length : sum;
32-
}, 0),
37+
lines.reduce((sum, ln) => Math.max(strip(ln).length, sum), 0),
3338
titleLen
3439
);
3540
const header = `${color.green(S_STEP_SUBMIT)} ${color.reset(title)} ${color.gray(S_BAR_H.repeat(len - titleLen + 1) + S_CORNER_TOP_RIGHT)}`;

packages/prompts/test/__snapshots__/note.test.ts.snap

Lines changed: 84 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,38 @@ exports[`note (isCI = false) > don't overflow 1`] = `
3131
]
3232
`;
3333

34+
exports[`note (isCI = false) > don't overflow with formatter 1`] = `
35+
[
36+
"│
37+
◇ title ─────────────────────────────────────────────────────────────────╮
38+
│ │
39+
│ * Eiusmod sint officia proident qui ex tempor laborum ut. Voluptate * │
40+
│ * dolore excepteur sunt adipisicing laborum non ea elit. * │
41+
│ * Consectetur exercitation ad laboris consectetur nisi minim labore * │
42+
│ * culpa enim. Eiusmod duis minim velit mollit nisi. Laboris magna * │
43+
│ * qui fugiat sit minim. Aliqua id aute sunt proident do tempor * │
44+
│ * mollit nulla veniam exercitation est ipsum occaecat nostrud. * │
45+
│ * Exercitation ullamco proident ex ut et in ut. * │
46+
│ * Dolore magna proident id in magna quis. Sunt et laboris Lorem * │
47+
│ * adipisicing nisi id proident qui enim laboris proident do. Fugiat * │
48+
│ * eu commodo exercitation ipsum in aliquip ipsum magna consequat * │
49+
│ * laborum. Id aute enim enim officia in do aliqua voluptate aute * │
50+
│ * nulla proident. Mollit pariatur exercitation sit mollit in * │
51+
│ * exercitation culpa deserunt sunt laboris aliquip cillum mollit * │
52+
│ * ad. Aliquip exercitation adipisicing qui laboris ea do occaecat * │
53+
│ * elit magna commodo sint adipisicing. * │
54+
│ * Fugiat veniam non nostrud reprehenderit tempor quis officia ad * │
55+
│ * reprehenderit. Veniam ut est irure est. Laboris reprehenderit * │
56+
│ * dolor dolor id laborum nulla velit et in sunt aliquip. Culpa * │
57+
│ * voluptate dolore enim ut incididunt dolor sint cupidatat enim. * │
58+
│ * Irure sint consectetur minim velit aliquip consequat enim ex in * │
59+
│ * sunt. * │
60+
│ │
61+
├─────────────────────────────────────────────────────────────────────────╯
62+
",
63+
]
64+
`;
65+
3466
exports[`note (isCI = false) > formatter which adds colors works 1`] = `
3567
[
3668
"│
@@ -48,13 +80,16 @@ exports[`note (isCI = false) > formatter which adds colors works 1`] = `
4880
exports[`note (isCI = false) > formatter which adds length works 1`] = `
4981
[
5082
"│
51-
◇ title ──────╮
52-
│ │
53-
│ * line 0 * │
54-
│ * line 1 * │
55-
│ * line 2 * │
56-
│ │
57-
├──────────────╯
83+
◇ title ────╮
84+
│ │
85+
│ * line * │
86+
│ * 0 * │
87+
│ * line * │
88+
│ * 1 * │
89+
│ * line * │
90+
│ * 2 * │
91+
│ │
92+
├────────────╯
5893
",
5994
]
6095
`;
@@ -115,6 +150,38 @@ exports[`note (isCI = true) > don't overflow 1`] = `
115150
]
116151
`;
117152

153+
exports[`note (isCI = true) > don't overflow with formatter 1`] = `
154+
[
155+
"│
156+
◇ title ─────────────────────────────────────────────────────────────────╮
157+
│ │
158+
│ * Eiusmod sint officia proident qui ex tempor laborum ut. Voluptate * │
159+
│ * dolore excepteur sunt adipisicing laborum non ea elit. * │
160+
│ * Consectetur exercitation ad laboris consectetur nisi minim labore * │
161+
│ * culpa enim. Eiusmod duis minim velit mollit nisi. Laboris magna * │
162+
│ * qui fugiat sit minim. Aliqua id aute sunt proident do tempor * │
163+
│ * mollit nulla veniam exercitation est ipsum occaecat nostrud. * │
164+
│ * Exercitation ullamco proident ex ut et in ut. * │
165+
│ * Dolore magna proident id in magna quis. Sunt et laboris Lorem * │
166+
│ * adipisicing nisi id proident qui enim laboris proident do. Fugiat * │
167+
│ * eu commodo exercitation ipsum in aliquip ipsum magna consequat * │
168+
│ * laborum. Id aute enim enim officia in do aliqua voluptate aute * │
169+
│ * nulla proident. Mollit pariatur exercitation sit mollit in * │
170+
│ * exercitation culpa deserunt sunt laboris aliquip cillum mollit * │
171+
│ * ad. Aliquip exercitation adipisicing qui laboris ea do occaecat * │
172+
│ * elit magna commodo sint adipisicing. * │
173+
│ * Fugiat veniam non nostrud reprehenderit tempor quis officia ad * │
174+
│ * reprehenderit. Veniam ut est irure est. Laboris reprehenderit * │
175+
│ * dolor dolor id laborum nulla velit et in sunt aliquip. Culpa * │
176+
│ * voluptate dolore enim ut incididunt dolor sint cupidatat enim. * │
177+
│ * Irure sint consectetur minim velit aliquip consequat enim ex in * │
178+
│ * sunt. * │
179+
│ │
180+
├─────────────────────────────────────────────────────────────────────────╯
181+
",
182+
]
183+
`;
184+
118185
exports[`note (isCI = true) > formatter which adds colors works 1`] = `
119186
[
120187
"│
@@ -132,13 +199,16 @@ exports[`note (isCI = true) > formatter which adds colors works 1`] = `
132199
exports[`note (isCI = true) > formatter which adds length works 1`] = `
133200
[
134201
"│
135-
◇ title ──────╮
136-
│ │
137-
│ * line 0 * │
138-
│ * line 1 * │
139-
│ * line 2 * │
140-
│ │
141-
├──────────────╯
202+
◇ title ────╮
203+
│ │
204+
│ * line * │
205+
│ * 0 * │
206+
│ * line * │
207+
│ * 1 * │
208+
│ * line * │
209+
│ * 2 * │
210+
│ │
211+
├────────────╯
142212
",
143213
]
144214
`;

packages/prompts/test/note.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,19 @@ describe.each(['true', 'false'])('note (isCI = %s)', (isCI) => {
7777

7878
expect(output.buffer).toMatchSnapshot();
7979
});
80+
81+
test('don\'t overflow with formatter', () => {
82+
const lorem = [
83+
"Eiusmod sint officia proident qui ex tempor laborum ut. Voluptate dolore excepteur sunt adipisicing laborum non ea elit. Consectetur exercitation ad laboris consectetur nisi minim labore culpa enim. Eiusmod duis minim velit mollit nisi. Laboris magna qui fugiat sit minim. Aliqua id aute sunt proident do tempor mollit nulla veniam exercitation est ipsum occaecat nostrud. Exercitation ullamco proident ex ut et in ut.",
84+
"Dolore magna proident id in magna quis. Sunt et laboris Lorem adipisicing nisi id proident qui enim laboris proident do. Fugiat eu commodo exercitation ipsum in aliquip ipsum magna consequat laborum. Id aute enim enim officia in do aliqua voluptate aute nulla proident. Mollit pariatur exercitation sit mollit in exercitation culpa deserunt sunt laboris aliquip cillum mollit ad. Aliquip exercitation adipisicing qui laboris ea do occaecat elit magna commodo sint adipisicing.",
85+
"Fugiat veniam non nostrud reprehenderit tempor quis officia ad reprehenderit. Veniam ut est irure est. Laboris reprehenderit dolor dolor id laborum nulla velit et in sunt aliquip. Culpa voluptate dolore enim ut incididunt dolor sint cupidatat enim. Irure sint consectetur minim velit aliquip consequat enim ex in sunt.",
86+
];
87+
prompts.note(lorem.join("\n"), 'title', {
88+
format: (line) => colors.red(`* ${colors.cyan(line)} *`),
89+
input,
90+
output: Object.assign(output, { columns: 75 }),
91+
});
92+
93+
expect(output.buffer).toMatchSnapshot();
94+
});
8095
});

0 commit comments

Comments
 (0)