@c80/types
v2.18.0
Published
Contrato de tipos compartido del ecosistema barman (enums + interfaces de dominio + DTOs de WebSocket). Fuente unica de verdad para zerath-back, vulcan-arm, kyron-front, midas-front y chillbox.
Downloads
3,118
Readme
@c80/types
Contrato de tipos compartido del ecosistema barman. Lib TS pura (framework-agnostica: sin Angular, sin Nest, cero dependencias de runtime).
Es la fuente unica de verdad de los tipos que antes se duplicaban a mano en
el core.types.ts de cada repo:
zerath-back— backend NestJS (dueno del contrato)vulcan-arm— controlador del brazokyron-front— frontend de operacionchillbox— frontend de cliente
Contenido (2.0.0)
Solo interface + enum + aliases:
- Enums:
Permission,RoomEvent,MovementStatus,MovementStepType,PurchaseStatus,RechargeStatus,WalletTransactionType. - Unions/aliases:
Side,SystemMode,MessageType,RoomId,MotorCommand,DriverType,Timestamp,NullableTimestamp,QueryParams. - Dominio:
Box,Task,Movement,Driver,Drivers,IngredientSlot,BoxIngredient,Product,Recipe,Part,User,Role,Favorite,Purchase,Rating,Recharge,Wallet,WalletTransaction,GlobalPoint,GlobalConfiguration,PriceConfiguration,MotorConfiguration,IngredientSlotConfiguration,FK. - WebSocket:
ChatMessage,TaskStats,BoxHealthPayload,MovementStatusUpdateRequest,MovementStatusUpdateResponse. - Genericos / paginacion:
ActionResponseDto,CreateProductResponseDto,PublicUser,LoginResponse,PaginationParams,PaginatedResponse<T>,CreateProductWithRecipeDto,CreatePartDto. - REST DTOs de respuesta (2.2.0):
CreatePurchaseResponse,PurchaseStatusResponse,PurchaseHistoryItem,InvoicePublicDto,InvoiceAdminDto+ enumInvoiceStatus,BoxStatus,RechargeConfig,AdminRecharge,AdminWallet,AdminWalletTransaction,CreatePayoutDto,SalesStatsResponse(+SalesTotals,SalesByProductItem,SalesByBoxItem,SalesByDayItem).
Changelog 2.2.0 (minor aditivo)
Sube al contrato los DTOs REST que hasta 2.1.0 se replicaban a mano entre zerath (dueno del shape) y los fronts. TODO aditivo: no se remueve ni cambia ningun tipo existente.
- Compra/canje (chillbox):
CreatePurchaseResponse,PurchaseStatusResponse(conqueuePosition/queueLength),PurchaseHistoryItem. Los dos ultimos incluyen el comprobanteinvoice: InvoicePublicDto | null. - Facturacion (ARCA, B2C): enum
InvoiceStatus,InvoicePublicDto(el que ve el cliente) eInvoiceAdminDto(trazabilidad de emision para kyron). - Catalogo:
BoxStatus(enabled/connected/queueLength+lastHealthAt/healthque consume el dashboard de kyron). - Recarga:
RechargeConfig(config global D19). - Reporting admin (kyron):
AdminRecharge,AdminWallet,AdminWalletTransaction,CreatePayoutDto,SalesStatsResponse+ sub-items. RechargeStatus.MANUAL_REVIEW: miembro nuevo (pago MP aprobado sin acreditar por usuario deshabilitado/anonimizado; requiere revision manual). Ya lo emitia zerath; el enum del contrato lo representaba de menos.- Timestamps de estos DTOs como
Timestamp(string | Date): zerath los tipa conDate, los fronts los reciben como ISO string sobre HTTP.
Nota: el listado admin de compras (AdminPurchase) NO se subio en este corte
(sigue como espejo local en kyron); InvoiceAdminDto ya viaja para que kyron
consuma el estado fiscal en Ventas. Subir AdminPurchase es un aditivo futuro.
Changelog 2.0.0 (breaking)
Major unico que agrupa TODO el cambio de contrato pendiente (Fase 1 del plan).
Breaking:
RoomEvent: se eliminan los miembros huerfanosUSER_JOINED,USER_LEFT,RECHARGE_PENDING,RECHARGE_APPROVED,RECHARGE_REJECTED(0 usos en los 4 repos). Tambien se eliminaChatMessage.rechargeData(carga de esos eventos, 0 usos).- Se eliminan
InterpolatedMovementyMovement.interpolatedMovements(deprecados; vulcan interpola localmente y ya los ignoraba). - Se elimina
PriceConfiguration.pointValue(deprecado; el punto es GLOBAL, verGlobalConfiguration.pointValue). Product.pointspasa destring(formateado a 6 decimales) anumber.
Runtime / packaging (fix de raiz):
- Build dual CJS/ESM: la 1.0.x era ESM-only y con el barrel sin extension NO
cargaba en ningun Node en runtime (
ERR_MODULE_NOT_FOUND). Ahora el paquete exponeexportsconrequire(NestJS: zerath/vulcan) eimport(fronts y Node ESM), y los imports internos llevan extension.
Nuevo:
- Dosis discretas (D1-D8):
Movement.dwellMs(dwell POST-llegada, aplicado UNA vez),Movement.stepType+ enumMovementStepType(TRANSIT|POUR|ICE|CUP|DELIVER),IngredientSlotConfiguration.cupCapacityMl(OPCIONAL hasta que zerath lo implemente en Fase 2,zb-vaso-capacidad; default 500 en el backend),IngredientSlot.unitMlOverride(reservado),Part.unitMl.Movement.sleepqueda@deprecated(semantica rota; las tasks grabadas lo usan). - Operacion:
PurchaseStatus.QUEUED(cola de servido, D17),RoomIdtipado (DEFAULT-ROOMdeprecado pero valido |admin|box:{id}),RoomEvent.BOX_HEALTH+BoxHealthPayload+ChatMessage.boxHealth,RoomEvent.MOVEMENT_STATUS_UPDATE_RESPONSE(antes string literal en zerath/vulcan), limites de recarga globales opcionales enGlobalConfiguration(minRechargeAmount/maxRechargeAmount/rechargeStep, D19; los dePriceConfigurationquedan@deprecated).Recharge.boxpasa abox?: Box | FK | nullpor la misma D19 (recarga global sin sesion de box, Fase 3); hoy zerath SIEMPRE lo envia, el opcional prepara el corte sin otro major. - Completitud:
Purchase.pointValueUsed/soldAtArs/errorMessage,Box.maxPartsPerProduct,User.boxes,Permission.GLOBAL_CONFIGURATION_READ/UPDATE. - F4/F5 (definidos ahora para no cortar otro major):
Box.owner,Wallet,WalletTransaction+WalletTransactionType,Permission.WALLET_READ/WALLET_PAYOUT/STATS_READ. Esquema de scoping por box DECIDIDO:Box.owner+User.boxesson el modelo completo; el guard de F4 valida pertenencia del recurso server-side, sin tipos adicionales de contrato.
Que NO vive aca
Tipos propios de un solo repo (UI de un front, Dispenser* de vulcan, payloads
concretos de sensores, etc.) quedan locales en cada repo.
Uso
import { Box, Movement, RoomEvent } from '@c80/types';Build dual CJS/ESM
scripts/build-types.js compila el mismo fuente dos veces:
dist/libs/types/esm/— ESM (con stub{"type":"module"}); condicionimport.dist/libs/types/cjs/— CommonJS (el package.json raiz no declaratype); condicionrequireymain(consumidores NestJS).
El package.json de esta carpeta es el PUBLICABLE (se copia tal cual al dist).
Regla: los imports internos del fuente llevan extension .js (sin ella la
resolucion ESM de Node revienta en runtime aunque el gate compile).
Build / publish (desde la raiz del workspace)
pnpm build:types # arma dist/libs/types (esm + cjs)
pnpm publish:types # gate + bump + build + publish (ver README raiz para minor/major)Antes de publicar, validar el runtime del dist: require('@c80/types') e
import('@c80/types') deben cargar y exponer los enums (el gate NO lo detecta;
probar con el dist montado en un node_modules suelto).
