@brasil-fiscal/core

中文文档
1.6.0发布于 2026/05/02MITTypeScriptCommonJS零依赖近 30 天下载 6295

Infraestrutura compartilhada para documentos fiscais eletronicos brasileiros (NFe, CTe, MDFe). Certificado digital, assinatura XML, transporte mTLS, helpers.

原始使用文档
文档目录22 节
  1. Para que serve?
  2. Instalacao
  3. API
  4. Certificado Digital
  5. Assinatura XML
  6. Transporte mTLS
  7. Helpers XML
  8. SOAP
  9. Chave de Acesso
  10. Validacao de Documentos
  11. Constantes
  12. Erros
  13. Contratos (Interfaces)
  14. Criando um provider customizado
  15. Arquitetura
  16. Principios
  17. Requisitos
  18. Desenvolvimento
  19. Contribuindo
  20. Code Style
  21. Ecossistema @brasil-fiscal
  22. Licenca

@brasil-fiscal/core

Infraestrutura compartilhada para documentos fiscais eletronicos brasileiros. Certificado digital, assinatura XML, transporte mTLS, helpers e constantes — tudo que NFe, CTe e MDFe tem em comum.

Para que serve?

Este pacote eh a base dos projetos @brasil-fiscal/*. Ele contem a logica que eh identica entre NFe, CTe e MDFe:

  • Carregar certificado digital A1 (.pfx/.p12)
  • Assinar XML com XMLDSig (RSA-SHA1)
  • Comunicar com a SEFAZ via HTTPS com mTLS
  • Canonicalizacao C14N de XML
  • Gerar chave de acesso (44 digitos)
  • Validar CNPJ e CPF
  • Codigos IBGE das UFs
  • Classes de erro base

Voce provavelmente nao precisa instalar este pacote diretamente. Ele eh uma dependencia dos pacotes de documento fiscal:

PacoteDocumento
@brasil-fiscal/nfeNFe / NFC-e (Nota Fiscal Eletronica)
@brasil-fiscal/cteCTe (Conhecimento de Transporte)
@brasil-fiscal/mdfeMDFe (Manifesto de Documentos Fiscais)

Instalacao

Se voce esta construindo um pacote que depende do core:

npm install @brasil-fiscal/core

API

Certificado Digital

import { A1CertificateProvider } from '@brasil-fiscal/core';

const provider = new A1CertificateProvider(pfxBuffer, 'senha');
const cert = await provider.load();
// cert.privateKey, cert.certPem, cert.pfx, cert.password, cert.notAfter

Assinatura XML

import { DefaultXmlSigner } from '@brasil-fiscal/core';

const signer = new DefaultXmlSigner();
const xmlAssinado = signer.sign(xml, certificateData);

O signer detecta automaticamente o tipo de documento (infNFe, infCte, infMDFe, infEvento, infInut) e assina corretamente.

Transporte mTLS

import { NodeHttpSefazTransport } from '@brasil-fiscal/core';

const transport = new NodeHttpSefazTransport({ timeout: 30000 });
const response = await transport.send({
  url: 'https://nfe.sefaz.mt.gov.br/...',
  soapAction: '...',
  xml: envelopeXml,
  pfx: cert.pfx,
  password: cert.password
});

Helpers XML

import { tag, tagGroup, formatDate, escapeXml, padLeft } from '@brasil-fiscal/core';

tag('CNPJ', '12345678000195');           // <CNPJ>12345678000195</CNPJ>
tag('xNome', undefined);                  // '' (omite tags vazias)
tagGroup('emit', tag('CNPJ', '123'));     // <emit><CNPJ>123</CNPJ></emit>
formatDate(new Date(), '-03:00');         // '2024-04-28T10:00:00-03:00'

SOAP

import { extractSoapBody, extractTag } from '@brasil-fiscal/core';

const body = extractSoapBody(soapResponseXml);  // conteudo dentro de <soap:Body>
const cStat = extractTag(body, 'cStat');         // conteudo de <cStat>

Chave de Acesso

import { generateAccessKey, generateNumericCode } from '@brasil-fiscal/core';

const chave = generateAccessKey({
  uf: '51',
  dataEmissao: new Date(),
  cnpj: '12345678000195',
  modelo: '55',     // 55=NFe, 57=CTe, 58=MDFe, 65=NFCe
  serie: 1,
  numero: 1,
  tipoEmissao: 1,
  codigoNumerico: generateNumericCode()
});
// 44 digitos com digito verificador

Validacao de Documentos

import { isValidCnpj, isValidCpf, formatCnpj, formatCpf } from '@brasil-fiscal/core';

isValidCnpj('11222333000181');  // true
isValidCpf('52998224725');      // true
formatCnpj('11222333000181');   // '11.222.333/0001-81'
formatCpf('52998224725');       // '529.982.247-25'

Constantes

import { UF_CODES } from '@brasil-fiscal/core';

UF_CODES['MT'];  // '51'
UF_CODES['SP'];  // '35'

Erros

import { DFeError, CertificateError, SefazRejectError } from '@brasil-fiscal/core';

// DFeError — erro base de todos os documentos fiscais
// CertificateError — falha no certificado digital
// SefazRejectError — SEFAZ rejeitou o documento (cStat + xMotivo)
// SchemaValidationError — XML invalido contra XSD

Contratos (Interfaces)

O core define contratos que podem ser implementados por qualquer pacote:

ContratoResponsabilidadeImplementacao padrao
CertificateProviderCarregar certificados digitaisA1CertificateProvider
SefazTransportComunicacao HTTP com a SEFAZNodeHttpSefazTransport
XmlSignerAssinar XML com certificadoDefaultXmlSigner
SchemaValidatorValidar XML contra XSD(implementado em cada pacote)

Criando um provider customizado

import type { CertificateProvider, CertificateData } from '@brasil-fiscal/core';

export class MyCertificateProvider implements CertificateProvider {
  async load(): Promise<CertificateData> {
    // Sua logica (vault, HSM, banco de dados, etc.)
    return { pfx, password, notAfter, privateKey, certPem };
  }
}

Arquitetura

src/
  contracts/        Interfaces (CertificateProvider, SefazTransport, XmlSigner, SchemaValidator)
  infra/
    certificate/    A1CertificateProvider (carrega .pfx/.p12 via openssl)
    xml/            DefaultXmlSigner, canonicalize (C14N), xml-helper (tag, escapeXml)
    transport/      NodeHttpSefazTransport (mTLS), soap-helper (extractSoapBody)
  shared/
    errors/         DFeError, CertificateError, SefazRejectError, SchemaValidationError
    helpers/        CNPJ, CPF, mod11, access-key
    constants/      UF_CODES (codigos IBGE)

Principios

  • Zero dependencias em runtime — apenas node:crypto, node:https, node:child_process
  • Contratos primeiro — toda integracao externa eh uma interface
  • Falhar rapido — erros claros com classes tipadas
  • DI manual — sem containers, providers injetados via construtores

Requisitos

  • Node.js >= 18
  • OpenSSL instalado (para carregar certificados A1)

Desenvolvimento

git clone https://github.com/brasil-fiscal/core.git
cd core
npm install
npm run build
npm test

Contribuindo

Contribuicoes sao bem-vindas! Veja CONTRIBUTING.md.

Code Style

  • TypeScript strict mode, return types explicitos
  • Single quotes, semicolons, sem trailing commas, 100 chars por linha
  • Path alias: @core/* mapeia para src/*
  • Interfaces sem prefixo I (CertificateProvider, nao ICertificateProvider)

Ecossistema @brasil-fiscal

PacoteStatusDescricao
@brasil-fiscal/coreEstavelInfraestrutura compartilhada (este pacote)
@brasil-fiscal/nfeEstavelNFe e NFC-e
@brasil-fiscal/cteEm desenvolvimentoCTe
@brasil-fiscal/mdfeEm desenvolvimentoMDFe
@brasil-fiscal/sped-fiscalEm desenvolvimentoEFD ICMS/IPI (SPED Fiscal)
@brasil-fiscal/sped-contribuicoesEm desenvolvimentoEFD Contribuicoes (PIS/COFINS)
@brasil-fiscal/sintegraEm desenvolvimentoSINTEGRA

Licenca

MIT

版本与发布记录

@brasil-fiscal/core 共发布 7 个版本,首次发布于 2026/05/01;过去 12 个月发布了 7 个版本。

版本发布日期距今
1.6.0latest2026/05/026 个月前
1.5.02026/05/026 个月前
1.4.02026/05/026 个月前
1.3.02026/05/026 个月前
1.2.02026/05/026 个月前
1.1.02026/05/026 个月前

关于 @brasil-fiscal/core 的常见问题

@brasil-fiscal/core 是什么?

Infraestrutura compartilhada para documentos fiscais eletronicos brasileiros (NFe, CTe, MDFe). Certificado digital, assinatura XML, transporte mTLS, helpers.

如何安装 @brasil-fiscal/core?

在项目目录运行 npm install @brasil-fiscal/core,或使用 pnpm add / yarn add / bun add。

@brasil-fiscal/core 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@brasil-fiscal/core 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@brasil-fiscal/core 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@brasil-fiscal/core 可以商用吗?

@brasil-fiscal/core 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@brasil-fiscal/core 的下载量有多少?

根据 npm 官方下载统计,@brasil-fiscal/core 在 2026/10/09 – 2026/11/07 这 30 天内被下载 6,295 次,日均约 210 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@brasil-fiscal/core 还在维护吗?

最新版本 1.6.0 发布于 2026/05/02(6 个月前);至今共发布 7 个版本,其中过去 12 个月发布了 7 个;首次发布于 2026/05/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。