diff --git a/.changeset/early-moles-drum.md b/.changeset/early-moles-drum.md new file mode 100644 index 0000000000..51b7bb6d7f --- /dev/null +++ b/.changeset/early-moles-drum.md @@ -0,0 +1,5 @@ +--- +"@react-router/dev": patch +--- + +properly handle cyclic imports in `getParentClientNodes` while getting unique nodes diff --git a/contributors.yml b/contributors.yml index 1f78b10b4a..5ddcdd114e 100644 --- a/contributors.yml +++ b/contributors.yml @@ -53,6 +53,7 @@ - bhbs - bilalk711 - bjohn465 +- BlankParticle - bmsuseluda - bobziroll - bravo-kernel diff --git a/packages/react-router-dev/vite/plugin.ts b/packages/react-router-dev/vite/plugin.ts index 81cd7e0bb3..0de3fb3efa 100644 --- a/packages/react-router-dev/vite/plugin.ts +++ b/packages/react-router-dev/vite/plugin.ts @@ -2408,10 +2408,8 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { return; } - let clientModules = uniqueNodes( - modules.flatMap((mod) => - getParentClientNodes(server.environments.client.moduleGraph, mod), - ), + let clientModules = modules.flatMap((mod) => + getParentClientNodes(server.environments.client.moduleGraph, mod), ); for (let clientModule of clientModules) { @@ -2427,10 +2425,15 @@ export const reactRouterVitePlugin: ReactRouterVitePlugin = () => { function getParentClientNodes( clientModuleGraph: Vite.EnvironmentModuleGraph, module: Vite.EnvironmentModuleNode, + seenNodes: Set = new Set(), ): Vite.EnvironmentModuleNode[] { if (!module.id) { return []; } + if (seenNodes.has(module.url)) { + return []; + } + seenNodes.add(module.url); let clientModule = clientModuleGraph.getModuleById(module.id); if (clientModule) { @@ -2438,25 +2441,10 @@ function getParentClientNodes( } return [...module.importers].flatMap((importer) => - getParentClientNodes(clientModuleGraph, importer), + getParentClientNodes(clientModuleGraph, importer, seenNodes), ); } -function uniqueNodes( - nodes: Vite.EnvironmentModuleNode[], -): Vite.EnvironmentModuleNode[] { - let nodeUrls = new Set(); - let unique: Vite.EnvironmentModuleNode[] = []; - for (let node of nodes) { - if (nodeUrls.has(node.url)) { - continue; - } - nodeUrls.add(node.url); - unique.push(node); - } - return unique; -} - function addRefreshWrapper( reactRouterConfig: ResolvedReactRouterConfig, code: string,