# Changelog

Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.

O formato é baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.0.0/),
e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR/).

## [2.0.0] - 2026-04-02

### 🚀 Adicionado

#### Type Safety com Generics

- Suporte a generics para tipagem de eventos: `EventBus<'event1' | 'event2'>`
- Sistema avançado de payload tipado: `EventBus<TEvents, TPayloadMap>`
- Interface `EventPayloadMap<TEvents>` para definir tipos de payload por evento
- Types auxiliares: `Unsubscribe`, `EventCallback<T>`, `ExtractEventPayload<>`
- Autocomplete completo de eventos e payloads em IDEs compatíveis com TypeScript

#### Sistema de Configuração

- Interface `EventBusConfig<TEvents>` para configuração flexível
- `allowedEvents` - lista de eventos permitidos (whitelist)
- `validateEvents` - validação runtime de eventos
- `onError` - handler customizado para erros em callbacks
- `logger` - logger customizado (substitui console)
- `enableMetrics` - coleta de métricas de uso

#### Métricas e Observabilidade

- Sistema de métricas opt-in com zero overhead quando desabilitado
- Interface `EventBusMetrics` com estatísticas completas
- Métrica de total de subscriptions, publishes e erros
- Métricas por evento individual
- Método `getMetrics()` para consulta de métricas
- Timestamps de última atividade

#### Múltiplas Instâncias

- Método estático `create(config)` para criar instâncias independentes
- Método estático `resetInstance()` para testes
- Suporte a namespaces e módulos isolados
- Cada instância pode ter configuração diferente

#### Inspeção e Debugging

- `getEventNames()` - lista eventos com subscribers ativos
- `hasSubscribers(eventName)` - verifica se evento tem subscribers
- `getSubscriberCount(eventName)` - conta subscribers de um evento
- `getConfig()` - retorna configuração atual (somente leitura)

#### Validação de Eventos

- Validação runtime opcional de nomes de eventos
- Mensagens de erro descritivas para eventos não permitidos
- Suporte a whitelist de eventos via `allowedEvents`

#### Error Handling Aprimorado

- Handler de erro customizável via config
- Contexto detalhado em erros (nome do evento, índice do callback)
- Logging customizável com fallback para console
- Erros em callbacks não interrompem execução dos demais

#### Documentação

- JSDoc completo em todos os métodos públicos
- Exemplos de uso inline na documentação
- Arquivo `examples/event-bus-usage.ts` com 12 exemplos práticos
- Guia de migração da v1.x para v2.0

### ⚠️ Modificado (Breaking Changes)

#### Campo `events` Agora é Privado

- **v1.x**: `public events: Record<string, EventCallback[]>`
- **v2.0**: `private events: Record<TEvents, GenericEventCallback[]>`
- **Migração**: Use os novos métodos públicos de inspeção:
    - `getEventNames()` ao invés de `Object.keys(bus.events)`
    - `hasSubscribers(event)` ao invés de `!!bus.events[event]`
    - `getSubscriberCount(event)` ao invés de `bus.events[event]?.length`

#### Assinatura do `getInstance()` Modificada

- **v1.x**: `getInstance(): EventBus`
- **v2.0**: `getInstance<TEvents, TPayloadMap>(config?: EventBusConfig<TEvents>): EventBus<TEvents, TPayloadMap>`
- **Migração**: Código existente continua funcionando, mas agora aceita configuração opcional
- **Nota**: Configuração só é aplicada na primeira chamada

#### Type do Callback Interno Modificado

- **v1.x**: `type EventCallback = (...args: any[]) => void`
- **v2.0**: `type GenericEventCallback = (...args: any[]) => void` (uso interno)
- **v2.0**: `type EventCallback<TPayload> = (payload: TPayload) => void` (uso público tipado)
- **Migração**: Uso público não é afetado, apenas types internos

### 🔧 Melhorado

- Performance otimizada para métricas (zero overhead com `enableMetrics=false`)
- Melhor isolamento entre instâncias
- Tratamento de erros mais robusto
- Mensagens de erro mais descritivas
- Documentação inline completa
- Suporte aprimorado a TypeScript strict mode

### 📚 Documentação

- Arquivo `MIGRATION_GUIDE.md` criado
- Arquivo `examples/event-bus-usage.ts` com 12 exemplos práticos
- JSDoc completo em toda a API pública
- Exemplos inline em todos os métodos

### 🛠️ Interno

- Refatoração completa seguindo princípios SOLID
- Separação de responsabilidades (validação, métricas, logging)
- Melhor encapsulamento com métodos privados auxiliares
- Código mais testável e modular

---

## [1.0.0] - Data Anterior

### Inicial

- Implementação básica do EventBus com pattern Singleton
- Métodos `subscribe()`, `unsubscribe()`, `publish()`
- Métodos `clearEvent()` e `clearAllEvents()`
- Try-catch básico em callbacks
- Campo `events` público

---

## Notas de Versão

### Sobre a v2.0.0

Esta é uma major release com **breaking changes**. A principal mudança é o campo `events` que passou de público para privado, corrigindo uma violação de encapsulamento da v1.x.

**Para quem deve atualizar:**

- ✅ Projetos TypeScript que querem type-safety
- ✅ Aplicações que precisam de validação de eventos
- ✅ Sistemas que requerem observabilidade e métricas
- ✅ Projetos que usam múltiplos módulos isolados

**Compatibilidade:**

- A v1.x será mantida em branch separado para bugfixes críticos
- Migration guide disponível em `MIGRATION_GUIDE.md`
- API básica (subscribe/publish) permanece compatível
- Apenas acesso direto a `events` requer mudança

**Bundle Size:**

- Aumento mínimo com tree-shaking adequado
- Métricas adicionam ~1KB quando habilitadas
- Zero overhead para features não utilizadas
