Migrar desde la v1
La versión 2 hace que los validadores sigan por defecto SPEC.md, las fuentes oficiales españolas. Cambian cuatro cosas; todo lo demás, incluidos todos los nombres de las exportaciones y sus alias, sigue igual. La lista completa, con todos los detalles, está en MIGRATION.md (en inglés).
Vía rápida: mantener los resultados de la v1
Sección titulada «Vía rápida: mantener los resultados de la v1»Todos los validadores aceptan opciones como segundo argumento. Estas dos dan exactamente los resultados de la v1.0.11; un test compara ambas versiones con unas 490 000 entradas:
import { isValidNif } from "nif-dni-nie-cif-validation";
const V1_COMPATIBLE = { normalize: false, cifControl: "lenient" } as const;
isValidNif("G1234567D"); // falseisValidNif("G1234567D", V1_COMPATIBLE); // true, como en la v1.0.11Úsalas como solución provisional para los datos guardados, y después pasa a los valores por defecto.
Qué cambia
Sección titulada «Qué cambia»| # | Cambio | A quién afecta | Mantener el comportamiento de la v1 |
|---|---|---|---|
| 1 | Las claves de CIF C, D, F, G, J, U y V necesitan un dígito de control | CIF como G1234567D dejan de ser válidos |
{ cifControl: "lenient" } |
| 2 | La entrada se normaliza por defecto | Valores con espacios, puntos, guiones o barras, o un DNI sin sus ceros iniciales, pasan a ser válidos | { normalize: false } |
| 3 | TypeScript: los validadores tienen un segundo parámetro | ids.filter(isValidNif) deja de compilar |
Escribe ids.filter((id) => isValidNif(id)) |
| 4 | Solo se pueden importar los puntos de entrada del paquete | Importaciones de archivos dentro de dist/ |
Importa desde nif-dni-nie-cif-validation |
1. El control del CIF sigue CIF-3
Sección titulada «1. El control del CIF sigue CIF-3»La nota técnica de la AEAT asigna un dígito de control a las claves A B C D E F G H J U V y una letra a N P Q R S W (CIF-3). La versión 1 aceptaba una letra o un dígito para C, D, F, G, J, U y V, algo que no tiene base oficial. Afecta a isValidNif, isValidCif (isValidLegalEntityNif) e isValidCifControlCode (isValidLegalEntityNifControlCode).
Antes, en la v1:
import { isValidCif } from "nif-dni-nie-cif-validation";
isValidCif("G1234567D"); // trueisValidCif("G12345674"); // trueDespués, en la v2:
import { isValidCif } from "nif-dni-nie-cif-validation";
isValidCif("G1234567D"); // false: la G lleva dígitoisValidCif("G12345674"); // trueisValidCif("G1234567D", { cifControl: "lenient" }); // true, como en la v1Solo cambian C, D, F, G, J, U y V: A, B, E y H siempre necesitaron un dígito, y N, P, Q, R, S y W una letra, en las dos versiones.
2. La entrada se normaliza
Sección titulada «2. La entrada se normaliza»Ahora los validadores limpian la entrada antes de comprobarla: se quitan los espacios en blanco y los puntos (NORM-2), los guiones y las barras (NORM-3), y a un DNI con menos de 8 dígitos se le vuelven a añadir los ceros iniciales (NORM-4). La limpieza nunca convierte un documento no válido en válido, así que ningún resultado true de los validadores de documentos completos cambia; algunos resultados false pasan a true. Las funciones que solo comprueban el carácter de control, isValidDniLetter e isValidCifControlCode, no comprueban el formato, así que con separadores su resultado puede cambiar en los dos sentidos: en la v1, isValidCifControlCode("A 7727886") era true porque el espacio contaba como un 0 (consulta MIGRATION.md, en inglés).
Antes, en la v1:
import { isValidCif, isValidDni, isValidNif } from "nif-dni-nie-cif-validation";
isValidNif(" 12.345.678-Z "); // falseisValidDni("1234567L"); // falseisValidCif("B-1234567-4"); // falseDespués, en la v2:
import { isValidCif, isValidDni, isValidNif } from "nif-dni-nie-cif-validation";
isValidNif(" 12.345.678-Z "); // trueisValidDni("1234567L"); // trueisValidCif("B-1234567-4"); // trueisValidNif(" 12.345.678-Z ", { normalize: false }); // false, como en la v1Las minúsculas y el NIE antiguo de 10 caracteres (X01234567L) ya se aceptaban en la v1, y se siguen aceptando. Si guardas el valor, guarda su forma canónica: la devuelve normalize(), nueva en la v2. Consulta Normalizar y formatear la entrada.
3. TypeScript: un segundo parámetro
Sección titulada «3. TypeScript: un segundo parámetro»Todos los validadores son ahora (value: unknown, opts?: IsValidOptions) => boolean. El primer parámetro acepta más que antes, lo que no rompe nada, pero el segundo hace que TypeScript rechace un validador pasado directamente a un método de array, cuyo segundo argumento es el índice:
import { isValidNif } from "nif-dni-nie-cif-validation";
const ids = ["12345678Z", "B12345675"];
// @ts-expect-error: el índice (un número) no es un objeto de opcionesids.filter(isValidNif);ids.filter((id) => isValidNif(id)); // ["12345678Z"]En tiempo de ejecución no cambia nada: un número como opciones se ignora, así que el JavaScript sin tipos sigue funcionando.
4. Importa desde el paquete, no desde dist/
Sección titulada «4. Importa desde el paquete, no desde dist/»La versión 2 publica módulos ES y CommonJS y los declara en un mapa exports. Solo se pueden importar el propio paquete, sus subrutas (/locales/<code>, /generate, /zod, /valibot, /yup) y package.json, así que una ruta a los archivos compilados falla con ERR_PACKAGE_PATH_NOT_EXPORTED:
const { isValidNif } = require("nif-dni-nie-cif-validation/dist/nif/nif");const { isValidNif } = require("nif-dni-nie-cif-validation");Los validadores y las demás funciones se importan desde nif-dni-nie-cif-validation; los idiomas, los generadores y los esquemas, desde sus propios puntos de entrada (/locales/<code>, /generate, /zod, /valibot, /yup). require() e import funcionan en Node.js 20 o posterior y en todos los bundlers.
Novedades de la v2
Sección titulada «Novedades de la v2»Nada de esto rompe el código existente:
validate(): el tipo, la forma canónica y, si el valor no es válido, un código de error, la regla de SPEC y un mensaje.normalize()yformat(),getNifType(),computeControlCharacter(),describeCifOrganisation()eisValidSpanishVat().- La opción
rejectPlaceholdersy, envalidate(), tambiéntypes,allowVatPrefixylocale. - Mensajes en español, catalán, euskera y gallego.
- Generadores de datos de prueba y esquemas de Zod, Valibot y Yup.
import { validate } from "nif-dni-nie-cif-validation";
validate("12345678A").error?.code; // "INVALID_CONTROL_CHARACTER"validate("12345678A").error?.rule; // "DNI-2"Lista de comprobación
Sección titulada «Lista de comprobación»-
Actualiza y ejecuta tus tests.
-
Si los CIF guardados con letra de control para C, D, F, G, J, U o V deben seguir siendo válidos, pasa
{ cifControl: "lenient" }donde los compruebes, y planifica la corrección de los datos. -
Si algún código dependía de
falsepara valores con separadores, pasa{ normalize: false }o, mejor, guardanormalize(value). -
En TypeScript, sustituye
array.filter(isValidX)por una función flecha. -
Sustituye cualquier importación desde
nif-dni-nie-cif-validation/dist/…por una desdenif-dni-nie-cif-validation. -
Para los mensajes en otro idioma, importa su objeto de idioma y pásalo como
locale.