refactor(shared): improve handling of out-of-range start and end values in generateCodeFrame (#10883)

related: #10854
This commit is contained in:
Tycho 2024-06-10 15:28:00 +08:00 committed by GitHub
parent bdeac377c7
commit 80e402975b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 38 additions and 0 deletions

View File

@ -1,5 +1,31 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`compiler: codeframe > invalid start and end 1`] = `
"1 | <div>
| ^
2 | <template key="one"></template>
3 | <ul>"
`;
exports[`compiler: codeframe > invalid start and end 2`] = `
"1 | <div>
| ^^^^^
2 | <template key="one"></template>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3 | <ul>
| ^^^^^^
4 | <li v-for="foobar">hi</li>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5 | </ul>
| ^^^^^^^
6 | <template key="two"></template>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
7 | </div>
| ^^^^^^"
`;
exports[`compiler: codeframe > invalid start and end 3`] = `""`;
exports[`compiler: codeframe > line in middle 1`] = `
"2 | <template key="one"></template>
3 | <ul>

View File

@ -44,6 +44,12 @@ attr
expect(generateCodeFrame(source, attrStart, attrEnd)).toMatchSnapshot()
})
test('invalid start and end', () => {
expect(generateCodeFrame(source, -Infinity, 0)).toMatchSnapshot()
expect(generateCodeFrame(source, 0, Infinity)).toMatchSnapshot()
expect(generateCodeFrame(source, Infinity, 0)).toMatchSnapshot()
})
{
const source = `
<template>

View File

@ -5,6 +5,12 @@ export function generateCodeFrame(
start = 0,
end = source.length,
): string {
// Ensure start and end are within the source length
start = Math.max(0, Math.min(start, source.length))
end = Math.max(0, Math.min(end, source.length))
if (start > end) return ''
// Split the content into individual lines but capture the newline sequence
// that separated each line. This is important because the actual sequence is
// needed to properly take into account the full line length for offset