From 08ca58fc738c326f0f4a079982b77e2812f9160f Mon Sep 17 00:00:00 2001 From: bluwy Date: Thu, 27 Apr 2023 13:12:40 +0800 Subject: [PATCH] fix(ssr): track for statements as block scope --- .../node/ssr/__tests__/ssrTransform.spec.ts | 35 +++++++++++++++++++ packages/vite/src/node/ssr/ssrTransform.ts | 10 +++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts index 87764c7d13ba47..2c5201c15736a0 100644 --- a/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts +++ b/packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts @@ -869,3 +869,38 @@ function test() { }" `) }) + +test('track scope in for loops', async () => { + expect( + await ssrTransformSimpleCode(` +import { test } from './test.js' + +for (const test of tests) { + console.log(test) +} + +for (let test = 0; test < 10; test++) { + console.log(test) +} + +for (const test in tests) { + console.log(test) +}`), + ).toMatchInlineSnapshot(` + "const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"./test.js\\"); + + + + for (const test of tests) { + console.log(test) + } + + for (let test = 0; test < 10; test++) { + console.log(test) + } + + for (const test in tests) { + console.log(test) + }" + `) +}) diff --git a/packages/vite/src/node/ssr/ssrTransform.ts b/packages/vite/src/node/ssr/ssrTransform.ts index 3c0992f41a82a1..8a62094dcb0789 100644 --- a/packages/vite/src/node/ssr/ssrTransform.ts +++ b/packages/vite/src/node/ssr/ssrTransform.ts @@ -561,14 +561,16 @@ function isFunction(node: _Node): node is FunctionNode { return functionNodeTypeRE.test(node.type) } +const blockNodeTypeRE = /^BlockStatement$|^For(?:In|Of)?Statement$/ +function isBlock(node: _Node) { + return blockNodeTypeRE.test(node.type) +} + function findParentScope( parentStack: _Node[], isVar = false, ): _Node | undefined { - const predicate = isVar - ? isFunction - : (node: _Node) => node.type === 'BlockStatement' - return parentStack.find(predicate) + return parentStack.find(isVar ? isFunction : isBlock) } function isInDestructuringAssignment(