@mailcore-hq/node 0.0.0-stage → 0.2.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +160 -2
- package/SECURITY.md +27 -0
- package/dist/index.cjs +1448 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1630 -0
- package/dist/index.d.ts +1630 -0
- package/dist/index.js +1422 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +46 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +14 -0
- package/dist/react.d.ts +14 -0
- package/dist/react.js +15 -0
- package/dist/react.js.map +1 -0
- package/docs/cobertura.md +83 -0
- package/docs/contrato-sdk.md +30 -0
- package/docs/desempenho.json +24 -0
- package/docs/desempenho.md +23 -0
- package/docs/integracao-api.json +32 -0
- package/docs/publicacao.md +20 -0
- package/docs/roteiro-sdks.md +43 -0
- package/docs/verificacao-postman.md +26 -0
- package/docs/verificacao.md +120 -0
- package/package.json +100 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Alterações
|
|
2
|
+
|
|
3
|
+
## 0.2.1-alpha.1 — 14/11/2026
|
|
4
|
+
|
|
5
|
+
Compatibiliza o transporte com runtimes Web que não aceitam o modo de
|
|
6
|
+
redirecionamento `error`. O cliente usa `manual` e recusa respostas 3xx antes
|
|
7
|
+
de processar o corpo, sem encaminhar credenciais a outro destino. O resultado
|
|
8
|
+
preserva o status em `redirecionamento_recusado`.
|
|
9
|
+
|
|
10
|
+
As integrações serverless reutilizam este cliente; exemplos, runtimes e alcance
|
|
11
|
+
dos testes são mantidos no repositório próprio de integrações.
|
|
12
|
+
|
|
13
|
+
## 0.2.0-alpha.1 — 14/11/2026
|
|
14
|
+
|
|
15
|
+
Amplia a integração para campanhas, automações, eventos personalizados,
|
|
16
|
+
recebimento, caixas de entrada e concessões da CLI. Inclui envio direto composto
|
|
17
|
+
com Cc/Cco, cabeçalhos, remetente com nome e CID; capacidades/rastreamento de
|
|
18
|
+
domínios; versões, pastas, prévias e teste de modelos; exportações de contatos.
|
|
19
|
+
|
|
20
|
+
Downloads por fluxo mantêm prazo, cancelamento, backpressure e limite de bytes
|
|
21
|
+
configurável. Os cabeçalhos base são privados e imutáveis, com cópia por operação.
|
|
22
|
+
Os tipos de eventos de webhook acompanham os eventos atuais do servidor.
|
|
23
|
+
|
|
24
|
+
Documentação passa a descrever somente o contrato e a identidade Mailcore.
|
|
25
|
+
Inclui testes de integração com API/PostgreSQL TLS isolados e medição local de
|
|
26
|
+
desempenho. Nenhuma publicação npm ou implantação.
|
|
27
|
+
|
|
28
|
+
## 0.1.0-alpha.1 — 13/11/2026
|
|
29
|
+
|
|
30
|
+
Primeira biblioteca Mailcore para Node.js/TypeScript, com implementação própria.
|
|
31
|
+
Inclui e-mails e lotes, agendamento, anexos, domínios, chaves, contatos e catálogos,
|
|
32
|
+
importações, modelos e webhooks conforme o contrato existente do Mailcore.
|
|
33
|
+
|
|
34
|
+
Pacote ESM/CommonJS com tipos, renderização React opcional, HTTPS, cancelamento,
|
|
35
|
+
prazo de requisição, idempotência explícita e verificação de assinatura Svix.
|
|
36
|
+
Sem repetição automática. Versão local, sem publicação no npm.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mailcore
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,161 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SDK Mailcore para Node.js e TypeScript
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Cliente da API Mailcore com tipos TypeScript, módulos ESM/CommonJS e recursos organizados por domínio. Requer **Node.js 20.19.0 ou superior**, com chaves mantidas no servidor.
|
|
4
|
+
|
|
5
|
+
Versão **`0.2.1-alpha.1`**, pacote **`@mailcore-hq/node`**. A publicação no registro está em preparação. O código-fonte é mantido em [mailcore-hq/mailcore-node](https://github.com/mailcore-hq/mailcore-node). Consulte a [cobertura dos métodos](docs/cobertura.md), o [contrato](docs/contrato-sdk.md), a [verificação executada](docs/verificacao.md) e o [roteiro dos próximos SDKs](docs/roteiro-sdks.md).
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
Após a publicação desta versão no npm:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @mailcore-hq/node@alpha
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
A versão alpha identifica a distribuição inicial; fixe a versão quando precisar de builds reproduzíveis.
|
|
16
|
+
|
|
17
|
+
### Desenvolver e instalar localmente
|
|
18
|
+
|
|
19
|
+
No repositório da biblioteca:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm ci
|
|
23
|
+
npm run check
|
|
24
|
+
npm pack --pack-destination /tmp
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
No projeto consumidor:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install /tmp/mailcore-hq-node-0.2.1-alpha.1.tgz
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`check` verifica tipos, testes, build, instalação em consumidores separados e formatação. `pack` gera o artefato local sem publicar. A compatibilidade comprovada de runtimes e consumidores está em [verificacao.md](docs/verificacao.md); usar ESM ou CommonJS não comprova todos os frameworks ou ambientes serverless.
|
|
34
|
+
|
|
35
|
+
## Enviar o primeiro e-mail
|
|
36
|
+
|
|
37
|
+
Configure `MAILCORE_API_KEY` no ambiente protegido do servidor. Use um domínio verificado e uma chave com permissão de envio.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { Mailcore } from '@mailcore-hq/node';
|
|
41
|
+
|
|
42
|
+
const mailcore = new Mailcore(); // Lê MAILCORE_API_KEY.
|
|
43
|
+
const { dados, erro } = await mailcore.emails.enviar(
|
|
44
|
+
{
|
|
45
|
+
remetente: 'notificacoes@seudominio.com.br',
|
|
46
|
+
destinatarios: ['cliente@example.com'],
|
|
47
|
+
assunto: 'Pedido recebido',
|
|
48
|
+
html: '<p>Recebemos seu pedido.</p>',
|
|
49
|
+
texto: 'Recebemos seu pedido.',
|
|
50
|
+
},
|
|
51
|
+
{ chaveIdempotencia: 'pedido-123-confirmacao' },
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
if (erro !== null) throw new Error(erro.mensagem);
|
|
55
|
+
console.log(dados.id, dados.estado);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
HTTP 202 confirma uma intenção persistida; acompanhe a entrega por consulta ou webhook. Também é possível fornecer a chave explicitamente ao construtor. Em CommonJS: `const { Mailcore } = require('@mailcore-hq/node')`.
|
|
59
|
+
|
|
60
|
+
Rotas de servidor de frameworks JavaScript reutilizam esta biblioteca. Não exponha a chave em componentes de navegador, bundles públicos ou variáveis destinadas ao cliente. A detecção de navegador da biblioteca é uma proteção adicional, sem substituir a separação do código servidor.
|
|
61
|
+
|
|
62
|
+
## Conteúdo, cópias e modelos
|
|
63
|
+
|
|
64
|
+
O envio individual com HTML/texto ou `react` aceita `cc`, `cco`, `cabecalhos` de mensagem, nome de exibição no remetente e anexos com `id_conteudo` para imagens CID. Destinatários, Cc e Cco usam endereços sem nome de exibição. `cabecalhos` no pedido pertence ao e-mail; `opcoes.cabecalhos` pertence à requisição HTTP. O servidor valida os nomes permitidos e protege cabeçalhos reservados.
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const resultado = await mailcore.emails.enviar({
|
|
68
|
+
remetente: 'Equipe <notificacoes@seudominio.com.br>',
|
|
69
|
+
destinatarios: ['cliente@example.com'],
|
|
70
|
+
cc: ['equipe@example.com'],
|
|
71
|
+
cco: ['arquivo@example.com'],
|
|
72
|
+
assunto: 'Pedido acompanhado',
|
|
73
|
+
html: '<p>Seu pedido está em processamento.</p>',
|
|
74
|
+
cabecalhos: { 'X-Pedido': '123' },
|
|
75
|
+
});
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Anexos são enviados em `anexos: [{ nome, tipo_conteudo, conteudo_base64, id_conteudo? }]`. O conteúdo é Base64 padrão, sem prefixo `data:`. Para CID, use no HTML o mesmo identificador em `src="cid:identificador"`. O envio transacional não aceita anexos por URL.
|
|
79
|
+
|
|
80
|
+
Um modelo publicado é enviado com `modelo: { id: 'boas-vindas', variaveis: { NOME: 'Ana' } }` e `destinatarios`. Remetente, assunto e resposta podem usar os padrões publicados ou overrides. **Modelo não combina com `html`, `texto`, `react`, Cc/Cco, cabeçalhos ou CID** no contrato atual. **Lotes não aceitam Cc/Cco, cabeçalhos ou anexos**. Os tipos distinguem essas modalidades; o SDK não apaga silenciosamente campos incompatíveis.
|
|
81
|
+
|
|
82
|
+
Um lote contém de 1 a 100 mensagens, mantém a ordem e é aceito atomicamente. `mailcore.lotes.enviar(mensagens, opcoes?)` faz uma requisição, sem dividir a intenção.
|
|
83
|
+
|
|
84
|
+
## React opcional
|
|
85
|
+
|
|
86
|
+
Projetos que enviam apenas HTML/texto não precisam de React. Para componentes no servidor:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install react react-dom @react-email/render
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { createElement } from 'react';
|
|
94
|
+
|
|
95
|
+
const resultado = await mailcore.emails.enviar({
|
|
96
|
+
remetente: 'notificacoes@seudominio.com.br',
|
|
97
|
+
destinatarios: ['cliente@example.com'],
|
|
98
|
+
assunto: 'Pedido recebido',
|
|
99
|
+
react: createElement('p', null, 'Recebemos seu pedido.'),
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
O componente é renderizado localmente antes da requisição. Texto simples é gerado quando `texto` é omitido; `texto: ''` e `texto: null` são preservados. Para renderizar e persistir o conteúdo antes de enviá-lo, importe `renderizarEmail` de `@mailcore-hq/node/react`. O backend recebe HTML/texto e não executa React. A mesma opção funciona em lotes sem composição, renderizados em sequência.
|
|
104
|
+
|
|
105
|
+
## Recursos e permissões
|
|
106
|
+
|
|
107
|
+
`mailcore` oferece `emails`, `lotes`, `dominios`, `chavesApi`, `contatos`, `propriedadesContatos`, `segmentos`, `topicos`, `modelos`, `webhooks`, `campanhas`, `automacoes`, `eventos`, `recebimento`, `caixas` e `cli.concessoes`. A [cobertura](docs/cobertura.md) lista todos os métodos e suas limitações.
|
|
108
|
+
|
|
109
|
+
Chaves `sending_access` atendem ao envio transacional, inclusive com modelos publicados, e podem ser restritas a um domínio. Consultas e gestão dependem de uma chave Full com escopos atuais; operações como exportar contatos e administrar concessões da CLI exigem também papel administrativo válido. O servidor revalida os direitos. O SDK não implementa sessão, autenticação interativa ou interfaces administrativas privadas.
|
|
110
|
+
|
|
111
|
+
Edição/publicação de modelos, campanhas, automações, caixas, conversas e rascunhos seguem a revisão exigida pelo respectivo pedido. Um conflito 409 deve ser tratado pela aplicação; o SDK não atualiza a revisão nem sobrescreve a edição concorrente.
|
|
112
|
+
|
|
113
|
+
## Resultados, opções e paginação
|
|
114
|
+
|
|
115
|
+
Operações HTTP retornam `{ dados, erro, cabecalhos }`. Verifique `erro !== null`: falhas retornam `dados: null` e `erro: { codigo, mensagem, status }`; sucesso retorna `erro: null`. Exclusões sem corpo podem retornar `dados: null` com sucesso. Configuração inválida, renderização React e assinatura inválida podem lançar exceções.
|
|
116
|
+
|
|
117
|
+
Todos os métodos HTTP aceitam `OpcoesRequisicao` no último argumento: `sinal`, `tempoLimiteMs`, `limiteRespostaBytes`, `chaveIdempotencia` e cabeçalhos HTTP adicionais permitidos. A origem padrão é `https://mailcore.com.br/v1`; o prazo padrão é **30 segundos** e o limite de resposta é **16 MiB**, ajustável por chamada. `urlBase`, prazo padrão e `fetch` controlado são configuráveis no construtor. HTTPS é obrigatório; `permitirHttpLocal` habilita somente loopback para testes.
|
|
118
|
+
|
|
119
|
+
Falhas HTTP preservam o erro e status da API. Os códigos locais incluem `erro_http`, `resposta_invalida`, `falha_de_rede`, `requisicao_cancelada`, `resposta_excedida` e `redirecionamento_recusado`. Cabeçalhos de resposta permitem consultar identificadores de requisição. O cliente não envia cookies nem segue redirecionamentos.
|
|
120
|
+
|
|
121
|
+
Cada listagem carrega uma página. O cursor pode ser `proximo` ou `proximo_cursor`, conforme o recurso; passe-o como `antes`. Recebimento também admite `depois`, excluindo `antes`. Consulte os [envelopes por recurso](docs/cobertura.md#paginação) e processe as páginas sem acumular toda a base em memória.
|
|
122
|
+
|
|
123
|
+
## Exportações e downloads grandes
|
|
124
|
+
|
|
125
|
+
`contatos.exportacoes` cria, consulta e baixa exportações autorizadas. `baixar` acumula bytes; `baixarFluxo` fornece um `ReadableStream<Uint8Array>` com backpressure. O exemplo grava uma exportação existente pela rota autenticada do Mailcore, com teto explícito de 64 MiB:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import { createWriteStream } from 'node:fs';
|
|
129
|
+
import { Readable } from 'node:stream';
|
|
130
|
+
import { pipeline } from 'node:stream/promises';
|
|
131
|
+
import type { ReadableStream as FluxoWebNode } from 'node:stream/web';
|
|
132
|
+
|
|
133
|
+
async function salvarExportacao(exportacaoId: string, destino: string) {
|
|
134
|
+
const download = await mailcore.contatos.exportacoes.baixarFluxo(exportacaoId, {
|
|
135
|
+
limiteRespostaBytes: 64 * 1024 * 1024,
|
|
136
|
+
tempoLimiteMs: 60_000,
|
|
137
|
+
});
|
|
138
|
+
if (download.erro !== null) throw new Error(download.erro.mensagem);
|
|
139
|
+
|
|
140
|
+
await pipeline(
|
|
141
|
+
Readable.fromWeb(download.dados as FluxoWebNode<Uint8Array>),
|
|
142
|
+
createWriteStream(destino, { flags: 'wx', mode: 0o600 }),
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
O cast do exemplo concilia as declarações de fluxo Web do Node com as da biblioteca DOM em projetos TypeScript; não transforma o fluxo. Consuma ou cancele o fluxo. Falhas de leitura, cancelamento e excesso do teto depois da abertura são rejeições do fluxo; trate a falha de `pipeline` e o arquivo parcial na aplicação. O prazo continua válido durante o consumo.
|
|
148
|
+
|
|
149
|
+
`recebimento.baixarOriginalFluxo` e `recebimento.baixarAnexoFluxo` também permitem consumo em fluxo. As variantes `baixarOriginal`/`baixarAnexo` retornam bytes em memória. Detalhes recebidos com HTML `data_uri` podem ultrapassar o teto padrão por expansão dos anexos: prefira `formato_html: 'cid'` ou informe um `limiteRespostaBytes` adequado ao seu orçamento e trate `resposta_excedida`. Um teto maior, como 32 MiB, não garante acomodar todo detalhe possível. URLs temporárias nos metadados são sensíveis: a biblioteca não as segue nem anexa Bearer a destinos externos.
|
|
150
|
+
|
|
151
|
+
## Idempotência e webhooks
|
|
152
|
+
|
|
153
|
+
O SDK **não repete requisições automaticamente**, inclusive em 429, 503 ou timeout. Interrupção não comprova rejeição no servidor. Persista corpo e chave da intenção antes de operações que suportam idempotência; preserve-os ao repetir explicitamente. Envios transacionais oferecem `emails.obterPorIdempotencia` e `lotes.obterPorIdempotencia`, sujeitos a permissão de leitura. A chave vale por 24 horas; reutilizá-la após expirar pode criar outra intenção. Renderizações dependentes de hora ou dados externos devem ter seu resultado persistido para uma repetição fiel.
|
|
154
|
+
|
|
155
|
+
`verificarAssinatura(corpoBruto, cabecalhos, segredo)` é exportado pelo pacote principal. Usa o segredo `whsec_...`, HMAC-SHA256 e os cabeçalhos `svix-id`, `svix-timestamp` e `svix-signature`, com tolerância de cinco minutos. Passe o corpo bruto antes de qualquer parser JSON. Só processe eventos depois da verificação e deduplique `svix-id` em armazenamento durável; o verificador não guarda estado.
|
|
156
|
+
|
|
157
|
+
## Desenvolvimento e validação
|
|
158
|
+
|
|
159
|
+
Código modular em `src/recursos/`, transporte compartilhado, testes em `testes/` e exemplos em `exemplos/`. `npm run check` executa as verificações da distribuição. Resultados de integração estão em [verificacao.md](docs/verificacao.md); as [medições locais](docs/desempenho.md) descrevem seu cenário e seus limites. Não demonstram implantação nem capacidade de entrega SMTP em produção. Não registrar credenciais, corpos, destinatários ou URLs de capacidade.
|
|
160
|
+
|
|
161
|
+
Licença [MIT](LICENSE).
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Segurança
|
|
2
|
+
|
|
3
|
+
Use a biblioteca no servidor, com uma chave de API guardada em variável de
|
|
4
|
+
ambiente ou gerenciador de segredos. Prefira Sending quando a aplicação precisa
|
|
5
|
+
somente enviar. Revogue chaves expostas pelo painel Mailcore.
|
|
6
|
+
|
|
7
|
+
HTTPS e validação de certificados devem permanecer ativos. A biblioteca não
|
|
8
|
+
persiste mensagens ou chaves, não envia cookies e não segue redirecionamentos.
|
|
9
|
+
Não há repetição automática após falhas de comunicação. A chave e o corpo da
|
|
10
|
+
intenção devem ser preservados pelo sistema chamador para reconciliação.
|
|
11
|
+
|
|
12
|
+
Não publique chaves, conteúdo de mensagens ou dados pessoais em issues, logs
|
|
13
|
+
e relatórios. Ao identificar uma vulnerabilidade, envie uma reprodução
|
|
14
|
+
sanitizada para [github@mailcore.com.br](mailto:github@mailcore.com.br).
|
|
15
|
+
Compartilhe inicialmente apenas o necessário para investigar o problema, sem
|
|
16
|
+
credenciais ou dados de terceiros.
|
|
17
|
+
|
|
18
|
+
O recebimento de webhooks exige validação da assinatura sobre o corpo bruto,
|
|
19
|
+
controle temporal e deduplicação durável do identificador de entrega. A aplicação
|
|
20
|
+
é responsável por limites, filas, retenção, criptografia de sua persistência e
|
|
21
|
+
autorização das operações que disparam mensagens.
|
|
22
|
+
|
|
23
|
+
Esta versão alpha tem validação local documentada em `docs/verificacao.md`.
|
|
24
|
+
Durante a fase alpha, mantenha a versão instalada atualizada e consulte o
|
|
25
|
+
changelog antes de atualizar. O workflow de verificação não publica pacotes ou deploys. A publicação npm
|
|
26
|
+
exige acionamento manual do workflow separado e vínculo OIDC no registro,
|
|
27
|
+
conforme [publicacao.md](docs/publicacao.md).
|