UNPKG

core-value-objects

Version:

Biblioteca de Value Objects reutilizáveis para domínios de negócio

385 lines (265 loc) 8.26 kB
# 📦 Core Value Objects Biblioteca de Value Objects reutilizáveis para aplicações Node.js/TypeScript, com foco em domínios brasileiros como CPF/CNPJ, E-mail, Telefone e outros tipos de dados comuns. --- ## ✨ Objetivo Centralizar e padronizar a validação, formatação e comparação de valores fundamentais utilizados em diversos contextos de negócio, seguindo princípios de Domain-Driven Design (DDD) e Clean Architecture. --- ## 🚀 Instalação ### Via NPM: ```bash npm install core-value-objects ``` ### Via Yarn: ```bash yarn add core-value-objects ``` ### Local (link simbólico): ```bash npm install /caminho/absoluto/para/core-value-objects # ou yarn add /caminho/absoluto/para/core-value-objects ``` ### Ou via GitHub: ```bash npm install git+https://github.com/ostrowskijr/core-value-objects.git # ou yarn add git+https://github.com/ostrowskijr/core-value-objects.git ``` --- ## 📦 Value Objects disponíveis ### 🏠 **Endereços e Localização** #### ✅ `Cep` ```ts import { Cep } from "core-value-objects"; const cep = new Cep("80000-000"); cep.getValue(); // "80000000" cep.getValueFormatted(); // "80000-000" ``` #### ✅ `Cidade` ```ts import { Cidade } from "core-value-objects"; const cidade = new Cidade("Curitiba"); cidade.getValue(); // "Curitiba" ``` #### ✅ `Logradouro` ```ts import { Logradouro } from "core-value-objects"; const logradouro = new Logradouro("Rua das Flores"); logradouro.getValue(); // "Rua das Flores" ``` #### ✅ `UF` ```ts import { UF } from "core-value-objects"; const uf = new UF(" sp "); uf.getValue(); // "SP" ``` #### ✅ `Endereco` (VO Composto) ```ts import { Endereco, Cep, Cidade, Logradouro, UF } from "core-value-objects"; const endereco = new Endereco({ cep: new Cep("80000-000"), uf: new UF("PR"), cidade: new Cidade("Curitiba"), logradouro: new Logradouro("Rua Teste"), numero: "123", bairro: "Centro", complemento: "Apto 456", }); endereco.getValueFormatted(); // "Rua Teste, 123 - Centro, Curitiba - PR, CEP: 80000-000, Apto 456" ``` ### 👤 **Identificação e Dados Pessoais** #### ✅ `CpfCnpj` ```ts import { CpfCnpj } from "core-value-objects"; const cpf = new CpfCnpj("123.456.789-09"); cpf.getValue(); // "12345678909" cpf.getValueFormatted(); // "123.456.789-09" const cnpj = new CpfCnpj("12.345.678/0001-90"); cnpj.getValue(); // "12345678000190" cnpj.getValueFormatted(); // "12.345.678/0001-90" ``` #### ✅ `Crp` ```ts import { Crp } from "core-value-objects"; const crp = new Crp("06/12345"); crp.getValue(); // "0612345" crp.getValueFormatted(); // "06/12345" ``` #### ✅ `Nome` ```ts import { Nome } from "core-value-objects"; // Nome válido com nome e sobrenome const nome = new Nome("João Silva"); nome.getValue(); // "João Silva" // Nome com múltiplas palavras (nome, sobrenome, etc.) const nomeCompleto = new Nome(" João da Silva "); nomeCompleto.getValue(); // "João da Silva" (espaços normalizados) // Nome com acentos e caracteres especiais const nomeEspecial = new Nome("José D'Ávila"); nomeEspecial.getValue(); // "José D'Ávila" // Validações automáticas: // ✅ Deve conter ao menos nome e sobrenome // ✅ Cada parte deve ter ao menos 2 caracteres // ✅ Aceita letras, acentos, espaços, hífens e apóstrofos // ❌ Rejeita: "João" (apenas uma palavra), "J Silva" (parte muito curta) ``` #### ✅ `UUID` ```ts import { UUID } from "core-value-objects"; // Gera um UUID automático const uuid = new UUID(); uuid.getValue(); // "550e8400-e29b-41d4-a716-446655440000" // Ou use um UUID específico const uuidCustom = new UUID("550e8400-e29b-41d4-a716-446655440000"); ``` ### 📞 **Comunicação** #### ✅ `Email` ```ts import { Email } from "core-value-objects"; const email = new Email(" USUARIO@dominio.com "); email.getValue(); // "usuario@dominio.com" ``` #### ✅ `Telefone` ```ts import { Telefone } from "core-value-objects"; const tel = new Telefone("(11) 98765-4321"); tel.getValue(); // "11987654321" tel.getValueFormatted(); // "(11) 98765-4321" ``` ### 💳 **Financeiro e Pagamentos** #### ✅ `CreditCard` ```ts import { CreditCard } from "core-value-objects"; const card = new CreditCard("4992 7345 6789 1234"); card.getValue(); // "4992734567891234" card.getValueFormatted(); // "4992 7345 6789 1234" ``` #### ✅ `ValorReal` ```ts import { ValorReal } from "core-value-objects"; const valor = new ValorReal(1234.56); valor.getValue(); // 1234.56 valor.getValueFormatted(); // "R$ 1.234,56" ``` #### ✅ `Percentual` ```ts import { Percentual } from "core-value-objects"; const percentual = new Percentual(25.5); percentual.getValue(); // 25.5 percentual.getValueFormatted(); // "25.50%" // Valida automaticamente: 0% <= percentual <= 100% ``` ### 📅 **Data e Hora** #### ✅ `Data` ```ts import { Data } from "core-value-objects"; const data = new Data("2025-07-31"); data.getValue(); // Objeto Date de '2025-07-31T03:00:00.000Z' data.getValueFormatted(); // "31/07/2025" ``` #### ✅ `Horario` ```ts import { Horario } from "core-value-objects"; const horario = new Horario("14:30"); horario.getValue(); // "14:30" horario.getValueFormatted(); // "14h30" ``` ### 🔐 **Segurança** #### ✅ `Password` ```ts import { Password } from "core-value-objects"; // Lança erro se a senha não atender aos critérios de segurança const senha = new Password("Senha@123"); ``` --- ## ✅ Validações automáticas Todos os VOs lançam `Error` se o valor for inválido, logo são seguros por construção. As validações incluem: - **Formato**: Verificação de padrões e estruturas válidas - **Faixa de valores**: Percentuais entre 0% e 100%, valores positivos, etc. - **Integridade**: Validação de CPF/CNPJ, cartão de crédito, etc. - **Segurança**: Critérios de senha forte - **Composição**: Nomes devem conter ao menos nome e sobrenome, cada parte com mínimo de 2 caracteres --- ## 🧪 Testes Para rodar os testes unitários: ```bash # Instalar dependências npm install # ou yarn install # Executar testes npm test # ou yarn test ``` --- ## 🛠️ Build ```bash npm run build # ou yarn build ``` Gera os arquivos `.js` e `.d.ts` dentro da pasta `dist/`. --- ## 🏗️ Arquitetura Este projeto segue os princípios de: - **Domain-Driven Design (DDD)**: Value Objects como conceito central do domínio - **Clean Architecture**: Separação clara de responsabilidades - **Clean Code**: Código legível, testável e mantível - **SOLID**: Princípios de design orientado a objetos --- ## 📦 **Gerenciamento de Dependências** ### **NPM vs Yarn** Este projeto suporta tanto **NPM** quanto **Yarn** como gerenciadores de pacotes. Escolha o que preferir: | Comando | NPM | Yarn | | -------------------- | ---------------------- | ------------------- | | **Instalar** | `npm install` | `yarn install` | | **Adicionar** | `npm install <pkg>` | `yarn add <pkg>` | | **Testes** | `npm test` | `yarn test` | | **Build** | `npm run build` | `yarn build` | | **Dev Dependencies** | `npm install -D <pkg>` | `yarn add -D <pkg>` | --- ## 🚀 **Scripts Disponíveis** ### **Desenvolvimento** ```bash # Instalar dependências npm install # ou yarn install # Executar testes em modo watch npm run test:watch # ou yarn test:watch # Executar testes com coverage npm run test:cov # ou yarn test:cov ``` ### **Produção** ```bash # Build do projeto npm run build # ou yarn build # Limpar build (Linux/Mac) npm run clean # ou yarn clean # No Windows, use: # rmdir /s dist # ou delete manualmente a pasta dist/ ``` --- ## 🔍 **Validações Específicas por VO** ### 📝 **Nome** - **Estrutura**: Deve conter ao menos nome e sobrenome - **Comprimento**: Cada parte deve ter mínimo de 2 caracteres - **Caracteres**: Aceita letras, acentos, espaços, hífens e apóstrofos - **Normalização**: Remove espaços múltiplos automaticamente - **Exemplos válidos**: "João Silva", "Maria da Silva", "José D'Ávila" - **Exemplos inválidos**: "João", "J Silva", "João123 Silva" --- ## 📝 Licença MIT - Luis A. Ostrowski Jr. <ostrowskijr@gmail.com>