Browse Source

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

related: #10854
Tycho 1 năm trước cách đây
mục cha
commit
80e402975b

+ 26 - 0
packages/shared/__tests__/__snapshots__/codeframe.spec.ts.snap

@@ -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>

+ 6 - 0
packages/shared/__tests__/codeframe.spec.ts

@@ -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>

+ 6 - 0
packages/shared/src/codeframe.ts

@@ -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