diff --git a/dist-back/eLog.js b/dist-back/eLog.js new file mode 100644 index 0000000..f8ba1f3 --- /dev/null +++ b/dist-back/eLog.js @@ -0,0 +1,90 @@ +"use strict"; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var eLog_exports = {}; +__export(eLog_exports, { + NivelLog: () => NivelLog, + NivelLogDetalhes: () => NivelLogDetalhes, + iniciarELog: () => iniciarELog +}); +module.exports = __toCommonJS(eLog_exports); +var NivelLog = /* @__PURE__ */ ((NivelLog2) => { + NivelLog2["RASTREAMENTO"] = "RASTREAMENTO"; + NivelLog2["DEPURACAO"] = "DEPURACAO"; + NivelLog2["INFORMACAO"] = "INFORMACAO"; + NivelLog2["AVISO"] = "AVISO"; + NivelLog2["ERRO"] = "ERRO"; + NivelLog2["CRITICO"] = "CRITICO"; + return NivelLog2; +})(NivelLog || {}); +const NivelLogDetalhes = { + ["RASTREAMENTO" /* RASTREAMENTO */]: { peso: 1, rotulo: "Rastreamento", emoji: "\u{1F50D}", metodo: "debug" }, + ["DEPURACAO" /* DEPURACAO */]: { peso: 2, rotulo: "Depura\xE7\xE3o", emoji: "\u{1F41B}", metodo: "debug" }, + ["INFORMACAO" /* INFORMACAO */]: { peso: 3, rotulo: "Informa\xE7\xE3o", emoji: "\u2139\uFE0F", metodo: "info" }, + ["AVISO" /* AVISO */]: { peso: 4, rotulo: "Aviso", emoji: "\u26A0\uFE0F", metodo: "warn" }, + ["ERRO" /* ERRO */]: { peso: 5, rotulo: "Erro", emoji: "\u274C", metodo: "error" }, + ["CRITICO" /* CRITICO */]: { peso: 6, rotulo: "Cr\xEDtico", emoji: "\u{1F525}", metodo: "error" } +}; +const iniciarELog = (opcoes) => { + const nivel = opcoes.nivelMinimo ?? "INFORMACAO" /* INFORMACAO */; + const pesoMinimo = NivelLogDetalhes[nivel].peso; + const emitir = (nivelLog, pr) => { + const config = NivelLogDetalhes[nivelLog]; + if (config.peso < pesoMinimo) return; + const entrada = { + timestamp: (/* @__PURE__ */ new Date()).toISOString(), + nivel: nivelLog, + app: opcoes.app, + origem: pr.origem, + mensagem: pr.mensagem, + ...pr.dados !== void 0 ? { dados: pr.dados } : {} + }; + console[config.metodo]( + `${config.emoji} [${config.rotulo}] [${opcoes.app}] [${pr.origem}] ${pr.mensagem}`, + pr.dados !== void 0 ? pr.dados : "" + ); + if (opcoes.arquivamento) { + opcoes.arquivamento(entrada, { app: opcoes.app, nivelMinimo: nivel }); + } + }; + return { + rastreamento: (pr) => emitir("RASTREAMENTO" /* RASTREAMENTO */, pr), + depuracao: (pr) => emitir("DEPURACAO" /* DEPURACAO */, pr), + info: (pr) => emitir("INFORMACAO" /* INFORMACAO */, pr), + aviso: (pr) => emitir("AVISO" /* AVISO */, pr), + erro: (pr) => emitir("ERRO" /* ERRO */, pr), + critico: (pr) => emitir("CRITICO" /* CRITICO */, pr) + }; +}; +const log = iniciarELog({ + app: "testando", + nivelMinimo: "INFORMACAO" /* INFORMACAO */, + arquivamento: (entrada, opcoes) => { + fetch("https://localhost:3334/debug/log", { + method: "POST", + body: JSON.stringify({ ...entrada, _opcoes: opcoes }) + }); + } +}); +log.aviso({ origem: "teste", mensagem: "teste" }); +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + NivelLog, + NivelLogDetalhes, + iniciarELog +}); diff --git a/dist-back/index.js b/dist-back/index.js index a6c6ab0..0526ae9 100644 --- a/dist-back/index.js +++ b/dist-back/index.js @@ -22,6 +22,7 @@ __reExport(index_exports, require("./constantes"), module.exports); __reExport(index_exports, require("./consulta"), module.exports); __reExport(index_exports, require("./dayjs26"), module.exports); __reExport(index_exports, require("./ecosistema"), module.exports); +__reExport(index_exports, require("./eLog"), module.exports); __reExport(index_exports, require("./extensoes"), module.exports); __reExport(index_exports, require("./extensoes"), module.exports); __reExport(index_exports, require("./filtroDelta"), module.exports); @@ -48,6 +49,7 @@ __reExport(index_exports, require("./zodCustomizados"), module.exports); ...require("./consulta"), ...require("./dayjs26"), ...require("./ecosistema"), + ...require("./eLog"), ...require("./extensoes"), ...require("./extensoes"), ...require("./filtroDelta"), diff --git a/dist-front/index.d.mts b/dist-front/index.d.mts index d5f0b46..70c0eac 100644 --- a/dist-front/index.d.mts +++ b/dist-front/index.d.mts @@ -204,6 +204,101 @@ declare const defineDayjsBr: ({ dayjs, duration, isSameOrAfter, isSameOrBefore, declare const link_paiol = "https://paiol.idz.one"; +/** Níveis de severidade para o sistema de log estruturado. */ +declare enum NivelLog { + /** O mais baixo nível, ideal para rastreamento detalhado de fluxo e execução. */ + RASTREAMENTO = "RASTREAMENTO", + /** Usado para informações que ajudam a entender o estado do sistema durante a execução. */ + DEPURACAO = "DEPURACAO", + /** Informações gerais e eventos do sistema. */ + INFORMACAO = "INFORMACAO", + /** Eventos inesperados, mas que não impedem o funcionamento do sistema. */ + AVISO = "AVISO", + /** Erros que impactam o funcionamento do sistema, mas que podem ser recuperados. */ + ERRO = "ERRO", + /** O nível mais alto de severidade, indicando falhas que requerem atenção imediata. */ + CRITICO = "CRITICO" +} +type DetalheNivel = { + peso: number; + rotulo: string; + emoji: string; + metodo: "debug" | "info" | "warn" | "error"; +}; +/** Detalhes de cada nível de log — peso para filtragem, emoji e método do console. */ +declare const NivelLogDetalhes: Record; +/** Estrutura de uma entrada de log emitida pelo sistema. */ +type EntradaLog = { + timestamp: string; + nivel: keyof typeof NivelLog; + /** Identificador da aplicação/instância (ex: "front:e-licencie:12345"). */ + app: string; + /** Local no código de onde o log foi emitido (ex: "criarUsuario()"). */ + origem: string; + mensagem: string; + dados?: unknown; +}; +/** Interface pública do logger retornado por `iniciarELog`. */ +type ELogger = { + rastreamento: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + depuracao: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + info: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + aviso: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + erro: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; + critico: (pr: { + origem: string; + mensagem: string; + dados?: unknown; + }) => void; +}; +/** Opções de configuração do logger, disponíveis no callback de arquivamento. */ +type OpoesELogger = { + app: string; + nivelMinimo: keyof typeof NivelLog; +}; +/** Tipo do callback de arquivamento de logs. */ +type ArquivamentoLog = (entrada: EntradaLog, opcoes: OpoesELogger) => void; +/** + * Inicializa o sistema de log estruturado. + * + * @param opcoes.app - Identificador da aplicação/instância (ex: `"front:e-licencie:12345"`) + * @param opcoes.nivelMinimo - Nível mínimo para exibição no console (padrão: INFORMACAO) + * @param opcoes.arquivamento - Callback opcional para persistir/enviar as entradas de log + * + * @example + * ```ts + * const log = iniciarELog({ app: "front:e-licencie:12345" }) + * + * log.info({ origem: "criarUsuario()", mensagem: "Usuário criado", dados: { id: "abc-123" } }) + * // → ℹ️ [Informação] [front:e-licencie:12345] [criarUsuario()] Usuário criado + * ``` + */ +declare const iniciarELog: (opcoes: { + app: string; + nivelMinimo?: keyof typeof NivelLog; + arquivamento?: ArquivamentoLog; +}) => ELogger; + type tiposArquivo = "imagem" | "documento" | "vídeo" | "outros"; declare const extensoes: { ext: string; @@ -597,4 +692,4 @@ declare const zNumero: z.ZodPipe, z.ZodNumber>; declare const zNumeroPositivo: z.ZodPipe, z.ZodNumber>; declare const zNumeroInteiro: z.ZodPipe, z.ZodNumber>; -export { Produtos, TipagemRotas, type TipoPayloadAuditoria, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, criarFiltroDelta, defineDayjsBr, erUuid, esperar, extensoes, iniciarDayjsBr, iniciarFiltroDelta, type interfaceConsulta, link_paiol, localValor, nomeVariavel, objetoPg, operadorFiltroDeltaDetalhes, operadores, paraObjetoRegistroPg, pgObjeto, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoColunaFiltroDelta, type tipoCondicaoFiltroDelta, type tipoCondicaoFiltroDeltaTipado, type tipoFiltro, type tipoFiltroDelta, type tipoFiltroDeltaColunaTipada, type tipoOperadorFiltroDelta, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zColunaFiltroDelta, zCondicaoFiltroDelta, zCoordenadas, zDocCnpj, zDocCpf, zDocumento, zFiltro, zFiltroDelta, zNumero, zNumeroInteiro, zNumeroPositivo, zOperadorFiltroDelta, zOperadores }; +export { type ArquivamentoLog, type ELogger, type EntradaLog, NivelLog, NivelLogDetalhes, type OpoesELogger, Produtos, TipagemRotas, type TipoPayloadAuditoria, aleatorio, cacheM, cacheMFixo, cacheMemoria, camposComuns, criarFiltroDelta, defineDayjsBr, erUuid, esperar, extensoes, iniciarDayjsBr, iniciarELog, iniciarFiltroDelta, type interfaceConsulta, link_paiol, localValor, nomeVariavel, objetoPg, operadorFiltroDeltaDetalhes, operadores, paraObjetoRegistroPg, pgObjeto, siglas_unidades_medida, texto_busca, tipoArquivo, type tipoColunaFiltroDelta, type tipoCondicaoFiltroDelta, type tipoCondicaoFiltroDeltaTipado, type tipoFiltro, type tipoFiltroDelta, type tipoFiltroDeltaColunaTipada, type tipoOperadorFiltroDelta, tipoUsuarioResiduos, tiposSituacoesElicencie, tx, umaFuncao, umaVariavel, unidades_medida, uuid, uuidV3, uuidV4, uuid_null, validarUuid, verCacheM, zColunaFiltroDelta, zCondicaoFiltroDelta, zCoordenadas, zDocCnpj, zDocCpf, zDocumento, zFiltro, zFiltroDelta, zNumero, zNumeroInteiro, zNumeroPositivo, zOperadorFiltroDelta, zOperadores }; diff --git a/dist-front/index.mjs b/dist-front/index.mjs index ef97ac5..a40362b 100644 --- a/dist-front/index.mjs +++ b/dist-front/index.mjs @@ -1 +1 @@ -var g="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),H=e=>`eli-${Array.from({length:e||8}).map(()=>g[(999*Math.random()|0)%g.length]).join("")}`;var f={};globalThis.cacheMemoria_cache=f;var x=(e,o,a)=>{let n=typeof e=="string"?e:typeof e=="number"?String(e):encodeURIComponent(JSON.stringify(e)),t=a&&new Date().getTime()+a*1e3;o!==void 0&&(f[n]={valor:o,validade:t});let i=f[n];if(!(i?.validade&&i.validadef,E=x,ee=e=>o=>x(e,o);var re="00000000-0000-0000-0000-000000000000",h=(d=>(d.codigo="codigo",d.excluido="excluido",d.data_hora_criacao="data_hora_criacao",d.data_hora_atualizacao="data_hora_atualizacao",d.codigo_usuario_criacao="codigo_usuario_criacao",d.codigo_usuario_atualizacao="codigo_usuario_atualizacao",d.versao="versao",d))(h||{}),z=(o=>(o.token="token",o))(z||{}),O=(a=>(a.Usuario="usuario",a.Fornecedor="fornecedor",a))(O||{});import s from"zod";var T=(n=>(n["="]="=",n["!="]="!=",n[">"]=">",n[">="]=">=",n["<"]="<",n["<="]="<=",n.like="like",n.in="in",n.isNull="isNull",n))(T||{}),w=s.enum(["=","!=",">",">=","<","<=","like","in","isNull"]),ne=s.object({coluna:s.string(),valor:s.any(),operador:w,ou:s.boolean().optional()});var D=({dayjs:e,duration:o,isSameOrAfter:a,isSameOrBefore:n,minMax:t,relativeTime:i,timezone:m,utc:d,weekOfYear:b})=>(e.extend(d),e.extend(m),e.extend(b),e.extend(n),e.extend(a),e.extend(t),e.extend(i),e.extend(o),e.locale("pt-br"),e),de=D;var le="https://paiol.idz.one";var j=[{ext:"gif",tipo:"imagem",mime:"image/gif"},{ext:"jpg",tipo:"imagem",mime:"image/jpeg"},{ext:"jpeg",tipo:"imagem",mime:"image/jpeg"},{ext:"png",tipo:"imagem",mime:"image/png"},{ext:"bmp",tipo:"imagem",mime:"image/bmp"},{ext:"webp",tipo:"imagem",mime:"image/webp"},{ext:"tiff",tipo:"imagem",mime:"image/tiff"},{ext:"svg",tipo:"imagem",mime:"image/svg+xml"},{ext:"ico",tipo:"imagem",mime:"image/x-icon"},{ext:"pdf",tipo:"documento",mime:"application/pdf"},{ext:"doc",tipo:"documento",mime:"application/msword"},{ext:"docx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"},{ext:"xls",tipo:"documento",mime:"application/vnd.ms-excel"},{ext:"xlsx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},{ext:"ppt",tipo:"documento",mime:"application/vnd.ms-powerpoint"},{ext:"pptx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"},{ext:"txt",tipo:"documento",mime:"text/plain"},{ext:"odt",tipo:"documento",mime:"application/vnd.oasis.opendocument.text"},{ext:"ods",tipo:"documento",mime:"application/vnd.oasis.opendocument.spreadsheet"},{ext:"rtf",tipo:"documento",mime:"application/rtf"},{ext:"csv",tipo:"documento",mime:"text/csv"},{ext:"mp4",tipo:"v\xEDdeo",mime:"video/mp4"},{ext:"avi",tipo:"v\xEDdeo",mime:"video/x-msvideo"},{ext:"mkv",tipo:"v\xEDdeo",mime:"video/x-matroska"},{ext:"mov",tipo:"v\xEDdeo",mime:"video/quicktime"},{ext:"wmv",tipo:"v\xEDdeo",mime:"video/x-ms-wmv"},{ext:"flv",tipo:"v\xEDdeo",mime:"video/x-flv"},{ext:"webm",tipo:"v\xEDdeo",mime:"video/webm"},{ext:"3gp",tipo:"v\xEDdeo",mime:"video/3gpp"},{ext:"mpeg",tipo:"v\xEDdeo",mime:"video/mpeg"}],fe=e=>{let o=String(e||"").toLocaleLowerCase().split(".").pop();return j.find(n=>n.ext===o)?.tipo||"outros"};import l from"zod";var F=l.enum([">","<",">=","<=","=","!=","in","like","\u2229"]),xe={">":{rotulo:"Maior que",descricao:"O valor de A deve ser maior que o valor de B"},"<":{rotulo:"Menor que",descricao:"O valor de A deve ser menor que o valor de B"},">=":{rotulo:"Maior ou igual a",descricao:"O valor de A deve ser maior ou igual ao valor de B"},"<=":{rotulo:"Menor ou igual a",descricao:"O valor de A deve ser menor ou igual ao valor de B"},"=":{rotulo:"Igual a",descricao:"O valor de A deve ser igual ao valor de B"},"!=":{rotulo:"Diferente de",descricao:"O valor de A deve ser diferente do valor de B"},in:{rotulo:"Est\xE1 em",descricao:"O valor de A deve estar presente na cole\xE7\xE3o ou lista definida em B"},like:{rotulo:"Cont\xE9m",descricao:"O valor de A deve conter o texto informado em B"},"\u2229":{rotulo:"Interse\xE7\xE3o",descricao:"A e B devem possuir pelo menos um elemento em comum"}},C=/^\{[\w:]+\}$/,N=/^\w+(\.\w+)*$/,A=l.string().regex(N,"Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"),k=l.object({id:l.string().describe("id da condi\xE7\xE3o do filtro").regex(C,"O id deve seguir o formato {identificador}"),coluna:A,operador:F,valor:l.any().describe("valor de compara\xE7\xE3o")}),X=e=>{let a=(e.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g)||[]).join(""),n=e.replace(/\s+/g,""),t=a.replace(/\s+/g,"");if(n!==t)return!1;let i=e.replace(/\{[\w:]+\}/g,"true").replace(/\bNAO\b/g,"!").replace(/\bE\b/g,"&&").replace(/\bOU\b/g,"||");try{return new Function(`return (${i})`)(),!0}catch{return!1}},M=l.object({condicoes:l.array(k),formula:l.string().refine(X,{message:"F\xF3rmula inv\xE1lida. Use apenas refer\xEAncias de condi\xE7\xF5es {id} ou {id:sufixo}, operadores E/OU/NAO e par\xEAnteses."})}).superRefine((e,o)=>{let a=new Set(e.condicoes.map(t=>t.id)),n=e.formula.match(/\{[\w:]+\}/g)||[];for(let t of n)a.has(t)||o.addIssue({code:"custom",path:["formula"],message:`A refer\xEAncia ${t} n\xE3o existe em condicoes.`})}),B=e=>M.parse(e),_e=()=>({criarFiltroDelta:B});var ve=(e,o)=>{let a="localStorage"in globalThis?globalThis.localStorage:void 0;if(typeof a>"u")return null;let n=typeof e=="string"?e:encodeURIComponent(JSON.stringify(e));try{o!==void 0&&a.setItem(n,JSON.stringify(o));let t=a.getItem(n);if(t===null)return null;try{return JSON.parse(t)}catch{return t}}catch{return null}};var _=e=>{try{return Object.fromEntries(Object.entries(e).map(([o,a])=>[o,a===void 0||a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean"?a:JSON.stringify(a,null,2)]))}catch(o){throw new Error(`Erro na fun\xE7\xE3o paraObjetoRegistroPg: ${o.message} ${o.stack}`)}},he=_,ze=_;var P=(e=>(e["e-licencie"]="e-licencie",e["gov.e-licencie"]="gov.e-licencie",e))(P||{});var q=(r=>(r.modelo="000_modelo",r.vencida="100_vencida",r.expirado="200_expirado",r.alerta="300_alerta",r.protocoladafora="350_protocoladafora",r.protocolada="400_protocolada",r.protocoladaApenas="430_protocolada",r.protocolada_alteracao="450_protocolada",r.prazo="500_prazo",r.emitida="515_emitida",r.valida="518_valida",r.novo="520_novo",r.recebido="521_recebido",r.em_andamento="530_em_andamento",r.aguardando="530_aguardando",r.aguardandoresposta="540_aguardandoresposta",r.suspensaotemporaria="540_suspensaotemporaria",r.cancelada="550_cancelada",r.execucao="560_execucao",r.pendente="570_pendente",r.executadafora="600_executadafora",r.executada="700_executada",r.naoexecutada="701_naoexecutada",r.concluida="730_concluida",r.respondido_negado="740_respondido_negado",r.respondido_aceito="741_respondido_aceito",r.atendidoparcial="742_atendidoparcial",r.naoatendido="743_naoatendido",r.atendido="744_atendido",r.renovada="760_renovada",r.finalizada="800_finalizada",r.emitirnota="101_emitirnota",r.faturaatrasada="301_faturaatrasada",r.pagarfatura="302_pagarfatura",r.aguardandoconfirmacao="531_aguardandoconfirmacao",r.agendado="701_agendado",r.faturapaga="801_faturapaga",r.excluida="999_excluida",r.requerida="401_requerida",r.vigente="516_vigente",r.emrenovacao="402_emrenovacao",r.arquivada="801_arquivada",r.aguardando_sincronizacao="999_aguardando_sincronizacao",r.nao_conforme="710_nao_conforme",r.conforme="720_conforme",r.nao_aplicavel="730_nao_aplicavel",r.parcial="715_parcial",r))(q||{});var De=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Fe="Ol\xE1 Mundo! (vari\xE1vel)";var Xe=(...e)=>e.map(o=>o==null?"":String(o).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var y=class{constructor({caminho:o,acaoIr:a,rotulo:n}){this._partesCaminho=[];this._acaoIr=a,this._partesCaminho=(Array.isArray(o)?o:[o]).filter(Boolean).map(t=>String(t)).flatMap(t=>t.split("/")).filter(Boolean),this.rotulo=n}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(o){this._partesCaminho=o.split("/").filter(a=>a)}endereco(o,a){let n=typeof globalThis<"u"&&globalThis.window||void 0,t=new URL(n?n.location.href:"http://localhost");t.pathname=this.caminho,t.search="";let i=Object.entries(o);for(let[m,d]of i)t.searchParams.set(String(m),JSON.stringify(d));return t.hash="",a&&(t.hash=`#${t.search}`,t.search=""),t.href}ir(o){if(this._acaoIr)this._acaoIr(this.endereco({...o}));else{let a=typeof globalThis<"u"&&globalThis.window||void 0;a&&(a.location.href=this.endereco({...o}))}}parametros(o){let a=o?new URL(o):new URL(typeof globalThis<"u"&&globalThis.window?globalThis.window.location.href:"http://localhost"),n=a.searchParams,t=Object.fromEntries(n.entries()),i=a.hash;if(i){let m=Object.fromEntries(new URLSearchParams(i.slice(1)).entries());t={...t,...m}}for(let m in t)try{t[m]=JSON.parse(t[m])}catch{console.log(`[${m}|${t[m]}] n\xE3o \xE9 um json v\xE1lido.`)}return t}};var I=(i=>(i.UN="UN",i.KG="KG",i.TON="TON",i.g="g",i["M\xB3"]="M\xB3",i.Lt="Lt",i))(I||{}),Pe=[{sigla_unidade:"KG",nome:"Quilograma",sigla_normalizada:"KG",normalizar:e=>e,tipo:"massa"},{sigla_unidade:"g",nome:"Grama",sigla_normalizada:"KG",normalizar:e=>e/1e3,tipo:"massa"},{sigla_unidade:"TON",nome:"Tonelada",sigla_normalizada:"KG",normalizar:e=>e*1e3,tipo:"massa"},{sigla_unidade:"Lt",nome:"Litro",sigla_normalizada:"Lt",normalizar:e=>e,tipo:"volume"},{sigla_unidade:"M\xB3",nome:"Metro C\xFAbico",sigla_normalizada:"Lt",normalizar:e=>e*1e3,tipo:"volume"},{sigla_unidade:"UN",nome:"Unidade",sigla_normalizada:"UN",normalizar:e=>e,tipo:"unidade"}];import{NIL as U,v3 as L,v4 as $}from"uuid";var J=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ue=e=>J.test(String(e||"")),G=(e,o)=>L(typeof e=="string"?e:typeof e=="number"?String(e):JSON.stringify(e),o?G(o):U),R=$,Le=R;var Je=e=>new Promise(o=>setTimeout(()=>o(!0),e)),Ge=e=>Object.keys(e).join("/");import u from"zod";var Ve=u.object({formato:u.literal("decimal").default("decimal"),datum:u.literal("EPSG:4326").default("EPSG:4326"),latitude:u.number(),longitude:u.number()});import v from"zod";var K=/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/,V=/^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[A-Z0-9]{4}-\d{2}$/i,Y=Number(new Date().toISOString().slice(0,7).replace("-","")),Z=v.string().regex(Y<202407?K:V).describe("Documento (CNPJ) no formato XX.XXX.XXX/XXXX-XX"),Q=v.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/).describe("Documento (CPF) no formato XXX.XXX.XXX-XX"),Qe=Q.or(Z).describe("CPF ou CNPJ");import p from"zod";var c=e=>{if(typeof e=="number"||typeof e!="string")return e;let o=e;return o.includes(",")&&(o=o.replace(/\./g,"").replace(",",".")),o=o.replace(/[^0-9.]/g,""),o==""?null:Number(o)},Se=p.preprocess(c,p.number()),Ee=p.preprocess(c,p.number().positive()),eo=p.preprocess(c,p.number().int());export{P as Produtos,y as TipagemRotas,H as aleatorio,x as cacheM,ee as cacheMFixo,E as cacheMemoria,h as camposComuns,B as criarFiltroDelta,de as defineDayjsBr,J as erUuid,Je as esperar,j as extensoes,D as iniciarDayjsBr,_e as iniciarFiltroDelta,le as link_paiol,ve as localValor,Ge as nomeVariavel,ze as objetoPg,xe as operadorFiltroDeltaDetalhes,T as operadores,_ as paraObjetoRegistroPg,he as pgObjeto,I as siglas_unidades_medida,Xe as texto_busca,fe as tipoArquivo,O as tipoUsuarioResiduos,q as tiposSituacoesElicencie,z as tx,De as umaFuncao,Fe as umaVariavel,Pe as unidades_medida,Le as uuid,G as uuidV3,R as uuidV4,re as uuid_null,Ue as validarUuid,S as verCacheM,A as zColunaFiltroDelta,k as zCondicaoFiltroDelta,Ve as zCoordenadas,Z as zDocCnpj,Q as zDocCpf,Qe as zDocumento,ne as zFiltro,M as zFiltroDelta,Se as zNumero,eo as zNumeroInteiro,Ee as zNumeroPositivo,F as zOperadorFiltroDelta,w as zOperadores}; +var c="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),oo=o=>`eli-${Array.from({length:o||8}).map(()=>c[(999*Math.random()|0)%c.length]).join("")}`;var g={};globalThis.cacheMemoria_cache=g;var x=(o,e,a)=>{let n=typeof o=="string"?o:typeof o=="number"?String(o):encodeURIComponent(JSON.stringify(o)),r=a&&new Date().getTime()+a*1e3;e!==void 0&&(g[n]={valor:e,validade:r});let i=g[n];if(!(i?.validade&&i.validadeg,to=x,ao=o=>e=>x(o,e);var io="00000000-0000-0000-0000-000000000000",h=(d=>(d.codigo="codigo",d.excluido="excluido",d.data_hora_criacao="data_hora_criacao",d.data_hora_atualizacao="data_hora_atualizacao",d.codigo_usuario_criacao="codigo_usuario_criacao",d.codigo_usuario_atualizacao="codigo_usuario_atualizacao",d.versao="versao",d))(h||{}),A=(e=>(e.token="token",e))(A||{}),T=(a=>(a.Usuario="usuario",a.Fornecedor="fornecedor",a))(T||{});import p from"zod";var N=(n=>(n["="]="=",n["!="]="!=",n[">"]=">",n[">="]=">=",n["<"]="<",n["<="]="<=",n.like="like",n.in="in",n.isNull="isNull",n))(N||{}),z=p.enum(["=","!=",">",">=","<","<=","like","in","isNull"]),lo=p.object({coluna:p.string(),valor:p.any(),operador:z,ou:p.boolean().optional()});var w=({dayjs:o,duration:e,isSameOrAfter:a,isSameOrBefore:n,minMax:r,relativeTime:i,timezone:m,utc:d,weekOfYear:O})=>(o.extend(d),o.extend(m),o.extend(O),o.extend(n),o.extend(a),o.extend(r),o.extend(i),o.extend(e),o.locale("pt-br"),o),uo=w;var fo="https://paiol.idz.one";var C=(m=>(m.RASTREAMENTO="RASTREAMENTO",m.DEPURACAO="DEPURACAO",m.INFORMACAO="INFORMACAO",m.AVISO="AVISO",m.ERRO="ERRO",m.CRITICO="CRITICO",m))(C||{}),v={RASTREAMENTO:{peso:1,rotulo:"Rastreamento",emoji:"\u{1F50D}",metodo:"debug"},DEPURACAO:{peso:2,rotulo:"Depura\xE7\xE3o",emoji:"\u{1F41B}",metodo:"debug"},INFORMACAO:{peso:3,rotulo:"Informa\xE7\xE3o",emoji:"\u2139\uFE0F",metodo:"info"},AVISO:{peso:4,rotulo:"Aviso",emoji:"\u26A0\uFE0F",metodo:"warn"},ERRO:{peso:5,rotulo:"Erro",emoji:"\u274C",metodo:"error"},CRITICO:{peso:6,rotulo:"Cr\xEDtico",emoji:"\u{1F525}",metodo:"error"}},D=o=>{let e=o.nivelMinimo??"INFORMACAO",a=v[e].peso,n=(r,i)=>{let m=v[r];if(m.peson("RASTREAMENTO",r),depuracao:r=>n("DEPURACAO",r),info:r=>n("INFORMACAO",r),aviso:r=>n("AVISO",r),erro:r=>n("ERRO",r),critico:r=>n("CRITICO",r)}},j=D({app:"testando",nivelMinimo:"INFORMACAO",arquivamento:(o,e)=>{fetch("https://localhost:3334/debug/log",{method:"POST",body:JSON.stringify({...o,_opcoes:e})})}});j.aviso({origem:"teste",mensagem:"teste"});var F=[{ext:"gif",tipo:"imagem",mime:"image/gif"},{ext:"jpg",tipo:"imagem",mime:"image/jpeg"},{ext:"jpeg",tipo:"imagem",mime:"image/jpeg"},{ext:"png",tipo:"imagem",mime:"image/png"},{ext:"bmp",tipo:"imagem",mime:"image/bmp"},{ext:"webp",tipo:"imagem",mime:"image/webp"},{ext:"tiff",tipo:"imagem",mime:"image/tiff"},{ext:"svg",tipo:"imagem",mime:"image/svg+xml"},{ext:"ico",tipo:"imagem",mime:"image/x-icon"},{ext:"pdf",tipo:"documento",mime:"application/pdf"},{ext:"doc",tipo:"documento",mime:"application/msword"},{ext:"docx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"},{ext:"xls",tipo:"documento",mime:"application/vnd.ms-excel"},{ext:"xlsx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},{ext:"ppt",tipo:"documento",mime:"application/vnd.ms-powerpoint"},{ext:"pptx",tipo:"documento",mime:"application/vnd.openxmlformats-officedocument.presentationml.presentation"},{ext:"txt",tipo:"documento",mime:"text/plain"},{ext:"odt",tipo:"documento",mime:"application/vnd.oasis.opendocument.text"},{ext:"ods",tipo:"documento",mime:"application/vnd.oasis.opendocument.spreadsheet"},{ext:"rtf",tipo:"documento",mime:"application/rtf"},{ext:"csv",tipo:"documento",mime:"text/csv"},{ext:"mp4",tipo:"v\xEDdeo",mime:"video/mp4"},{ext:"avi",tipo:"v\xEDdeo",mime:"video/x-msvideo"},{ext:"mkv",tipo:"v\xEDdeo",mime:"video/x-matroska"},{ext:"mov",tipo:"v\xEDdeo",mime:"video/quicktime"},{ext:"wmv",tipo:"v\xEDdeo",mime:"video/x-ms-wmv"},{ext:"flv",tipo:"v\xEDdeo",mime:"video/x-flv"},{ext:"webm",tipo:"v\xEDdeo",mime:"video/webm"},{ext:"3gp",tipo:"v\xEDdeo",mime:"video/3gpp"},{ext:"mpeg",tipo:"v\xEDdeo",mime:"video/mpeg"}],_o=o=>{let e=String(o||"").toLocaleLowerCase().split(".").pop();return F.find(n=>n.ext===e)?.tipo||"outros"};import s from"zod";var k=s.enum([">","<",">=","<=","=","!=","in","like","\u2229"]),ho={">":{rotulo:"Maior que",descricao:"O valor de A deve ser maior que o valor de B"},"<":{rotulo:"Menor que",descricao:"O valor de A deve ser menor que o valor de B"},">=":{rotulo:"Maior ou igual a",descricao:"O valor de A deve ser maior ou igual ao valor de B"},"<=":{rotulo:"Menor ou igual a",descricao:"O valor de A deve ser menor ou igual ao valor de B"},"=":{rotulo:"Igual a",descricao:"O valor de A deve ser igual ao valor de B"},"!=":{rotulo:"Diferente de",descricao:"O valor de A deve ser diferente do valor de B"},in:{rotulo:"Est\xE1 em",descricao:"O valor de A deve estar presente na cole\xE7\xE3o ou lista definida em B"},like:{rotulo:"Cont\xE9m",descricao:"O valor de A deve conter o texto informado em B"},"\u2229":{rotulo:"Interse\xE7\xE3o",descricao:"A e B devem possuir pelo menos um elemento em comum"}},R=/^\{[\w:]+\}$/,L=/^\w+(\.\w+)*$/,M=s.string().regex(L,"Coluna inv\xE1lida").describe("nome da coluna ou caminho aninhado do jsonb"),I=s.object({id:s.string().describe("id da condi\xE7\xE3o do filtro").regex(R,"O id deve seguir o formato {identificador}"),coluna:M,operador:k,valor:s.any().describe("valor de compara\xE7\xE3o")}),X=o=>{let a=(o.match(/\{[\w:]+\}|\bNAO\b|\bE\b|\bOU\b|\(|\)/g)||[]).join(""),n=o.replace(/\s+/g,""),r=a.replace(/\s+/g,"");if(n!==r)return!1;let i=o.replace(/\{[\w:]+\}/g,"true").replace(/\bNAO\b/g,"!").replace(/\bE\b/g,"&&").replace(/\bOU\b/g,"||");try{return new Function(`return (${i})`)(),!0}catch{return!1}},q=s.object({condicoes:s.array(I),formula:s.string().refine(X,{message:"F\xF3rmula inv\xE1lida. Use apenas refer\xEAncias de condi\xE7\xF5es {id} ou {id:sufixo}, operadores E/OU/NAO e par\xEAnteses."})}).superRefine((o,e)=>{let a=new Set(o.condicoes.map(r=>r.id)),n=o.formula.match(/\{[\w:]+\}/g)||[];for(let r of n)a.has(r)||e.addIssue({code:"custom",path:["formula"],message:`A refer\xEAncia ${r} n\xE3o existe em condicoes.`})}),P=o=>q.parse(o),Ao=()=>({criarFiltroDelta:P});var No=(o,e)=>{let a="localStorage"in globalThis?globalThis.localStorage:void 0;if(typeof a>"u")return null;let n=typeof o=="string"?o:encodeURIComponent(JSON.stringify(o));try{e!==void 0&&a.setItem(n,JSON.stringify(e));let r=a.getItem(n);if(r===null)return null;try{return JSON.parse(r)}catch{return r}}catch{return null}};var y=o=>{try{return Object.fromEntries(Object.entries(o).map(([e,a])=>[e,a===void 0||a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean"?a:JSON.stringify(a,null,2)]))}catch(e){throw new Error(`Erro na fun\xE7\xE3o paraObjetoRegistroPg: ${e.message} ${e.stack}`)}},wo=y,Co=y;var U=(o=>(o["e-licencie"]="e-licencie",o["gov.e-licencie"]="gov.e-licencie",o))(U||{});var $=(t=>(t.modelo="000_modelo",t.vencida="100_vencida",t.expirado="200_expirado",t.alerta="300_alerta",t.protocoladafora="350_protocoladafora",t.protocolada="400_protocolada",t.protocoladaApenas="430_protocolada",t.protocolada_alteracao="450_protocolada",t.prazo="500_prazo",t.emitida="515_emitida",t.valida="518_valida",t.novo="520_novo",t.recebido="521_recebido",t.em_andamento="530_em_andamento",t.aguardando="530_aguardando",t.aguardandoresposta="540_aguardandoresposta",t.suspensaotemporaria="540_suspensaotemporaria",t.cancelada="550_cancelada",t.execucao="560_execucao",t.pendente="570_pendente",t.executadafora="600_executadafora",t.executada="700_executada",t.naoexecutada="701_naoexecutada",t.concluida="730_concluida",t.respondido_negado="740_respondido_negado",t.respondido_aceito="741_respondido_aceito",t.atendidoparcial="742_atendidoparcial",t.naoatendido="743_naoatendido",t.atendido="744_atendido",t.renovada="760_renovada",t.finalizada="800_finalizada",t.emitirnota="101_emitirnota",t.faturaatrasada="301_faturaatrasada",t.pagarfatura="302_pagarfatura",t.aguardandoconfirmacao="531_aguardandoconfirmacao",t.agendado="701_agendado",t.faturapaga="801_faturapaga",t.excluida="999_excluida",t.requerida="401_requerida",t.vigente="516_vigente",t.emrenovacao="402_emrenovacao",t.arquivada="801_arquivada",t.aguardando_sincronizacao="999_aguardando_sincronizacao",t.nao_conforme="710_nao_conforme",t.conforme="720_conforme",t.nao_aplicavel="730_nao_aplicavel",t.parcial="715_parcial",t))($||{});var ko=()=>"Ol\xE1 Mundo! (fun\xE7\xE3o)";var Lo="Ol\xE1 Mundo! (vari\xE1vel)";var Po=(...o)=>o.map(e=>e==null?"":String(e).normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/\s+/g," ").toLowerCase()).join(" ");var _=class{constructor({caminho:e,acaoIr:a,rotulo:n}){this._partesCaminho=[];this._acaoIr=a,this._partesCaminho=(Array.isArray(e)?e:[e]).filter(Boolean).map(r=>String(r)).flatMap(r=>r.split("/")).filter(Boolean),this.rotulo=n}get caminho(){return`/${this._partesCaminho.join("/")}`}set caminho(e){this._partesCaminho=e.split("/").filter(a=>a)}endereco(e,a){let n=typeof globalThis<"u"&&globalThis.window||void 0,r=new URL(n?n.location.href:"http://localhost");r.pathname=this.caminho,r.search="";let i=Object.entries(e);for(let[m,d]of i)r.searchParams.set(String(m),JSON.stringify(d));return r.hash="",a&&(r.hash=`#${r.search}`,r.search=""),r.href}ir(e){if(this._acaoIr)this._acaoIr(this.endereco({...e}));else{let a=typeof globalThis<"u"&&globalThis.window||void 0;a&&(a.location.href=this.endereco({...e}))}}parametros(e){let a=e?new URL(e):new URL(typeof globalThis<"u"&&globalThis.window?globalThis.window.location.href:"http://localhost"),n=a.searchParams,r=Object.fromEntries(n.entries()),i=a.hash;if(i){let m=Object.fromEntries(new URLSearchParams(i.slice(1)).entries());r={...r,...m}}for(let m in r)try{r[m]=JSON.parse(r[m])}catch{console.log(`[${m}|${r[m]}] n\xE3o \xE9 um json v\xE1lido.`)}return r}};var B=(i=>(i.UN="UN",i.KG="KG",i.TON="TON",i.g="g",i["M\xB3"]="M\xB3",i.Lt="Lt",i))(B||{}),Bo=[{sigla_unidade:"KG",nome:"Quilograma",sigla_normalizada:"KG",normalizar:o=>o,tipo:"massa"},{sigla_unidade:"g",nome:"Grama",sigla_normalizada:"KG",normalizar:o=>o/1e3,tipo:"massa"},{sigla_unidade:"TON",nome:"Tonelada",sigla_normalizada:"KG",normalizar:o=>o*1e3,tipo:"massa"},{sigla_unidade:"Lt",nome:"Litro",sigla_normalizada:"Lt",normalizar:o=>o,tipo:"volume"},{sigla_unidade:"M\xB3",nome:"Metro C\xFAbico",sigla_normalizada:"Lt",normalizar:o=>o*1e3,tipo:"volume"},{sigla_unidade:"UN",nome:"Unidade",sigla_normalizada:"UN",normalizar:o=>o,tipo:"unidade"}];import{NIL as J,v3 as V,v4 as G}from"uuid";var K=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Go=o=>K.test(String(o||"")),Y=(o,e)=>V(typeof o=="string"?o:typeof o=="number"?String(o):JSON.stringify(o),e?Y(e):J),Z=G,Ko=Z;var Zo=o=>new Promise(e=>setTimeout(()=>e(!0),o)),Qo=o=>Object.keys(o).join("/");import u from"zod";var So=u.object({formato:u.literal("decimal").default("decimal"),datum:u.literal("EPSG:4326").default("EPSG:4326"),latitude:u.number(),longitude:u.number()});import b from"zod";var Q=/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/,H=/^[A-Z0-9]{2}\.[A-Z0-9]{3}\.[A-Z0-9]{3}\/[A-Z0-9]{4}-\d{2}$/i,W=Number(new Date().toISOString().slice(0,7).replace("-","")),S=b.string().regex(W<202407?Q:H).describe("Documento (CNPJ) no formato XX.XXX.XXX/XXXX-XX"),E=b.string().regex(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/).describe("Documento (CPF) no formato XXX.XXX.XXX-XX"),ee=E.or(S).describe("CPF ou CNPJ");import l from"zod";var f=o=>{if(typeof o=="number"||typeof o!="string")return o;let e=o;return e.includes(",")&&(e=e.replace(/\./g,"").replace(",",".")),e=e.replace(/[^0-9.]/g,""),e==""?null:Number(e)},ae=l.preprocess(f,l.number()),ne=l.preprocess(f,l.number().positive()),ie=l.preprocess(f,l.number().int());export{C as NivelLog,v as NivelLogDetalhes,U as Produtos,_ as TipagemRotas,oo as aleatorio,x as cacheM,ao as cacheMFixo,to as cacheMemoria,h as camposComuns,P as criarFiltroDelta,uo as defineDayjsBr,K as erUuid,Zo as esperar,F as extensoes,w as iniciarDayjsBr,D as iniciarELog,Ao as iniciarFiltroDelta,fo as link_paiol,No as localValor,Qo as nomeVariavel,Co as objetoPg,ho as operadorFiltroDeltaDetalhes,N as operadores,y as paraObjetoRegistroPg,wo as pgObjeto,B as siglas_unidades_medida,Po as texto_busca,_o as tipoArquivo,T as tipoUsuarioResiduos,$ as tiposSituacoesElicencie,A as tx,ko as umaFuncao,Lo as umaVariavel,Bo as unidades_medida,Ko as uuid,Y as uuidV3,Z as uuidV4,io as uuid_null,Go as validarUuid,ro as verCacheM,M as zColunaFiltroDelta,I as zCondicaoFiltroDelta,So as zCoordenadas,S as zDocCnpj,E as zDocCpf,ee as zDocumento,lo as zFiltro,q as zFiltroDelta,ae as zNumero,ie as zNumeroInteiro,ne as zNumeroPositivo,k as zOperadorFiltroDelta,z as zOperadores}; diff --git a/package.json b/package.json index 1d2dfa1..006a661 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-comuns", - "version": "0.348.0", + "version": "0.349.0", "description": "", "main": "./dist-front/index.mjs", "module": "./dist-front/index.mjs", diff --git a/pacote.tgz b/pacote.tgz index a18073a..e4666c0 100644 Binary files a/pacote.tgz and b/pacote.tgz differ diff --git a/src/eLog.ts b/src/eLog.ts new file mode 100644 index 0000000..06e9884 --- /dev/null +++ b/src/eLog.ts @@ -0,0 +1,135 @@ +/** Níveis de severidade para o sistema de log estruturado. */ +export enum NivelLog { + /** O mais baixo nível, ideal para rastreamento detalhado de fluxo e execução. */ + RASTREAMENTO = "RASTREAMENTO", + /** Usado para informações que ajudam a entender o estado do sistema durante a execução. */ + DEPURACAO = "DEPURACAO", + /** Informações gerais e eventos do sistema. */ + INFORMACAO = "INFORMACAO", + /** Eventos inesperados, mas que não impedem o funcionamento do sistema. */ + AVISO = "AVISO", + /** Erros que impactam o funcionamento do sistema, mas que podem ser recuperados. */ + ERRO = "ERRO", + /** O nível mais alto de severidade, indicando falhas que requerem atenção imediata. */ + CRITICO = "CRITICO", +} + +type DetalheNivel = { + peso: number + rotulo: string + emoji: string + metodo: "debug" | "info" | "warn" | "error" +} + +/** Detalhes de cada nível de log — peso para filtragem, emoji e método do console. */ +export const NivelLogDetalhes: Record = { + [NivelLog.RASTREAMENTO]: { peso: 1, rotulo: "Rastreamento", emoji: "🔍", metodo: "debug" }, + [NivelLog.DEPURACAO]: { peso: 2, rotulo: "Depuração", emoji: "🐛", metodo: "debug" }, + [NivelLog.INFORMACAO]: { peso: 3, rotulo: "Informação", emoji: "ℹ️", metodo: "info" }, + [NivelLog.AVISO]: { peso: 4, rotulo: "Aviso", emoji: "⚠️", metodo: "warn" }, + [NivelLog.ERRO]: { peso: 5, rotulo: "Erro", emoji: "❌", metodo: "error" }, + [NivelLog.CRITICO]: { peso: 6, rotulo: "Crítico", emoji: "🔥", metodo: "error" }, +} + +/** Estrutura de uma entrada de log emitida pelo sistema. */ +export type EntradaLog = { + timestamp: string + nivel: keyof typeof NivelLog + /** Identificador da aplicação/instância (ex: "front:e-licencie:12345"). */ + app: string + /** Local no código de onde o log foi emitido (ex: "criarUsuario()"). */ + origem: string + mensagem: string + dados?: unknown +} + +/** Interface pública do logger retornado por `iniciarELog`. */ +export type ELogger = { + rastreamento: (pr: { origem: string; mensagem: string; dados?: unknown }) => void + depuracao: (pr: { origem: string; mensagem: string; dados?: unknown }) => void + info: (pr: { origem: string; mensagem: string; dados?: unknown }) => void + aviso: (pr: { origem: string; mensagem: string; dados?: unknown }) => void + erro: (pr: { origem: string; mensagem: string; dados?: unknown }) => void + critico: (pr: { origem: string; mensagem: string; dados?: unknown }) => void +} + +/** Opções de configuração do logger, disponíveis no callback de arquivamento. */ +export type OpoesELogger = { + app: string + nivelMinimo: keyof typeof NivelLog +} + +/** Tipo do callback de arquivamento de logs. */ +export type ArquivamentoLog = (entrada: EntradaLog, opcoes: OpoesELogger) => void + +/** + * Inicializa o sistema de log estruturado. + * + * @param opcoes.app - Identificador da aplicação/instância (ex: `"front:e-licencie:12345"`) + * @param opcoes.nivelMinimo - Nível mínimo para exibição no console (padrão: INFORMACAO) + * @param opcoes.arquivamento - Callback opcional para persistir/enviar as entradas de log + * + * @example + * ```ts + * const log = iniciarELog({ app: "front:e-licencie:12345" }) + * + * log.info({ origem: "criarUsuario()", mensagem: "Usuário criado", dados: { id: "abc-123" } }) + * // → ℹ️ [Informação] [front:e-licencie:12345] [criarUsuario()] Usuário criado + * ``` + */ +export const iniciarELog = (opcoes: { + app: string + nivelMinimo?: keyof typeof NivelLog + arquivamento?: ArquivamentoLog +}): ELogger => { + const nivel: keyof typeof NivelLog = opcoes.nivelMinimo ?? NivelLog.INFORMACAO + const pesoMinimo = NivelLogDetalhes[nivel].peso + + const emitir = ( + nivelLog: keyof typeof NivelLog, + pr: { origem: string; mensagem: string; dados?: unknown }, + ) => { + const config = NivelLogDetalhes[nivelLog] + if (config.peso < pesoMinimo) return + + const entrada: EntradaLog = { + timestamp: new Date().toISOString(), + nivel: nivelLog, + app: opcoes.app, + origem: pr.origem, + mensagem: pr.mensagem, + ...(pr.dados !== undefined ? { dados: pr.dados } : {}), + } + + console[config.metodo]( + `${config.emoji} [${config.rotulo}] [${opcoes.app}] [${pr.origem}] ${pr.mensagem}`, + pr.dados !== undefined ? pr.dados : "", + ) + + if (opcoes.arquivamento) { + opcoes.arquivamento(entrada, { app: opcoes.app, nivelMinimo: nivel }) + } + } + + return { + rastreamento: (pr) => emitir(NivelLog.RASTREAMENTO, pr), + depuracao: (pr) => emitir(NivelLog.DEPURACAO, pr), + info: (pr) => emitir(NivelLog.INFORMACAO, pr), + aviso: (pr) => emitir(NivelLog.AVISO, pr), + erro: (pr) => emitir(NivelLog.ERRO, pr), + critico: (pr) => emitir(NivelLog.CRITICO, pr), + } +} + +const log = iniciarELog({ + app: "testando", + nivelMinimo: NivelLog.INFORMACAO, + arquivamento: (entrada, opcoes) => { + fetch("https://localhost:3334/debug/log", { + method: "POST", + body: JSON.stringify({ ...entrada, _opcoes: opcoes }), + }) + }, +}) + +log.aviso({ origem: "teste", mensagem: "teste" }) diff --git a/src/index.ts b/src/index.ts index cadd713..28e224f 100755 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ export * from "./constantes" export * from "./consulta" export * from "./dayjs26" export * from "./ecosistema" +export * from "./eLog" export * from "./extensoes" export * from "./extensoes" export * from "./filtroDelta"