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

nfse-nacional-core

v0.4.0

Published

Cliente do ADN (NFS-e Nacional): certificado A1, distribuição por NSU, leitura do XML e criptografia do certificado em repouso, extensível por plugins

Readme

nfse-nacional-core

Biblioteca Node para as APIs de contribuintes do ADN da NFS-e Nacional: abre o certificado A1, conecta por mTLS, percorre a distribuição por NSU, lê o XML da NFS-e e guarda o certificado cifrado. Não depende do Directus.

npm install nfse-nacional-core

Uso direto

import { abrirCertificado, ClienteAdn, descompactarXml, lerNfse, sincronizar } from 'nfse-nacional-core';

const certificado = abrirCertificado(await readFile('empresa.pfx'), process.env.SENHA!);
const cliente = new ClienteAdn({ certificado, ambiente: 'producao_restrita' });

await sincronizar({
	cliente,
	ultimoNsu: 0,
	aoReceberLote: async (itens, ultimoNsu) => {
		for (const item of itens) console.log(lerNfse(descompactarXml(item.ArquivoXml)));
		// grave os itens e o novo cursor (ultimoNsu) antes de retornar
	},
});

cliente.fechar();

Arquitetura: padrão Plugin

O núcleo segue o padrão Plugin de Martin Fowler (Patterns of Enterprise Application Architecture): as interfaces ficam no núcleo (Separated Interface), as implementações são registradas por nome e a escolha acontece na configuração, em tempo de execução, nunca no código.

| Ponto de extensão | Interface | Escolhido por | Embutidos | | ------------------------ | ------------------------- | ---------------------------------- | ------------------------------------------------------ | | Provedor de chave-mestra | ProvedorDeChave | NFSE_CHAVE_PROVEDOR | env, arquivo, dividida | | Fonte de certificado | FonteDeCertificado | origemCertificado da empresa | arquivo (a extensão do Directus registra directus) | | Repositório das notas | RepositorioNfse | quem chama sincronizarEmpresa | (a extensão do Directus fornece o seu) | | Relator de divergências | RelatorDeDivergencias | NFSE_RELATOR (com consentimento) | rele (relé oficial ou NFSE_URL_RELE) | | Registro de divergências | RepositorioDivergencias | quem chama sincronizarEmpresa | (a extensão do Directus fornece o seu) |

import { carregarPlugins, criarRegistros, listaDaConfig, sincronizarEmpresa } from 'nfse-nacional-core';

const registros = criarRegistros(); // já com as implementações embutidas
await carregarPlugins(listaDaConfig(process.env.NFSE_PLUGINS), registros); // pacotes externos

await sincronizarEmpresa(empresa, {
	repositorio: meuRepositorio, // implementa RepositorioNfse
	fontesDeCertificado: registros.fontesDeCertificado,
	config: process.env,
});

Eventos

lerEvento(xml) lê um evento do leiaute nacional (o código vem do nome do grupo, ex.: e101101). TIPOS_EVENTO traz os 16 tipos oficiais (Anexo II) e o efeito de cada um na nota; estadoDaNota(eventos) devolve ativa, cancelada, substituida ou bloqueada. Em DocumentoRecebido, o evento lido vem em evento (e a nota, em nota).

Contrato do ADN

CONTRATO_ADN lista o que esta versão sabe ler: versões de leiaute, valores de StatusProcessamento e TipoDocumento, campos obrigatórios do lote e campos essenciais da nota. A cada sincronização, verificarResposta, verificarItem e verificarNota geram divergências (tipo, detalhe, assinatura) quando o ADN foge disso. O detalhe passa por detalheSeguro, que corta sequências de dígitos: uma divergência nunca carrega dado fiscal. tratarDivergencias registra e, se houver relator, relata uma vez por assinatura; acompanharIssues consulta a API pública do GitHub e informa quando a issue for corrigida.

Escrevendo um plugin

Um pacote de plugins exporta (como default ou plugin) um objeto { nome, registrar(registros) }:

import type { PluginNfse, RegistrosNfse } from 'nfse-nacional-core';

const plugin: PluginNfse<RegistrosNfse> = {
	nome: 'fonte-vault',
	registrar({ fontesDeCertificado }) {
		fontesDeCertificado.registrar('vault', (config) => ({
			obter: async (empresa) => lerDoVault(config.VAULT_ADDR, empresa.cnpj), // { pfx, senha }
		}));
	},
};

export default plugin;

Nomes repetidos são recusados e um nome desconhecido gera erro listando os disponíveis. Nos testes, os registros aceitam dublês (Service Stub) no lugar do ADN, do repositório e da fonte.

Chave-mestra

npx nfse-nacional-core gerar-chave

Gera 32 bytes aleatórios em base64. Para o provedor dividida, gere duas: uma em NFSE_CHAVE_MESTRA e outra no arquivo de NFSE_CHAVE_MESTRA_ARQUIVO.

Licença

MIT