From 71ec17c6993b2557845cbb4afb3a372831ef89b4 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Fri, 8 Nov 2024 17:33:04 +0900 Subject: [PATCH 01/10] fix(ssr): format ssrTransform parse error --- packages/vite/src/node/ssr/ssrTransform.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index a93b2c9d8a73ba..b5bcd249b4c972 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -19,7 +19,12 @@ import { walk as eswalk } from 'estree-walker' import type { RawSourceMap } from '@ampproject/remapping' import { parseAstAsync as rollupParseAstAsync } from 'rollup/parseAst' import type { TransformResult } from '../server/transformRequest' -import { combineSourcemaps, isDefined } from '../utils' +import { + combineSourcemaps, + generateCodeFrame, + isDefined, + numberToPos, +} from '../utils' import { isJSONRequest } from '../plugins/json' import type { DefineImportMetadata } from '../../shared/ssrTransform' @@ -81,15 +86,12 @@ async function ssrTransformScript( try { ast = await rollupParseAstAsync(code) } catch (err) { - if (!err.loc || !err.loc.line) throw err - const line = err.loc.line - throw new Error( - `Parse failure: ${ - err.message - }\nAt file: ${url}\nContents of line ${line}: ${ - code.split('\n')[line - 1] - }`, - ) + if (err.code === 'PARSE_ERROR' && typeof err.pos === 'number') { + err.loc = numberToPos(code, err.pos) + err.loc.file = url + err.frame = generateCodeFrame(code, err.pos) + } + throw err } let uid = 0 From a8c7905f0af2de554550aebcd47aad26dfeecdff Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Fri, 8 Nov 2024 17:45:47 +0900 Subject: [PATCH 02/10] test: add test --- .../node/ssr/__tests__/ssrTransform.spec.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index fa8bd6e52a302c..29935b60c79dd1 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -1205,3 +1205,25 @@ console.log(bar) " `) }) + +test('parse error', async () => { + try { + await ssrTransform(`some bad code`, null, '/file.js', '') + expect.unreachable() + } catch (e) { + expect(e).toMatchInlineSnapshot(`[RollupError: Expected ';', '}' or ]`) + expect({ ...e }).toMatchInlineSnapshot(` + { + "code": "PARSE_ERROR", + "frame": "1 | some bad code + | ^", + "loc": { + "column": 6, + "file": "/file.js", + "line": 1, + }, + "pos": 5, + } + `) + } +}) From 5d3009034c9e907463f54fca5e9a0dd546d80b7e Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 9 Nov 2024 12:06:37 +0900 Subject: [PATCH 03/10] chore: replace test --- .../__snapshots__/ssrLoadModule.spec.ts.snap | 20 +++++++++++++---- .../node/ssr/__tests__/ssrTransform.spec.ts | 22 ------------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index 7b9a13e9fb1762..a920a5965c67db 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -21,9 +21,15 @@ Expected ";" but found "code" exports[`parse error 2`] = ` { - "frame": "", + "frame": "1 | invalid code + | ^ +2 | ", "id": "", - "loc": undefined, + "loc": { + "column": 9, + "file": "/fixtures/errors/syntax-error.js", + "line": 1, + }, "message": "Expected ';', '}' or ", } `; @@ -49,9 +55,15 @@ Expected ";" but found "code" exports[`parse error 4`] = ` { - "frame": "", + "frame": "1 | invalid code + | ^ +2 | ", "id": "", - "loc": undefined, + "loc": { + "column": 9, + "file": "/fixtures/errors/syntax-error.js", + "line": 1, + }, "message": "Expected ';', '}' or ", } `; diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index 29935b60c79dd1..fa8bd6e52a302c 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -1205,25 +1205,3 @@ console.log(bar) " `) }) - -test('parse error', async () => { - try { - await ssrTransform(`some bad code`, null, '/file.js', '') - expect.unreachable() - } catch (e) { - expect(e).toMatchInlineSnapshot(`[RollupError: Expected ';', '}' or ]`) - expect({ ...e }).toMatchInlineSnapshot(` - { - "code": "PARSE_ERROR", - "frame": "1 | some bad code - | ^", - "loc": { - "column": 6, - "file": "/file.js", - "line": 1, - }, - "pos": 5, - } - `) - } -}) From fb6ab11f432467643efd4ee1fa8845f38372e20a Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Sat, 9 Nov 2024 12:23:39 +0900 Subject: [PATCH 04/10] fix: err.id too --- .../ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap | 4 ++-- packages/vite/src/node/ssr/ssrTransform.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index a920a5965c67db..bcb392884b3f6c 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -24,7 +24,7 @@ exports[`parse error 2`] = ` "frame": "1 | invalid code | ^ 2 | ", - "id": "", + "id": "/fixtures/errors/syntax-error.js", "loc": { "column": 9, "file": "/fixtures/errors/syntax-error.js", @@ -58,7 +58,7 @@ exports[`parse error 4`] = ` "frame": "1 | invalid code | ^ 2 | ", - "id": "", + "id": "/fixtures/errors/syntax-error.js", "loc": { "column": 9, "file": "/fixtures/errors/syntax-error.js", diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index b5bcd249b4c972..7375a06cdf4a0a 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -87,6 +87,7 @@ async function ssrTransformScript( ast = await rollupParseAstAsync(code) } catch (err) { if (err.code === 'PARSE_ERROR' && typeof err.pos === 'number') { + err.id = url err.loc = numberToPos(code, err.pos) err.loc.file = url err.frame = generateCodeFrame(code, err.pos) From 77ca43223673985f4820d869af4d3f87c051d0f0 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Nov 2024 14:23:15 +0900 Subject: [PATCH 05/10] chore: tweak message --- .../ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap | 4 ++-- packages/vite/src/node/ssr/ssrTransform.ts | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index bcb392884b3f6c..eccfadc9ae8a3a 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -30,7 +30,7 @@ exports[`parse error 2`] = ` "file": "/fixtures/errors/syntax-error.js", "line": 1, }, - "message": "Expected ';', '}' or ", + "message": "Parse Failure: Expected ';', '}' or ", } `; @@ -64,6 +64,6 @@ exports[`parse error 4`] = ` "file": "/fixtures/errors/syntax-error.js", "line": 1, }, - "message": "Expected ';', '}' or ", + "message": "Parse Failure: Expected ';', '}' or ", } `; diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 7375a06cdf4a0a..3f2d41c1fb842a 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -87,6 +87,7 @@ async function ssrTransformScript( ast = await rollupParseAstAsync(code) } catch (err) { if (err.code === 'PARSE_ERROR' && typeof err.pos === 'number') { + err.message = `Parse Failure: ${err.message}` err.id = url err.loc = numberToPos(code, err.pos) err.loc.file = url From fce167f9ea82d0197ba82af4e372590fa44e1cd8 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Nov 2024 14:41:46 +0900 Subject: [PATCH 06/10] fix: err.pos might be missing --- .../__snapshots__/ssrLoadModule.spec.ts.snap | 8 ++++++-- packages/vite/src/node/ssr/ssrTransform.ts | 18 +++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index eccfadc9ae8a3a..aaf244bd93242b 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -30,7 +30,9 @@ exports[`parse error 2`] = ` "file": "/fixtures/errors/syntax-error.js", "line": 1, }, - "message": "Parse Failure: Expected ';', '}' or ", + "message": "Parse Failure: Expected ';', '}' or +At file: /fixtures/errors/syntax-error.js:1:9 +Contents of line: invalid code", } `; @@ -64,6 +66,8 @@ exports[`parse error 4`] = ` "file": "/fixtures/errors/syntax-error.js", "line": 1, }, - "message": "Parse Failure: Expected ';', '}' or ", + "message": "Parse Failure: Expected ';', '}' or +At file: /fixtures/errors/syntax-error.js:1:9 +Contents of line: invalid code", } `; diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 3f2d41c1fb842a..82da7cb93d7619 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -86,12 +86,20 @@ async function ssrTransformScript( try { ast = await rollupParseAstAsync(code) } catch (err) { - if (err.code === 'PARSE_ERROR' && typeof err.pos === 'number') { - err.message = `Parse Failure: ${err.message}` + // enhance known rollup errors + // https://github.com/rollup/rollup/blob/42e587e0e37bc0661aa39fe7ad6f1d7fd33f825c/src/utils/bufferToAst.ts#L17-L22 + if (err.code === 'PARSE_ERROR') { + err.message = `Parse Failure: ${err.message}\n` err.id = url - err.loc = numberToPos(code, err.pos) - err.loc.file = url - err.frame = generateCodeFrame(code, err.pos) + if (typeof err.pos === 'number') { + err.loc = numberToPos(code, err.pos) + err.loc.file = url + err.frame = generateCodeFrame(code, err.pos) + const { line, column } = err.loc + err.message += `At file: ${url}:${line}:${column}\nContents of line: ${code.split('\n')[line - 1]}` + } else { + err.message += `At file: ${url}` + } } throw err } From 514a0de0fa7f2f03a4e7fe0734bf78f33a34969c Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Nov 2024 15:08:47 +0900 Subject: [PATCH 07/10] chore: tweak --- .../ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap | 6 ++---- packages/vite/src/node/ssr/ssrTransform.ts | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index aaf244bd93242b..9d847ab78da7a3 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -31,8 +31,7 @@ exports[`parse error 2`] = ` "line": 1, }, "message": "Parse Failure: Expected ';', '}' or -At file: /fixtures/errors/syntax-error.js:1:9 -Contents of line: invalid code", +At file: /fixtures/errors/syntax-error.js:1:9", } `; @@ -67,7 +66,6 @@ exports[`parse error 4`] = ` "line": 1, }, "message": "Parse Failure: Expected ';', '}' or -At file: /fixtures/errors/syntax-error.js:1:9 -Contents of line: invalid code", +At file: /fixtures/errors/syntax-error.js:1:9", } `; diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 82da7cb93d7619..0ba752c504ba81 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -95,8 +95,7 @@ async function ssrTransformScript( err.loc = numberToPos(code, err.pos) err.loc.file = url err.frame = generateCodeFrame(code, err.pos) - const { line, column } = err.loc - err.message += `At file: ${url}:${line}:${column}\nContents of line: ${code.split('\n')[line - 1]}` + err.message += `At file: ${url}:${err.loc.line}:${err.loc.column}` } else { err.message += `At file: ${url}` } From 2bc211a3141c956dfef0d016ac7ab34a94fc8f61 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Nov 2024 19:15:22 +0900 Subject: [PATCH 08/10] chore: typo --- .../node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index 9d847ab78da7a3..c1b20fc5d4fb8d 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -30,7 +30,7 @@ exports[`parse error 2`] = ` "file": "/fixtures/errors/syntax-error.js", "line": 1, }, - "message": "Parse Failure: Expected ';', '}' or + "message": "Parse failure: Expected ';', '}' or At file: /fixtures/errors/syntax-error.js:1:9", } `; From e33f4737b7bfaecf6d3dbf0c97b44147fd5d1c84 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Nov 2024 19:15:40 +0900 Subject: [PATCH 09/10] chore: f --- .../node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap index c1b20fc5d4fb8d..7624cf62422656 100644 --- a/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap +++ b/packages/vite/src/node/ssr/__tests__/__snapshots__/ssrLoadModule.spec.ts.snap @@ -65,7 +65,7 @@ exports[`parse error 4`] = ` "file": "/fixtures/errors/syntax-error.js", "line": 1, }, - "message": "Parse Failure: Expected ';', '}' or + "message": "Parse failure: Expected ';', '}' or At file: /fixtures/errors/syntax-error.js:1:9", } `; From 42eec0cafbd5f3b67472c513484bdb2f482038a3 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Tue, 12 Nov 2024 19:15:54 +0900 Subject: [PATCH 10/10] chore: f Co-authored-by: Bjorn Lu --- packages/vite/src/node/ssr/ssrTransform.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 0ba752c504ba81..589ba9b5cf7ff2 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -89,7 +89,7 @@ async function ssrTransformScript( // enhance known rollup errors // https://github.com/rollup/rollup/blob/42e587e0e37bc0661aa39fe7ad6f1d7fd33f825c/src/utils/bufferToAst.ts#L17-L22 if (err.code === 'PARSE_ERROR') { - err.message = `Parse Failure: ${err.message}\n` + err.message = `Parse failure: ${err.message}\n` err.id = url if (typeof err.pos === 'number') { err.loc = numberToPos(code, err.pos)