cosmemilton-acbr-node 0.1.1 → 0.1.2
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/README.md +108 -106
- package/dist/cli.js +1310 -964
- package/dist/cli.js.map +4 -4
- package/dist/contract.json +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/types/generated/acbr/index.d.ts +2 -2
- package/dist/types/src/cli.d.ts +4 -2
- package/dist/types/src/contract-help.d.ts +53 -0
- package/dist/types/src/generator.d.ts +2 -0
- package/dist/types/src/index.d.ts +2 -2
- package/docs/API.md +90 -90
- package/docs/CLI.md +52 -32
- package/package.json +6 -4
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ModelIR, ModelProperty } from './generator.js';
|
|
2
|
+
export interface ContractMetadata {
|
|
3
|
+
formatVersion: 1;
|
|
4
|
+
sourceRevision: number;
|
|
5
|
+
sourceHash: string;
|
|
6
|
+
contractHash: string;
|
|
7
|
+
ir: ModelIR;
|
|
8
|
+
}
|
|
9
|
+
export interface FieldDescription {
|
|
10
|
+
formatVersion: 1;
|
|
11
|
+
sdkVersion: string;
|
|
12
|
+
sourceRevision: number;
|
|
13
|
+
sourceHash: string;
|
|
14
|
+
contractHash: string;
|
|
15
|
+
root: string;
|
|
16
|
+
path: string;
|
|
17
|
+
kind: ModelProperty['kind'];
|
|
18
|
+
pascalType: string;
|
|
19
|
+
typeReference?: string;
|
|
20
|
+
inputType: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
21
|
+
readonly: boolean;
|
|
22
|
+
declaredDefault?: string;
|
|
23
|
+
values?: string[];
|
|
24
|
+
constraints?: {
|
|
25
|
+
min?: number;
|
|
26
|
+
max?: number;
|
|
27
|
+
scale?: number;
|
|
28
|
+
};
|
|
29
|
+
itemType?: string;
|
|
30
|
+
members?: {
|
|
31
|
+
name: string;
|
|
32
|
+
kind: ModelProperty['kind'];
|
|
33
|
+
pascalType: string;
|
|
34
|
+
readonly: boolean;
|
|
35
|
+
}[];
|
|
36
|
+
}
|
|
37
|
+
export declare class FieldHelpError extends Error {
|
|
38
|
+
readonly code: string;
|
|
39
|
+
readonly details?: {
|
|
40
|
+
segment?: string;
|
|
41
|
+
ownerType?: string;
|
|
42
|
+
candidates?: string[];
|
|
43
|
+
} | undefined;
|
|
44
|
+
constructor(code: string, message: string, details?: {
|
|
45
|
+
segment?: string;
|
|
46
|
+
ownerType?: string;
|
|
47
|
+
candidates?: string[];
|
|
48
|
+
} | undefined);
|
|
49
|
+
}
|
|
50
|
+
export declare function validateContractMetadata(value: unknown): ContractMetadata;
|
|
51
|
+
export declare function describeField(metadata: ContractMetadata, sdkVersion: string, query: string): FieldDescription;
|
|
52
|
+
export declare function describeInstalledField(query: string, packageRoot: string): Promise<FieldDescription>;
|
|
53
|
+
export declare function formatFieldDescription(description: FieldDescription): string;
|
|
@@ -82,6 +82,7 @@ export declare function compareContracts(previous: ModelIR | undefined, current:
|
|
|
82
82
|
};
|
|
83
83
|
export declare function renderModelValidation(): string;
|
|
84
84
|
export declare function renderTypeScript(ir: ModelIR, revision: number, contractHash: string): string;
|
|
85
|
+
export declare function renderContractMetadata(ir: ModelIR, sourceRevision: number, sourceHash: string, contractHash: string): string;
|
|
85
86
|
export declare function renderPascal(ir: ModelIR, revision: number, contractHash: string): string;
|
|
86
87
|
export declare function renderClientIndex(): string;
|
|
87
88
|
export declare function generateModel(options: GenerateOptions): Promise<{
|
|
@@ -90,5 +91,6 @@ export declare function generateModel(options: GenerateOptions): Promise<{
|
|
|
90
91
|
models: number;
|
|
91
92
|
reportPath: string;
|
|
92
93
|
manifestPath: string;
|
|
94
|
+
metadataPath: string;
|
|
93
95
|
}>;
|
|
94
96
|
export {};
|
|
@@ -2,7 +2,7 @@ import { type OpcoesEmissor, type OpcoesOperacao } from './runtime.js';
|
|
|
2
2
|
import { type TNFeInput } from '../generated/acbr/models.js';
|
|
3
3
|
export * from './runtime.js';
|
|
4
4
|
export * from '../generated/acbr/models.js';
|
|
5
|
-
export declare function diagnosticarErro(erro: unknown):
|
|
5
|
+
export declare function diagnosticarErro(erro: unknown): Readonly<{
|
|
6
6
|
codigo: import("./index.js").CodigoValidacaoModelo;
|
|
7
7
|
etapa: "documento";
|
|
8
8
|
campo?: string;
|
|
@@ -14,7 +14,7 @@ export declare function diagnosticarErro(erro: unknown): import("./types.js").Di
|
|
|
14
14
|
etapa: "documento";
|
|
15
15
|
campo?: string;
|
|
16
16
|
}>;
|
|
17
|
-
}
|
|
17
|
+
}> | import("./types.js").DiagnosticoAcbr;
|
|
18
18
|
export type OpcoesCriarEmissor = Omit<OpcoesEmissor, 'contrato' | 'validaDocumento'>;
|
|
19
19
|
export declare function criarEmissor(options: OpcoesCriarEmissor): {
|
|
20
20
|
gerarXml(documento: TNFeInput, operacao?: OpcoesOperacao): Promise<import("./types.js").ResultadoFiscal>;
|
package/docs/API.md
CHANGED
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
# API e protocolo
|
|
2
|
-
|
|
3
|
-
`criarEmissor` retorna operações assíncronas; cada chamada inicia um processo fiscal isolado. Uma instância processa uma operação por vez, com fila limitada. Emitentes diferentes não compartilham o componente Pascal.
|
|
4
|
-
|
|
5
|
-
## Configuração
|
|
6
|
-
|
|
7
|
-
Campos obrigatórios: `cnpj` (14 dígitos), `uf`, `modelo` (55/65), `ambiente` (1 produção, 2 homologação). Certificado A1: `certificado: { pfx: Uint8Array, senha: string }` ou `{ arquivo: string, senha: string }`. NFC-e requer `csc: { id: string, valor: string }` para os recursos que dependem do CSC.
|
|
8
|
-
|
|
9
|
-
`timeoutMs` tem padrão/máximo de 120.000 ms; `limiteFila` tem padrão 32. `runtimeDirectory` seleciona um runtime próprio cujo contrato deve coincidir com o cliente. Cada operação aceita `{ signal: AbortSignal }` como último argumento. `fechar()` cancela a fila, encerra e aguarda o processo em execução.
|
|
10
|
-
|
|
11
|
-
Com `limiteFila: 0`, uma operação pode executar e chamadas concorrentes recebem
|
|
12
|
-
`FILA_CHEIA`. Após o `await` dessa operação, a fila já está disponível para a
|
|
13
|
-
próxima chamada; isso também vale quando a operação termina com erro, salvo
|
|
14
|
-
quando o emissor foi fechado ou o encerramento do motor não foi confirmado.
|
|
15
|
-
|
|
16
|
-
## Operações
|
|
17
|
-
|
|
18
|
-
| Método | Entrada |
|
|
19
|
-
| --- | --- |
|
|
20
|
-
| `gerarXml` | Objeto TNFe/TNFeInput com nomes ACBr |
|
|
21
|
-
| `assinar`, `validar`, `transmitir` | XML UTF-8 como string |
|
|
22
|
-
| `consultar` | `{ chave, recibo? }` |
|
|
23
|
-
| `cancelar` | `{ chave, protocolo, justificativa }` |
|
|
24
|
-
| `cartaCorrecao` | `{ chave, correcao, sequenciaEvento? }`; modelo 55 |
|
|
25
|
-
| `inutilizar` | `{ ano, serie, numeroInicial, numeroFinal, justificativa }`; ano com 2 dígitos |
|
|
26
|
-
|
|
27
|
-
A resposta `ResultadoFiscal` contém `sucesso`, `estado`, revisão/hash do contrato e, quando disponíveis, `cStat`, `xMotivo`, `chave`, `protocolo`, `recibo` e `xmlBase64`. `sucesso` deve ser conferido antes de usar o resultado. XML é devolvido em base64 para preservar os bytes UTF-8.
|
|
28
|
-
|
|
29
|
-
Rejeições fiscais e recibos pendentes são resultados, sem retry automático. Falhas no supervisor lançam `ErroAcbrNode` com `codigo` e `resultadoDesconhecido`. Em falha/timeout de uma operação que pode ter iniciado envio, consulte a situação fiscal antes de decidir uma nova transmissão. O erro de transmissão conserva `xmlBase64` para recuperação.
|
|
30
|
-
|
|
31
|
-
## Feedback seguro para o usuário
|
|
32
|
-
|
|
33
|
-
Os resultados incluem `diagnostico`, com `codigo`, `etapa`, `mensagem`, `acao`,
|
|
34
|
-
`statusEnvio` e, quando disponíveis, `campo` e `cStat`. Também estão disponíveis
|
|
35
|
-
os helpers `diagnosticarErro(erro)` e `diagnosticarResultado(resultado, comando)`.
|
|
36
|
-
Use esse resumo nas interfaces e nos logs. Ele não copia XML, identidade fiscal,
|
|
37
|
-
caminhos, senha, `xMotivo`, stderr, stack ou causa bruta.
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
import { TNFe, diagnosticarErro, diagnosticarResultado } from 'cosmemilton-acbr-node';
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
const resultado = await emissor.gerarXml(new TNFe(dados));
|
|
44
|
-
const d = resultado.diagnostico ?? diagnosticarResultado(resultado, 'gerarXml');
|
|
45
|
-
mostrarAoUsuario(d); // Apresente mensagem, campo, ação e statusEnvio.
|
|
46
|
-
} catch (erro) {
|
|
47
|
-
mostrarAoUsuario(diagnosticarErro(erro)); // Não registre o erro bruto.
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
As validações dos modelos continuam lançando uma subclasse de `TypeError`
|
|
52
|
-
(`ErroValidacaoModelo`). Por exemplo, uma data com fuso em `TNFe.Ide.dEmi`
|
|
53
|
-
informa `DATA_HORA_INVALIDA`, o campo e a orientação de usar a data/hora civil
|
|
54
|
-
da UF em `AAAA-MM-DDTHH:mm:ss`, sem `Z` ou offset. Nenhum valor informado é
|
|
55
|
-
incluído no diagnóstico. Uma chave desconhecida aponta o grupo conhecido,
|
|
56
|
-
evitando registrar chaves que possam conter dados privados.
|
|
57
|
-
|
|
58
|
-
`statusEnvio` refere-se à operação atual:
|
|
59
|
-
|
|
60
|
-
| Status | Significado |
|
|
61
|
-
| --- | --- |
|
|
62
|
-
| `nao_enviado` | Etapa local confirmada ou falha comprovadamente anterior ao envio desta operação. Não prova ausência de envios anteriores. |
|
|
63
|
-
| `rejeitado` | Resultado fiscal de rejeição ou denegação; confira `cStat` e a orientação. |
|
|
64
|
-
| `autorizado` | Autorização confirmada com identidade/protocolo; em eventos, a mensagem identifica cancelamento, registro ou inutilização. |
|
|
65
|
-
| `resultado_incerto` | Resultado pendente, evidência incompleta/contraditória ou interrupção após possível envio. Consulte antes de repetir. |
|
|
66
|
-
|
|
67
|
-
Os campos e os estados anteriores da API permanecem disponíveis. O XML de
|
|
68
|
-
recuperação de `ErroAcbrNode` ainda pode ser lido explicitamente em `xmlBase64`,
|
|
69
|
-
mas não é enumerável; `JSON.stringify(erro)` devolve apenas o diagnóstico
|
|
70
|
-
sanitizado. `cause` contém somente código, etapa e campo conhecidos. Nenhum
|
|
71
|
-
helper retransmite ou altera o resultado fiscal.
|
|
72
|
-
|
|
73
|
-
O encerramento de um filho fiscal iniciado aguarda `close` por até 1000 ms após
|
|
74
|
-
o pedido de parada. Se `kill` falha ou o filho não confirma o encerramento, a
|
|
75
|
-
operação termina com seu erro original e um aviso adicional em
|
|
76
|
-
`diagnostico.limpeza`, com código `ENCERRAMENTO_MOTOR_NAO_CONFIRMADO` e etapa
|
|
77
|
-
`limpeza`. O supervisor libera somente os pipes e handles desse filho,
|
|
78
|
-
bloqueia a fila e novas operações do emissor e não afirma que o processo
|
|
79
|
-
terminou. Encerre a aplicação antes de iniciar outro motor; se havia envio
|
|
80
|
-
possível, consulte a situação fiscal antes de repetir. Chamadas concorrentes
|
|
81
|
-
de `fechar()` aguardam o mesmo encerramento limitado. O watcher nativo
|
|
82
|
-
acompanha o processo pai e encerra o filho quando o pai termina.
|
|
83
|
-
|
|
84
|
-
## Processo auxiliar
|
|
85
|
-
|
|
86
|
-
Protocolo JSONL versão 1 em stdin/stdout. Certificado e senha são enviados pelas pipes, nunca como argumentos. O ambiente herdado é restrito a variáveis de sistema; stderr bruto não é apresentado como erro público. Limites de mensagem, timeout, checks de hash e validações de identidade protegem a comunicação. O processo acompanha o PID do pai e termina quando o pai encerra.
|
|
87
|
-
|
|
88
|
-
Cada pedido tem `id`, `versao`, `sourceRevision`, `contractHash`, `comando`, `config` e parâmetros da operação. Antes de enviar uma operação com efeitos fiscais, o motor escreve `{ tipo: "envioIniciado", id }`. A resposta final precisa repetir identidade e contrato. O supervisor aguarda o fechamento do processo antes de liberar a próxima operação.
|
|
89
|
-
|
|
90
|
-
TLS usa OpenSSL com verificação de cadeia, validade, finalidade e hostname antes de enviar bytes de aplicação. No Linux usa as CAs do sistema; no Windows exporta raízes públicas confiáveis para um bundle temporário. Esta versão não implementa consulta de revogação CRL/OCSP.
|
|
1
|
+
# API e protocolo
|
|
2
|
+
|
|
3
|
+
`criarEmissor` retorna operações assíncronas; cada chamada inicia um processo fiscal isolado. Uma instância processa uma operação por vez, com fila limitada. Emitentes diferentes não compartilham o componente Pascal.
|
|
4
|
+
|
|
5
|
+
## Configuração
|
|
6
|
+
|
|
7
|
+
Campos obrigatórios: `cnpj` (14 dígitos), `uf`, `modelo` (55/65), `ambiente` (1 produção, 2 homologação). Certificado A1: `certificado: { pfx: Uint8Array, senha: string }` ou `{ arquivo: string, senha: string }`. NFC-e requer `csc: { id: string, valor: string }` para os recursos que dependem do CSC.
|
|
8
|
+
|
|
9
|
+
`timeoutMs` tem padrão/máximo de 120.000 ms; `limiteFila` tem padrão 32. `runtimeDirectory` seleciona um runtime próprio cujo contrato deve coincidir com o cliente. Cada operação aceita `{ signal: AbortSignal }` como último argumento. `fechar()` cancela a fila, encerra e aguarda o processo em execução.
|
|
10
|
+
|
|
11
|
+
Com `limiteFila: 0`, uma operação pode executar e chamadas concorrentes recebem
|
|
12
|
+
`FILA_CHEIA`. Após o `await` dessa operação, a fila já está disponível para a
|
|
13
|
+
próxima chamada; isso também vale quando a operação termina com erro, salvo
|
|
14
|
+
quando o emissor foi fechado ou o encerramento do motor não foi confirmado.
|
|
15
|
+
|
|
16
|
+
## Operações
|
|
17
|
+
|
|
18
|
+
| Método | Entrada |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `gerarXml` | Objeto TNFe/TNFeInput com nomes ACBr |
|
|
21
|
+
| `assinar`, `validar`, `transmitir` | XML UTF-8 como string |
|
|
22
|
+
| `consultar` | `{ chave, recibo? }` |
|
|
23
|
+
| `cancelar` | `{ chave, protocolo, justificativa }` |
|
|
24
|
+
| `cartaCorrecao` | `{ chave, correcao, sequenciaEvento? }`; modelo 55 |
|
|
25
|
+
| `inutilizar` | `{ ano, serie, numeroInicial, numeroFinal, justificativa }`; ano com 2 dígitos |
|
|
26
|
+
|
|
27
|
+
A resposta `ResultadoFiscal` contém `sucesso`, `estado`, revisão/hash do contrato e, quando disponíveis, `cStat`, `xMotivo`, `chave`, `protocolo`, `recibo` e `xmlBase64`. `sucesso` deve ser conferido antes de usar o resultado. XML é devolvido em base64 para preservar os bytes UTF-8.
|
|
28
|
+
|
|
29
|
+
Rejeições fiscais e recibos pendentes são resultados, sem retry automático. Falhas no supervisor lançam `ErroAcbrNode` com `codigo` e `resultadoDesconhecido`. Em falha/timeout de uma operação que pode ter iniciado envio, consulte a situação fiscal antes de decidir uma nova transmissão. O erro de transmissão conserva `xmlBase64` para recuperação.
|
|
30
|
+
|
|
31
|
+
## Feedback seguro para o usuário
|
|
32
|
+
|
|
33
|
+
Os resultados incluem `diagnostico`, com `codigo`, `etapa`, `mensagem`, `acao`,
|
|
34
|
+
`statusEnvio` e, quando disponíveis, `campo` e `cStat`. Também estão disponíveis
|
|
35
|
+
os helpers `diagnosticarErro(erro)` e `diagnosticarResultado(resultado, comando)`.
|
|
36
|
+
Use esse resumo nas interfaces e nos logs. Ele não copia XML, identidade fiscal,
|
|
37
|
+
caminhos, senha, `xMotivo`, stderr, stack ou causa bruta.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { TNFe, diagnosticarErro, diagnosticarResultado } from 'cosmemilton-acbr-node';
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const resultado = await emissor.gerarXml(new TNFe(dados));
|
|
44
|
+
const d = resultado.diagnostico ?? diagnosticarResultado(resultado, 'gerarXml');
|
|
45
|
+
mostrarAoUsuario(d); // Apresente mensagem, campo, ação e statusEnvio.
|
|
46
|
+
} catch (erro) {
|
|
47
|
+
mostrarAoUsuario(diagnosticarErro(erro)); // Não registre o erro bruto.
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
As validações dos modelos continuam lançando uma subclasse de `TypeError`
|
|
52
|
+
(`ErroValidacaoModelo`). Por exemplo, uma data com fuso em `TNFe.Ide.dEmi`
|
|
53
|
+
informa `DATA_HORA_INVALIDA`, o campo e a orientação de usar a data/hora civil
|
|
54
|
+
da UF em `AAAA-MM-DDTHH:mm:ss`, sem `Z` ou offset. Nenhum valor informado é
|
|
55
|
+
incluído no diagnóstico. Uma chave desconhecida aponta o grupo conhecido,
|
|
56
|
+
evitando registrar chaves que possam conter dados privados.
|
|
57
|
+
|
|
58
|
+
`statusEnvio` refere-se à operação atual:
|
|
59
|
+
|
|
60
|
+
| Status | Significado |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| `nao_enviado` | Etapa local confirmada ou falha comprovadamente anterior ao envio desta operação. Não prova ausência de envios anteriores. |
|
|
63
|
+
| `rejeitado` | Resultado fiscal de rejeição ou denegação; confira `cStat` e a orientação. |
|
|
64
|
+
| `autorizado` | Autorização confirmada com identidade/protocolo; em eventos, a mensagem identifica cancelamento, registro ou inutilização. |
|
|
65
|
+
| `resultado_incerto` | Resultado pendente, evidência incompleta/contraditória ou interrupção após possível envio. Consulte antes de repetir. |
|
|
66
|
+
|
|
67
|
+
Os campos e os estados anteriores da API permanecem disponíveis. O XML de
|
|
68
|
+
recuperação de `ErroAcbrNode` ainda pode ser lido explicitamente em `xmlBase64`,
|
|
69
|
+
mas não é enumerável; `JSON.stringify(erro)` devolve apenas o diagnóstico
|
|
70
|
+
sanitizado. `cause` contém somente código, etapa e campo conhecidos. Nenhum
|
|
71
|
+
helper retransmite ou altera o resultado fiscal.
|
|
72
|
+
|
|
73
|
+
O encerramento de um filho fiscal iniciado aguarda `close` por até 1000 ms após
|
|
74
|
+
o pedido de parada. Se `kill` falha ou o filho não confirma o encerramento, a
|
|
75
|
+
operação termina com seu erro original e um aviso adicional em
|
|
76
|
+
`diagnostico.limpeza`, com código `ENCERRAMENTO_MOTOR_NAO_CONFIRMADO` e etapa
|
|
77
|
+
`limpeza`. O supervisor libera somente os pipes e handles desse filho,
|
|
78
|
+
bloqueia a fila e novas operações do emissor e não afirma que o processo
|
|
79
|
+
terminou. Encerre a aplicação antes de iniciar outro motor; se havia envio
|
|
80
|
+
possível, consulte a situação fiscal antes de repetir. Chamadas concorrentes
|
|
81
|
+
de `fechar()` aguardam o mesmo encerramento limitado. O watcher nativo
|
|
82
|
+
acompanha o processo pai e encerra o filho quando o pai termina.
|
|
83
|
+
|
|
84
|
+
## Processo auxiliar
|
|
85
|
+
|
|
86
|
+
Protocolo JSONL versão 1 em stdin/stdout. Certificado e senha são enviados pelas pipes, nunca como argumentos. O ambiente herdado é restrito a variáveis de sistema; stderr bruto não é apresentado como erro público. Limites de mensagem, timeout, checks de hash e validações de identidade protegem a comunicação. O processo acompanha o PID do pai e termina quando o pai encerra.
|
|
87
|
+
|
|
88
|
+
Cada pedido tem `id`, `versao`, `sourceRevision`, `contractHash`, `comando`, `config` e parâmetros da operação. Antes de enviar uma operação com efeitos fiscais, o motor escreve `{ tipo: "envioIniciado", id }`. A resposta final precisa repetir identidade e contrato. O supervisor aguarda o fechamento do processo antes de liberar a próxima operação.
|
|
89
|
+
|
|
90
|
+
TLS usa OpenSSL com verificação de cadeia, validade, finalidade e hostname antes de enviar bytes de aplicação. No Linux usa as CAs do sistema; no Windows exporta raízes públicas confiáveis para um bundle temporário. Esta versão não implementa consulta de revogação CRL/OCSP.
|
package/docs/CLI.md
CHANGED
|
@@ -1,32 +1,52 @@
|
|
|
1
|
-
# Fontes, contrato e build
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
# Fontes, contrato e build
|
|
2
|
+
|
|
3
|
+
## Help de tipos e campos — implementação de desenvolvimento
|
|
4
|
+
|
|
5
|
+
O help TAG faz parte da release 0.1.2. A documentação pública só anuncia disponibilidade após a confirmação dessa versão no registry npm.
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
node dist/cli.js help TAG Ide.tpNF
|
|
9
|
+
node dist/cli.js help TAG 'Det[].Imposto.PIS.CST' --json
|
|
10
|
+
node dist/cli.js help TAG 'TNFe.Det[0].Prod.DI[].adi[2].nAdicao' --json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`Ide.tpNF` resolve para `TTipoNFe` e apresenta `tnEntrada` e `tnSaida`. O caminho PIS resolve para `TCSTPis`, com seus valores textuais, incluindo `pis99`. Os valores são obtidos do contrato gerado; não há catálogo de enums mantido manualmente.
|
|
14
|
+
|
|
15
|
+
O prefixo `TNFe.` é opcional. Os nomes dos campos respeitam maiúsculas e minúsculas; `TAG` aceita ambas. `[]` consulta o tipo do elemento de uma coleção. Um índice não negativo, como `[0]`, é normalizado para `[]`: a consulta não lê uma nota nem confere a quantidade de itens. Um nome curto só é aceito quando identifica um caminho único; `CST` retorna `CAMPO_AMBIGUO` com os caminhos possíveis. `Det.Imposto` pede um seletor de coleção, enquanto `Ide[]` é recusado por não ser coleção.
|
|
16
|
+
|
|
17
|
+
O help lê somente `dist/contract.json`, `package.json` e `acbr.lock.json` da própria instalação. Não consulta configuração do consumidor, runtime, certificado, SVN ou rede e funciona sem dependências opcionais. `--config` e `--revision` não se aplicam a esse comando. Saída JSON contém versão do SDK, revisão ACBr, hashes, caminho canônico, tipo, referências, valores, limites do tipo e indicação de somente leitura. Erros JSON vão para `stderr`, com código de saída 1; uma consulta válida termina com 0.
|
|
18
|
+
|
|
19
|
+
Os caminhos pertencem ao modelo de entrada do SDK, não são XPath/XML. Por exemplo, o modelo usa `Ide.dEmi`; `Ide.dhEmi` é inexistente. `declaredDefault` é a declaração Pascal, não uma garantia sobre o construtor nativo. Limites primitivos, enums e campos opcionais do TypeScript não substituem regras fiscais, códigos XML, obrigatoriedade ou orientação tributária.
|
|
20
|
+
|
|
21
|
+
`generate` também emite `generated/acbr/contract.json` a partir do mesmo IR usado pelo validador. O build confere o hash e o lock e distribui esses metadados em `dist/contract.json`, separados dos três arquivos gerados que vinculam o motor.
|
|
22
|
+
|
|
23
|
+
`init` cria a configuração e copia os fontes do motor e extractor distribuídos no pacote para o projeto do consumidor, preservando arquivos existentes. O CLI usa `acbr.config.json`. Todos os caminhos relativos são resolvidos pelo diretório desse arquivo, independentemente do diretório atual do terminal. Campos desconhecidos, revisão inválida ou outra origem SVN são rejeitados.
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
acbr-node init
|
|
27
|
+
acbr-node source update
|
|
28
|
+
acbr-node generate
|
|
29
|
+
acbr-node build
|
|
30
|
+
acbr-node check
|
|
31
|
+
acbr-node doctor
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`source update` é a única operação que busca alterações do SVN. Primeiro resolve `HEAD` para um número, exporta `Fontes`, schemas NF-e e licença para uma área temporária e registra a revisão e SHA256 de cada arquivo em `acbr.lock.json`. Se já houver fontes, precisa de um lock válido e recusa arquivos alterados, adicionados ou removidos. A geração, compilação e execução não atualizam fontes automaticamente.
|
|
35
|
+
|
|
36
|
+
`source update` sem `--revision` consulta a revisão mais recente (`HEAD`), mesmo quando a configuração registra uma revisão anterior. `source update --revision 48590` seleciona explicitamente uma revisão. Após download e lock bem-sucedidos, o CLI persiste a revisão numérica resolvida na configuração, preservando os caminhos e demais campos. Falhas restauram fontes e lock; nenhuma atualização acontece na execução normal. Um export previamente obtido e conferido pelo operador pode ser registrado com `source lock --revision 48590`; esse comando confia na origem declarada pelo operador e calcula os hashes locais, sem comparar o conteúdo com o SVN remoto.
|
|
37
|
+
|
|
38
|
+
`generate` recria os tipos em `generated/acbr/models.ts`, o mapper Pascal em `native/generated/AcbrModels.pas` e os manifestos/relatórios em `.acbr/generated`. Revise o relatório após cada atualização para detectar campos novos, removidos, enums e partes que o gerador não suporta.
|
|
39
|
+
|
|
40
|
+
`build` confere fontes/contrato antes de invocar o Free Pascal. Usa os defines `NOGUI` e `NOREPORT`, unidades Lazarus sem interface gráfica, ACBr original e mapper gerado. Linux x64 e Windows x64 são os alvos iniciais. A compilação precisa ocorrer no sistema do alvo; não há cross-compilation implícita.
|
|
41
|
+
|
|
42
|
+
No Linux, instale Free Pascal 3.2.2, Lazarus 3.0, SVN, OpenSSL 3, libxml2, tar/gzip e certificados CA do sistema. `native.lazarusRoot` ou `LAZARUS_ROOT` podem indicar outra instalação. O staging copia OpenSSL/libxml2 e suas dependências transitivas como bibliotecas dinâmicas com suas licenças e origem/versionamento dos pacotes fonte. Inclui o provider legacy e configuração de providers OpenSSL. glibc e o loader permanecem requisitos do sistema. O Linux usa glibc: o runtime não equivale a um binário portátil para qualquer distribuição ou Alpine.
|
|
43
|
+
|
|
44
|
+
No Windows, configure `native.lazarusRoot`, `native.fpc`, `native.providerFiles` (incluindo `legacy.dll`) e `native.libraryFiles` para as DLLs x64 de TLS/XML. Cada DLL exige um arquivo de licença adjacente `<DLL>.LICENSE`; `<DLL>.SOURCE.json` registra opcionalmente origem e versão do código correspondente e é incluído na proveniência do runtime. As dependências também podem ser compiladas no WSL com MinGW, conforme [Dependências nativas](DEPENDENCIAS-NATIVAS.md). O motor Pascal é compilado no Windows pelo CLI; a compilação não substitui a homologação fiscal. A [receita de CI](CI.md) documenta instalação oficial gratuita, `FPC_ROOT`/`LAZARUS_ROOT` e criação de um `fpc.cfg` exclusivo com `PPC_CONFIG_PATH`, sem alterar a instalação do compilador.
|
|
45
|
+
|
|
46
|
+
No Windows, execute comandos `npm` em uma pasta local, por exemplo `C:\Projetos\MinhaAplicacao`. O launcher `npm.cmd` usa `cmd.exe`, que não mantém um caminho UNC como diretório atual. Para trabalhar com um checkout WSL acessado por `\\wsl.localhost\...`, execute a CLI por `node caminho\dist\cli.js` e, quando necessário, invoque `npm-cli.js` diretamente por Node, indicando o caminho da instalação. Na compilação Pascal, fontes em uma pasta Windows local evitam o custo de leitura por UNC; `source.directory` pode apontar para essa cópia e o lock confere os mesmos hashes.
|
|
47
|
+
|
|
48
|
+
O runtime fica em `.acbr/runtime/<platform>-<arch>`, contendo executável, bibliotecas dinâmicas, schemas, serviços NF-e, licenças, fontes correspondentes e `manifest.json`. O manifesto registra revisão ACBr, contrato, plataforma e SHA256 de cada arquivo. `check` verifica todos esses vínculos e arquivos e depois inicia o motor real em quatro probes locais: gera uma NF-e55 sintética para conferir mapper/chave/UTF-8, valida uma fixture XML assinada com certificado público sintético e recusa XML malformado e DTD/entidade externa. O smoke não recebe PFX, chave privada ou senha e não transmite documentos; `--json` inclui `offlineChecks`. A fixture assinada fica embutida no CLI, pois o schema exige `Signature` e o XML gerado sem A1 ainda não é assinado. O builder confere SHA256 dos três arquivos gerados antes e depois da compilação; uma alteração de mapper/helper invalida o build mesmo quando o hash do contrato permanece igual. O staging inclui notices FPC (GPL do compilador, LGPL e exceção da RTL), Lazarus e das bibliotecas dinâmicas, além da proveniência das cópias usadas. `doctor` informa ferramentas e dependências encontradas; ele não instala ferramentas nem transmite documentos.
|
|
49
|
+
|
|
50
|
+
Atualizações concorrentes são recusadas com `acbr.lock.json.operation`. Se um processo encerrar abruptamente, confira o PID registrado antes de remover o marcador. Uma alteração de revisão durante a compilação invalida o resultado. O log FPC completo fica em `.acbr/build.log`.
|
|
51
|
+
|
|
52
|
+
Use `--config caminho` para escolher a configuração e `--json` para obter saída estruturada. Nunca inclua senhas ou certificados nesse arquivo de build: a API recebe essas credenciais separadamente em memória.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cosmemilton-acbr-node",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "NF-e/NFC-e com ACBr Free Pascal, cliente TypeScript gerado e CLI SVN",
|
|
5
5
|
"license": "LGPL-2.1-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"files": [
|
|
27
27
|
"dist",
|
|
28
28
|
"native",
|
|
29
|
+
"native/generated/AcbrModels.pas",
|
|
29
30
|
"tools",
|
|
30
31
|
"LICENSE",
|
|
31
32
|
"NOTICE",
|
|
@@ -50,11 +51,12 @@
|
|
|
50
51
|
"acbr": "tsx src/cli.ts",
|
|
51
52
|
"pack:runtimes": "node scripts/pack-runtimes.mjs",
|
|
52
53
|
"release:prepare": "node scripts/publish-artifacts.mjs",
|
|
53
|
-
"test:package": "node tests/package-install.mjs"
|
|
54
|
+
"test:package": "node tests/package-install.mjs",
|
|
55
|
+
"test:help-installed": "node tests/cli-help-installed.mjs"
|
|
54
56
|
},
|
|
55
57
|
"optionalDependencies": {
|
|
56
|
-
"cosmemilton-acbr-node-linux-x64": "0.1.
|
|
57
|
-
"cosmemilton-acbr-node-win32-x64": "0.1.
|
|
58
|
+
"cosmemilton-acbr-node-linux-x64": "0.1.2",
|
|
59
|
+
"cosmemilton-acbr-node-win32-x64": "0.1.2"
|
|
58
60
|
},
|
|
59
61
|
"devDependencies": {
|
|
60
62
|
"@types/node": "^24.0.0",
|