Skip to content

Commit a5143e9

Browse files
authored
fix(ssr): track var as function scope (#10397)
backport: fix(ssr): track var as function scope (#10388)
1 parent d2af6d9 commit a5143e9

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

packages/vite/src/node/ssr/__tests__/ssrTransform.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,3 +787,27 @@ export class Test {
787787
Object.defineProperty(__vite_ssr_exports__, \\"Test\\", { enumerable: true, configurable: true, get(){ return Test }});;"
788788
`)
789789
})
790+
791+
// #10386
792+
test('track var scope by function', async () => {
793+
expect(
794+
await ssrTransformSimpleCode(`
795+
import { foo, bar } from 'foobar'
796+
function test() {
797+
if (true) {
798+
var foo = () => { var why = 'would' }, bar = 'someone'
799+
}
800+
return [foo, bar]
801+
}`)
802+
).toMatchInlineSnapshot(`
803+
"
804+
const __vite_ssr_import_0__ = await __vite_ssr_import__(\\"foobar\\");
805+
806+
function test() {
807+
if (true) {
808+
var foo = () => { var why = 'would' }, bar = 'someone'
809+
}
810+
return [foo, bar]
811+
}"
812+
`)
813+
})

packages/vite/src/node/ssr/ssrTransform.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
Identifier,
66
Pattern,
77
Property,
8+
VariableDeclaration,
89
Node as _Node
910
} from 'estree'
1011
import { extract_names as extractNames } from 'periscopic'
@@ -319,6 +320,7 @@ function walk(
319320
{ onIdentifier, onImportMeta, onDynamicImport }: Visitors
320321
) {
321322
const parentStack: Node[] = []
323+
const varKindStack: VariableDeclaration['kind'][] = []
322324
const scopeMap = new WeakMap<_Node, Set<string>>()
323325
const identifiers: [id: any, stack: Node[]][] = []
324326

@@ -378,6 +380,11 @@ function walk(
378380
parentStack.unshift(parent)
379381
}
380382

383+
// track variable declaration kind stack used by VariableDeclarator
384+
if (node.type === 'VariableDeclaration') {
385+
varKindStack.unshift(node.kind)
386+
}
387+
381388
if (node.type === 'MetaProperty' && node.meta.name === 'import') {
382389
onImportMeta(node)
383390
} else if (node.type === 'ImportExpression') {
@@ -437,7 +444,10 @@ function walk(
437444
// mark property in destructuring pattern
438445
setIsNodeInPattern(node)
439446
} else if (node.type === 'VariableDeclarator') {
440-
const parentFunction = findParentScope(parentStack)
447+
const parentFunction = findParentScope(
448+
parentStack,
449+
varKindStack[0] === 'var'
450+
)
441451
if (parentFunction) {
442452
handlePattern(node.id, parentFunction)
443453
}
@@ -452,6 +462,10 @@ function walk(
452462
) {
453463
parentStack.shift()
454464
}
465+
466+
if (node.type === 'VariableDeclaration') {
467+
varKindStack.shift()
468+
}
455469
}
456470
})
457471

@@ -541,8 +555,12 @@ function isFunction(node: _Node): node is FunctionNode {
541555

542556
const scopeNodeTypeRE =
543557
/(?:Function|Class)(?:Expression|Declaration)$|Method$|^IfStatement$/
544-
function findParentScope(parentStack: _Node[]): _Node | undefined {
545-
return parentStack.find((i) => scopeNodeTypeRE.test(i.type))
558+
function findParentScope(
559+
parentStack: _Node[],
560+
isVar = false
561+
): _Node | undefined {
562+
const regex = isVar ? functionNodeTypeRE : scopeNodeTypeRE
563+
return parentStack.find((i) => regex.test(i.type))
546564
}
547565

548566
function isInDestructuringAssignment(

0 commit comments

Comments
 (0)