npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@jysperu/schema-correo

v1.0.2

Published

Esquemas para correos electrónicos: Mongoose, JSON Schema y Joi

Readme

@jysperu/schema-correo

npm version npm downloads License: MIT TypeScript Node.js MongoDB Joi Bundle Size

Esquemas para correos electrónicos con soporte para Mongoose, JSON Schema y Joi.

🚀 Características

  • 📧 Validación de correos electrónicos
  • 🌍 Formato estándar RFC 5322 completo
  • 🔧 Extracción automática de usuario y dominio
  • 🏷️ Clasificaciones del uso de correo (Trabajo, Personal, etc.)
  • Estados de validación y verificación

📦 Instalación

npm install @jysperu/schema-correo

⚡ Inicio Rápido

import { MongoSchemaCorreo, JsonSchemaCorreo, JoiSchemaCorreo, parseCorreo } from "@jysperu/schema-correo";
import { ICorreo, ClasificacionCorreo } from "@jysperu/schema-correo";

// Mongoose
const PersonaSchema = new Schema({
  correos: [MongoSchemaCorreo],
});

// Joi Validation
const { error, value } = JoiSchemaCorreo.validate({
  correo: "[email protected]",
  tipo: "Personal",
  valido: true,
});

// JSON Schema
const validate = ajv.compile(JsonSchemaCorreo);
const isValid = validate(correoData);

// Función utilitaria para parsear correos
const correoParseado = parseCorreo("[email protected]", { tipo: "Personal" });
// Resultado: { correo: "[email protected]", usuario: "usuario", dominio: "dominio.com", tipo: "Personal" }

📚 Esquemas Disponibles

1. 🍃 Mongoose Schema

import { MongoSchemaCorreo, ICorreo } from "@jysperu/schema-correo";
import { Schema, model, Document } from "mongoose";

interface IPersona extends Document {
  nombres: string;
  correos: ICorreo[];
}

const PersonaSchema = new Schema<IPersona>({
  nombres: { type: String, required: true },
  correos: [MongoSchemaCorreo], // Array de correos
});

const PersonaModel = model<IPersona>("Persona", PersonaSchema);

2. 📋 JSON Schema

import { JsonSchemaCorreo } from "@jysperu/schema-correo";
import Ajv from "ajv";

const ajv = new Ajv();
const validate = ajv.compile(JsonSchemaCorreo);

const correo = {
  correo: "[email protected]",
  tipo: "Personal",
  nombre: "Juan Pérez",
  valido: true,
};

const valid = validate(correo);
if (!valid) console.log(validate.errors);

3. ✅ Joi Schema

import { JoiSchemaCorreo } from "@jysperu/schema-correo";

// Validación individual
const { error, value } = JoiSchemaCorreo.validate({
  correo: "[email protected]",
  tipo: "Personal",
  nombre: "Ana García",
  valido: true,
});

if (error) {
  error.details.forEach((err) => console.log(`❌ ${err.path}: ${err.message}`));
}

// Para arrays de correos
import Joi from "@jysperu/joi-spanish";

const personaSchema = Joi.object({
  nombres: Joi.string().required(),
  correos: Joi.array().items(JoiSchemaCorreo).default([]),
});

🛠️ Casos de Uso Avanzados

Crear persona con múltiples correos

import { MongoSchemaCorreo, ICorreo, ClasificacionCorreo } from "@jysperu/schema-correo";

const persona = new PersonaModel({
  nombres: "Ana García",
  correos: [
    {
      correo: "[email protected]",
      tipo: ClasificacionCorreo.TRABAJO,
      nombre: "Ana García",
      usuario: "ana.garcia",
      dominio: "empresa.com",
      valido: true,
      verificado: true,
    },
    {
      correo: "[email protected]",
      tipo: ClasificacionCorreo.PERSONAL,
      nombre: "Ana García",
      usuario: "ana.personal",
      dominio: "gmail.com",
      valido: true,
    },
  ],
});

await persona.save();

Operaciones con correos

// Buscar correos verificados
const correosVerificados = persona.correos.filter((correo) => correo.verificado);

// Encontrar correos de trabajo
const correosDetrabajo = persona.correos.filter((correo) => correo.tipo === ClasificacionCorreo.TRABAJO);

// Agregar nuevo correo
persona.correos.push({
  correo: "[email protected]",
  tipo: "Backup",
  usuario: "ana.backup",
  dominio: "hotmail.com",
  valido: true,
});

await persona.save();

Usar la función parseCorreo

import { parseCorreo } from "@jysperu/schema-correo";

// Uso básico - extrae automáticamente usuario y dominio
const correo1 = parseCorreo("[email protected]");
console.log(correo1);
// { correo: "[email protected]", usuario: "usuario", dominio: "ejemplo.com" }

// Con configuración adicional
const correo2 = parseCorreo("[email protected]", {
  tipo: "Trabajo",
  nombre: "Ana García",
  valido: true
});
console.log(correo2);
// {
//   correo: "[email protected]",
//   usuario: "ana.garcia",
//   dominio: "empresa.com",
//   tipo: "Trabajo",
//   nombre: "Ana García",
//   valido: true
// }

// Crear múltiples correos parseados
const correos = [
  "[email protected]",
  "[email protected]",
  "[email protected]"
].map(email => parseCorreo(email, { valido: true }));

console.log(correos);

📊 Esquema de Datos

✅ Campo Obligatorio

| Campo | Tipo | Validación | Descripción | | ------- | -------- | ------------------------------- | ---------------------------------- | | correo | String | Required, trim, formato email | Dirección de correo electrónico |

⚙️ Campos Opcionales

| Campo | Tipo | Validación/Enum | Defecto | Descripción | | ------------ | --------- | ------------------------ | ---------- | ------------------------------------- | | tipo | String | Min 1 char, personalizable | "Personal" | Clasificación (Trabajo/Personal) | | nombre | String | Max 100 chars | - | Nombre de la persona | | usuario | String | Max 64 chars, lowercase | - | Parte antes del @ (usuario) | | dominio | String | Max 255 chars, lowercase | - | Parte después del @ (dominio) | | valido | Boolean | true/false | false | Formato de correo válido | | verificado | Boolean | true/false | false | Correo verificado por el usuario |

🏷️ Clasificaciones Personales

enum ClasificacionCorreo {
  TRABAJO = "Trabajo",   // 🏢 Correo laboral
  PERSONAL = "Personal", // 👤 Correo personal
}

💡 Ejemplos de Datos

📧 Correo Personal (Completo)

const correoCompleto: ICorreo = {
  correo: "[email protected]",
  tipo: "Personal",
  nombre: "Ana García",
  usuario: "ana.garcia",
  dominio: "gmail.com",
  valido: true,
  verificado: true,
};

🏢 Correo de Trabajo

const correoTrabajo: ICorreo = {
  correo: "[email protected]",
  tipo: "Trabajo",
  nombre: "Juan Pérez",
  usuario: "jperez",
  dominio: "empresa.com.pe",
  valido: true,
  verificado: false,
};

🔄 Correo Temporal

const correoTemporal: ICorreo = {
  correo: "[email protected]",
  tipo: "Temporal",
  nombre: "Usuario Temporal",
  usuario: "temp.user",
  dominio: "10minutemail.com",
  valido: true,
  verificado: false,
};

🏫 Correo Educativo

const correoEducativo: ICorreo = {
  correo: "[email protected]",
  tipo: "Educativo",
  nombre: "Estudiante Universitario",
  usuario: "estudiante",
  dominio: "universidad.edu",
  valido: true,
  verificado: true,
};

🔧 Configuración del Esquema

// Configuración Mongoose
{
  strict: false,        // Permite campos adicionales
  timestamps: true,     // createdAt, updatedAt automáticos
  _id: true             // Cada correo tiene su propio ID
}

// Configuración Joi
{
  stripUnknown: false,  // Mantiene campos extra
  allowUnknown: true,   // Permite propiedades no definidas
  convert: true,        // Conversión automática de tipos
  abortEarly: false     // Muestra todos los errores
}

📋 JSON Schema Standalone

El archivo correo.schema.json se genera automáticamente en cada build:

# Usar correo.schema.json directamente
curl -O https://gitlab.com/tiny.node/schema/correo/-/raw/main/dist/correo.schema.json

# Validar con cualquier validador JSON Schema
cat data.json | ajv validate -s correo.schema.json

🧪 Testing y Validación

// Test básico con Joi
import { JoiSchemaCorreo } from "@jysperu/schema-correo";

const testCases = [
  { correo: "[email protected]", valid: true },
  { correo: "", valid: false }, // Vacío
  { correo: "correo-invalido", valid: false }, // Sin @
  { correo: "test@", valid: false }, // Sin dominio
];

testCases.forEach((test) => {
  const result = JoiSchemaCorreo.validate(test);
  console.log(`${test.correo}: ${result.error ? "❌" : "✅"}`);
});

📦 Build y Distribución

# Construir el proyecto
npm run build

# Genera automáticamente:
# └── dist/
#     ├── correo.es.js       # ESM
#     ├── correo.cjs.js      # CommonJS
#     ├── correo.umd.js      # UMD
#     ├── *.d.ts             # TypeScript definitions
#     └── correo.schema.json # JSON Schema

🔗 Enlaces y Recursos

📄 Licencia

MIT License - Consulta el archivo LICENSE para detalles completos.

MIT License - Copyright (c) 2025 JYS Perú

Desarrollado con ❤️ por JYS Perú