diff --git a/node_modules/@vitest/browser-playwright/dist/index.js b/node_modules/@vitest/browser-playwright/dist/index.js index c01e754..f1bb7be 100644 --- a/node_modules/@vitest/browser-playwright/dist/index.js +++ b/node_modules/@vitest/browser-playwright/dist/index.js @@ -936,7 +936,7 @@ class PlaywrightBrowserProvider { createMocker() { const idPredicates = 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")) { @@ -961,11 +961,7 @@ class PlaywrightBrowserProvider { } return true; }; - const ids = sessionIds.get(sessionId) || []; - ids.push(moduleUrl.href); - sessionIds.set(sessionId, ids); - idPredicates.set(predicateKey(sessionId, moduleUrl.href), predicate); - return predicate; + return { url: moduleUrl.href, predicate }; } function predicateKey(sessionId, url) { return `${sessionId}:${url}`; @@ -973,7 +969,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 = idPredicates.get(key); + if (existingPredicate) { + await page.context().unroute(existingPredicate); + } + const ids = sessionIds.get(sessionId) ?? new Set(); + ids.add(moduleUrl); + sessionIds.set(sessionId, ids); + idPredicates.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); @@ -1034,8 +1046,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 = idPredicates.get(key); if (predicate) {