diff --git a/node_modules/@vitest/browser-playwright/dist/index.js b/node_modules/@vitest/browser-playwright/dist/index.js index 5d0d37b..821d7b4 100644 --- a/node_modules/@vitest/browser-playwright/dist/index.js +++ b/node_modules/@vitest/browser-playwright/dist/index.js @@ -935,7 +935,7 @@ class PlaywrightBrowserProvider { createMocker() { const idPreficates = new Map(); const sessionIds = new Map(); - function createPredicate(sessionId, url) { + function createPredicate(url) { const moduleUrl = new URL(url, "http://localhost"); const predicate = (url) => { if (url.searchParams.has("_vitest_original")) { @@ -960,11 +960,7 @@ class PlaywrightBrowserProvider { } return true; }; - const ids = sessionIds.get(sessionId) || []; - ids.push(moduleUrl.href); - sessionIds.set(sessionId, ids); - idPreficates.set(predicateKey(sessionId, moduleUrl.href), predicate); - return predicate; + return { url: moduleUrl.href, predicate }; } function predicateKey(sessionId, url) { return `${sessionId}:${url}`; @@ -972,7 +968,23 @@ class PlaywrightBrowserProvider { return { register: async (sessionId, module) => { const page = this.getPage(sessionId); - await page.context().route(createPredicate(sessionId, module.url), async (route) => { + const { url: moduleUrl, predicate } = createPredicate(module.url); + const key = predicateKey(sessionId, moduleUrl); + // Backport of vitest PR #10267: if a route handler is already + // registered for this resolved module URL in this session, + // unroute it before installing the new one. Without this guard, + // duplicate-id mocks (e.g. '$lib/foo.svelte' + '$lib/foo.svelte.js') + // leak an orphan route whose handler crashes after the next + // session's birpc channel closes. + const existingPredicate = idPreficates.get(key); + if (existingPredicate) { + await page.context().unroute(existingPredicate); + } + const ids = sessionIds.get(sessionId) ?? new Set(); + ids.add(moduleUrl); + sessionIds.set(sessionId, ids); + idPreficates.set(key, predicate); + await page.context().route(predicate, async (route) => { if (module.type === "manual") { const exports$1 = Object.keys(await module.resolve()); const body = createManualModuleSource(module.url, exports$1); @@ -1033,8 +1045,8 @@ class PlaywrightBrowserProvider { }, clear: async (sessionId) => { const page = this.getPage(sessionId); - const ids = sessionIds.get(sessionId) || []; - const promises = ids.map((id) => { + const ids = sessionIds.get(sessionId) ?? new Set(); + const promises = [...ids].map((id) => { const key = predicateKey(sessionId, id); const predicate = idPreficates.get(key); if (predicate) {