@pairus/product-data 1.4.0 → 1.6.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/dist/index.mjs CHANGED
@@ -74,7 +74,7 @@ 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.4.0",
77
+ "User-Agent": "Pairus-NodeJS-SDK/1.6.0",
78
78
  ...options.headers || {}
79
79
  };
80
80
  const isFormData = typeof FormData !== "undefined" && options.body instanceof FormData;
@@ -114,7 +114,8 @@ var BaseResource = class {
114
114
  }
115
115
  throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);
116
116
  }
117
- if ([502, 503, 504].includes(response.status) && attempt < this.maxRetries - 1) {
117
+ const vendaEmProcessamento = response.status === 409 && "Idempotency-Key" in reqHeaders;
118
+ if (([502, 503, 504].includes(response.status) || vendaEmProcessamento) && attempt < this.maxRetries - 1) {
118
119
  const delay = Math.pow(2, attempt) * 1e3 + Math.random() * 500;
119
120
  await new Promise((res) => setTimeout(res, delay));
120
121
  continue;
@@ -144,7 +145,7 @@ var BaseResource = class {
144
145
  const reqHeaders = {
145
146
  "Accept": "*/*",
146
147
  "X-API-Key": this.apiKey,
147
- "User-Agent": "Pairus-NodeJS-SDK/1.3.0",
148
+ "User-Agent": "Pairus-NodeJS-SDK/1.6.0",
148
149
  ...options.headers || {}
149
150
  };
150
151
  let lastError = null;
@@ -203,7 +204,7 @@ var BaseResource = class {
203
204
  const reqHeaders = {
204
205
  "Accept": "*/*",
205
206
  "X-API-Key": this.apiKey,
206
- "User-Agent": "Pairus-NodeJS-SDK/1.3.0",
207
+ "User-Agent": "Pairus-NodeJS-SDK/1.6.0",
207
208
  ...options.headers || {}
208
209
  };
209
210
  let lastError = null;
@@ -339,25 +340,31 @@ var DFeResource = class extends BaseResource {
339
340
  };
340
341
 
341
342
  // src/resources/emissao.ts
343
+ import { randomUUID } from "crypto";
344
+ function cabecalhoIdempotencia(options) {
345
+ return { "Idempotency-Key": options?.idempotencyKey || randomUUID() };
346
+ }
342
347
  var EmissaoResource = class extends BaseResource {
343
348
  /**
344
349
  * Emite uma Nota Fiscal Eletrônica (NF-e Modelo 55) perante a SEFAZ.
345
350
  */
346
- async emitirNFe(payload) {
351
+ async emitirNFe(payload, options) {
347
352
  return this.request({
348
353
  method: "POST",
349
354
  path: "/v1/nfe/emitir",
350
- body: payload
355
+ body: payload,
356
+ headers: cabecalhoIdempotencia(options)
351
357
  });
352
358
  }
353
359
  /**
354
360
  * Emite uma Nota Fiscal de Consumidor Eletrônica (NFC-e Modelo 65) perante a SEFAZ.
355
361
  */
356
- async emitirNFCe(payload) {
362
+ async emitirNFCe(payload, options) {
357
363
  return this.request({
358
364
  method: "POST",
359
365
  path: "/v1/nfce/emitir",
360
- body: payload
366
+ body: payload,
367
+ headers: cabecalhoIdempotencia(options)
361
368
  });
362
369
  }
363
370
  /**
@@ -412,13 +419,40 @@ var EmissaoResource = class extends BaseResource {
412
419
  numero_final: params.numero_final,
413
420
  justificativa: params.justificativa,
414
421
  ano: params.ano,
415
- modelo: params.modelo ?? 55
422
+ modelo: String(params.modelo ?? "55")
416
423
  }
417
424
  });
418
425
  }
419
426
  };
420
427
 
421
428
  // src/resources/fiscal.ts
429
+ function comNomesLegados(dados) {
430
+ const is = dados.is ?? dados.imposto_seletivo;
431
+ const impostoSeletivo = is ? { ...is, CSTIS: is.CSTIS ?? is.cst, cst: is.cst ?? is.CSTIS, pIS: is.pIS ?? is.aliquota, aliquota: is.aliquota ?? is.pIS } : void 0;
432
+ return {
433
+ ...dados,
434
+ cfop_interno: dados.cfop_interno ?? dados.cfop,
435
+ cfop: dados.cfop ?? dados.cfop_interno,
436
+ cfop_devolucao_interno: dados.cfop_devolucao_interno ?? dados.cfop_devolucao,
437
+ cfop_devolucao: dados.cfop_devolucao ?? dados.cfop_devolucao_interno,
438
+ is: impostoSeletivo,
439
+ imposto_seletivo: impostoSeletivo,
440
+ aliquota_efetiva_unificada: dados.aliquota_efetiva_unificada ?? dados.ibscbs?.aliquota_efetiva_unificada ?? 0,
441
+ avisos_fiscais: dados.avisos_fiscais ?? dados.avisos ?? [],
442
+ avisos: dados.avisos ?? dados.avisos_fiscais ?? []
443
+ };
444
+ }
445
+ function itemDeSaneamento(item) {
446
+ const { NCM, CEST, xProd, id, ncm, cest, descricao, gtin, ...extras } = item;
447
+ const convertido = {
448
+ ...extras,
449
+ NCM: NCM ?? ncm,
450
+ CEST: CEST ?? cest,
451
+ xProd: xProd ?? descricao,
452
+ id: id ?? gtin
453
+ };
454
+ return Object.fromEntries(Object.entries(convertido).filter(([, v]) => v !== void 0 && v !== null));
455
+ }
422
456
  var FiscalResource = class extends BaseResource {
423
457
  /**
424
458
  * Executa a predição fiscal completa da Reforma Tributária (IBS/CBS/IS) e NF-e.
@@ -431,25 +465,34 @@ var FiscalResource = class extends BaseResource {
431
465
  finalidade: params.finalidade || "revenda",
432
466
  destinatario_contribuinte: params.destinatarioContribuinte ?? true
433
467
  };
468
+ if (params.aliquotaCreditoIcmsSn !== void 0) payload.aliquota_credito_icms_sn = params.aliquotaCreditoIcmsSn;
469
+ if (params.destinatarioSuframa !== void 0) payload.destinatario_suframa = params.destinatarioSuframa;
470
+ if (params.inscricaoSuframa) payload.inscricao_suframa = params.inscricaoSuframa;
434
471
  if (params.xProd) payload.xProd = params.xProd;
435
472
  if (params.gtin) payload.gtin = params.gtin;
436
473
  if (params.ncm) payload.ncm = params.ncm;
437
474
  if (params.cest) payload.cest = params.cest;
438
475
  if (params.itens) payload.itens = params.itens;
439
- return this.request({
476
+ const res = await this.request({
440
477
  method: "POST",
441
478
  path: "/v2/fiscal/predict",
442
479
  body: payload
443
480
  });
481
+ return {
482
+ ...res,
483
+ dados_tributarios: res.dados_tributarios ? comNomesLegados(res.dados_tributarios) : res.dados_tributarios,
484
+ resultados: res.resultados?.map((r) => ({ ...r, dados_tributarios: comNomesLegados(r.dados_tributarios) }))
485
+ };
444
486
  }
445
487
  /**
446
488
  * Audita e higieniza uma lista de produtos em lote perante as tabelas fiscais vigentes.
489
+ * Cada item precisa de `NCM` (aceita também `ncm`); `CEST`, `xProd` e `id` são opcionais.
447
490
  */
448
491
  async sanitize(itens) {
449
492
  return this.request({
450
493
  method: "POST",
451
494
  path: "/v2/fiscal/sanitize",
452
- body: { itens }
495
+ body: { itens: itens.map(itemDeSaneamento) }
453
496
  });
454
497
  }
455
498
  };
@@ -498,6 +541,85 @@ var NFSeResource = class extends BaseResource {
498
541
  };
499
542
 
500
543
  // src/resources/products.ts
544
+ function primeiro(...valores) {
545
+ return valores.find((v) => v !== void 0 && v !== null && v !== "");
546
+ }
547
+ function numero(valor) {
548
+ const n = valor === void 0 || valor === null || valor === "" ? NaN : Number(valor);
549
+ return Number.isFinite(n) ? n : void 0;
550
+ }
551
+ function produtoDaApi(data, gtinFallback = "") {
552
+ const prod = data?.produto || data || {};
553
+ const info = prod.infoAdicional || {};
554
+ return {
555
+ gtin: String(primeiro(prod.GTIN, prod.gtin, gtinFallback) ?? ""),
556
+ xProd: primeiro(prod.xProd, prod.descricao) || "Descri\xE7\xE3o Indispon\xEDvel",
557
+ ncm: primeiro(prod.NCM, prod.ncm),
558
+ cest: primeiro(prod.CEST, prod.cest),
559
+ marca: primeiro(prod.marca, info.xMarca),
560
+ fabricante: prod.fabricante,
561
+ categoria: primeiro(prod.categoria, info.xCategoria),
562
+ imagemUrl: primeiro(prod.imagem_url, prod.thumbnail, info.urlImagem),
563
+ pesoBruto: numero(primeiro(prod.peso_bruto, info.pesoBruto)),
564
+ pesoLiquido: numero(primeiro(prod.peso_liquido, info.pesoLiquido)),
565
+ quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1),
566
+ tpGTIN: prod.tpGTIN ?? void 0,
567
+ fonte: prod.fonte ?? void 0,
568
+ infoAdicional: prod.infoAdicional ?? void 0
569
+ };
570
+ }
571
+ function produtoEnriquecidoDaApi(data, gtinFallback = "") {
572
+ const prod = data?.produto || data || {};
573
+ const base = produtoDaApi(prod, gtinFallback);
574
+ const enriquecimento = prod.enriquecimentoIA || {};
575
+ const atributos = enriquecimento.atributos || {};
576
+ const temAtributos = Object.keys(atributos).length > 0;
577
+ return {
578
+ gtin: base.gtin,
579
+ xProd: base.xProd,
580
+ xProd_higienizado: enriquecimento.xProd_higienizado,
581
+ descricao_completa: primeiro(prod.descricao_completa, enriquecimento.descricao_seo),
582
+ ficha_tecnica: prod.ficha_tecnica ?? (temAtributos ? atributos : void 0),
583
+ palavras_chave: prod.palavras_chave,
584
+ ncm: base.ncm,
585
+ cest: base.cest,
586
+ marca: primeiro(prod.marca, atributos.marca, base.marca),
587
+ categoria: primeiro(prod.categoria, enriquecimento.categoria_comercial, base.categoria),
588
+ imagem_url: base.imagemUrl,
589
+ peso_bruto: base.pesoBruto,
590
+ peso_liquido: primeiro(numero(prod.peso_liquido), numero(atributos.peso_liquido), base.pesoLiquido),
591
+ dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos ?? prod.tributacaoIA ?? void 0,
592
+ tpGTIN: base.tpGTIN,
593
+ fonte: base.fonte,
594
+ infoAdicional: base.infoAdicional,
595
+ enriquecimentoIA: prod.enriquecimentoIA ?? void 0,
596
+ tributacaoIA: prod.tributacaoIA ?? void 0
597
+ };
598
+ }
599
+ function buscaDaApi(data, query) {
600
+ const itens = (data?.resultados || data?.produtos || []).map((item) => {
601
+ const prod = produtoEnriquecidoDaApi(item.produto || item);
602
+ return {
603
+ gtin: prod.gtin,
604
+ xProd: prod.xProd,
605
+ marca: prod.marca,
606
+ categoria: prod.categoria,
607
+ score: item.score !== void 0 && item.score !== null ? Number(item.score) : void 0,
608
+ justificativa: item.justificativa ?? void 0,
609
+ ncm: prod.ncm,
610
+ cest: prod.cest,
611
+ imagem_url: prod.imagem_url
612
+ };
613
+ });
614
+ return {
615
+ status: data?.status || "success",
616
+ provider: data?.provider || "PAIRUS",
617
+ total_encontrados: itens.length,
618
+ termo_buscado: data?.query || query,
619
+ motor_busca: data?.motor_busca,
620
+ produtos: itens
621
+ };
622
+ }
501
623
  var ProductsResource = class extends BaseResource {
502
624
  /**
503
625
  * Consulta dados oficiais de um produto por código de barras GTIN/EAN (V1).
@@ -505,24 +627,8 @@ var ProductsResource = class extends BaseResource {
505
627
  */
506
628
  async get(gtin) {
507
629
  const gtinLimpo = gtin.replace(/\D/g, "");
508
- const data = await this.request({
509
- method: "GET",
510
- path: `/v1/gtin/${gtinLimpo}`
511
- });
512
- const prod = data.produto || data;
513
- return {
514
- gtin: prod.GTIN || prod.gtin || gtinLimpo,
515
- xProd: prod.xProd || prod.descricao || "Descri\xE7\xE3o Indispon\xEDvel",
516
- ncm: prod.NCM || prod.ncm,
517
- cest: prod.CEST || prod.cest,
518
- marca: prod.marca,
519
- fabricante: prod.fabricante,
520
- categoria: prod.categoria,
521
- imagemUrl: prod.imagem_url || prod.thumbnail,
522
- pesoBruto: prod.peso_bruto ? Number(prod.peso_bruto) : void 0,
523
- pesoLiquido: prod.peso_liquido ? Number(prod.peso_liquido) : void 0,
524
- quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1)
525
- };
630
+ const data = await this.request({ method: "GET", path: `/v1/gtin/${gtinLimpo}` });
631
+ return produtoDaApi(data, gtinLimpo);
526
632
  }
527
633
  /**
528
634
  * Consulta dados enriquecidos por IA, com SEO e ficha técnica estruturada (V2).
@@ -530,54 +636,16 @@ var ProductsResource = class extends BaseResource {
530
636
  */
531
637
  async getEnriched(gtin) {
532
638
  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
- };
639
+ const data = await this.request({ method: "GET", path: `/v2/gtin/${gtinLimpo}` });
640
+ return produtoEnriquecidoDaApi(data, gtinLimpo);
553
641
  }
554
642
  /**
555
643
  * Executa busca semântica por intenção/linguagem natural (V2).
556
644
  * @param query Termo livre de busca (ex: 'refrigerante zero lata').
557
645
  */
558
646
  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
- };
647
+ const data = await this.request({ method: "GET", path: "/v2/gtin/search", params: { q: query } });
648
+ return buscaDaApi(data, query);
581
649
  }
582
650
  /**
583
651
  * Reconhece código de barras por visão computacional a partir de foto JPEG (OCR V2).
@@ -596,27 +664,8 @@ var ProductsResource = class extends BaseResource {
596
664
  formData.append("file", blob, "barcode.jpg");
597
665
  }
598
666
  }
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
- };
667
+ const data = await this.request({ method: "POST", path: "/v2/gtin/scan", body: formData });
668
+ return produtoEnriquecidoDaApi(data);
620
669
  }
621
670
  };
622
671
 
@@ -1 +1 @@
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 {\n AuthenticationError,\n NetworkError,\n PairusAPIError,\n RateLimitError,\n} from '../errors.js';\n\nexport interface RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n path: string;\n params?: Record<string, string>;\n body?: any;\n headers?: Record<string, string>;\n}\n\nexport class BaseResource {\n protected apiKey: string;\n protected baseUrl: string;\n protected timeoutMs: number;\n protected maxRetries: number;\n\n constructor(apiKey: string, baseUrl: string, timeoutMs: number, maxRetries: number) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.timeoutMs = timeoutMs;\n this.maxRetries = maxRetries;\n }\n\n protected async request<T>(options: RequestOptions): Promise<T> {\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\n if (options.params) {\n const query = new URLSearchParams(options.params).toString();\n url = `${url}?${query}`;\n }\n\n const reqHeaders: Record<string, string> = {\n 'Accept': 'application/json',\n 'X-API-Key': this.apiKey,\n 'User-Agent': 'Pairus-NodeJS-SDK/1.4.0',\n ...(options.headers || {}),\n };\n\n const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData;\n\n if (options.body && !isFormData && !reqHeaders['Content-Type']) {\n reqHeaders['Content-Type'] = 'application/json';\n }\n\n let lastError: any = null;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n const bodyData = isFormData\n ? options.body\n : options.body\n ? JSON.stringify(options.body)\n : undefined;\n\n const response = await fetch(url, {\n method: options.method,\n headers: reqHeaders,\n body: bodyData,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || (response.status >= 200 && response.status < 300)) {\n return (await response.json()) as T;\n }\n\n let errData: any = {};\n try {\n errData = await response.json();\n } catch {\n errData = {};\n }\n\n if (response.status === 401) {\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\n }\n\n if (response.status === 429) {\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\n if (attempt < this.maxRetries - 1) {\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\n continue;\n }\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\n }\n\n if ([502, 503, 504].includes(response.status) && attempt < this.maxRetries - 1) {\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\n await new Promise((res) => setTimeout(res, delay));\n continue;\n }\n\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\n } catch (err: any) {\n if (err instanceof PairusAPIError) {\n throw err;\n }\n lastError = err;\n if (attempt < this.maxRetries - 1) {\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\n await new Promise((res) => setTimeout(res, delay));\n continue;\n }\n break;\n }\n }\n\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\n }\n\n protected async requestText(options: RequestOptions): Promise<string> {\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\n if (options.params) {\n const query = new URLSearchParams(options.params).toString();\n url = `${url}?${query}`;\n }\n\n const reqHeaders: Record<string, string> = {\n 'Accept': '*/*',\n 'X-API-Key': this.apiKey,\n 'User-Agent': 'Pairus-NodeJS-SDK/1.3.0',\n ...(options.headers || {}),\n };\n\n let lastError: any = null;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n const response = await fetch(url, {\n method: options.method,\n headers: reqHeaders,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || (response.status >= 200 && response.status < 300)) {\n return await response.text();\n }\n\n let errData: any = {};\n try {\n errData = await response.json();\n } catch {\n errData = {};\n }\n\n if (response.status === 401) {\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\n }\n\n if (response.status === 429) {\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\n if (attempt < this.maxRetries - 1) {\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\n continue;\n }\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\n }\n\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\n } catch (err: any) {\n if (err instanceof PairusAPIError) {\n throw err;\n }\n lastError = err;\n if (attempt < this.maxRetries - 1) {\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\n await new Promise((res) => setTimeout(res, delay));\n continue;\n }\n break;\n }\n }\n\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\n }\n\n protected async requestBinary(options: RequestOptions): Promise<ArrayBuffer> {\n let url = `${this.baseUrl}/${options.path.replace(/^\\/+/, '')}`;\n if (options.params) {\n const query = new URLSearchParams(options.params).toString();\n url = `${url}?${query}`;\n }\n\n const reqHeaders: Record<string, string> = {\n 'Accept': '*/*',\n 'X-API-Key': this.apiKey,\n 'User-Agent': 'Pairus-NodeJS-SDK/1.3.0',\n ...(options.headers || {}),\n };\n\n let lastError: any = null;\n\n for (let attempt = 0; attempt < this.maxRetries; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n const response = await fetch(url, {\n method: options.method,\n headers: reqHeaders,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || (response.status >= 200 && response.status < 300)) {\n return await response.arrayBuffer();\n }\n\n let errData: any = {};\n try {\n errData = await response.json();\n } catch {\n errData = {};\n }\n\n if (response.status === 401) {\n throw new AuthenticationError(errData.cStat, errData.xMotivo, errData);\n }\n\n if (response.status === 429) {\n const retryAfterSec = parseFloat(response.headers.get('Retry-After') || '2');\n if (attempt < this.maxRetries - 1) {\n await new Promise((res) => setTimeout(res, (retryAfterSec + Math.random() * 0.5) * 1000));\n continue;\n }\n throw new RateLimitError(retryAfterSec, errData.cStat, errData.xMotivo, errData);\n }\n\n throw new PairusAPIError(response.status, errData.cStat, errData.xMotivo, errData);\n } catch (err: any) {\n if (err instanceof PairusAPIError) {\n throw err;\n }\n lastError = err;\n if (attempt < this.maxRetries - 1) {\n const delay = Math.pow(2, attempt) * 1000 + Math.random() * 500;\n await new Promise((res) => setTimeout(res, delay));\n continue;\n }\n break;\n }\n }\n\n throw new NetworkError(`Falha de conexão com a API PAIRUS após ${this.maxRetries} tentativas: ${lastError?.message || lastError}`);\n }\n}\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":"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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.6.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 // 502/503/504 e, com Idempotency-Key, o 409 de venda ainda em processamento: retry com a mesma chave\r\n const vendaEmProcessamento = response.status === 409 && 'Idempotency-Key' in reqHeaders;\r\n if (([502, 503, 504].includes(response.status) || vendaEmProcessamento) && 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.6.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.6.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 { randomUUID } from 'node:crypto';\r\nimport { BaseResource } from './base.js';\r\nimport {\r\n CancelamentoInput,\r\n CartaCorrecaoInput,\r\n EmissaoNFeInput,\r\n EmissaoOptions,\r\n EmissaoNFeResponse,\r\n EventoNFeResponse,\r\n InutilizacaoInput,\r\n} from '../types/emissao.js';\r\n\r\n/**\r\n * Cabeçalho Idempotency-Key da emissão. Sem chave informada, gera um UUID por chamada; a mesma chave\r\n * acompanha todas as retentativas automáticas (timeout, rede, 5xx), então a API devolve a nota já\r\n * emitida em vez de emitir outra.\r\n */\r\nfunction cabecalhoIdempotencia(options?: EmissaoOptions): Record<string, string> {\r\n return { 'Idempotency-Key': options?.idempotencyKey || randomUUID() };\r\n}\r\n\r\nexport class EmissaoResource extends BaseResource {\r\n /**\r\n * Emite uma Nota Fiscal Eletrônica (NF-e Modelo 55) perante a SEFAZ.\r\n */\r\n public async emitirNFe(payload: EmissaoNFeInput, options?: EmissaoOptions): Promise<EmissaoNFeResponse> {\r\n return this.request<EmissaoNFeResponse>({\r\n method: 'POST',\r\n path: '/v1/nfe/emitir',\r\n body: payload,\r\n headers: cabecalhoIdempotencia(options),\r\n });\r\n }\r\n\r\n /**\r\n * Emite uma Nota Fiscal de Consumidor Eletrônica (NFC-e Modelo 65) perante a SEFAZ.\r\n */\r\n public async emitirNFCe(payload: EmissaoNFeInput, options?: EmissaoOptions): Promise<EmissaoNFeResponse> {\r\n return this.request<EmissaoNFeResponse>({\r\n method: 'POST',\r\n path: '/v1/nfce/emitir',\r\n body: payload,\r\n headers: cabecalhoIdempotencia(options),\r\n });\r\n }\r\n\r\n /**\r\n * Simula uma emissão fiscal sem transmitir à SEFAZ (custo ZERO de créditos).\r\n */\r\n public async simular(payload: EmissaoNFeInput): Promise<EmissaoNFeResponse> {\r\n return this.request<EmissaoNFeResponse>({\r\n method: 'POST',\r\n path: '/v1/nfe/simular',\r\n body: payload,\r\n });\r\n }\r\n\r\n /**\r\n * Homologa o cancelamento oficial de uma NF-e ou NFC-e perante a SEFAZ.\r\n */\r\n public async cancelar(params: CancelamentoInput): Promise<EventoNFeResponse> {\r\n return this.request<EventoNFeResponse>({\r\n method: 'POST',\r\n path: '/v1/nfe/cancelar',\r\n body: {\r\n chave_acesso: params.chave_acesso,\r\n justificativa: params.justificativa,\r\n protocolo_autorizacao: params.protocolo_autorizacao,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Emite uma Carta de Correção Eletrônica (CC-e) perante a SEFAZ.\r\n */\r\n public async cartaCorrecao(params: CartaCorrecaoInput): Promise<EventoNFeResponse> {\r\n return this.request<EventoNFeResponse>({\r\n method: 'POST',\r\n path: '/v1/nfe/carta-correcao',\r\n body: {\r\n chave_acesso: params.chave_acesso,\r\n correcao: params.correcao,\r\n sequencia_evento: params.sequencia_evento ?? 1,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Inutiliza uma faixa de numeração quebrada na SEFAZ (Ajuste SINIEF 07/05).\r\n */\r\n public async inutilizar(params: InutilizacaoInput): Promise<EventoNFeResponse> {\r\n return this.request<EventoNFeResponse>({\r\n method: 'POST',\r\n path: '/v1/nfe/inutilizar',\r\n body: {\r\n cnpj_emitente: params.cnpj_emitente,\r\n serie: params.serie,\r\n numero_inicial: params.numero_inicial,\r\n numero_final: params.numero_final,\r\n justificativa: params.justificativa,\r\n ano: params.ano,\r\n modelo: String(params.modelo ?? '55'),\r\n },\r\n });\r\n }\r\n}\r\n","import { BaseResource } from './base.js';\r\nimport {\r\n FiscalSanitizeItemInput,\r\n FiscalSanitizeResponse,\r\n TaxPredictionData,\r\n TaxPredictionParams,\r\n TaxPredictionResponse,\r\n} from '../types/fiscal.js';\r\n\r\n/** Preenche os nomes da 1.5 (`cfop`, `avisos`, `imposto_seletivo`...) a partir dos oficiais da API. */\r\nfunction comNomesLegados(dados: TaxPredictionData): TaxPredictionData {\r\n const is = dados.is ?? dados.imposto_seletivo;\r\n const impostoSeletivo = is\r\n ? { ...is, CSTIS: is.CSTIS ?? is.cst, cst: is.cst ?? is.CSTIS, pIS: is.pIS ?? is.aliquota, aliquota: is.aliquota ?? is.pIS }\r\n : undefined;\r\n return {\r\n ...dados,\r\n cfop_interno: dados.cfop_interno ?? dados.cfop,\r\n cfop: dados.cfop ?? dados.cfop_interno,\r\n cfop_devolucao_interno: dados.cfop_devolucao_interno ?? dados.cfop_devolucao,\r\n cfop_devolucao: dados.cfop_devolucao ?? dados.cfop_devolucao_interno,\r\n is: impostoSeletivo,\r\n imposto_seletivo: impostoSeletivo,\r\n aliquota_efetiva_unificada: dados.aliquota_efetiva_unificada ?? dados.ibscbs?.aliquota_efetiva_unificada ?? 0,\r\n avisos_fiscais: dados.avisos_fiscais ?? dados.avisos ?? [],\r\n avisos: dados.avisos ?? dados.avisos_fiscais ?? [],\r\n };\r\n}\r\n\r\n/** Converte o item para os nomes exigidos pela API (a 1.5 enviava `ncm` minúsculo e recebia 422). */\r\nfunction itemDeSaneamento(item: FiscalSanitizeItemInput): Record<string, any> {\r\n const { NCM, CEST, xProd, id, ncm, cest, descricao, gtin, ...extras } = item;\r\n const convertido: Record<string, any> = {\r\n ...extras,\r\n NCM: NCM ?? ncm,\r\n CEST: CEST ?? cest,\r\n xProd: xProd ?? descricao,\r\n id: id ?? gtin,\r\n };\r\n return Object.fromEntries(Object.entries(convertido).filter(([, v]) => v !== undefined && v !== null));\r\n}\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.aliquotaCreditoIcmsSn !== undefined) payload.aliquota_credito_icms_sn = params.aliquotaCreditoIcmsSn;\r\n if (params.destinatarioSuframa !== undefined) payload.destinatario_suframa = params.destinatarioSuframa;\r\n if (params.inscricaoSuframa) payload.inscricao_suframa = params.inscricaoSuframa;\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 const res = await this.request<TaxPredictionResponse>({\r\n method: 'POST',\r\n path: '/v2/fiscal/predict',\r\n body: payload,\r\n });\r\n\r\n return {\r\n ...res,\r\n dados_tributarios: res.dados_tributarios ? comNomesLegados(res.dados_tributarios) : res.dados_tributarios,\r\n resultados: res.resultados?.map((r) => ({ ...r, dados_tributarios: comNomesLegados(r.dados_tributarios) })),\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 * Cada item precisa de `NCM` (aceita também `ncm`); `CEST`, `xProd` e `id` são opcionais.\r\n */\r\n public async sanitize(itens: FiscalSanitizeItemInput[]): Promise<FiscalSanitizeResponse> {\r\n return this.request<FiscalSanitizeResponse>({\r\n method: 'POST',\r\n path: '/v2/fiscal/sanitize',\r\n body: { itens: itens.map(itemDeSaneamento) },\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';\r\nimport {\r\n ProductDetails,\r\n ProductEnrichedDetails,\r\n ProductSearchResponse,\r\n ProductSearchResultItem,\r\n} from '../types/product.js';\r\n\r\n/** Primeiro valor preenchido (ignora undefined, null e texto vazio). */\r\nfunction primeiro<T>(...valores: Array<T | undefined | null | ''>): T | undefined {\r\n return valores.find((v) => v !== undefined && v !== null && v !== '') as T | undefined;\r\n}\r\n\r\nfunction numero(valor: any): number | undefined {\r\n const n = valor === undefined || valor === null || valor === '' ? NaN : Number(valor);\r\n return Number.isFinite(n) ? n : undefined;\r\n}\r\n\r\n/** Converte o produto da API (layout NF-e + `infoAdicional`) para `ProductDetails`. */\r\nfunction produtoDaApi(data: any, gtinFallback = ''): ProductDetails {\r\n const prod = data?.produto || data || {};\r\n const info = prod.infoAdicional || {};\r\n return {\r\n gtin: String(primeiro(prod.GTIN, prod.gtin, gtinFallback) ?? ''),\r\n xProd: primeiro(prod.xProd, prod.descricao) || 'Descrição Indisponível',\r\n ncm: primeiro(prod.NCM, prod.ncm),\r\n cest: primeiro(prod.CEST, prod.cest),\r\n marca: primeiro(prod.marca, info.xMarca),\r\n fabricante: prod.fabricante,\r\n categoria: primeiro(prod.categoria, info.xCategoria),\r\n imagemUrl: primeiro(prod.imagem_url, prod.thumbnail, info.urlImagem),\r\n pesoBruto: numero(primeiro(prod.peso_bruto, info.pesoBruto)),\r\n pesoLiquido: numero(primeiro(prod.peso_liquido, info.pesoLiquido)),\r\n quantidadeEmbalagem: Number(prod.quantidade_embalagem || 1),\r\n tpGTIN: prod.tpGTIN ?? undefined,\r\n fonte: prod.fonte ?? undefined,\r\n infoAdicional: prod.infoAdicional ?? undefined,\r\n };\r\n}\r\n\r\n/** Converte o produto enriquecido (`/v2/gtin`, scan ou item da busca) para `ProductEnrichedDetails`. */\r\nfunction produtoEnriquecidoDaApi(data: any, gtinFallback = ''): ProductEnrichedDetails {\r\n const prod = data?.produto || data || {};\r\n const base = produtoDaApi(prod, gtinFallback);\r\n const enriquecimento = prod.enriquecimentoIA || {};\r\n const atributos = enriquecimento.atributos || {};\r\n const temAtributos = Object.keys(atributos).length > 0;\r\n return {\r\n gtin: base.gtin,\r\n xProd: base.xProd,\r\n xProd_higienizado: enriquecimento.xProd_higienizado,\r\n descricao_completa: primeiro(prod.descricao_completa, enriquecimento.descricao_seo),\r\n ficha_tecnica: prod.ficha_tecnica ?? (temAtributos ? atributos : undefined),\r\n palavras_chave: prod.palavras_chave,\r\n ncm: base.ncm,\r\n cest: base.cest,\r\n marca: primeiro(prod.marca, atributos.marca, base.marca),\r\n categoria: primeiro(prod.categoria, enriquecimento.categoria_comercial, base.categoria),\r\n imagem_url: base.imagemUrl,\r\n peso_bruto: base.pesoBruto,\r\n peso_liquido: primeiro(numero(prod.peso_liquido), numero(atributos.peso_liquido), base.pesoLiquido),\r\n dados_tributarios_sugeridos: prod.dados_tributarios_sugeridos ?? prod.tributacaoIA ?? undefined,\r\n tpGTIN: base.tpGTIN,\r\n fonte: base.fonte,\r\n infoAdicional: base.infoAdicional,\r\n enriquecimentoIA: prod.enriquecimentoIA ?? undefined,\r\n tributacaoIA: prod.tributacaoIA ?? undefined,\r\n };\r\n}\r\n\r\n/** Converte `/v2/gtin/search` (`resultados[].produto`; aceita o legado `produtos`). */\r\nfunction buscaDaApi(data: any, query: string): ProductSearchResponse {\r\n const itens: ProductSearchResultItem[] = (data?.resultados || data?.produtos || []).map((item: any) => {\r\n const prod = produtoEnriquecidoDaApi(item.produto || item);\r\n return {\r\n gtin: prod.gtin,\r\n xProd: prod.xProd,\r\n marca: prod.marca,\r\n categoria: prod.categoria,\r\n score: item.score !== undefined && item.score !== null ? Number(item.score) : undefined,\r\n justificativa: item.justificativa ?? undefined,\r\n ncm: prod.ncm,\r\n cest: prod.cest,\r\n imagem_url: prod.imagem_url,\r\n };\r\n });\r\n return {\r\n status: data?.status || 'success',\r\n provider: data?.provider || 'PAIRUS',\r\n total_encontrados: itens.length,\r\n termo_buscado: data?.query || query,\r\n motor_busca: data?.motor_busca,\r\n produtos: itens,\r\n };\r\n}\r\n\r\nexport class ProductsResource extends BaseResource {\r\n /**\r\n * Consulta dados oficiais de um produto por código de barras GTIN/EAN (V1).\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<any>({ method: 'GET', path: `/v1/gtin/${gtinLimpo}` });\r\n return produtoDaApi(data, gtinLimpo);\r\n }\r\n\r\n /**\r\n * Consulta dados enriquecidos por IA, com SEO e ficha técnica estruturada (V2).\r\n * @param gtin Código numérico do produto.\r\n */\r\n public async getEnriched(gtin: string): Promise<ProductEnrichedDetails> {\r\n const gtinLimpo = gtin.replace(/\\D/g, '');\r\n const data = await this.request<any>({ method: 'GET', path: `/v2/gtin/${gtinLimpo}` });\r\n return produtoEnriquecidoDaApi(data, gtinLimpo);\r\n }\r\n\r\n /**\r\n * Executa busca semântica por intenção/linguagem natural (V2).\r\n * @param query Termo livre de busca (ex: 'refrigerante zero lata').\r\n */\r\n public async search(query: string): Promise<ProductSearchResponse> {\r\n const data = await this.request<any>({ method: 'GET', path: '/v2/gtin/search', params: { q: query } });\r\n return buscaDaApi(data, query);\r\n }\r\n\r\n /**\r\n * Reconhece código de barras por visão computacional a partir de foto JPEG (OCR V2).\r\n * @param file Blob, Buffer ou FormData com a imagem JPEG.\r\n */\r\n public async scan(file: Blob | Buffer | FormData): Promise<ProductEnrichedDetails> {\r\n let formData: FormData;\r\n\r\n if (typeof FormData !== 'undefined' && file instanceof FormData) {\r\n formData = file;\r\n } else {\r\n formData = new FormData();\r\n if (typeof Blob !== 'undefined' && file instanceof Blob) {\r\n formData.append('file', file, 'barcode.jpg');\r\n } else {\r\n // Node Buffer\r\n const blob = new Blob([file as any], { type: 'image/jpeg' });\r\n formData.append('file', blob, 'barcode.jpg');\r\n }\r\n }\r\n\r\n const data = await this.request<any>({ method: 'POST', path: '/v2/gtin/scan', body: formData });\r\n return produtoEnriquecidoDaApi(data);\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 { 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;AAGA,cAAM,uBAAuB,SAAS,WAAW,OAAO,qBAAqB;AAC7E,aAAK,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,SAAS,MAAM,KAAK,yBAAyB,UAAU,KAAK,aAAa,GAAG;AACxG,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;;;AC3PO,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;;;AC/FA,SAAS,kBAAkB;AAiB3B,SAAS,sBAAsB,SAAkD;AAC/E,SAAO,EAAE,mBAAmB,SAAS,kBAAkB,WAAW,EAAE;AACtE;AAEO,IAAM,kBAAN,cAA8B,aAAa;AAAA;AAAA;AAAA;AAAA,EAIhD,MAAa,UAAU,SAA0B,SAAuD;AACtG,WAAO,KAAK,QAA4B;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,sBAAsB,OAAO;AAAA,IACxC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,SAA0B,SAAuD;AACvG,WAAO,KAAK,QAA4B;AAAA,MACtC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,sBAAsB,OAAO;AAAA,IACxC,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,OAAO,UAAU,IAAI;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/FA,SAAS,gBAAgB,OAA6C;AACpE,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,QAAM,kBAAkB,KACpB,EAAE,GAAG,IAAI,OAAO,GAAG,SAAS,GAAG,KAAK,KAAK,GAAG,OAAO,GAAG,OAAO,KAAK,GAAG,OAAO,GAAG,UAAU,UAAU,GAAG,YAAY,GAAG,IAAI,IACzH;AACJ,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,MAAM,gBAAgB,MAAM;AAAA,IAC1C,MAAM,MAAM,QAAQ,MAAM;AAAA,IAC1B,wBAAwB,MAAM,0BAA0B,MAAM;AAAA,IAC9D,gBAAgB,MAAM,kBAAkB,MAAM;AAAA,IAC9C,IAAI;AAAA,IACJ,kBAAkB;AAAA,IAClB,4BAA4B,MAAM,8BAA8B,MAAM,QAAQ,8BAA8B;AAAA,IAC5G,gBAAgB,MAAM,kBAAkB,MAAM,UAAU,CAAC;AAAA,IACzD,QAAQ,MAAM,UAAU,MAAM,kBAAkB,CAAC;AAAA,EACnD;AACF;AAGA,SAAS,iBAAiB,MAAoD;AAC5E,QAAM,EAAE,KAAK,MAAM,OAAO,IAAI,KAAK,MAAM,WAAW,MAAM,GAAG,OAAO,IAAI;AACxE,QAAM,aAAkC;AAAA,IACtC,GAAG;AAAA,IACH,KAAK,OAAO;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,OAAO,SAAS;AAAA,IAChB,IAAI,MAAM;AAAA,EACZ;AACA,SAAO,OAAO,YAAY,OAAO,QAAQ,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,UAAa,MAAM,IAAI,CAAC;AACvG;AAEO,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,0BAA0B,OAAW,SAAQ,2BAA2B,OAAO;AAC1F,QAAI,OAAO,wBAAwB,OAAW,SAAQ,uBAAuB,OAAO;AACpF,QAAI,OAAO,iBAAkB,SAAQ,oBAAoB,OAAO;AAChE,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,UAAM,MAAM,MAAM,KAAK,QAA+B;AAAA,MACpD,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB,IAAI,oBAAoB,gBAAgB,IAAI,iBAAiB,IAAI,IAAI;AAAA,MACxF,YAAY,IAAI,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,mBAAmB,gBAAgB,EAAE,iBAAiB,EAAE,EAAE;AAAA,IAC5G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,SAAS,OAAmE;AACvF,WAAO,KAAK,QAAgC;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,MAAM,IAAI,gBAAgB,EAAE;AAAA,IAC7C,CAAC;AAAA,EACH;AACF;;;AChFO,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;;;AC1CA,SAAS,YAAe,SAA0D;AAChF,SAAO,QAAQ,KAAK,CAAC,MAAM,MAAM,UAAa,MAAM,QAAQ,MAAM,EAAE;AACtE;AAEA,SAAS,OAAO,OAAgC;AAC9C,QAAM,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,KAAK,MAAM,OAAO,KAAK;AACpF,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAGA,SAAS,aAAa,MAAW,eAAe,IAAoB;AAClE,QAAM,OAAO,MAAM,WAAW,QAAQ,CAAC;AACvC,QAAM,OAAO,KAAK,iBAAiB,CAAC;AACpC,SAAO;AAAA,IACL,MAAM,OAAO,SAAS,KAAK,MAAM,KAAK,MAAM,YAAY,KAAK,EAAE;AAAA,IAC/D,OAAO,SAAS,KAAK,OAAO,KAAK,SAAS,KAAK;AAAA,IAC/C,KAAK,SAAS,KAAK,KAAK,KAAK,GAAG;AAAA,IAChC,MAAM,SAAS,KAAK,MAAM,KAAK,IAAI;AAAA,IACnC,OAAO,SAAS,KAAK,OAAO,KAAK,MAAM;AAAA,IACvC,YAAY,KAAK;AAAA,IACjB,WAAW,SAAS,KAAK,WAAW,KAAK,UAAU;AAAA,IACnD,WAAW,SAAS,KAAK,YAAY,KAAK,WAAW,KAAK,SAAS;AAAA,IACnE,WAAW,OAAO,SAAS,KAAK,YAAY,KAAK,SAAS,CAAC;AAAA,IAC3D,aAAa,OAAO,SAAS,KAAK,cAAc,KAAK,WAAW,CAAC;AAAA,IACjE,qBAAqB,OAAO,KAAK,wBAAwB,CAAC;AAAA,IAC1D,QAAQ,KAAK,UAAU;AAAA,IACvB,OAAO,KAAK,SAAS;AAAA,IACrB,eAAe,KAAK,iBAAiB;AAAA,EACvC;AACF;AAGA,SAAS,wBAAwB,MAAW,eAAe,IAA4B;AACrF,QAAM,OAAO,MAAM,WAAW,QAAQ,CAAC;AACvC,QAAM,OAAO,aAAa,MAAM,YAAY;AAC5C,QAAM,iBAAiB,KAAK,oBAAoB,CAAC;AACjD,QAAM,YAAY,eAAe,aAAa,CAAC;AAC/C,QAAM,eAAe,OAAO,KAAK,SAAS,EAAE,SAAS;AACrD,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,mBAAmB,eAAe;AAAA,IAClC,oBAAoB,SAAS,KAAK,oBAAoB,eAAe,aAAa;AAAA,IAClF,eAAe,KAAK,kBAAkB,eAAe,YAAY;AAAA,IACjE,gBAAgB,KAAK;AAAA,IACrB,KAAK,KAAK;AAAA,IACV,MAAM,KAAK;AAAA,IACX,OAAO,SAAS,KAAK,OAAO,UAAU,OAAO,KAAK,KAAK;AAAA,IACvD,WAAW,SAAS,KAAK,WAAW,eAAe,qBAAqB,KAAK,SAAS;AAAA,IACtF,YAAY,KAAK;AAAA,IACjB,YAAY,KAAK;AAAA,IACjB,cAAc,SAAS,OAAO,KAAK,YAAY,GAAG,OAAO,UAAU,YAAY,GAAG,KAAK,WAAW;AAAA,IAClG,6BAA6B,KAAK,+BAA+B,KAAK,gBAAgB;AAAA,IACtF,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,eAAe,KAAK;AAAA,IACpB,kBAAkB,KAAK,oBAAoB;AAAA,IAC3C,cAAc,KAAK,gBAAgB;AAAA,EACrC;AACF;AAGA,SAAS,WAAW,MAAW,OAAsC;AACnE,QAAM,SAAoC,MAAM,cAAc,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,SAAc;AACrG,UAAM,OAAO,wBAAwB,KAAK,WAAW,IAAI;AACzD,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK,UAAU,UAAa,KAAK,UAAU,OAAO,OAAO,KAAK,KAAK,IAAI;AAAA,MAC9E,eAAe,KAAK,iBAAiB;AAAA,MACrC,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,MAAM,UAAU;AAAA,IACxB,UAAU,MAAM,YAAY;AAAA,IAC5B,mBAAmB,MAAM;AAAA,IACzB,eAAe,MAAM,SAAS;AAAA,IAC9B,aAAa,MAAM;AAAA,IACnB,UAAU;AAAA,EACZ;AACF;AAEO,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,QAAa,EAAE,QAAQ,OAAO,MAAM,YAAY,SAAS,GAAG,CAAC;AACrF,WAAO,aAAa,MAAM,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,YAAY,MAA+C;AACtE,UAAM,YAAY,KAAK,QAAQ,OAAO,EAAE;AACxC,UAAM,OAAO,MAAM,KAAK,QAAa,EAAE,QAAQ,OAAO,MAAM,YAAY,SAAS,GAAG,CAAC;AACrF,WAAO,wBAAwB,MAAM,SAAS;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAO,OAA+C;AACjE,UAAM,OAAO,MAAM,KAAK,QAAa,EAAE,QAAQ,OAAO,MAAM,mBAAmB,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;AACrG,WAAO,WAAW,MAAM,KAAK;AAAA,EAC/B;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,EAAE,QAAQ,QAAQ,MAAM,iBAAiB,MAAM,SAAS,CAAC;AAC9F,WAAO,wBAAwB,IAAI;AAAA,EACrC;AACF;;;ACrJA,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.4.0",
3
+ "version": "1.6.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",