@pairus/product-data 1.1.0 → 1.3.0
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 +408 -141
- package/dist/index.d.mts +307 -2
- package/dist/index.d.ts +307 -2
- package/dist/index.js +364 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +362 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -74,10 +74,11 @@ var BaseResource = class {
|
|
|
74
74
|
const reqHeaders = {
|
|
75
75
|
"Accept": "application/json",
|
|
76
76
|
"X-API-Key": this.apiKey,
|
|
77
|
-
"User-Agent": "Pairus-NodeJS-SDK/1.
|
|
77
|
+
"User-Agent": "Pairus-NodeJS-SDK/1.2.0",
|
|
78
78
|
...options.headers || {}
|
|
79
79
|
};
|
|
80
|
-
|
|
80
|
+
const isFormData = typeof FormData !== "undefined" && options.body instanceof FormData;
|
|
81
|
+
if (options.body && !isFormData && !reqHeaders["Content-Type"]) {
|
|
81
82
|
reqHeaders["Content-Type"] = "application/json";
|
|
82
83
|
}
|
|
83
84
|
let lastError = null;
|
|
@@ -85,14 +86,15 @@ var BaseResource = class {
|
|
|
85
86
|
try {
|
|
86
87
|
const controller = new AbortController();
|
|
87
88
|
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
89
|
+
const bodyData = isFormData ? options.body : options.body ? JSON.stringify(options.body) : void 0;
|
|
88
90
|
const response = await fetch(url, {
|
|
89
91
|
method: options.method,
|
|
90
92
|
headers: reqHeaders,
|
|
91
|
-
body:
|
|
93
|
+
body: bodyData,
|
|
92
94
|
signal: controller.signal
|
|
93
95
|
});
|
|
94
96
|
clearTimeout(timeoutId);
|
|
95
|
-
if (response.ok) {
|
|
97
|
+
if (response.ok || response.status >= 200 && response.status < 300) {
|
|
96
98
|
return await response.json();
|
|
97
99
|
}
|
|
98
100
|
let errData = {};
|
|
@@ -133,6 +135,207 @@ var BaseResource = class {
|
|
|
133
135
|
}
|
|
134
136
|
throw new NetworkError(`Falha de conex\xE3o com a API PAIRUS ap\xF3s ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);
|
|
135
137
|
}
|
|
138
|
+
async requestText(options) {
|
|
139
|
+
let url = `${this.baseUrl}/${options.path.replace(/^\/+/, "")}`;
|
|
140
|
+
if (options.params) {
|
|
141
|
+
const query = new URLSearchParams(options.params).toString();
|
|
142
|
+
url = `${url}?${query}`;
|
|
143
|
+
}
|
|
144
|
+
const reqHeaders = {
|
|
145
|
+
"Accept": "*/*",
|
|
146
|
+
"X-API-Key": this.apiKey,
|
|
147
|
+
"User-Agent": "Pairus-NodeJS-SDK/1.3.0",
|
|
148
|
+
...options.headers || {}
|
|
149
|
+
};
|
|
150
|
+
let lastError = null;
|
|
151
|
+
for (let attempt = 0; attempt < this.maxRetries; attempt++) {
|
|
152
|
+
try {
|
|
153
|
+
const controller = new AbortController();
|
|
154
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
155
|
+
const response = await fetch(url, {
|
|
156
|
+
method: options.method,
|
|
157
|
+
headers: reqHeaders,
|
|
158
|
+
signal: controller.signal
|
|
159
|
+
});
|
|
160
|
+
clearTimeout(timeoutId);
|
|
161
|
+
if (response.ok || response.status >= 200 && response.status < 300) {
|
|
162
|
+
return await response.text();
|
|
163
|
+
}
|
|
164
|
+
let errData = {};
|
|
165
|
+
try {
|
|
166
|
+
errData = await response.json();
|
|
167
|
+
} catch {
|
|
168
|
+
errData = {};
|
|
169
|
+
}
|
|
170
|
+
if (response.status === 401) {
|
|
171
|
+
throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);
|
|
172
|
+
}
|
|
173
|
+
if (response.status === 429) {
|
|
174
|
+
const retryAfterSec = parseFloat(response.headers.get("Retry-After") || "2");
|
|
175
|
+
if (attempt < this.maxRetries - 1) {
|
|
176
|
+
await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1e3));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);
|
|
180
|
+
}
|
|
181
|
+
throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);
|
|
182
|
+
} catch (err) {
|
|
183
|
+
if (err instanceof PairusAPIError) {
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
lastError = err;
|
|
187
|
+
if (attempt < this.maxRetries - 1) {
|
|
188
|
+
const delay = Math.pow(2, attempt) * 1e3 + Math.random() * 500;
|
|
189
|
+
await new Promise((res) => setTimeout(res, delay));
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
throw new NetworkError(`Falha de conex\xE3o com a API PAIRUS ap\xF3s ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);
|
|
196
|
+
}
|
|
197
|
+
async requestBinary(options) {
|
|
198
|
+
let url = `${this.baseUrl}/${options.path.replace(/^\/+/, "")}`;
|
|
199
|
+
if (options.params) {
|
|
200
|
+
const query = new URLSearchParams(options.params).toString();
|
|
201
|
+
url = `${url}?${query}`;
|
|
202
|
+
}
|
|
203
|
+
const reqHeaders = {
|
|
204
|
+
"Accept": "*/*",
|
|
205
|
+
"X-API-Key": this.apiKey,
|
|
206
|
+
"User-Agent": "Pairus-NodeJS-SDK/1.3.0",
|
|
207
|
+
...options.headers || {}
|
|
208
|
+
};
|
|
209
|
+
let lastError = null;
|
|
210
|
+
for (let attempt = 0; attempt < this.maxRetries; attempt++) {
|
|
211
|
+
try {
|
|
212
|
+
const controller = new AbortController();
|
|
213
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
214
|
+
const response = await fetch(url, {
|
|
215
|
+
method: options.method,
|
|
216
|
+
headers: reqHeaders,
|
|
217
|
+
signal: controller.signal
|
|
218
|
+
});
|
|
219
|
+
clearTimeout(timeoutId);
|
|
220
|
+
if (response.ok || response.status >= 200 && response.status < 300) {
|
|
221
|
+
return await response.arrayBuffer();
|
|
222
|
+
}
|
|
223
|
+
let errData = {};
|
|
224
|
+
try {
|
|
225
|
+
errData = await response.json();
|
|
226
|
+
} catch {
|
|
227
|
+
errData = {};
|
|
228
|
+
}
|
|
229
|
+
if (response.status === 401) {
|
|
230
|
+
throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);
|
|
231
|
+
}
|
|
232
|
+
if (response.status === 429) {
|
|
233
|
+
const retryAfterSec = parseFloat(response.headers.get("Retry-After") || "2");
|
|
234
|
+
if (attempt < this.maxRetries - 1) {
|
|
235
|
+
await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1e3));
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);
|
|
239
|
+
}
|
|
240
|
+
throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);
|
|
241
|
+
} catch (err) {
|
|
242
|
+
if (err instanceof PairusAPIError) {
|
|
243
|
+
throw err;
|
|
244
|
+
}
|
|
245
|
+
lastError = err;
|
|
246
|
+
if (attempt < this.maxRetries - 1) {
|
|
247
|
+
const delay = Math.pow(2, attempt) * 1e3 + Math.random() * 500;
|
|
248
|
+
await new Promise((res) => setTimeout(res, delay));
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
throw new NetworkError(`Falha de conex\xE3o com a API PAIRUS ap\xF3s ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
// src/resources/dfe.ts
|
|
259
|
+
var DFeResource = class extends BaseResource {
|
|
260
|
+
/**
|
|
261
|
+
* Dispara busca ativa de notas fiscais emitidas contra o CNPJ na SEFAZ Nacional.
|
|
262
|
+
*
|
|
263
|
+
* @param input Parâmetros de sincronização (CNPJ e ambiente opcional)
|
|
264
|
+
* @returns Resultado da consulta SEFAZ com novos documentos e controle de NSU
|
|
265
|
+
*/
|
|
266
|
+
async sincronizar(input) {
|
|
267
|
+
return this.request({
|
|
268
|
+
method: "POST",
|
|
269
|
+
path: "/v1/dfe/sincronizar",
|
|
270
|
+
body: {
|
|
271
|
+
cnpj: input.cnpj,
|
|
272
|
+
ambiente: input.ambiente || "producao"
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Lista notas fiscais de compras emitidas por fornecedores contra a sua empresa.
|
|
278
|
+
*
|
|
279
|
+
* @param params Filtros de busca (CNPJ, ambiente e limite de registros)
|
|
280
|
+
* @returns Lista de documentos fiscais capturados e status de manifestação
|
|
281
|
+
*/
|
|
282
|
+
async listarDocumentos(params) {
|
|
283
|
+
const queryParams = {
|
|
284
|
+
cnpj: params.cnpj,
|
|
285
|
+
ambiente: params.ambiente || "producao"
|
|
286
|
+
};
|
|
287
|
+
if (params.limite) {
|
|
288
|
+
queryParams.limite = String(params.limite);
|
|
289
|
+
}
|
|
290
|
+
return this.request({
|
|
291
|
+
method: "GET",
|
|
292
|
+
path: "/v1/dfe/documentos",
|
|
293
|
+
params: queryParams
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Registra evento oficial de Manifestação do Destinatário perante o Ambiente Nacional da SEFAZ.
|
|
298
|
+
*
|
|
299
|
+
* @param input Dados do evento ('210210' Ciência, '210200' Confirmação, '210220' Desconhecimento, '210240' Não Realizada)
|
|
300
|
+
* @returns Protocolo de homologação do evento na SEFAZ
|
|
301
|
+
*/
|
|
302
|
+
async manifestar(input) {
|
|
303
|
+
return this.request({
|
|
304
|
+
method: "POST",
|
|
305
|
+
path: "/v1/dfe/manifestar",
|
|
306
|
+
body: {
|
|
307
|
+
cnpj: input.cnpj,
|
|
308
|
+
chave_acesso: input.chave_acesso,
|
|
309
|
+
tipo_evento: input.tipo_evento,
|
|
310
|
+
justificativa: input.justificativa,
|
|
311
|
+
ambiente: input.ambiente || "producao"
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Baixa o arquivo XML autorizado (procNFe) da nota fiscal capturada.
|
|
317
|
+
*
|
|
318
|
+
* @param chaveAcesso Chave de acesso de 44 dígitos da NF-e
|
|
319
|
+
* @returns Conteúdo do XML em formato string
|
|
320
|
+
*/
|
|
321
|
+
async baixarXml(chaveAcesso) {
|
|
322
|
+
return this.requestText({
|
|
323
|
+
method: "GET",
|
|
324
|
+
path: `/v1/dfe/xml/${chaveAcesso}`
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Baixa o DANFE em PDF da nota fiscal de fornecedor.
|
|
329
|
+
*
|
|
330
|
+
* @param chaveAcesso Chave de acesso de 44 dígitos da NF-e
|
|
331
|
+
* @returns ArrayBuffer contendo o PDF binário
|
|
332
|
+
*/
|
|
333
|
+
async baixarDanfe(chaveAcesso) {
|
|
334
|
+
return this.requestBinary({
|
|
335
|
+
method: "GET",
|
|
336
|
+
path: `/v1/dfe/danfe/${chaveAcesso}`
|
|
337
|
+
});
|
|
338
|
+
}
|
|
136
339
|
};
|
|
137
340
|
|
|
138
341
|
// src/resources/emissao.ts
|
|
@@ -239,19 +442,72 @@ var FiscalResource = class extends BaseResource {
|
|
|
239
442
|
body: payload
|
|
240
443
|
});
|
|
241
444
|
}
|
|
445
|
+
/**
|
|
446
|
+
* Audita e higieniza uma lista de produtos em lote perante as tabelas fiscais vigentes.
|
|
447
|
+
*/
|
|
448
|
+
async sanitize(itens) {
|
|
449
|
+
return this.request({
|
|
450
|
+
method: "POST",
|
|
451
|
+
path: "/v2/fiscal/sanitize",
|
|
452
|
+
body: { itens }
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
// src/resources/nfse.ts
|
|
458
|
+
var NFSeResource = class extends BaseResource {
|
|
459
|
+
/**
|
|
460
|
+
* Emite uma Nota Fiscal de Serviços Eletrônica (NFS-e) perante o SND ou prefeitura.
|
|
461
|
+
*/
|
|
462
|
+
async emitir(payload) {
|
|
463
|
+
return this.request({
|
|
464
|
+
method: "POST",
|
|
465
|
+
path: "/v1/nfse/emitir",
|
|
466
|
+
body: payload
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Simula o cálculo de NFS-e com retenções e apuração tributária (custo ZERO de créditos).
|
|
471
|
+
*/
|
|
472
|
+
async simular(payload) {
|
|
473
|
+
return this.request({
|
|
474
|
+
method: "POST",
|
|
475
|
+
path: "/v1/nfse/simular",
|
|
476
|
+
body: payload
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Homologa o cancelamento oficial de uma NFS-e perante o SND ou prefeitura.
|
|
481
|
+
*/
|
|
482
|
+
async cancelar(payload) {
|
|
483
|
+
return this.request({
|
|
484
|
+
method: "POST",
|
|
485
|
+
path: "/v1/nfse/cancelar",
|
|
486
|
+
body: payload
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Consulta os dados, status e DANFSE de uma NFS-e pelo número ou chave de 50 dígitos.
|
|
491
|
+
*/
|
|
492
|
+
async consultar(chaveOuNumero) {
|
|
493
|
+
return this.request({
|
|
494
|
+
method: "GET",
|
|
495
|
+
path: `/v1/nfse/${chaveOuNumero}`
|
|
496
|
+
});
|
|
497
|
+
}
|
|
242
498
|
};
|
|
243
499
|
|
|
244
500
|
// src/resources/products.ts
|
|
245
501
|
var ProductsResource = class extends BaseResource {
|
|
246
502
|
/**
|
|
247
|
-
* Consulta um produto por código de barras GTIN/EAN.
|
|
503
|
+
* Consulta dados oficiais de um produto por código de barras GTIN/EAN (V1).
|
|
248
504
|
* @param gtin Código numérico de 8 a 14 dígitos.
|
|
249
505
|
*/
|
|
250
506
|
async get(gtin) {
|
|
251
507
|
const gtinLimpo = gtin.replace(/\D/g, "");
|
|
252
508
|
const data = await this.request({
|
|
253
509
|
method: "GET",
|
|
254
|
-
path: `/
|
|
510
|
+
path: `/v1/gtin/${gtinLimpo}`
|
|
255
511
|
});
|
|
256
512
|
const prod = data.produto || data;
|
|
257
513
|
return {
|
|
@@ -268,6 +524,100 @@ var ProductsResource = class extends BaseResource {
|
|
|
268
524
|
quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1)
|
|
269
525
|
};
|
|
270
526
|
}
|
|
527
|
+
/**
|
|
528
|
+
* Consulta dados enriquecidos por IA, com SEO e ficha técnica estruturada (V2).
|
|
529
|
+
* @param gtin Código numérico do produto.
|
|
530
|
+
*/
|
|
531
|
+
async getEnriched(gtin) {
|
|
532
|
+
const gtinLimpo = gtin.replace(/\D/g, "");
|
|
533
|
+
const data = await this.request({
|
|
534
|
+
method: "GET",
|
|
535
|
+
path: `/v2/gtin/${gtinLimpo}`
|
|
536
|
+
});
|
|
537
|
+
const prod = data.produto || data;
|
|
538
|
+
return {
|
|
539
|
+
gtin: prod.GTIN || prod.gtin || gtinLimpo,
|
|
540
|
+
xProd: prod.xProd || prod.descricao || "Descri\xE7\xE3o Indispon\xEDvel",
|
|
541
|
+
descricao_completa: prod.descricao_completa,
|
|
542
|
+
ficha_tecnica: prod.ficha_tecnica,
|
|
543
|
+
palavras_chave: prod.palavras_chave,
|
|
544
|
+
ncm: prod.NCM || prod.ncm,
|
|
545
|
+
cest: prod.CEST || prod.cest,
|
|
546
|
+
marca: prod.marca,
|
|
547
|
+
categoria: prod.categoria,
|
|
548
|
+
imagem_url: prod.imagem_url,
|
|
549
|
+
peso_bruto: prod.peso_bruto ? Number(prod.peso_bruto) : void 0,
|
|
550
|
+
peso_liquido: prod.peso_liquido ? Number(prod.peso_liquido) : void 0,
|
|
551
|
+
dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Executa busca semântica por intenção/linguagem natural (V2).
|
|
556
|
+
* @param query Termo livre de busca (ex: 'refrigerante zero lata').
|
|
557
|
+
*/
|
|
558
|
+
async search(query) {
|
|
559
|
+
const data = await this.request({
|
|
560
|
+
method: "GET",
|
|
561
|
+
path: "/v2/gtin/search",
|
|
562
|
+
params: { q: query }
|
|
563
|
+
});
|
|
564
|
+
const itens = (data.produtos || []).map((item) => ({
|
|
565
|
+
gtin: String(item.GTIN || item.gtin),
|
|
566
|
+
xProd: String(item.xProd || item.descricao),
|
|
567
|
+
marca: item.marca,
|
|
568
|
+
categoria: item.categoria,
|
|
569
|
+
score: item.score !== void 0 ? Number(item.score) : void 0,
|
|
570
|
+
ncm: item.NCM || item.ncm,
|
|
571
|
+
cest: item.CEST || item.cest,
|
|
572
|
+
imagem_url: item.imagem_url
|
|
573
|
+
}));
|
|
574
|
+
return {
|
|
575
|
+
status: data.status || "success",
|
|
576
|
+
provider: data.provider || "PAIRUS",
|
|
577
|
+
total_encontrados: itens.length,
|
|
578
|
+
termo_buscado: query,
|
|
579
|
+
produtos: itens
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* Reconhece código de barras por visão computacional a partir de foto JPEG (OCR V2).
|
|
584
|
+
* @param file Blob, Buffer ou FormData com a imagem JPEG.
|
|
585
|
+
*/
|
|
586
|
+
async scan(file) {
|
|
587
|
+
let formData;
|
|
588
|
+
if (typeof FormData !== "undefined" && file instanceof FormData) {
|
|
589
|
+
formData = file;
|
|
590
|
+
} else {
|
|
591
|
+
formData = new FormData();
|
|
592
|
+
if (typeof Blob !== "undefined" && file instanceof Blob) {
|
|
593
|
+
formData.append("file", file, "barcode.jpg");
|
|
594
|
+
} else {
|
|
595
|
+
const blob = new Blob([file], { type: "image/jpeg" });
|
|
596
|
+
formData.append("file", blob, "barcode.jpg");
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
const data = await this.request({
|
|
600
|
+
method: "POST",
|
|
601
|
+
path: "/v2/gtin/scan",
|
|
602
|
+
body: formData
|
|
603
|
+
});
|
|
604
|
+
const prod = data.produto || data;
|
|
605
|
+
return {
|
|
606
|
+
gtin: prod.GTIN || prod.gtin || "",
|
|
607
|
+
xProd: prod.xProd || prod.descricao || "Descri\xE7\xE3o Indispon\xEDvel",
|
|
608
|
+
descricao_completa: prod.descricao_completa,
|
|
609
|
+
ficha_tecnica: prod.ficha_tecnica,
|
|
610
|
+
palavras_chave: prod.palavras_chave,
|
|
611
|
+
ncm: prod.NCM || prod.ncm,
|
|
612
|
+
cest: prod.CEST || prod.cest,
|
|
613
|
+
marca: prod.marca,
|
|
614
|
+
categoria: prod.categoria,
|
|
615
|
+
imagem_url: prod.imagem_url,
|
|
616
|
+
peso_bruto: prod.peso_bruto ? Number(prod.peso_bruto) : void 0,
|
|
617
|
+
peso_liquido: prod.peso_liquido ? Number(prod.peso_liquido) : void 0,
|
|
618
|
+
dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos
|
|
619
|
+
};
|
|
620
|
+
}
|
|
271
621
|
};
|
|
272
622
|
|
|
273
623
|
// src/webhooks.ts
|
|
@@ -325,6 +675,8 @@ var PairusProductData = class {
|
|
|
325
675
|
products;
|
|
326
676
|
fiscal;
|
|
327
677
|
emissao;
|
|
678
|
+
nfse;
|
|
679
|
+
dfe;
|
|
328
680
|
constructor(options) {
|
|
329
681
|
const apiKey = options?.apiKey || (typeof process !== "undefined" ? process.env.PAIRUS_API_KEY : void 0);
|
|
330
682
|
if (!apiKey) {
|
|
@@ -338,6 +690,8 @@ var PairusProductData = class {
|
|
|
338
690
|
this.products = new ProductsResource(apiKey, baseUrl, timeoutMs, maxRetries);
|
|
339
691
|
this.fiscal = new FiscalResource(apiKey, baseUrl, timeoutMs, maxRetries);
|
|
340
692
|
this.emissao = new EmissaoResource(apiKey, baseUrl, timeoutMs, maxRetries);
|
|
693
|
+
this.nfse = new NFSeResource(apiKey, baseUrl, timeoutMs, maxRetries);
|
|
694
|
+
this.dfe = new DFeResource(apiKey, baseUrl, timeoutMs, maxRetries);
|
|
341
695
|
}
|
|
342
696
|
};
|
|
343
697
|
export {
|
|
@@ -345,9 +699,11 @@ export {
|
|
|
345
699
|
DEFAULT_BASE_URL,
|
|
346
700
|
DEFAULT_MAX_RETRIES,
|
|
347
701
|
DEFAULT_TIMEOUT_MS,
|
|
702
|
+
DFeResource,
|
|
348
703
|
EmissaoResource,
|
|
349
704
|
FiscalResource,
|
|
350
705
|
InvalidSignatureError,
|
|
706
|
+
NFSeResource,
|
|
351
707
|
NetworkError,
|
|
352
708
|
PairusAPIError,
|
|
353
709
|
PairusError,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/resources/base.ts","../src/resources/emissao.ts","../src/resources/fiscal.ts","../src/resources/products.ts","../src/webhooks.ts","../src/client.ts"],"sourcesContent":["/**\r\n * Opções de configuração para o cliente PairusProductData.\r\n */\r\n\r\nexport interface PairusClientOptions {\r\n apiKey?: string;\r\n baseUrl?: string;\r\n timeoutMs?: number;\r\n maxRetries?: number;\r\n}\r\n\r\nexport const DEFAULT_BASE_URL = 'https://api.pairus.com.br';\r\nexport const DEFAULT_TIMEOUT_MS = 15000;\r\nexport const DEFAULT_MAX_RETRIES = 3;\r\n","/**\r\n * Classes de erro oficiais do SDK @pairus/product-data.\r\n */\r\n\r\nexport class PairusError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'PairusError';\r\n }\r\n}\r\n\r\nexport class PairusAPIError extends PairusError {\r\n public readonly statusCode: number;\r\n public readonly cStat: string;\r\n public readonly xMotivo: string;\r\n public readonly details?: any;\r\n\r\n constructor(statusCode: number, cStat?: string, xMotivo?: string, details?: any) {\r\n const code = cStat || String(statusCode);\r\n const reason = xMotivo || details?.detail || `Erro HTTP ${statusCode}`;\r\n super(`[${code}] ${reason}`);\r\n this.name = 'PairusAPIError';\r\n this.statusCode = statusCode;\r\n this.cStat = code;\r\n this.xMotivo = reason;\r\n this.details = details;\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends PairusAPIError {\r\n constructor(cStat = '401', xMotivo = 'Chave de API inválida ou não autorizada.', details?: any) {\r\n super(401, cStat, xMotivo, details);\r\n this.name = 'AuthenticationError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends PairusAPIError {\r\n public readonly retryAfter?: number;\r\n\r\n constructor(retryAfter?: number, cStat = '429', xMotivo = 'Limite de requisições excedido.', details?: any) {\r\n super(429, cStat, xMotivo, details);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\nexport class InvalidSignatureError extends PairusError {\r\n constructor(message = \"A assinatura criptográfica do webhook ('X-Pairus-Signature') é inválida.\") {\r\n super(message);\r\n this.name = 'InvalidSignatureError';\r\n }\r\n}\r\n\r\nexport class NetworkError extends PairusError {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n","import {\r\n AuthenticationError,\r\n NetworkError,\r\n PairusAPIError,\r\n RateLimitError,\r\n} from '../errors.js';\r\n\r\nexport interface RequestOptions {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\r\n path: string;\r\n params?: Record<string, string>;\r\n body?: any;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport class BaseResource {\r\n protected apiKey: string;\r\n protected baseUrl: string;\r\n protected timeoutMs: number;\r\n protected maxRetries: number;\r\n\r\n constructor(apiKey: string, baseUrl: string, timeoutMs: number, maxRetries: number) {\r\n this.apiKey = apiKey;\r\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\r\n this.timeoutMs = timeoutMs;\r\n this.maxRetries = maxRetries;\r\n }\r\n\r\n protected async request<T>(options: RequestOptions): Promise<T> {\r\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\r\n if (options.params) {\r\n const query = new URLSearchParams(options.params).toString();\r\n url = `${url}?${query}`;\r\n }\r\n\r\n const reqHeaders: Record<string, string> = {\r\n 'Accept': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n 'User-Agent': 'Pairus-NodeJS-SDK/1.0.0',\r\n ...(options.headers || {}),\r\n };\r\n\r\n if (options.body) {\r\n reqHeaders['Content-Type'] = 'application/json';\r\n }\r\n\r\n let lastError: any = null;\r\n\r\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\r\n\r\n const response = await fetch(url, {\r\n method: options.method,\r\n headers: reqHeaders,\r\n body: options.body ? JSON.stringify(options.body) : undefined,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (response.ok) {\r\n return (await response.json()) as T;\r\n }\r\n\r\n let errData: any = {};\r\n try {\r\n errData = await response.json();\r\n } catch {\r\n errData = {};\r\n }\r\n\r\n if (response.status === 401) {\r\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n if (response.status === 429) {\r\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\r\n if (attempt < this.maxRetries - 1) {\r\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\r\n continue;\r\n }\r\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n if ([502, 503, 504].includes(response.status) && attempt < this.maxRetries - 1) {\r\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\r\n await new Promise((res) => setTimeout(res, delay));\r\n continue;\r\n }\r\n\r\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\r\n } catch (err: any) {\r\n if (err instanceof PairusAPIError) {\r\n throw err;\r\n }\r\n lastError = err;\r\n if (attempt < this.maxRetries - 1) {\r\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\r\n await new Promise((res) => setTimeout(res, delay));\r\n continue;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\r\n }\r\n}\r\n","import { BaseResource } from './base.js';\nimport {\n CancelamentoInput,\n CartaCorrecaoInput,\n EmissaoNFeInput,\n EmissaoNFeResponse,\n EventoNFeResponse,\n InutilizacaoInput,\n} from '../types/emissao.js';\n\nexport class EmissaoResource extends BaseResource {\n /**\n * Emite uma Nota Fiscal Eletrônica (NF-e Modelo 55) perante a SEFAZ.\n */\n public async emitirNFe(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\n return this.request<EmissaoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/emitir',\n body: payload,\n });\n }\n\n /**\n * Emite uma Nota Fiscal de Consumidor Eletrônica (NFC-e Modelo 65) perante a SEFAZ.\n */\n public async emitirNFCe(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\n return this.request<EmissaoNFeResponse>({\n method: 'POST',\n path: '/v1/nfce/emitir',\n body: payload,\n });\n }\n\n /**\n * Simula uma emissão fiscal sem transmitir à SEFAZ (custo ZERO de créditos).\n */\n public async simular(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\n return this.request<EmissaoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/simular',\n body: payload,\n });\n }\n\n /**\n * Homologa o cancelamento oficial de uma NF-e ou NFC-e perante a SEFAZ.\n */\n public async cancelar(params: CancelamentoInput): Promise<EventoNFeResponse> {\n return this.request<EventoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/cancelar',\n body: {\n chave_acesso: params.chave_acesso,\n justificativa: params.justificativa,\n protocolo_autorizacao: params.protocolo_autorizacao,\n },\n });\n }\n\n /**\n * Emite uma Carta de Correção Eletrônica (CC-e) perante a SEFAZ.\n */\n public async cartaCorrecao(params: CartaCorrecaoInput): Promise<EventoNFeResponse> {\n return this.request<EventoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/carta-correcao',\n body: {\n chave_acesso: params.chave_acesso,\n correcao: params.correcao,\n sequencia_evento: params.sequencia_evento ?? 1,\n },\n });\n }\n\n /**\n * Inutiliza uma faixa de numeração quebrada na SEFAZ (Ajuste SINIEF 07/05).\n */\n public async inutilizar(params: InutilizacaoInput): Promise<EventoNFeResponse> {\n return this.request<EventoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/inutilizar',\n body: {\n cnpj_emitente: params.cnpj_emitente,\n serie: params.serie,\n numero_inicial: params.numero_inicial,\n numero_final: params.numero_final,\n justificativa: params.justificativa,\n ano: params.ano,\n modelo: params.modelo ?? 55,\n },\n });\n }\n}\n","import { BaseResource } from './base.js';\r\nimport { TaxPredictionParams, TaxPredictionResponse } from '../types/fiscal.js';\r\n\r\nexport class FiscalResource extends BaseResource {\r\n /**\r\n * Executa a predição fiscal completa da Reforma Tributária (IBS/CBS/IS) e NF-e.\r\n */\r\n public async predict(params: TaxPredictionParams): Promise<TaxPredictionResponse> {\r\n const payload: Record<string, any> = {\r\n regime_tributario: params.regimeTributario,\r\n uf_origem: params.ufOrigem,\r\n uf_destino: params.ufDestino || params.ufOrigem,\r\n finalidade: params.finalidade || 'revenda',\r\n destinatario_contribuinte: params.destinatarioContribuinte ?? true,\r\n };\r\n\r\n if (params.xProd) payload.xProd = params.xProd;\r\n if (params.gtin) payload.gtin = params.gtin;\r\n if (params.ncm) payload.ncm = params.ncm;\r\n if (params.cest) payload.cest = params.cest;\r\n if (params.itens) payload.itens = params.itens;\r\n\r\n return this.request<TaxPredictionResponse>({\r\n method: 'POST',\r\n path: '/v2/fiscal/predict',\r\n body: payload,\r\n });\r\n }\r\n}\r\n","import { BaseResource } from './base.js';\r\nimport { ProductDetails, ProductResponse } from '../types/product.js';\r\n\r\nexport class ProductsResource extends BaseResource {\r\n /**\r\n * Consulta um produto por código de barras GTIN/EAN.\r\n * @param gtin Código numérico de 8 a 14 dígitos.\r\n */\r\n public async get(gtin: string): Promise<ProductDetails> {\r\n const gtinLimpo = gtin.replace(/\\D/g, '');\r\n const data = await this.request<ProductResponse>({\r\n method: 'GET',\r\n path: `/api/produtos/${gtinLimpo}`,\r\n });\r\n\r\n const prod: any = data.produto || data;\r\n return {\r\n gtin: prod.GTIN || prod.gtin || gtinLimpo,\r\n xProd: prod.xProd || prod.descricao || 'Descrição Indisponível',\r\n ncm: prod.NCM || prod.ncm,\r\n cest: prod.CEST || prod.cest,\r\n marca: prod.marca,\r\n fabricante: prod.fabricante,\r\n categoria: prod.categoria,\r\n imagemUrl: prod.imagem_url || prod.thumbnail,\r\n pesoBruto: prod.peso_bruto ? Number(prod.peso_bruto) : undefined,\r\n pesoLiquido: prod.peso_liquido ? Number(prod.peso_liquido) : undefined,\r\n quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1),\r\n };\r\n }\r\n}\r\n","import * as crypto from 'crypto';\r\nimport { InvalidSignatureError } from './errors.js';\r\nimport { WebhookEvent } from './types/webhook.js';\r\n\r\nexport class Webhooks {\r\n /**\r\n * Calcula a assinatura HMAC-SHA256 esperada para o payload informado.\r\n */\r\n public static computeSignature(payload: string | Buffer, secret: string): string {\r\n return crypto\r\n .createHmac('sha256', secret)\r\n .update(payload)\r\n .digest('hex');\r\n }\r\n\r\n /**\r\n * Verifica de forma segura (resistente a timing attacks) a assinatura de um webhook.\r\n */\r\n public static verifySignature(\r\n payload: string | Buffer | Record<string, any>,\r\n signature: string | undefined | null,\r\n secret: string\r\n ): boolean {\r\n if (!signature || !secret) {\r\n return false;\r\n }\r\n\r\n let payloadBuffer: Buffer;\r\n if (Buffer.isBuffer(payload)) {\r\n payloadBuffer = payload;\r\n } else if (typeof payload === 'string') {\r\n payloadBuffer = Buffer.from(payload, 'utf-8');\r\n } else {\r\n payloadBuffer = Buffer.from(JSON.stringify(payload), 'utf-8');\r\n }\r\n\r\n const expectedSignature = this.computeSignature(payloadBuffer, secret);\r\n\r\n try {\r\n const sigBuf = Buffer.from(signature.trim(), 'hex');\r\n const expectedBuf = Buffer.from(expectedSignature, 'hex');\r\n\r\n if (sigBuf.length !== expectedBuf.length) {\r\n return false;\r\n }\r\n\r\n return crypto.timingSafeEqual(sigBuf, expectedBuf);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Valida a assinatura e converte o payload em objeto tipado WebhookEvent.\r\n */\r\n public static constructEvent<T = Record<string, any>>(\r\n payload: string | Buffer,\r\n signature: string | undefined | null,\r\n secret: string\r\n ): WebhookEvent<T> {\r\n if (!this.verifySignature(payload, signature, secret)) {\r\n throw new InvalidSignatureError(\"Assinatura do webhook ('X-Pairus-Signature') é inválida.\");\r\n }\r\n\r\n const rawStr = Buffer.isBuffer(payload) ? payload.toString('utf-8') : payload;\r\n return JSON.parse(rawStr) as WebhookEvent<T>;\r\n }\r\n}\r\n","import {\r\n DEFAULT_BASE_URL,\r\n DEFAULT_MAX_RETRIES,\r\n DEFAULT_TIMEOUT_MS,\r\n PairusClientOptions,\r\n} from './config.js';\r\nimport { EmissaoResource } from './resources/emissao.js';\r\nimport { FiscalResource } from './resources/fiscal.js';\r\nimport { ProductsResource } from './resources/products.js';\r\nimport { Webhooks } from './webhooks.js';\r\n\r\nexport class PairusProductData {\r\n public static readonly webhooks = Webhooks;\r\n public readonly webhooks = Webhooks;\r\n\r\n public readonly products: ProductsResource;\r\n public readonly fiscal: FiscalResource;\r\n public readonly emissao: EmissaoResource;\r\n\r\n constructor(options?: PairusClientOptions) {\r\n const apiKey = options?.apiKey || (typeof process !== 'undefined' ? process.env.PAIRUS_API_KEY : undefined);\r\n if (!apiKey) {\r\n throw new Error(\r\n \"A chave de API da PAIRUS é obrigatória. Passe 'apiKey' no construtor ou defina a variável 'PAIRUS_API_KEY'.\"\r\n );\r\n }\r\n\r\n const baseUrl = options?.baseUrl || (typeof process !== 'undefined' ? process.env.PAIRUS_BASE_URL : undefined) || DEFAULT_BASE_URL;\r\n const timeoutMs = options?.timeoutMs || DEFAULT_TIMEOUT_MS;\r\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\r\n\r\n this.products = new ProductsResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n this.fiscal = new FiscalResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n this.emissao = new EmissaoResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/errors.ts","../src/resources/base.ts","../src/resources/dfe.ts","../src/resources/emissao.ts","../src/resources/fiscal.ts","../src/resources/nfse.ts","../src/resources/products.ts","../src/webhooks.ts","../src/client.ts"],"sourcesContent":["/**\r\n * Opções de configuração para o cliente PairusProductData.\r\n */\r\n\r\nexport interface PairusClientOptions {\r\n apiKey?: string;\r\n baseUrl?: string;\r\n timeoutMs?: number;\r\n maxRetries?: number;\r\n}\r\n\r\nexport const DEFAULT_BASE_URL = 'https://api.pairus.com.br';\r\nexport const DEFAULT_TIMEOUT_MS = 15000;\r\nexport const DEFAULT_MAX_RETRIES = 3;\r\n","/**\r\n * Classes de erro oficiais do SDK @pairus/product-data.\r\n */\r\n\r\nexport class PairusError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'PairusError';\r\n }\r\n}\r\n\r\nexport class PairusAPIError extends PairusError {\r\n public readonly statusCode: number;\r\n public readonly cStat: string;\r\n public readonly xMotivo: string;\r\n public readonly details?: any;\r\n\r\n constructor(statusCode: number, cStat?: string, xMotivo?: string, details?: any) {\r\n const code = cStat || String(statusCode);\r\n const reason = xMotivo || details?.detail || `Erro HTTP ${statusCode}`;\r\n super(`[${code}] ${reason}`);\r\n this.name = 'PairusAPIError';\r\n this.statusCode = statusCode;\r\n this.cStat = code;\r\n this.xMotivo = reason;\r\n this.details = details;\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends PairusAPIError {\r\n constructor(cStat = '401', xMotivo = 'Chave de API inválida ou não autorizada.', details?: any) {\r\n super(401, cStat, xMotivo, details);\r\n this.name = 'AuthenticationError';\r\n }\r\n}\r\n\r\nexport class RateLimitError extends PairusAPIError {\r\n public readonly retryAfter?: number;\r\n\r\n constructor(retryAfter?: number, cStat = '429', xMotivo = 'Limite de requisições excedido.', details?: any) {\r\n super(429, cStat, xMotivo, details);\r\n this.name = 'RateLimitError';\r\n this.retryAfter = retryAfter;\r\n }\r\n}\r\n\r\nexport class InvalidSignatureError extends PairusError {\r\n constructor(message = \"A assinatura criptográfica do webhook ('X-Pairus-Signature') é inválida.\") {\r\n super(message);\r\n this.name = 'InvalidSignatureError';\r\n }\r\n}\r\n\r\nexport class NetworkError extends PairusError {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n","import {\r\n AuthenticationError,\r\n NetworkError,\r\n PairusAPIError,\r\n RateLimitError,\r\n} from '../errors.js';\r\n\r\nexport interface RequestOptions {\r\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\r\n path: string;\r\n params?: Record<string, string>;\r\n body?: any;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport class BaseResource {\r\n protected apiKey: string;\r\n protected baseUrl: string;\r\n protected timeoutMs: number;\r\n protected maxRetries: number;\r\n\r\n constructor(apiKey: string, baseUrl: string, timeoutMs: number, maxRetries: number) {\r\n this.apiKey = apiKey;\r\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\r\n this.timeoutMs = timeoutMs;\r\n this.maxRetries = maxRetries;\r\n }\r\n\r\n protected async request<T>(options: RequestOptions): Promise<T> {\r\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\r\n if (options.params) {\r\n const query = new URLSearchParams(options.params).toString();\r\n url = `${url}?${query}`;\r\n }\r\n\r\n const reqHeaders: Record<string, string> = {\r\n 'Accept': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n 'User-Agent': 'Pairus-NodeJS-SDK/1.2.0',\r\n ...(options.headers || {}),\r\n };\r\n\r\n const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData;\r\n\r\n if (options.body && !isFormData && !reqHeaders['Content-Type']) {\r\n reqHeaders['Content-Type'] = 'application/json';\r\n }\r\n\r\n let lastError: any = null;\r\n\r\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\r\n\r\n const bodyData = isFormData\r\n ? options.body\r\n : options.body\r\n ? JSON.stringify(options.body)\r\n : undefined;\r\n\r\n const response = await fetch(url, {\r\n method: options.method,\r\n headers: reqHeaders,\r\n body: bodyData,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (response.ok || (response.status >= 200 && response.status < 300)) {\r\n return (await response.json()) as T;\r\n }\r\n\r\n let errData: any = {};\r\n try {\r\n errData = await response.json();\r\n } catch {\r\n errData = {};\r\n }\r\n\r\n if (response.status === 401) {\r\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n if (response.status === 429) {\r\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\r\n if (attempt < this.maxRetries - 1) {\r\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\r\n continue;\r\n }\r\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n if ([502, 503, 504].includes(response.status) && attempt < this.maxRetries - 1) {\r\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\r\n await new Promise((res) => setTimeout(res, delay));\r\n continue;\r\n }\r\n\r\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\r\n } catch (err: any) {\r\n if (err instanceof PairusAPIError) {\r\n throw err;\r\n }\r\n lastError = err;\r\n if (attempt < this.maxRetries - 1) {\r\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\r\n await new Promise((res) => setTimeout(res, delay));\r\n continue;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\r\n }\r\n\r\n protected async requestText(options: RequestOptions): Promise<string> {\r\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\r\n if (options.params) {\r\n const query = new URLSearchParams(options.params).toString();\r\n url = `${url}?${query}`;\r\n }\r\n\r\n const reqHeaders: Record<string, string> = {\r\n 'Accept': '*/*',\r\n 'X-API-Key': this.apiKey,\r\n 'User-Agent': 'Pairus-NodeJS-SDK/1.3.0',\r\n ...(options.headers || {}),\r\n };\r\n\r\n let lastError: any = null;\r\n\r\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\r\n\r\n const response = await fetch(url, {\r\n method: options.method,\r\n headers: reqHeaders,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (response.ok || (response.status >= 200 && response.status < 300)) {\r\n return await response.text();\r\n }\r\n\r\n let errData: any = {};\r\n try {\r\n errData = await response.json();\r\n } catch {\r\n errData = {};\r\n }\r\n\r\n if (response.status === 401) {\r\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n if (response.status === 429) {\r\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\r\n if (attempt < this.maxRetries - 1) {\r\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\r\n continue;\r\n }\r\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\r\n } catch (err: any) {\r\n if (err instanceof PairusAPIError) {\r\n throw err;\r\n }\r\n lastError = err;\r\n if (attempt < this.maxRetries - 1) {\r\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\r\n await new Promise((res) => setTimeout(res, delay));\r\n continue;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\r\n }\r\n\r\n protected async requestBinary(options: RequestOptions): Promise<ArrayBuffer> {\r\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\r\n if (options.params) {\r\n const query = new URLSearchParams(options.params).toString();\r\n url = `${url}?${query}`;\r\n }\r\n\r\n const reqHeaders: Record<string, string> = {\r\n 'Accept': '*/*',\r\n 'X-API-Key': this.apiKey,\r\n 'User-Agent': 'Pairus-NodeJS-SDK/1.3.0',\r\n ...(options.headers || {}),\r\n };\r\n\r\n let lastError: any = null;\r\n\r\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\r\n\r\n const response = await fetch(url, {\r\n method: options.method,\r\n headers: reqHeaders,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (response.ok || (response.status >= 200 && response.status < 300)) {\r\n return await response.arrayBuffer();\r\n }\r\n\r\n let errData: any = {};\r\n try {\r\n errData = await response.json();\r\n } catch {\r\n errData = {};\r\n }\r\n\r\n if (response.status === 401) {\r\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n if (response.status === 429) {\r\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\r\n if (attempt < this.maxRetries - 1) {\r\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\r\n continue;\r\n }\r\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\r\n }\r\n\r\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\r\n } catch (err: any) {\r\n if (err instanceof PairusAPIError) {\r\n throw err;\r\n }\r\n lastError = err;\r\n if (attempt < this.maxRetries - 1) {\r\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\r\n await new Promise((res) => setTimeout(res, delay));\r\n continue;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\r\n }\r\n}\r\n","import { BaseResource } from './base.js';\nimport {\n ListarDocumentosDFeParams,\n ListarDocumentosDFeResponse,\n ManifestarDFeInput,\n ManifestarDFeResponse,\n SincronizarDFeInput,\n SincronizarDFeResponse,\n} from '../types/dfe.js';\n\nexport class DFeResource extends BaseResource {\n /**\n * Dispara busca ativa de notas fiscais emitidas contra o CNPJ na SEFAZ Nacional.\n *\n * @param input Parâmetros de sincronização (CNPJ e ambiente opcional)\n * @returns Resultado da consulta SEFAZ com novos documentos e controle de NSU\n */\n public async sincronizar(input: SincronizarDFeInput): Promise<SincronizarDFeResponse> {\n return this.request<SincronizarDFeResponse>({\n method: 'POST',\n path: '/v1/dfe/sincronizar',\n body: {\n cnpj: input.cnpj,\n ambiente: input.ambiente || 'producao',\n },\n });\n }\n\n /**\n * Lista notas fiscais de compras emitidas por fornecedores contra a sua empresa.\n *\n * @param params Filtros de busca (CNPJ, ambiente e limite de registros)\n * @returns Lista de documentos fiscais capturados e status de manifestação\n */\n public async listarDocumentos(params: ListarDocumentosDFeParams): Promise<ListarDocumentosDFeResponse> {\n const queryParams: Record<string, string> = {\n cnpj: params.cnpj,\n ambiente: params.ambiente || 'producao',\n };\n if (params.limite) {\n queryParams.limite = String(params.limite);\n }\n\n return this.request<ListarDocumentosDFeResponse>({\n method: 'GET',\n path: '/v1/dfe/documentos',\n params: queryParams,\n });\n }\n\n /**\n * Registra evento oficial de Manifestação do Destinatário perante o Ambiente Nacional da SEFAZ.\n *\n * @param input Dados do evento ('210210' Ciência, '210200' Confirmação, '210220' Desconhecimento, '210240' Não Realizada)\n * @returns Protocolo de homologação do evento na SEFAZ\n */\n public async manifestar(input: ManifestarDFeInput): Promise<ManifestarDFeResponse> {\n return this.request<ManifestarDFeResponse>({\n method: 'POST',\n path: '/v1/dfe/manifestar',\n body: {\n cnpj: input.cnpj,\n chave_acesso: input.chave_acesso,\n tipo_evento: input.tipo_evento,\n justificativa: input.justificativa,\n ambiente: input.ambiente || 'producao',\n },\n });\n }\n\n /**\n * Baixa o arquivo XML autorizado (procNFe) da nota fiscal capturada.\n *\n * @param chaveAcesso Chave de acesso de 44 dígitos da NF-e\n * @returns Conteúdo do XML em formato string\n */\n public async baixarXml(chaveAcesso: string): Promise<string> {\n return this.requestText({\n method: 'GET',\n path: `/v1/dfe/xml/${chaveAcesso}`,\n });\n }\n\n /**\n * Baixa o DANFE em PDF da nota fiscal de fornecedor.\n *\n * @param chaveAcesso Chave de acesso de 44 dígitos da NF-e\n * @returns ArrayBuffer contendo o PDF binário\n */\n public async baixarDanfe(chaveAcesso: string): Promise<ArrayBuffer> {\n return this.requestBinary({\n method: 'GET',\n path: `/v1/dfe/danfe/${chaveAcesso}`,\n });\n }\n}\n","import { BaseResource } from './base.js';\nimport {\n CancelamentoInput,\n CartaCorrecaoInput,\n EmissaoNFeInput,\n EmissaoNFeResponse,\n EventoNFeResponse,\n InutilizacaoInput,\n} from '../types/emissao.js';\n\nexport class EmissaoResource extends BaseResource {\n /**\n * Emite uma Nota Fiscal Eletrônica (NF-e Modelo 55) perante a SEFAZ.\n */\n public async emitirNFe(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\n return this.request<EmissaoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/emitir',\n body: payload,\n });\n }\n\n /**\n * Emite uma Nota Fiscal de Consumidor Eletrônica (NFC-e Modelo 65) perante a SEFAZ.\n */\n public async emitirNFCe(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\n return this.request<EmissaoNFeResponse>({\n method: 'POST',\n path: '/v1/nfce/emitir',\n body: payload,\n });\n }\n\n /**\n * Simula uma emissão fiscal sem transmitir à SEFAZ (custo ZERO de créditos).\n */\n public async simular(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\n return this.request<EmissaoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/simular',\n body: payload,\n });\n }\n\n /**\n * Homologa o cancelamento oficial de uma NF-e ou NFC-e perante a SEFAZ.\n */\n public async cancelar(params: CancelamentoInput): Promise<EventoNFeResponse> {\n return this.request<EventoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/cancelar',\n body: {\n chave_acesso: params.chave_acesso,\n justificativa: params.justificativa,\n protocolo_autorizacao: params.protocolo_autorizacao,\n },\n });\n }\n\n /**\n * Emite uma Carta de Correção Eletrônica (CC-e) perante a SEFAZ.\n */\n public async cartaCorrecao(params: CartaCorrecaoInput): Promise<EventoNFeResponse> {\n return this.request<EventoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/carta-correcao',\n body: {\n chave_acesso: params.chave_acesso,\n correcao: params.correcao,\n sequencia_evento: params.sequencia_evento ?? 1,\n },\n });\n }\n\n /**\n * Inutiliza uma faixa de numeração quebrada na SEFAZ (Ajuste SINIEF 07/05).\n */\n public async inutilizar(params: InutilizacaoInput): Promise<EventoNFeResponse> {\n return this.request<EventoNFeResponse>({\n method: 'POST',\n path: '/v1/nfe/inutilizar',\n body: {\n cnpj_emitente: params.cnpj_emitente,\n serie: params.serie,\n numero_inicial: params.numero_inicial,\n numero_final: params.numero_final,\n justificativa: params.justificativa,\n ano: params.ano,\n modelo: params.modelo ?? 55,\n },\n });\n }\n}\n","import { BaseResource } from './base.js';\r\nimport { TaxPredictionParams, TaxPredictionResponse } from '../types/fiscal.js';\r\n\r\nexport class FiscalResource extends BaseResource {\r\n /**\r\n * Executa a predição fiscal completa da Reforma Tributária (IBS/CBS/IS) e NF-e.\r\n */\r\n public async predict(params: TaxPredictionParams): Promise<TaxPredictionResponse> {\r\n const payload: Record<string, any> = {\r\n regime_tributario: params.regimeTributario,\r\n uf_origem: params.ufOrigem,\r\n uf_destino: params.ufDestino || params.ufOrigem,\r\n finalidade: params.finalidade || 'revenda',\r\n destinatario_contribuinte: params.destinatarioContribuinte ?? true,\r\n };\r\n\r\n if (params.xProd) payload.xProd = params.xProd;\r\n if (params.gtin) payload.gtin = params.gtin;\r\n if (params.ncm) payload.ncm = params.ncm;\r\n if (params.cest) payload.cest = params.cest;\r\n if (params.itens) payload.itens = params.itens;\r\n\r\n return this.request<TaxPredictionResponse>({\r\n method: 'POST',\r\n path: '/v2/fiscal/predict',\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Audita e higieniza uma lista de produtos em lote perante as tabelas fiscais vigentes.\r\n */\r\n public async sanitize(itens: Array<Record<string, any>>): Promise<any> {\r\n return this.request<any>({\r\n method: 'POST',\r\n path: '/v2/fiscal/sanitize',\r\n body: { itens },\r\n });\r\n }\r\n}\r\n\r\n","import { BaseResource } from './base.js';\nimport {\n CancelamentoNFSeInput,\n CancelamentoNFSeResponse,\n NFSeEmissaoInput,\n NFSeEmissaoResponse,\n} from '../types/nfse.js';\n\nexport class NFSeResource extends BaseResource {\n /**\n * Emite uma Nota Fiscal de Serviços Eletrônica (NFS-e) perante o SND ou prefeitura.\n */\n async emitir(payload: NFSeEmissaoInput | Record<string, any>): Promise<NFSeEmissaoResponse> {\n return this.request<NFSeEmissaoResponse>({\n method: 'POST',\n path: '/v1/nfse/emitir',\n body: payload,\n });\n }\n\n /**\n * Simula o cálculo de NFS-e com retenções e apuração tributária (custo ZERO de créditos).\n */\n async simular(payload: NFSeEmissaoInput | Record<string, any>): Promise<NFSeEmissaoResponse> {\n return this.request<NFSeEmissaoResponse>({\n method: 'POST',\n path: '/v1/nfse/simular',\n body: payload,\n });\n }\n\n /**\n * Homologa o cancelamento oficial de uma NFS-e perante o SND ou prefeitura.\n */\n async cancelar(payload: CancelamentoNFSeInput): Promise<CancelamentoNFSeResponse> {\n return this.request<CancelamentoNFSeResponse>({\n method: 'POST',\n path: '/v1/nfse/cancelar',\n body: payload,\n });\n }\n\n /**\n * Consulta os dados, status e DANFSE de uma NFS-e pelo número ou chave de 50 dígitos.\n */\n async consultar(chaveOuNumero: string): Promise<Record<string, any>> {\n return this.request<Record<string, any>>({\n method: 'GET',\n path: `/v1/nfse/${chaveOuNumero}`,\n });\n }\n}\n\r\n","import { BaseResource } from './base.js';\nimport {\n ProductDetails,\n ProductEnrichedDetails,\n ProductResponse,\n ProductSearchResponse,\n ProductSearchResultItem,\n} from '../types/product.js';\n\nexport class ProductsResource extends BaseResource {\n /**\n * Consulta dados oficiais de um produto por código de barras GTIN/EAN (V1).\n * @param gtin Código numérico de 8 a 14 dígitos.\n */\n public async get(gtin: string): Promise<ProductDetails> {\n const gtinLimpo = gtin.replace(/\\D/g, '');\n const data = await this.request<ProductResponse>({\n method: 'GET',\n path: `/v1/gtin/${gtinLimpo}`,\n });\n\n const prod: any = data.produto || data;\n return {\n gtin: prod.GTIN || prod.gtin || gtinLimpo,\n xProd: prod.xProd || prod.descricao || 'Descrição Indisponível',\n ncm: prod.NCM || prod.ncm,\n cest: prod.CEST || prod.cest,\n marca: prod.marca,\n fabricante: prod.fabricante,\n categoria: prod.categoria,\n imagemUrl: prod.imagem_url || prod.thumbnail,\n pesoBruto: prod.peso_bruto ? Number(prod.peso_bruto) : undefined,\n pesoLiquido: prod.peso_liquido ? Number(prod.peso_liquido) : undefined,\n quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1),\n };\n }\n\n /**\n * Consulta dados enriquecidos por IA, com SEO e ficha técnica estruturada (V2).\n * @param gtin Código numérico do produto.\n */\n public async getEnriched(gtin: string): Promise<ProductEnrichedDetails> {\n const gtinLimpo = gtin.replace(/\\D/g, '');\n const data = await this.request<any>({\n method: 'GET',\n path: `/v2/gtin/${gtinLimpo}`,\n });\n\n const prod = data.produto || data;\n return {\n gtin: prod.GTIN || prod.gtin || gtinLimpo,\n xProd: prod.xProd || prod.descricao || 'Descrição Indisponível',\n descricao_completa: prod.descricao_completa,\n ficha_tecnica: prod.ficha_tecnica,\n palavras_chave: prod.palavras_chave,\n ncm: prod.NCM || prod.ncm,\n cest: prod.CEST || prod.cest,\n marca: prod.marca,\n categoria: prod.categoria,\n imagem_url: prod.imagem_url,\n peso_bruto: prod.peso_bruto ? Number(prod.peso_bruto) : undefined,\n peso_liquido: prod.peso_liquido ? Number(prod.peso_liquido) : undefined,\n dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos,\n };\n }\n\n /**\n * Executa busca semântica por intenção/linguagem natural (V2).\n * @param query Termo livre de busca (ex: 'refrigerante zero lata').\n */\n public async search(query: string): Promise<ProductSearchResponse> {\n const data = await this.request<any>({\n method: 'GET',\n path: '/v2/gtin/search',\n params: { q: query },\n });\n\n const itens: ProductSearchResultItem[] = (data.produtos || []).map((item: any) => ({\n gtin: String(item.GTIN || item.gtin),\n xProd: String(item.xProd || item.descricao),\n marca: item.marca,\n categoria: item.categoria,\n score: item.score !== undefined ? Number(item.score) : undefined,\n ncm: item.NCM || item.ncm,\n cest: item.CEST || item.cest,\n imagem_url: item.imagem_url,\n }));\n\n return {\n status: data.status || 'success',\n provider: data.provider || 'PAIRUS',\n total_encontrados: itens.length,\n termo_buscado: query,\n produtos: itens,\n };\n }\n\n /**\n * Reconhece código de barras por visão computacional a partir de foto JPEG (OCR V2).\n * @param file Blob, Buffer ou FormData com a imagem JPEG.\n */\n public async scan(file: Blob | Buffer | FormData): Promise<ProductEnrichedDetails> {\n let formData: FormData;\n\n if (typeof FormData !== 'undefined' && file instanceof FormData) {\n formData = file;\n } else {\n formData = new FormData();\n if (typeof Blob !== 'undefined' && file instanceof Blob) {\n formData.append('file', file, 'barcode.jpg');\n } else {\n // Node Buffer\n const blob = new Blob([file as any], { type: 'image/jpeg' });\n formData.append('file', blob, 'barcode.jpg');\n }\n }\n\n const data = await this.request<any>({\n method: 'POST',\n path: '/v2/gtin/scan',\n body: formData,\n });\n\n const prod = data.produto || data;\n return {\n gtin: prod.GTIN || prod.gtin || '',\n xProd: prod.xProd || prod.descricao || 'Descrição Indisponível',\n descricao_completa: prod.descricao_completa,\n ficha_tecnica: prod.ficha_tecnica,\n palavras_chave: prod.palavras_chave,\n ncm: prod.NCM || prod.ncm,\n cest: prod.CEST || prod.cest,\n marca: prod.marca,\n categoria: prod.categoria,\n imagem_url: prod.imagem_url,\n peso_bruto: prod.peso_bruto ? Number(prod.peso_bruto) : undefined,\n peso_liquido: prod.peso_liquido ? Number(prod.peso_liquido) : undefined,\n dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos,\n };\n }\n}\r\n","import * as crypto from 'crypto';\r\nimport { InvalidSignatureError } from './errors.js';\r\nimport { WebhookEvent } from './types/webhook.js';\r\n\r\nexport class Webhooks {\r\n /**\r\n * Calcula a assinatura HMAC-SHA256 esperada para o payload informado.\r\n */\r\n public static computeSignature(payload: string | Buffer, secret: string): string {\r\n return crypto\r\n .createHmac('sha256', secret)\r\n .update(payload)\r\n .digest('hex');\r\n }\r\n\r\n /**\r\n * Verifica de forma segura (resistente a timing attacks) a assinatura de um webhook.\r\n */\r\n public static verifySignature(\r\n payload: string | Buffer | Record<string, any>,\r\n signature: string | undefined | null,\r\n secret: string\r\n ): boolean {\r\n if (!signature || !secret) {\r\n return false;\r\n }\r\n\r\n let payloadBuffer: Buffer;\r\n if (Buffer.isBuffer(payload)) {\r\n payloadBuffer = payload;\r\n } else if (typeof payload === 'string') {\r\n payloadBuffer = Buffer.from(payload, 'utf-8');\r\n } else {\r\n payloadBuffer = Buffer.from(JSON.stringify(payload), 'utf-8');\r\n }\r\n\r\n const expectedSignature = this.computeSignature(payloadBuffer, secret);\r\n\r\n try {\r\n const sigBuf = Buffer.from(signature.trim(), 'hex');\r\n const expectedBuf = Buffer.from(expectedSignature, 'hex');\r\n\r\n if (sigBuf.length !== expectedBuf.length) {\r\n return false;\r\n }\r\n\r\n return crypto.timingSafeEqual(sigBuf, expectedBuf);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Valida a assinatura e converte o payload em objeto tipado WebhookEvent.\r\n */\r\n public static constructEvent<T = Record<string, any>>(\r\n payload: string | Buffer,\r\n signature: string | undefined | null,\r\n secret: string\r\n ): WebhookEvent<T> {\r\n if (!this.verifySignature(payload, signature, secret)) {\r\n throw new InvalidSignatureError(\"Assinatura do webhook ('X-Pairus-Signature') é inválida.\");\r\n }\r\n\r\n const rawStr = Buffer.isBuffer(payload) ? payload.toString('utf-8') : payload;\r\n return JSON.parse(rawStr) as WebhookEvent<T>;\r\n }\r\n}\r\n","import {\r\n DEFAULT_BASE_URL,\r\n DEFAULT_MAX_RETRIES,\r\n DEFAULT_TIMEOUT_MS,\r\n PairusClientOptions,\r\n} from './config.js';\r\nimport { DFeResource } from './resources/dfe.js';\r\nimport { EmissaoResource } from './resources/emissao.js';\r\nimport { FiscalResource } from './resources/fiscal.js';\r\nimport { NFSeResource } from './resources/nfse.js';\r\nimport { ProductsResource } from './resources/products.js';\r\nimport { Webhooks } from './webhooks.js';\r\n\r\nexport class PairusProductData {\r\n public static readonly webhooks = Webhooks;\r\n public readonly webhooks = Webhooks;\r\n\r\n public readonly products: ProductsResource;\r\n public readonly fiscal: FiscalResource;\r\n public readonly emissao: EmissaoResource;\r\n public readonly nfse: NFSeResource;\r\n public readonly dfe: DFeResource;\r\n\r\n constructor(options?: PairusClientOptions) {\r\n const apiKey = options?.apiKey || (typeof process !== 'undefined' ? process.env.PAIRUS_API_KEY : undefined);\r\n if (!apiKey) {\r\n throw new Error(\r\n \"A chave de API da PAIRUS é obrigatória. Passe 'apiKey' no construtor ou defina a variável 'PAIRUS_API_KEY'.\"\r\n );\r\n }\r\n\r\n const baseUrl = options?.baseUrl || (typeof process !== 'undefined' ? process.env.PAIRUS_BASE_URL : undefined) || DEFAULT_BASE_URL;\r\n const timeoutMs = options?.timeoutMs || DEFAULT_TIMEOUT_MS;\r\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\r\n\r\n this.products = new ProductsResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n this.fiscal = new FiscalResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n this.emissao = new EmissaoResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n this.nfse = new NFSeResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n this.dfe = new DFeResource(apiKey, baseUrl, timeoutMs, maxRetries);\r\n }\r\n}\r\n\r\n"],"mappings":";AAWO,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;;;ACT5B,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,YAAY;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,YAAoB,OAAgB,SAAkB,SAAe;AAC/E,UAAM,OAAO,SAAS,OAAO,UAAU;AACvC,UAAM,SAAS,WAAW,SAAS,UAAU,aAAa,UAAU;AACpE,UAAM,IAAI,IAAI,KAAK,MAAM,EAAE;AAC3B,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AACF;AAEO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EACtD,YAAY,QAAQ,OAAO,UAAU,kDAA4C,SAAe;AAC9F,UAAM,KAAK,OAAO,SAAS,OAAO;AAClC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACjC;AAAA,EAEhB,YAAY,YAAqB,QAAQ,OAAO,UAAU,yCAAmC,SAAe;AAC1G,UAAM,KAAK,OAAO,SAAS,OAAO;AAClC,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAEO,IAAM,wBAAN,cAAoC,YAAY;AAAA,EACrD,YAAY,UAAU,qFAA4E;AAChG,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,eAAN,cAA2B,YAAY;AAAA,EAC5C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AC3CO,IAAM,eAAN,MAAmB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEV,YAAY,QAAgB,SAAiB,WAAmB,YAAoB;AAClF,SAAK,SAAS;AACd,SAAK,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AACzC,SAAK,YAAY;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,MAAgB,QAAW,SAAqC;AAC9D,QAAI,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAC7D,QAAI,QAAQ,QAAQ;AAClB,YAAM,QAAQ,IAAI,gBAAgB,QAAQ,MAAM,EAAE,SAAS;AAC3D,YAAM,GAAG,GAAG,IAAI,KAAK;AAAA,IACvB;AAEA,UAAM,aAAqC;AAAA,MACzC,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,cAAc;AAAA,MACd,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,UAAM,aAAa,OAAO,aAAa,eAAe,QAAQ,gBAAgB;AAE9E,QAAI,QAAQ,QAAQ,CAAC,cAAc,CAAC,WAAW,cAAc,GAAG;AAC9D,iBAAW,cAAc,IAAI;AAAA,IAC/B;AAEA,QAAI,YAAiB;AAErB,aAAS,UAAU,GAAG,UAAU,KAAK,YAAY,WAAW;AAC1D,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAErE,cAAM,WAAW,aACb,QAAQ,OACR,QAAQ,OACR,KAAK,UAAU,QAAQ,IAAI,IAC3B;AAEJ,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,QAAQ,QAAQ;AAAA,UAChB,SAAS;AAAA,UACT,MAAM;AAAA,UACN,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,SAAS;AAEtB,YAAI,SAAS,MAAO,SAAS,UAAU,OAAO,SAAS,SAAS,KAAM;AACpE,iBAAQ,MAAM,SAAS,KAAK;AAAA,QAC9B;AAEA,YAAI,UAAe,CAAC;AACpB,YAAI;AACF,oBAAU,MAAM,SAAS,KAAK;AAAA,QAChC,QAAQ;AACN,oBAAU,CAAC;AAAA,QACb;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,IAAI,oBAAoB,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,QACvE;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,gBAAgB,WAAW,SAAS,QAAQ,IAAI,aAAa,KAAK,GAAG;AAC3E,cAAI,UAAU,KAAK,aAAa,GAAG;AACjC,kBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,MAAM,gBAAgB,KAAK,OAAO,IAAI,OAAO,GAAI,CAAC;AACxF;AAAA,UACF;AACA,gBAAM,IAAI,eAAe,eAAe,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,QACjF;AAEA,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,SAAS,MAAM,KAAK,UAAU,KAAK,aAAa,GAAG;AAC9E,gBAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,MAAO,KAAK,OAAO,IAAI;AAC5D,gBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,KAAK,CAAC;AACjD;AAAA,QACF;AAEA,cAAM,IAAI,eAAe,SAAS,QAAQ,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,MACnF,SAAS,KAAU;AACjB,YAAI,eAAe,gBAAgB;AACjC,gBAAM;AAAA,QACR;AACA,oBAAY;AACZ,YAAI,UAAU,KAAK,aAAa,GAAG;AACjC,gBAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,MAAO,KAAK,OAAO,IAAI;AAC5D,gBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,KAAK,CAAC;AACjD;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,aAAa,gDAA0C,KAAK,UAAU,gBAAgB,WAAW,WAAW,SAAS,EAAE;AAAA,EACnI;AAAA,EAEA,MAAgB,YAAY,SAA0C;AACpE,QAAI,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAC7D,QAAI,QAAQ,QAAQ;AAClB,YAAM,QAAQ,IAAI,gBAAgB,QAAQ,MAAM,EAAE,SAAS;AAC3D,YAAM,GAAG,GAAG,IAAI,KAAK;AAAA,IACvB;AAEA,UAAM,aAAqC;AAAA,MACzC,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,cAAc;AAAA,MACd,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,QAAI,YAAiB;AAErB,aAAS,UAAU,GAAG,UAAU,KAAK,YAAY,WAAW;AAC1D,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAErE,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,QAAQ,QAAQ;AAAA,UAChB,SAAS;AAAA,UACT,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,SAAS;AAEtB,YAAI,SAAS,MAAO,SAAS,UAAU,OAAO,SAAS,SAAS,KAAM;AACpE,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B;AAEA,YAAI,UAAe,CAAC;AACpB,YAAI;AACF,oBAAU,MAAM,SAAS,KAAK;AAAA,QAChC,QAAQ;AACN,oBAAU,CAAC;AAAA,QACb;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,IAAI,oBAAoB,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,QACvE;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,gBAAgB,WAAW,SAAS,QAAQ,IAAI,aAAa,KAAK,GAAG;AAC3E,cAAI,UAAU,KAAK,aAAa,GAAG;AACjC,kBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,MAAM,gBAAgB,KAAK,OAAO,IAAI,OAAO,GAAI,CAAC;AACxF;AAAA,UACF;AACA,gBAAM,IAAI,eAAe,eAAe,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,QACjF;AAEA,cAAM,IAAI,eAAe,SAAS,QAAQ,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,MACnF,SAAS,KAAU;AACjB,YAAI,eAAe,gBAAgB;AACjC,gBAAM;AAAA,QACR;AACA,oBAAY;AACZ,YAAI,UAAU,KAAK,aAAa,GAAG;AACjC,gBAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,MAAO,KAAK,OAAO,IAAI;AAC5D,gBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,KAAK,CAAC;AACjD;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,aAAa,gDAA0C,KAAK,UAAU,gBAAgB,WAAW,WAAW,SAAS,EAAE;AAAA,EACnI;AAAA,EAEA,MAAgB,cAAc,SAA+C;AAC3E,QAAI,MAAM,GAAG,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAC7D,QAAI,QAAQ,QAAQ;AAClB,YAAM,QAAQ,IAAI,gBAAgB,QAAQ,MAAM,EAAE,SAAS;AAC3D,YAAM,GAAG,GAAG,IAAI,KAAK;AAAA,IACvB;AAEA,UAAM,aAAqC;AAAA,MACzC,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,cAAc;AAAA,MACd,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,QAAI,YAAiB;AAErB,aAAS,UAAU,GAAG,UAAU,KAAK,YAAY,WAAW;AAC1D,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAErE,cAAM,WAAW,MAAM,MAAM,KAAK;AAAA,UAChC,QAAQ,QAAQ;AAAA,UAChB,SAAS;AAAA,UACT,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,SAAS;AAEtB,YAAI,SAAS,MAAO,SAAS,UAAU,OAAO,SAAS,SAAS,KAAM;AACpE,iBAAO,MAAM,SAAS,YAAY;AAAA,QACpC;AAEA,YAAI,UAAe,CAAC;AACpB,YAAI;AACF,oBAAU,MAAM,SAAS,KAAK;AAAA,QAChC,QAAQ;AACN,oBAAU,CAAC;AAAA,QACb;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,IAAI,oBAAoB,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,QACvE;AAEA,YAAI,SAAS,WAAW,KAAK;AAC3B,gBAAM,gBAAgB,WAAW,SAAS,QAAQ,IAAI,aAAa,KAAK,GAAG;AAC3E,cAAI,UAAU,KAAK,aAAa,GAAG;AACjC,kBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,MAAM,gBAAgB,KAAK,OAAO,IAAI,OAAO,GAAI,CAAC;AACxF;AAAA,UACF;AACA,gBAAM,IAAI,eAAe,eAAe,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,QACjF;AAEA,cAAM,IAAI,eAAe,SAAS,QAAQ,QAAQ,OAAO,QAAQ,SAAS,OAAO;AAAA,MACnF,SAAS,KAAU;AACjB,YAAI,eAAe,gBAAgB;AACjC,gBAAM;AAAA,QACR;AACA,oBAAY;AACZ,YAAI,UAAU,KAAK,aAAa,GAAG;AACjC,gBAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,MAAO,KAAK,OAAO,IAAI;AAC5D,gBAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,KAAK,CAAC;AACjD;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,aAAa,gDAA0C,KAAK,UAAU,gBAAgB,WAAW,WAAW,SAAS,EAAE;AAAA,EACnI;AACF;;;ACzPO,IAAM,cAAN,cAA0B,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5C,MAAa,YAAY,OAA6D;AACpF,WAAO,KAAK,QAAgC;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM,YAAY;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,iBAAiB,QAAyE;AACrG,UAAM,cAAsC;AAAA,MAC1C,MAAM,OAAO;AAAA,MACb,UAAU,OAAO,YAAY;AAAA,IAC/B;AACA,QAAI,OAAO,QAAQ;AACjB,kBAAY,SAAS,OAAO,OAAO,MAAM;AAAA,IAC3C;AAEA,WAAO,KAAK,QAAqC;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,WAAW,OAA2D;AACjF,WAAO,KAAK,QAA+B;AAAA,MACzC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,MAAM,MAAM;AAAA,QACZ,cAAc,MAAM;AAAA,QACpB,aAAa,MAAM;AAAA,QACnB,eAAe,MAAM;AAAA,QACrB,UAAU,MAAM,YAAY;AAAA,MAC9B;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,UAAU,aAAsC;AAC3D,WAAO,KAAK,YAAY;AAAA,MACtB,QAAQ;AAAA,MACR,MAAM,eAAe,WAAW;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,YAAY,aAA2C;AAClE,WAAO,KAAK,cAAc;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,iBAAiB,WAAW;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;;ACrFO,IAAM,kBAAN,cAA8B,aAAa;AAAA;AAAA;AAAA;AAAA,EAIhD,MAAa,UAAU,SAAuD;AAC5E,WAAO,KAAK,QAA4B;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,SAAuD;AAC7E,WAAO,KAAK,QAA4B;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,QAAQ,SAAuD;AAC1E,WAAO,KAAK,QAA4B;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS,QAAuD;AAC3E,WAAO,KAAK,QAA2B;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,cAAc,OAAO;AAAA,QACrB,eAAe,OAAO;AAAA,QACtB,uBAAuB,OAAO;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,QAAwD;AACjF,WAAO,KAAK,QAA2B;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,cAAc,OAAO;AAAA,QACrB,UAAU,OAAO;AAAA,QACjB,kBAAkB,OAAO,oBAAoB;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,QAAuD;AAC7E,WAAO,KAAK,QAA2B;AAAA,MACrC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,eAAe,OAAO;AAAA,QACtB,OAAO,OAAO;AAAA,QACd,gBAAgB,OAAO;AAAA,QACvB,cAAc,OAAO;AAAA,QACrB,eAAe,OAAO;AAAA,QACtB,KAAK,OAAO;AAAA,QACZ,QAAQ,OAAO,UAAU;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACzFO,IAAM,iBAAN,cAA6B,aAAa;AAAA;AAAA;AAAA;AAAA,EAI/C,MAAa,QAAQ,QAA6D;AAChF,UAAM,UAA+B;AAAA,MACnC,mBAAmB,OAAO;AAAA,MAC1B,WAAW,OAAO;AAAA,MAClB,YAAY,OAAO,aAAa,OAAO;AAAA,MACvC,YAAY,OAAO,cAAc;AAAA,MACjC,2BAA2B,OAAO,4BAA4B;AAAA,IAChE;AAEA,QAAI,OAAO,MAAO,SAAQ,QAAQ,OAAO;AACzC,QAAI,OAAO,KAAM,SAAQ,OAAO,OAAO;AACvC,QAAI,OAAO,IAAK,SAAQ,MAAM,OAAO;AACrC,QAAI,OAAO,KAAM,SAAQ,OAAO,OAAO;AACvC,QAAI,OAAO,MAAO,SAAQ,QAAQ,OAAO;AAEzC,WAAO,KAAK,QAA+B;AAAA,MACzC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS,OAAiD;AACrE,WAAO,KAAK,QAAa;AAAA,MACvB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AACF;;;AC/BO,IAAM,eAAN,cAA2B,aAAa;AAAA;AAAA;AAAA;AAAA,EAI7C,MAAM,OAAO,SAA+E;AAC1F,WAAO,KAAK,QAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,SAA+E;AAC3F,WAAO,KAAK,QAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,SAAmE;AAChF,WAAO,KAAK,QAAkC;AAAA,MAC5C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,eAAqD;AACnE,WAAO,KAAK,QAA6B;AAAA,MACvC,QAAQ;AAAA,MACR,MAAM,YAAY,aAAa;AAAA,IACjC,CAAC;AAAA,EACH;AACF;;;AC1CO,IAAM,mBAAN,cAA+B,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjD,MAAa,IAAI,MAAuC;AACtD,UAAM,YAAY,KAAK,QAAQ,OAAO,EAAE;AACxC,UAAM,OAAO,MAAM,KAAK,QAAyB;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM,YAAY,SAAS;AAAA,IAC7B,CAAC;AAED,UAAM,OAAY,KAAK,WAAW;AAClC,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAAA,MAChC,OAAO,KAAK,SAAS,KAAK,aAAa;AAAA,MACvC,KAAK,KAAK,OAAO,KAAK;AAAA,MACtB,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,OAAO,KAAK;AAAA,MACZ,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK,cAAc,KAAK;AAAA,MACnC,WAAW,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI;AAAA,MACvD,aAAa,KAAK,eAAe,OAAO,KAAK,YAAY,IAAI;AAAA,MAC7D,qBAAqB,OAAO,KAAK,wBAAwB,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,YAAY,MAA+C;AACtE,UAAM,YAAY,KAAK,QAAQ,OAAO,EAAE;AACxC,UAAM,OAAO,MAAM,KAAK,QAAa;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM,YAAY,SAAS;AAAA,IAC7B,CAAC;AAED,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAAA,MAChC,OAAO,KAAK,SAAS,KAAK,aAAa;AAAA,MACvC,oBAAoB,KAAK;AAAA,MACzB,eAAe,KAAK;AAAA,MACpB,gBAAgB,KAAK;AAAA,MACrB,KAAK,KAAK,OAAO,KAAK;AAAA,MACtB,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI;AAAA,MACxD,cAAc,KAAK,eAAe,OAAO,KAAK,YAAY,IAAI;AAAA,MAC9D,6BAA6B,KAAK;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,OAA+C;AACjE,UAAM,OAAO,MAAM,KAAK,QAAa;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ,EAAE,GAAG,MAAM;AAAA,IACrB,CAAC;AAED,UAAM,SAAoC,KAAK,YAAY,CAAC,GAAG,IAAI,CAAC,UAAe;AAAA,MACjF,MAAM,OAAO,KAAK,QAAQ,KAAK,IAAI;AAAA,MACnC,OAAO,OAAO,KAAK,SAAS,KAAK,SAAS;AAAA,MAC1C,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK,UAAU,SAAY,OAAO,KAAK,KAAK,IAAI;AAAA,MACvD,KAAK,KAAK,OAAO,KAAK;AAAA,MACtB,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,YAAY,KAAK;AAAA,IACnB,EAAE;AAEF,WAAO;AAAA,MACL,QAAQ,KAAK,UAAU;AAAA,MACvB,UAAU,KAAK,YAAY;AAAA,MAC3B,mBAAmB,MAAM;AAAA,MACzB,eAAe;AAAA,MACf,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,KAAK,MAAiE;AACjF,QAAI;AAEJ,QAAI,OAAO,aAAa,eAAe,gBAAgB,UAAU;AAC/D,iBAAW;AAAA,IACb,OAAO;AACL,iBAAW,IAAI,SAAS;AACxB,UAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACvD,iBAAS,OAAO,QAAQ,MAAM,aAAa;AAAA,MAC7C,OAAO;AAEL,cAAM,OAAO,IAAI,KAAK,CAAC,IAAW,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3D,iBAAS,OAAO,QAAQ,MAAM,aAAa;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,QAAa;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAED,UAAM,OAAO,KAAK,WAAW;AAC7B,WAAO;AAAA,MACL,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAAA,MAChC,OAAO,KAAK,SAAS,KAAK,aAAa;AAAA,MACvC,oBAAoB,KAAK;AAAA,MACzB,eAAe,KAAK;AAAA,MACpB,gBAAgB,KAAK;AAAA,MACrB,KAAK,KAAK,OAAO,KAAK;AAAA,MACtB,MAAM,KAAK,QAAQ,KAAK;AAAA,MACxB,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,MACjB,YAAY,KAAK,aAAa,OAAO,KAAK,UAAU,IAAI;AAAA,MACxD,cAAc,KAAK,eAAe,OAAO,KAAK,YAAY,IAAI;AAAA,MAC9D,6BAA6B,KAAK;AAAA,IACpC;AAAA,EACF;AACF;;;AC5IA,YAAY,YAAY;AAIjB,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA,EAIpB,OAAc,iBAAiB,SAA0B,QAAwB;AAC/E,WACG,kBAAW,UAAU,MAAM,EAC3B,OAAO,OAAO,EACd,OAAO,KAAK;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,gBACZ,SACA,WACA,QACS;AACT,QAAI,CAAC,aAAa,CAAC,QAAQ;AACzB,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,sBAAgB;AAAA,IAClB,WAAW,OAAO,YAAY,UAAU;AACtC,sBAAgB,OAAO,KAAK,SAAS,OAAO;AAAA,IAC9C,OAAO;AACL,sBAAgB,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG,OAAO;AAAA,IAC9D;AAEA,UAAM,oBAAoB,KAAK,iBAAiB,eAAe,MAAM;AAErE,QAAI;AACF,YAAM,SAAS,OAAO,KAAK,UAAU,KAAK,GAAG,KAAK;AAClD,YAAM,cAAc,OAAO,KAAK,mBAAmB,KAAK;AAExD,UAAI,OAAO,WAAW,YAAY,QAAQ;AACxC,eAAO;AAAA,MACT;AAEA,aAAc,uBAAgB,QAAQ,WAAW;AAAA,IACnD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,eACZ,SACA,WACA,QACiB;AACjB,QAAI,CAAC,KAAK,gBAAgB,SAAS,WAAW,MAAM,GAAG;AACrD,YAAM,IAAI,sBAAsB,gEAA0D;AAAA,IAC5F;AAEA,UAAM,SAAS,OAAO,SAAS,OAAO,IAAI,QAAQ,SAAS,OAAO,IAAI;AACtE,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AACF;;;ACtDO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,OAAuB,WAAW;AAAA,EAClB,WAAW;AAAA,EAEX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YAAY,SAA+B;AACzC,UAAM,SAAS,SAAS,WAAW,OAAO,YAAY,cAAc,QAAQ,IAAI,iBAAiB;AACjG,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,YAAY,OAAO,YAAY,cAAc,QAAQ,IAAI,kBAAkB,WAAc;AAClH,UAAM,YAAY,SAAS,aAAa;AACxC,UAAM,aAAa,SAAS,cAAc;AAE1C,SAAK,WAAW,IAAI,iBAAiB,QAAQ,SAAS,WAAW,UAAU;AAC3E,SAAK,SAAS,IAAI,eAAe,QAAQ,SAAS,WAAW,UAAU;AACvE,SAAK,UAAU,IAAI,gBAAgB,QAAQ,SAAS,WAAW,UAAU;AACzE,SAAK,OAAO,IAAI,aAAa,QAAQ,SAAS,WAAW,UAAU;AACnE,SAAK,MAAM,IAAI,YAAY,QAAQ,SAAS,WAAW,UAAU;AAAA,EACnE;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pairus/product-data",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "SDK oficial da PAIRUS para integração com catálogo GTIN/EAN, predição fiscal (IBS/CBS/IS) e emissão de NF-e/NFC-e com Autocura SEFAZ.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|