Aparência
TypeScript e monorepo sem mistério
Você vai aprender: reconhecer uma aplicação, um pacote e a responsabilidade de um tipo.
Um repositório, vários programas
A raiz declara os workspaces apps/* e packages/*. Cada aplicação tem uma entrada e um processo próprio. Os pacotes compartilham contratos ou acesso a bibliotecas.
| Área | Papel |
|---|---|
| apps/inverter-to-mqtt | Executa coleta e publicação |
| apps/mqtt-to-db | Executa assinatura e persistência |
| apps/admin | Executa API e interface administrativa |
| apps/mqtt-device-simulator | Publica exemplos fictícios no broker configurado |
| packages/mqtt | Compartilha formato, publicação e assinatura |
| packages/db | Compartilha schema e cliente Prisma |
O import de @campus/mqtt aponta ao pacote do repositório. Não é o endereço do broker.
Tipos não validam uma mensagem externa sozinhos
TypeScript ajuda durante desenvolvimento e compilação. Dados vindos da rede continuam sendo texto/bytes desconhecidos. O contrato usa Zod para validar em execução.
ReceivedTelemetry tem duas variantes: ok: true com dados válidos e ok: false com erro e conteúdo bruto. O if separa esses caminhos. Esse padrão é uma união discriminada.
Dependências passadas como parâmetros
Runtime recebe relógio, cliente, funções e banco como dependências. Nos testes, essas dependências podem ser objetos falsos em memória. Na entrada main.ts, recebem implementações reais.
Isso explica por que ler ou testar uma transformação é diferente de iniciar a aplicação.
Três perguntas para cada arquivo
- O que recebe?
- O que devolve ou envia?
- Acessa rede, banco, hardware ou apenas transforma valores?
Comece por mapa do código, depois leia preparação e fila.
Revisão: 06/10/2026. Base: package.json da raiz, interfaces MQTT e runtimes. Não é um tutorial completo da linguagem.