Skip to content

Commit 6619de7

Browse files
authoredNov 22, 2023
fix: generateCodeFrame infinite loop (#15093)
1 parent fd31412 commit 6619de7

File tree

3 files changed

+85
-12
lines changed

3 files changed

+85
-12
lines changed
 

‎packages/vite/src/node/__tests__/__snapshots__/utils.spec.ts.snap

+61-6
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,61 @@ exports[`generateCodeFrames > end 3`] = `
2525
"
2626
`;
2727

28+
exports[`generateCodeFrames > end 4`] = `
29+
"
30+
1 | import foo from './foo'
31+
| ^^^^^^^^^^^^^^^^^^^^^^^
32+
2 | foo()
33+
| ^^^^^
34+
"
35+
`;
36+
37+
exports[`generateCodeFrames > end 5`] = `
38+
"
39+
1 | import foo from './foo'
40+
| ^^^^^^^^^^^^^^^^^^^^^^^
41+
2 | foo()
42+
| ^^^^^
43+
"
44+
`;
45+
46+
exports[`generateCodeFrames > end 6`] = `
47+
"
48+
1 | import foo from './foo'
49+
| ^^^^^^^^^^^^^^^^^^^^^^^
50+
2 | foo()
51+
| ^^^^^
52+
"
53+
`;
54+
55+
exports[`generateCodeFrames > invalid start > end 1`] = `
56+
"
57+
1 | import foo from './foo'
58+
| ^
59+
2 | foo()
60+
"
61+
`;
62+
2863
exports[`generateCodeFrames > range 1`] = `
2964
"
30-
1 |
31-
2 | import foo from './foo'
32-
3 |
65+
1 | import foo from './foo'
66+
2 |
67+
3 | foo()
3368
| ^
34-
4 | foo()
35-
5 |
69+
4 | // 1
70+
5 | // 2
71+
"
72+
`;
73+
74+
exports[`generateCodeFrames > range 2`] = `
75+
"
76+
1 | import foo from './foo'
77+
2 |
78+
3 | foo()
79+
| ^^^^^
80+
4 | // 1
81+
| ^
82+
5 | // 2
3683
"
3784
`;
3885

@@ -47,13 +94,21 @@ exports[`generateCodeFrames > start with number 1`] = `
4794
exports[`generateCodeFrames > start with number 2`] = `
4895
"
4996
1 | import foo from './foo'
50-
| ^
97+
| ^
5198
2 | foo()
5299
"
53100
`;
54101

55102
exports[`generateCodeFrames > start with number 3`] = `
56103
"
104+
1 | import foo from './foo'
105+
| ^
106+
2 | foo()
107+
"
108+
`;
109+
110+
exports[`generateCodeFrames > start with number 4`] = `
111+
"
57112
1 | import foo from './foo'
58113
2 | foo()
59114
| ^

‎packages/vite/src/node/__tests__/utils.spec.ts

+19-4
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,10 @@ foo()
187187
import foo from './foo'
188188
189189
foo()
190-
191-
// bar
192-
// baz
193-
`
190+
// 1
191+
// 2
192+
// 3
193+
`.trim()
194194

195195
const expectSnapshot = (value: string) => {
196196
try {
@@ -204,6 +204,7 @@ foo()
204204
}
205205

206206
test('start with number', () => {
207+
expectSnapshot(generateCodeFrame(source, -1))
207208
expectSnapshot(generateCodeFrame(source, 0))
208209
expectSnapshot(generateCodeFrame(source, 1))
209210
expectSnapshot(generateCodeFrame(source, 24))
@@ -223,10 +224,24 @@ foo()
223224
expectSnapshot(generateCodeFrame(source, 0, 0))
224225
expectSnapshot(generateCodeFrame(source, 0, 23))
225226
expectSnapshot(generateCodeFrame(source, 0, 29))
227+
expectSnapshot(generateCodeFrame(source, 0, source.length))
228+
expectSnapshot(generateCodeFrame(source, 0, source.length + 1))
229+
expectSnapshot(generateCodeFrame(source, 0, source.length + 100))
226230
})
227231

228232
test('range', () => {
229233
expectSnapshot(generateCodeFrame(longSource, { line: 3, column: 0 }))
234+
expectSnapshot(
235+
generateCodeFrame(
236+
longSource,
237+
{ line: 3, column: 0 },
238+
{ line: 4, column: 0 },
239+
),
240+
)
241+
})
242+
243+
test('invalid start > end', () => {
244+
expectSnapshot(generateCodeFrame(source, 2, 0))
230245
})
231246
})
232247

‎packages/vite/src/node/utils.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,11 @@ export function generateCodeFrame(
505505
start: number | Pos = 0,
506506
end?: number | Pos,
507507
): string {
508-
start = posToNumber(source, start)
509-
end = end !== undefined ? posToNumber(source, end) : start
508+
start = Math.max(posToNumber(source, start), 0)
509+
end = Math.min(
510+
end !== undefined ? posToNumber(source, end) : start,
511+
source.length,
512+
)
510513
const lines = source.split(splitRE)
511514
let count = 0
512515
const res: string[] = []

0 commit comments

Comments
 (0)
Please sign in to comment.