From 733e1e2d21829134e29d72ef38ebe13bd00fd058 Mon Sep 17 00:00:00 2001 From: Isaac Sanchez-Hawkins <266845420+isanchez404@users.noreply.github.com> Date: Tue, 12 May 2026 03:55:31 -0400 Subject: [PATCH] fix(pwa): keep scoped shortcuts isolated (#1205) Co-authored-by: Isaac Sanchez --- .../lib/opencode/pwa-manifest-routes.js | 2 +- .../lib/opencode/pwa-manifest-routes.test.js | 80 +++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 packages/web/server/lib/opencode/pwa-manifest-routes.test.js diff --git a/packages/web/server/lib/opencode/pwa-manifest-routes.js b/packages/web/server/lib/opencode/pwa-manifest-routes.js index 69bc2135..25e47e20 100644 --- a/packages/web/server/lib/opencode/pwa-manifest-routes.js +++ b/packages/web/server/lib/opencode/pwa-manifest-routes.js @@ -130,7 +130,7 @@ export const registerPwaManifestRoute = (app, dependencies) => { } else { const globalPayload = await listSessions(null); const filteredGlobalPayload = filterSessionsByDirectory(globalPayload, preferredDirectory); - payload = filteredGlobalPayload.length > 0 ? filteredGlobalPayload : globalPayload; + payload = filteredGlobalPayload; } } else { payload = await listSessions(null); diff --git a/packages/web/server/lib/opencode/pwa-manifest-routes.test.js b/packages/web/server/lib/opencode/pwa-manifest-routes.test.js new file mode 100644 index 00000000..a64bed7f --- /dev/null +++ b/packages/web/server/lib/opencode/pwa-manifest-routes.test.js @@ -0,0 +1,80 @@ +import { describe, expect, it } from 'vitest'; +import { registerPwaManifestRoute } from './pwa-manifest-routes.js'; + +const createResponse = () => ({ + headers: new Map(), + contentType: '', + body: '', + setHeader(name, value) { + this.headers.set(name, value); + return this; + }, + type(value) { + this.contentType = value; + return this; + }, + send(value) { + this.body = value; + return this; + }, +}); + +describe('PWA manifest route', () => { + it('does not fall back to unrelated global session shortcuts for scoped manifests', async () => { + const routes = new Map(); + const app = { + get(route, handler) { + routes.set(route, handler); + }, + }; + const originalFetch = globalThis.fetch; + const fetchCalls = []; + globalThis.fetch = async (url) => { + fetchCalls.push(String(url)); + const sessions = String(url).includes('?directory=') + ? [] + : [ + { + id: 'other-session', + title: 'Other project', + directory: '/workspace/other', + time: { updated: 2 }, + }, + ]; + return { + ok: true, + json: async () => sessions, + }; + }; + + try { + registerPwaManifestRoute(app, { + process: { platform: 'darwin' }, + resolveProjectDirectory: async () => ({ directory: '/workspace/app' }), + buildOpenCodeUrl: (route) => route, + getOpenCodeAuthHeaders: () => ({}), + readSettingsFromDiskMigrated: async () => ({}), + normalizePwaAppName: (value, fallback) => typeof value === 'string' && value.trim() ? value.trim() : fallback, + normalizePwaOrientation: (value, fallback) => typeof value === 'string' && value.trim() ? value.trim() : fallback, + }); + + const handler = routes.get('/manifest.webmanifest'); + const res = createResponse(); + await handler({ query: {} }, res); + + const manifest = JSON.parse(res.body); + expect(fetchCalls).toHaveLength(2); + expect(manifest.shortcuts).toEqual([ + { + name: 'Appearance Settings', + short_name: 'Settings', + description: 'Open appearance settings', + url: '/?settings=appearance', + icons: [{ src: '/pwa-192.png', sizes: '192x192', type: 'image/png' }], + }, + ]); + } finally { + globalThis.fetch = originalFetch; + } + }); +});