- Updated demo credential logic to accept any password ≥8 characters for improved UX. - Improved MSW configuration to ignore non-API requests and warn only for unhandled API calls. - Adjusted `DemoModeBanner` to reflect updated password requirements for demo credentials.
95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
/**
|
|
* MSW Browser Setup
|
|
*
|
|
* Configures Mock Service Worker for browser environment.
|
|
* This intercepts network requests at the network layer, making it transparent to the app.
|
|
*/
|
|
|
|
import { setupWorker } from 'msw/browser';
|
|
import { handlers } from './handlers';
|
|
|
|
/**
|
|
* Create MSW worker with all handlers
|
|
* This worker intercepts fetch/XHR requests in the browser
|
|
*/
|
|
export const worker = setupWorker(...handlers);
|
|
|
|
/**
|
|
* Check if MSW should be started
|
|
* Only runs when ALL conditions are met:
|
|
* - In browser (not SSR)
|
|
* - NOT in Jest test environment
|
|
* - NOT in Playwright E2E tests
|
|
* - Demo mode explicitly enabled
|
|
*/
|
|
function shouldStartMSW(): boolean {
|
|
if (typeof window === 'undefined') {
|
|
return false; // SSR, skip
|
|
}
|
|
|
|
// Skip Jest unit tests
|
|
if (process.env.NODE_ENV === 'test') {
|
|
return false;
|
|
}
|
|
|
|
// Skip Playwright E2E tests (uses your existing __PLAYWRIGHT_TEST__ flag)
|
|
if ((window as any).__PLAYWRIGHT_TEST__) {
|
|
return false;
|
|
}
|
|
|
|
// Only start if demo mode is explicitly enabled
|
|
return process.env.NEXT_PUBLIC_DEMO_MODE === 'true';
|
|
}
|
|
|
|
/**
|
|
* Start MSW for demo mode
|
|
* SAFE: Will not interfere with unit tests or E2E tests
|
|
*/
|
|
export async function startMockServiceWorker() {
|
|
if (!shouldStartMSW()) {
|
|
// Silently skip - this is normal for dev/test environments
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await worker.start({
|
|
// Only intercept requests to the API, bypass everything else (Next.js routes, etc.)
|
|
onUnhandledRequest(request, print) {
|
|
// Ignore Next.js internal requests
|
|
const url = new URL(request.url);
|
|
if (
|
|
url.pathname.startsWith('/_next') ||
|
|
url.pathname.startsWith('/__next') ||
|
|
url.pathname.startsWith('/api/') ||
|
|
url.pathname === '/favicon.ico' ||
|
|
url.pathname.match(/\.(js|css|png|jpg|svg|woff|woff2)$/)
|
|
) {
|
|
return;
|
|
}
|
|
|
|
// Ignore locale routes (Next.js i18n)
|
|
if (url.pathname === '/en' || url.pathname === '/it' || url.pathname.startsWith('/en/') || url.pathname.startsWith('/it/')) {
|
|
return;
|
|
}
|
|
|
|
// Only warn about actual API requests we might have missed
|
|
if (url.hostname.includes('localhost') && url.port === '8000') {
|
|
print.warning();
|
|
}
|
|
},
|
|
serviceWorker: {
|
|
url: '/mockServiceWorker.js',
|
|
},
|
|
});
|
|
|
|
console.log('%c[MSW] Demo Mode Active', 'color: #00bfa5; font-weight: bold;');
|
|
console.log('[MSW] All API calls to localhost:8000 are mocked');
|
|
console.log('[MSW] Demo credentials:');
|
|
console.log(' Regular user: demo@example.com / DemoPass123');
|
|
console.log(' Admin user: admin@example.com / AdminPass123');
|
|
} catch (error) {
|
|
console.error('[MSW] Failed to start Mock Service Worker:', error);
|
|
console.error('[MSW] Demo mode will not work correctly');
|
|
}
|
|
}
|