React.FormEvent está marcado @deprecated en @types/react (recomienda SubmitEvent). Se usa 14 veces en 11 archivos de apps/web: admin/clientes, admin/inventario (lista y [id] ×2), admin/inventario/categorias, admin/inventario/productos ×2, admin/proveedores, admin/usuarios, login/_components/password-form, pos/_components/cash-register-control ×3 y pos/page.tsx.
apps/api no usa ninguna API deprecada (revisado con el compilador de TypeScript buscando símbolos @deprecated).
Código muerto
apps/web/src/app/_core/components/section-placeholder.tsx (SectionPlaceholder) no se usa.
@prisma/client está en las dependencias de apps/api pero no se importa (Prisma 8 usa @prisma/orm-postgres).
ProductHistory.soldAt está en el contrato, el DTO, la entidad y el repositorio, pero nada le asigna valor.
Redundancias
Dos formas de llamar al API: los hooks de createResource y 14 llamadas directas a apiClient (pos/page.tsx 6, pos/historial/page.tsx 5, admin/inventario/productos/page.tsx 2, admin/inventario/[id]/page.tsx 1). Las directas no invalidan la caché de React Query, por eso pos/page.tsx necesita invalidateSaleData() a mano.
Dos tipos para el mismo usuario: AuthUser (_core/types/auth-user.ts) y AppUser (_core/types/entities.ts).
admin/_components/user-menu.tsx:24-27 vuelve a declarar ThemeMode, los modos, los íconos y las etiquetas que ya existen en _core/hooks/use-theme.tsx y _core/components/theme-toggle.tsx.
admin/inventario/[id] y admin/proveedores/[id] hacen Number(params.id) sin validar: con /admin/proveedores/abc piden /api/suppliers/NaN y la página queda vacía en vez de mostrar "no encontrado".
Qué estamos pagando hoy
Los avisos de deprecación se acumulan y el siguiente upgrade de @types/react puede romper la compilación.
El código y las dependencias muertas confunden sobre qué se usa y hacen más pesada la instalación.
Con dos formas de llamar al API, es fácil olvidar invalidar la caché y mostrar datos viejos.
Arreglo propuesto
Reemplazar React.FormEvent<HTMLFormElement> por React.SubmitEvent<HTMLFormElement> (o tipar el handler con React.FormEventHandler)
Borrar SectionPlaceholder
Quitar @prisma/client de apps/api/package.json
Decidir si soldAt se usa (asignarlo al vender) o se quita del contrato
Usar siempre los hooks de recurso (agregando mutaciones específicas donde haga falta) o mover esas cadenas de llamadas al servidor (#3)
Unificar AuthUser y AppUser
Exportar modos, íconos y etiquetas del tema desde un solo lugar y usarlos en ThemeToggle y UserMenu
Validar el id de las rutas dinámicas y llamar a notFound() si no es un número
Techo de esta ronda
Limpieza mecánica en un PR chico. Fuera: rediseñar la capa de datos del frontend y mover la venta al servidor (#3).
Superficie
Web (apps/web)
Módulos
Web / frontend, API / backend, Base de datos / contrato Prisma
Esfuerzo
S — un PR chico
Riesgo de no tocarlo
Bajo
### Qué es la deuda
**APIs deprecadas**
- `React.FormEvent` está marcado `@deprecated` en `@types/react` (recomienda `SubmitEvent`). Se usa 14 veces en 11 archivos de `apps/web`: `admin/clientes`, `admin/inventario` (lista y `[id]` ×2), `admin/inventario/categorias`, `admin/inventario/productos` ×2, `admin/proveedores`, `admin/usuarios`, `login/_components/password-form`, `pos/_components/cash-register-control` ×3 y `pos/page.tsx`.
- `apps/api` no usa ninguna API deprecada (revisado con el compilador de TypeScript buscando símbolos `@deprecated`).
**Código muerto**
- `apps/web/src/app/_core/components/section-placeholder.tsx` (`SectionPlaceholder`) no se usa.
- `@prisma/client` está en las dependencias de `apps/api` pero no se importa (Prisma 8 usa `@prisma/orm-postgres`).
- `ProductHistory.soldAt` está en el contrato, el DTO, la entidad y el repositorio, pero nada le asigna valor.
**Redundancias**
- Dos formas de llamar al API: los hooks de `createResource` y 14 llamadas directas a `apiClient` (`pos/page.tsx` 6, `pos/historial/page.tsx` 5, `admin/inventario/productos/page.tsx` 2, `admin/inventario/[id]/page.tsx` 1). Las directas no invalidan la caché de React Query, por eso `pos/page.tsx` necesita `invalidateSaleData()` a mano.
- Dos tipos para el mismo usuario: `AuthUser` (`_core/types/auth-user.ts`) y `AppUser` (`_core/types/entities.ts`).
- `admin/_components/user-menu.tsx:24-27` vuelve a declarar `ThemeMode`, los modos, los íconos y las etiquetas que ya existen en `_core/hooks/use-theme.tsx` y `_core/components/theme-toggle.tsx`.
- `admin/inventario/[id]` y `admin/proveedores/[id]` hacen `Number(params.id)` sin validar: con `/admin/proveedores/abc` piden `/api/suppliers/NaN` y la página queda vacía en vez de mostrar "no encontrado".
### Qué estamos pagando hoy
- Los avisos de deprecación se acumulan y el siguiente upgrade de `@types/react` puede romper la compilación.
- El código y las dependencias muertas confunden sobre qué se usa y hacen más pesada la instalación.
- Con dos formas de llamar al API, es fácil olvidar invalidar la caché y mostrar datos viejos.
### Arreglo propuesto
- [x] Reemplazar `React.FormEvent<HTMLFormElement>` por `React.SubmitEvent<HTMLFormElement>` (o tipar el handler con `React.FormEventHandler`)
- [x] Borrar `SectionPlaceholder`
- [x] Quitar `@prisma/client` de `apps/api/package.json`
- [ ] Decidir si `soldAt` se usa (asignarlo al vender) o se quita del contrato
- [x] Usar siempre los hooks de recurso (agregando mutaciones específicas donde haga falta) o mover esas cadenas de llamadas al servidor (#3)
- [x] Unificar `AuthUser` y `AppUser`
- [x] Exportar modos, íconos y etiquetas del tema desde un solo lugar y usarlos en `ThemeToggle` y `UserMenu`
- [x] Validar el `id` de las rutas dinámicas y llamar a `notFound()` si no es un número
### Techo de esta ronda
Limpieza mecánica en un PR chico. Fuera: rediseñar la capa de datos del frontend y mover la venta al servidor (#3).
### Superficie
Web (apps/web)
### Módulos
Web / frontend, API / backend, Base de datos / contrato Prisma
### Esfuerzo
S — un PR chico
### Riesgo de no tocarlo
Bajo
Jose
was assigned by Carlos2026-10-02 20:04:01 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Qué es la deuda
APIs deprecadas
React.FormEventestá marcado@deprecateden@types/react(recomiendaSubmitEvent). Se usa 14 veces en 11 archivos deapps/web:admin/clientes,admin/inventario(lista y[id]×2),admin/inventario/categorias,admin/inventario/productos×2,admin/proveedores,admin/usuarios,login/_components/password-form,pos/_components/cash-register-control×3 ypos/page.tsx.apps/apino usa ninguna API deprecada (revisado con el compilador de TypeScript buscando símbolos@deprecated).Código muerto
apps/web/src/app/_core/components/section-placeholder.tsx(SectionPlaceholder) no se usa.@prisma/clientestá en las dependencias deapps/apipero no se importa (Prisma 8 usa@prisma/orm-postgres).ProductHistory.soldAtestá en el contrato, el DTO, la entidad y el repositorio, pero nada le asigna valor.Redundancias
createResourcey 14 llamadas directas aapiClient(pos/page.tsx6,pos/historial/page.tsx5,admin/inventario/productos/page.tsx2,admin/inventario/[id]/page.tsx1). Las directas no invalidan la caché de React Query, por esopos/page.tsxnecesitainvalidateSaleData()a mano.AuthUser(_core/types/auth-user.ts) yAppUser(_core/types/entities.ts).admin/_components/user-menu.tsx:24-27vuelve a declararThemeMode, los modos, los íconos y las etiquetas que ya existen en_core/hooks/use-theme.tsxy_core/components/theme-toggle.tsx.admin/inventario/[id]yadmin/proveedores/[id]hacenNumber(params.id)sin validar: con/admin/proveedores/abcpiden/api/suppliers/NaNy la página queda vacía en vez de mostrar "no encontrado".Qué estamos pagando hoy
@types/reactpuede romper la compilación.Arreglo propuesto
React.FormEvent<HTMLFormElement>porReact.SubmitEvent<HTMLFormElement>(o tipar el handler conReact.FormEventHandler)SectionPlaceholder@prisma/clientdeapps/api/package.jsonsoldAtse usa (asignarlo al vender) o se quita del contratoAuthUseryAppUserThemeToggleyUserMenuidde las rutas dinámicas y llamar anotFound()si no es un númeroTecho de esta ronda
Limpieza mecánica en un PR chico. Fuera: rediseñar la capa de datos del frontend y mover la venta al servidor (#3).
Superficie
Web (apps/web)
Módulos
Web / frontend, API / backend, Base de datos / contrato Prisma
Esfuerzo
S — un PR chico
Riesgo de no tocarlo
Bajo