Skip to content

Commit

Permalink
fix(hmr): prevent infinite recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
skovhus committed Nov 19, 2023
1 parent b93dfe3 commit 3cc24a0
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions packages/vite/src/node/server/hmr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -361,11 +361,13 @@ function propagateUpdate(
* @param nodeChain The chain of nodes/imports that lead to the node.
* (The last node in the chain imports the `node` parameter)
* @param currentChain The current chain tracked from the `node` parameter
* @param traversedModules The set of modules that have been traversed
*/
function isNodeWithinCircularImports(
node: ModuleNode,
nodeChain: ModuleNode[],
currentChain: ModuleNode[] = [node],
traversedModules = new Set<ModuleNode>(),
): HasDeadEnd {
// To help visualize how each parameters work, imagine this import graph:
//
Expand All @@ -383,6 +385,12 @@ function isNodeWithinCircularImports(
// It works by checking if any `node` importers are within `nodeChain`, which
// means there's an import loop with a HMR-accepted module in it.

if (traversedModules.has(node)) {
// To avoid infinite recursion, we only check each module once.
return false
}
traversedModules.add(node)

for (const importer of node.importers) {
// Node may import itself which is safe
if (importer === node) continue
Expand Down Expand Up @@ -416,6 +424,7 @@ function isNodeWithinCircularImports(
importer,
nodeChain,
currentChain.concat(importer),
traversedModules,
)
if (result) return result
}
Expand Down

0 comments on commit 3cc24a0

Please sign in to comment.