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",