} as const;
// SvelteKit PWA plugin options
-export const PWA_KIT_OPTIONS = {
- NAVIGATE_FALLBACK: './'
-} as const;
+export const PWA_KIT_OPTIONS = {} as const;
export const APPLE_META_TAGS = {
MOBILE_WEB_APP_CAPABLE: { name: 'apple-mobile-web-app-capable', content: 'yes' },
globIgnores: GLOB_IGNORES,
maximumFileSizeToCacheInBytes: CACHE_SETTINGS.MAX_FILE_SIZE_BYTES,
+ // Prevent @vite-pwa/sveltekit from auto-adding a NavigationRoute by
+ // setting navigateFallback to empty string. This keeps the service
+ // worker from intercepting direct browser navigation to server API
+ // endpoints (e.g. /slots, /models, /v1/models) which should return
+ // JSON, not the SPA HTML shell. The server's own static-file fallback
+ // handles non-API navigation to index.html for the SPA router.
+ navigateFallback: '',
+
// Runtime caching for API calls - use NetworkFirst so APIs are always fresh
runtimeCaching: [
{
devOptions: {
enabled: true,
- suppressWarnings: true,
- // Use PWA_KIT_OPTIONS.NAVIGATE_FALLBACK to match production SW behaviour
- // (navigateFallback defaults to the configured base path, which is '/' for this SPA).
- navigateFallback: PWA_KIT_OPTIONS.NAVIGATE_FALLBACK
+ suppressWarnings: true
},
// SvelteKit-specific options
expect(swContent).toMatch(/"_app\/immutable\/assets\/bundle\.[a-zA-Z0-9_-]+\.css"/);
expect(swContent).toMatch(/"manifest\.webmanifest"/);
expect(swContent).toMatch(/"_app\/version\.json"/);
- expect(swContent).toMatch(/NavigationRoute/);
+ // NavigationRoute is intentionally absent — server API endpoints
+ // (e.g. /slots, /models) must not be intercepted by the PWA and
+ // should return JSON directly from the server.
+ expect(swContent).not.toMatch(/NavigationRoute/);
expect(swContent).toMatch(/api-cache/);
});
expect(swContent).toMatch(/"manifest\.webmanifest"/);
});
- it('has navigation route registered', () => {
+ it('no navigation route — API endpoints bypass PWA', () => {
expect(swContent).toBeTruthy();
- expect(swContent).toMatch(/NavigationRoute/);
+ // NavigationRoute is intentionally absent so direct browser
+ // navigation to server API endpoints returns JSON, not HTML.
+ expect(swContent).not.toMatch(/NavigationRoute/);
});
it('has runtime caching for API routes', () => {