import type { CustomFieldValidator, CustomFieldValidators, FieldDescriptor, FieldError, FieldErrorMap } from './MasterDocument.types'; export type { CustomFieldValidator, CustomFieldValidators }; /** * Motor de validación en cliente para `FieldDescriptor.validations`. * * Hasta ahora `validations` era **configuración muerta**: el tipo la declaraba, los * templates la escribían (231 reglas en 20 templates solo en el módulo comercial) y * ningún punto del kit la leía. El canal `error` que pinta `FieldRenderer` lo llenaba * únicamente el servidor, al guardar, así que el `message` que cada regla trae escrito * no llegaba nunca a la pantalla. * * Este módulo es deliberadamente **puro**: sin React, sin estado, sin i18n. Recibe el * descriptor y el valor y devuelve el primer incumplimiento. Eso lo hace testeable de * verdad y deja que cada contenedor decida CUÁNDO enseñarlo. * * @see FieldRenderer — lo consume y decide el momento (tras tocar el campo) */ /** * Valor "vacío" a efectos de validación. Alineado con el criterio que ya usaba * `FieldRenderer` para el borde rojo de requerido-vacío, para que el borde y el * mensaje no puedan discrepar. */ export declare function isEmptyValue(value: unknown): boolean; /** * Primer incumplimiento del campo, o `null` si cumple todo. * * Los `severity: 'error'` ganan a los `warning` aunque aparezcan después en el array: * si un campo incumple las dos cosas, lo que hay que enseñar es el error. */ export declare function evaluateFieldValidations(fieldDef: FieldDescriptor, value: unknown, customValidators?: CustomFieldValidators, values?: Record): FieldError | null; /** * Evalúa un conjunto de campos contra sus valores. Pensado para que un contenedor * decida si puede guardar; el kit NO bloquea ningún botón por su cuenta. */ export declare function evaluateFields(fields: FieldDescriptor[], values: Record, customValidators?: CustomFieldValidators): FieldErrorMap; /** * Campos que IMPIDEN guardar, indexados por key. Lo que devuelve encaja tal cual en el * canal `error` que ya pinta `FieldRenderer`, así que el mensaje del campo y cualquier * otra señal que se derive de este mapa —el badge de la pestaña, p.ej.— salen de la MISMA * computación y no pueden contradecirse (ADR-027 §C.3b). * * Honra las DOS formas de declarar obligatoriedad, que en los templates reales no * coinciden: el flag `required` del descriptor y la regla `{ type: 'required' }` de * `validations`. De los 87 campos de línea obligatorios del módulo comercial, 5 traen * SOLO el flag; un guardián que mirara únicamente `validations` los dejaría pasar * mientras el asterisco de su pestaña sí los cuenta. * * Solo devuelve incumplimientos de severidad `error`: un `warning` avisa, no bloquea. * * El llamador decide QUÉ campos entran. Debe pasar únicamente los que el usuario puede * resolver ahora mismo —visibles y editables en el estado actual—: un campo oculto por * condición, no editable por estado, sin el permiso de edición (que llega con * `editableOn: []`) o calculado no puede bloquear a nadie, porque no habría forma de * desbloquearlo. */ export declare function evaluateBlockingFields(fields: FieldDescriptor[], values: Record, options: { requiredFallbackMessage: string; customValidators?: CustomFieldValidators; }): FieldErrorMap; //# sourceMappingURL=fieldValidation.d.ts.map