From 1d86f37361e8fd788af3efcd320bd5cbfff8eeff Mon Sep 17 00:00:00 2001 From: Victor Bayas Date: Sat, 14 Sep 2024 01:00:00 -0500 Subject: [PATCH] Add isZipCode validator (#3) * Add isZipCode validator * Add doc strings to all the functions * Release 1.2.0 --- README.md | 13 ++++++++----- package.json | 2 +- src/helpers/isDigits.ts | 5 ++++- src/index.ts | 3 ++- src/lib/isCedula.ts | 12 +++++++----- src/lib/isRUC.ts | 6 ++++++ src/lib/isZipCode.ts | 29 +++++++++++++++++++++++++++++ tests/index.test.ts | 36 +++++++++++++++++++++++++++++++++++- 8 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 src/lib/isZipCode.ts diff --git a/README.md b/README.md index 08698bc..0ace3a1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # validator-ec -**validator-ec** es una colección de validadores de datos para Ecuador desarrollada en TypeScript. Actualmente, cuenta con validadores para cédulas de identidad ecuatorianas y números de RUC (Registro Único de Contribuyentes). +Colección de validadores de datos comunes en Ecuador desarrollada en TypeScript. + +Actualmente, cuenta con validadores para cédulas de identidad ecuatorianas, números de RUC (Registro Único de Contribuyentes) y códigos postales. ## Características @@ -32,10 +34,11 @@ npm install validator-ec ## Validadores -| Validador | Descripción | Ejemplo | -| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ | -| `isCedula(cedula: string): boolean` | Valida una cédula de identidad ecuatoriana. Devuelve `true` si la cédula es válida, de lo contrario `false`. | `isCedula('1710034065')` | -| `isRUC(ruc: string): boolean` | Valida un número de RUC (Registro Único de Contribuyentes). Devuelve `true` si el RUC es válido, de lo contrario `false`. | `isRUC('1790016919001')` | +| Validador | Descripción | Ejemplo | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ | +| `isCedula(cedula: string): boolean` | Valida una cédula de identidad ecuatoriana. Devuelve `true` si la cédula es válida, de lo contrario `false`. | `isCedula('1710034065')` | +| `isRUC(ruc: string): boolean` | Valida un número de RUC (Registro Único de Contribuyentes). Devuelve `true` si el RUC es válido, de lo contrario `false`. | `isRUC('1790016919001')` | +| `isZipCode(zipCode: string): boolean` | Valida un código postal ecuatoriano. Devuelve `true` si el código postal es válido, de lo contrario `false`. | `isZipCode('131401')` | ## Uso diff --git a/package.json b/package.json index a9b30b2..bb555d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "validator-ec", - "version": "1.1.0", + "version": "1.2.0", "type": "module", "author": "Victor Bayas", "license": "Apache-2.0", diff --git a/src/helpers/isDigits.ts b/src/helpers/isDigits.ts index 612e75e..3de02c5 100644 --- a/src/helpers/isDigits.ts +++ b/src/helpers/isDigits.ts @@ -1,4 +1,7 @@ -// Helper para validar que una cadena contenga únicamente dígitos. +/** + * @param {string} value La cadena de texto a validar. + * @returns {boolean} Devuelve `true si la cadena de texto contiene únicamente dígitos, de lo contrario devuelve `false`. + */ export default function isDigits(value: string): boolean { return /^\d+$/.test(value); } diff --git a/src/index.ts b/src/index.ts index 12ac0f8..ae3fe7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import isCedula from "./lib/isCedula"; import isRUC from "./lib/isRUC"; +import isZipCode from "./lib/isZipCode"; -export { isCedula, isRUC }; +export { isCedula, isRUC, isZipCode }; diff --git a/src/lib/isCedula.ts b/src/lib/isCedula.ts index 180aa36..4f0ae5e 100644 --- a/src/lib/isCedula.ts +++ b/src/lib/isCedula.ts @@ -1,5 +1,10 @@ import isDigits from "../helpers/isDigits"; +/** + * + * @param {string} cedula La cédula a validar. + * @returns {boolean} Devuelve `true` si la cédula es válida, de lo contrario devuelve `false`. + */ export default function isCedula(cedula: string): boolean { // Validamos que la cédula tenga 10 dígitos if (cedula.length !== 10) { @@ -54,9 +59,6 @@ export default function isCedula(cedula: string): boolean { return false; } - if (validatorDigit == lastDigit) { - return true; - } - - return false; + // Si el dígito verificador es igual al último dígito de la cédula, la cédula es válida + return validatorDigit === lastDigit; } diff --git a/src/lib/isRUC.ts b/src/lib/isRUC.ts index 318614c..6db3a0e 100644 --- a/src/lib/isRUC.ts +++ b/src/lib/isRUC.ts @@ -1,6 +1,12 @@ import isDigits from "../helpers/isDigits"; import isCedula from "./isCedula"; +/** + * Valida un RUC ecuatoriano. + * + * @param {string} ruc El RUC a validar. + * @returns {boolean} Devuelve `true` si el RUC es válido, de lo contrario devuelve `false`. + */ export default function isRUC(ruc: string): boolean { // Verificamos que el RUC tenga 13 dígitos if (ruc.length !== 13) { diff --git a/src/lib/isZipCode.ts b/src/lib/isZipCode.ts new file mode 100644 index 0000000..373c2a1 --- /dev/null +++ b/src/lib/isZipCode.ts @@ -0,0 +1,29 @@ +import isDigits from "../helpers/isDigits"; + +/** + * Valida un código postal ecuatoriano. + * + * @param {string} zipCode El código postal a validar. + * @returns {boolean} Devuelve `true` si el código postal es válido, de lo contrario devuelve `false`. + */ +export default function isZipCode(zipCode: string): boolean { + // Verificamos que el código postal tenga 6 dígitos + if (zipCode.length !== 6) { + return false; + } + + // Verificamos que todos los caracteres sean dígitos + if (!isDigits(zipCode)) { + return false; + } + + // Extraemos el código de provincia + const provinceCode = parseInt(zipCode[0] + zipCode[1], 10); + + // Verificamos que el código de provincia sea válido + if (provinceCode < 1 || provinceCode > 24) { + return false; + } + + return true; +} diff --git a/tests/index.test.ts b/tests/index.test.ts index fe4f506..525e54e 100644 --- a/tests/index.test.ts +++ b/tests/index.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "vitest"; -import { isCedula, isRUC } from "../src"; +import { isCedula, isRUC, isZipCode } from "../src"; describe("Validador isCedula", () => { it("debería retornar true para una cédula válida", () => { @@ -99,3 +99,37 @@ describe("Validador isRUC", () => { expect(isRUC("1710034065000")).toBe(false); }); }); + +describe("Función isZipCode", () => { + it("debería retornar true para un código postal válido", () => { + expect(isZipCode("170150")).toBe(true); // Código postal válido de Pichincha + expect(isZipCode("090112")).toBe(true); // Código postal válido de Guayas + expect(isZipCode("010203")).toBe(true); // Código postal válido de Azuay + expect(isZipCode("240205")).toBe(true); // Código postal válido de Santa Elena + expect(isZipCode("220202")).toBe(true); // Código postal válido de Orellana + }); + + it("debería retornar false si el código postal no tiene 6 dígitos", () => { + expect(isZipCode("17015")).toBe(false); + expect(isZipCode("1701500")).toBe(false); + expect(isZipCode("1701")).toBe(false); + }); + + it("debería retornar false si el código postal contiene caracteres no numéricos", () => { + expect(isZipCode("17A150")).toBe(false); + expect(isZipCode("17015X")).toBe(false); + expect(isZipCode("170-50")).toBe(false); + expect(isZipCode("17 150")).toBe(false); + expect(isZipCode("17.150")).toBe(false); + }); + + it("debería retornar false para códigos postales con código de provincia inválido", () => { + expect(isZipCode("000150")).toBe(false); + expect(isZipCode("250150")).toBe(false); + expect(isZipCode("990150")).toBe(false); + }); + + it("debería retornar false para una cadena vacía", () => { + expect(isZipCode("")).toBe(false); + }); +});