diff --git a/project/VERSION b/project/VERSION index a45be46..1866a36 100644 --- a/project/VERSION +++ b/project/VERSION @@ -1 +1 @@ -0.2.8 +0.2.9 diff --git a/project/apps/admin/package-lock.json b/project/apps/admin/package-lock.json index 0ec01f6..149d78d 100644 --- a/project/apps/admin/package-lock.json +++ b/project/apps/admin/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mercadodevida/admin", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@mercadodevida/admin", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@lexical/history": "^0.49.0", "@lexical/html": "^0.49.0", diff --git a/project/apps/admin/package.json b/project/apps/admin/package.json index f56b512..eabc2e9 100644 --- a/project/apps/admin/package.json +++ b/project/apps/admin/package.json @@ -1,6 +1,6 @@ { "name": "@mercadodevida/admin", - "version": "0.2.8", + "version": "0.2.9", "private": true, "scripts": { "dev": "next dev --port 3001", diff --git a/project/apps/pos/package-lock.json b/project/apps/pos/package-lock.json index 51693e7..3928b3b 100644 --- a/project/apps/pos/package-lock.json +++ b/project/apps/pos/package-lock.json @@ -1,12 +1,12 @@ { "name": "mercadodevida-pos", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mercadodevida-pos", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "next": "^16.3.1", "react": "^19.2.8", diff --git a/project/apps/pos/package.json b/project/apps/pos/package.json index 420a91f..fd3971e 100644 --- a/project/apps/pos/package.json +++ b/project/apps/pos/package.json @@ -1,6 +1,6 @@ { "name": "mercadodevida-pos", - "version": "0.2.8", + "version": "0.2.9", "private": true, "scripts": { "dev": "next dev --port 3002", diff --git a/project/apps/pos/src/components/ReceiptModal.tsx b/project/apps/pos/src/components/ReceiptModal.tsx index 704fc73..719b662 100644 --- a/project/apps/pos/src/components/ReceiptModal.tsx +++ b/project/apps/pos/src/components/ReceiptModal.tsx @@ -59,7 +59,15 @@ export default function ReceiptModal({ aria-modal="true" aria-labelledby="receipt-title" > -
+
+ {/* Ticket content - only this gets printed */}
diff --git a/project/apps/pos/src/lib/api-client.ts b/project/apps/pos/src/lib/api-client.ts index d810102..ff54e97 100644 --- a/project/apps/pos/src/lib/api-client.ts +++ b/project/apps/pos/src/lib/api-client.ts @@ -12,6 +12,15 @@ async function apiFetch(path: string, init?: RequestInit): Promise { ...(init?.headers ?? {}), }, }); + if (res.status === 401) { + if (typeof window !== 'undefined') { + window.location.href = '/login'; + } + throw Object.assign(new Error('Sesión caducada, identifícate de nuevo'), { + status: 401, + code: 'UNAUTHORIZED', + }); + } if (!res.ok) { const err = (await res.json().catch(() => ({ message: res.statusText }))) as { message?: string; @@ -22,6 +31,15 @@ async function apiFetch(path: string, init?: RequestInit): Promise { code: err.error?.code, }); } + // Defensive: if a proxy/misconfiguration ever returns HTML on a successful + // response, surface a readable message instead of a JSON parse crash. + const contentType = res.headers.get('content-type') ?? ''; + if (!contentType.includes('application/json')) { + throw Object.assign(new Error('Respuesta inesperada del servidor (sesión o proxy)'), { + status: res.status, + code: 'INVALID_RESPONSE', + }); + } return res.json() as Promise; } diff --git a/project/apps/pos/src/proxy.ts b/project/apps/pos/src/proxy.ts index d43d251..61de4b9 100644 --- a/project/apps/pos/src/proxy.ts +++ b/project/apps/pos/src/proxy.ts @@ -20,6 +20,15 @@ export function proxy(request: NextRequest) { cookie.includes('session_token='); if (!hasSession) { + // API callers expect JSON. Redirecting them to /login makes fetch() follow + // the redirect and receive the HTML login page, which surfaces as the + // cryptic "Unexpected token '<'" parse error in the terminal UI. + if (pathname.startsWith('/api/')) { + return NextResponse.json( + { error: { statusCode: 401, code: 'UNAUTHORIZED', message: 'Authentication required' } }, + { status: 401 }, + ); + } return NextResponse.redirect(new URL('/login', request.url)); } diff --git a/project/frontend/package-lock.json b/project/frontend/package-lock.json index c71632e..25e1a2b 100644 --- a/project/frontend/package-lock.json +++ b/project/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "frontend", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "frontend", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "next": "16.3.1", "react": "19.2.8", diff --git a/project/frontend/package.json b/project/frontend/package.json index 6f113b2..adac0df 100644 --- a/project/frontend/package.json +++ b/project/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "0.2.8", + "version": "0.2.9", "private": true, "scripts": { "dev": "next dev", diff --git a/project/package-lock.json b/project/package-lock.json index 10474c8..f840574 100644 --- a/project/package-lock.json +++ b/project/package-lock.json @@ -1,12 +1,12 @@ { "name": "mercadodevida-backend", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mercadodevida-backend", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@fastify/cookie": "^11.1.2", "@fastify/cors": "^11.3.0", diff --git a/project/package.json b/project/package.json index 991e847..7a17ed1 100644 --- a/project/package.json +++ b/project/package.json @@ -1,6 +1,6 @@ { "name": "mercadodevida-backend", - "version": "0.2.8", + "version": "0.2.9", "private": true, "type": "module", "description": "mercadodevida vNext backend - modular monolith skeleton", diff --git a/project/storefront/package-lock.json b/project/storefront/package-lock.json index 19c7315..a30c0c1 100644 --- a/project/storefront/package-lock.json +++ b/project/storefront/package-lock.json @@ -1,12 +1,12 @@ { "name": "mercadodevida-storefront", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mercadodevida-storefront", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@tailwindcss/postcss": "^4.1.17", "next": "^16.0.5", diff --git a/project/storefront/package.json b/project/storefront/package.json index d27c928..f48e038 100644 --- a/project/storefront/package.json +++ b/project/storefront/package.json @@ -1,6 +1,6 @@ { "name": "mercadodevida-storefront", - "version": "0.2.8", + "version": "0.2.9", "private": true, "type": "module", "description": "mercadodevida customer storefront shell",