diff --git a/packages/vite/src/node/__tests__/__snapshots__/utils.spec.ts.snap b/packages/vite/src/node/__tests__/__snapshots__/utils.spec.ts.snap index 69d8fe2143be4c..1dee3c6a1228c0 100644 --- a/packages/vite/src/node/__tests__/__snapshots__/utils.spec.ts.snap +++ b/packages/vite/src/node/__tests__/__snapshots__/utils.spec.ts.snap @@ -25,14 +25,61 @@ exports[`generateCodeFrames > end 3`] = ` " `; +exports[`generateCodeFrames > end 4`] = ` +" +1 | import foo from './foo' + | ^^^^^^^^^^^^^^^^^^^^^^^ +2 | foo() + | ^^^^^ +" +`; + +exports[`generateCodeFrames > end 5`] = ` +" +1 | import foo from './foo' + | ^^^^^^^^^^^^^^^^^^^^^^^ +2 | foo() + | ^^^^^ +" +`; + +exports[`generateCodeFrames > end 6`] = ` +" +1 | import foo from './foo' + | ^^^^^^^^^^^^^^^^^^^^^^^ +2 | foo() + | ^^^^^ +" +`; + +exports[`generateCodeFrames > invalid start > end 1`] = ` +" +1 | import foo from './foo' + | ^ +2 | foo() +" +`; + exports[`generateCodeFrames > range 1`] = ` " -1 | -2 | import foo from './foo' -3 | +1 | import foo from './foo' +2 | +3 | foo() | ^ -4 | foo() -5 | +4 | // 1 +5 | // 2 +" +`; + +exports[`generateCodeFrames > range 2`] = ` +" +1 | import foo from './foo' +2 | +3 | foo() + | ^^^^^ +4 | // 1 + | ^ +5 | // 2 " `; @@ -47,13 +94,21 @@ exports[`generateCodeFrames > start with number 1`] = ` exports[`generateCodeFrames > start with number 2`] = ` " 1 | import foo from './foo' - | ^ + | ^ 2 | foo() " `; exports[`generateCodeFrames > start with number 3`] = ` " +1 | import foo from './foo' + | ^ +2 | foo() +" +`; + +exports[`generateCodeFrames > start with number 4`] = ` +" 1 | import foo from './foo' 2 | foo() | ^ diff --git a/packages/vite/src/node/__tests__/utils.spec.ts b/packages/vite/src/node/__tests__/utils.spec.ts index 78238e1db68bf7..5b3794a6f9cee4 100644 --- a/packages/vite/src/node/__tests__/utils.spec.ts +++ b/packages/vite/src/node/__tests__/utils.spec.ts @@ -187,10 +187,10 @@ foo() import foo from './foo' foo() - -// bar -// baz - ` +// 1 +// 2 +// 3 +`.trim() const expectSnapshot = (value: string) => { try { @@ -204,6 +204,7 @@ foo() } test('start with number', () => { + expectSnapshot(generateCodeFrame(source, -1)) expectSnapshot(generateCodeFrame(source, 0)) expectSnapshot(generateCodeFrame(source, 1)) expectSnapshot(generateCodeFrame(source, 24)) @@ -223,10 +224,24 @@ foo() expectSnapshot(generateCodeFrame(source, 0, 0)) expectSnapshot(generateCodeFrame(source, 0, 23)) expectSnapshot(generateCodeFrame(source, 0, 29)) + expectSnapshot(generateCodeFrame(source, 0, source.length)) + expectSnapshot(generateCodeFrame(source, 0, source.length + 1)) + expectSnapshot(generateCodeFrame(source, 0, source.length + 100)) }) test('range', () => { expectSnapshot(generateCodeFrame(longSource, { line: 3, column: 0 })) + expectSnapshot( + generateCodeFrame( + longSource, + { line: 3, column: 0 }, + { line: 4, column: 0 }, + ), + ) + }) + + test('invalid start > end', () => { + expectSnapshot(generateCodeFrame(source, 2, 0)) }) }) diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 64526eb3ebd3ea..ca3e47a492623c 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -505,8 +505,11 @@ export function generateCodeFrame( start: number | Pos = 0, end?: number | Pos, ): string { - start = posToNumber(source, start) - end = end !== undefined ? posToNumber(source, end) : start + start = Math.max(posToNumber(source, start), 0) + end = Math.min( + end !== undefined ? posToNumber(source, end) : start, + source.length, + ) const lines = source.split(splitRE) let count = 0 const res: string[] = []