diff --git a/dist-back/respostas.js b/dist-back/respostas.js index 12e1e05..69e4cd8 100644 --- a/dist-back/respostas.js +++ b/dist-back/respostas.js @@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => { var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var respostas_exports = {}; __export(respostas_exports, { + IniciarRespostas: () => IniciarRespostas, codigosResposta: () => codigosResposta, gerarRespostas: () => gerarRespostas, respostaComuns: () => respostaComuns @@ -32,9 +33,13 @@ var codigosResposta = /* @__PURE__ */ ((codigosResposta2) => { codigosResposta2[codigosResposta2["tempoEsgotado"] = 504] = "tempoEsgotado"; return codigosResposta2; })(codigosResposta || {}); -const gerarRespostas = (registrarErroInterno) => { +function aplicarCallback(resposta, callback) { + if (!callback) return resposta; + return callback(resposta); +} +const IniciarRespostas = (callback) => { const valor = (valor2, detalhes) => { - return { + const resposta = { cod: 200 /* sucesso */, valor: valor2, mensagem: void 0, @@ -42,9 +47,10 @@ const gerarRespostas = (registrarErroInterno) => { eCerto: true, detalhes }; + return aplicarCallback(resposta, callback); }; const valorTrue = (detalhes) => { - return { + const resposta = { cod: 200 /* sucesso */, valor: true, mensagem: void 0, @@ -52,9 +58,10 @@ const gerarRespostas = (registrarErroInterno) => { eCerto: true, detalhes }; + return aplicarCallback(resposta, callback); }; const erro = (mensagem, detalhes) => { - return { + const resposta = { cod: 400 /* erroConhecido */, valor: void 0, mensagem, @@ -62,9 +69,10 @@ const gerarRespostas = (registrarErroInterno) => { eCerto: false, detalhes }; + return aplicarCallback(resposta, callback); }; const erroPermissao = (mensagem, detalhes) => { - return { + const resposta = { cod: 401 /* erroPermissao */, valor: void 0, mensagem: mensagem || "Sem permiss\xE3o para esse recurso.", @@ -72,9 +80,10 @@ const gerarRespostas = (registrarErroInterno) => { eCerto: false, detalhes }; + return aplicarCallback(resposta, callback); }; const naoEncontrado = (mensagem, detalhes) => { - return { + const resposta = { cod: 404 /* erroNaoEncontrado */, valor: void 0, mensagem: mensagem || "Registro n\xE3o encontrado ou a execu\xE7\xE3o dessa a\xE7\xE3o depende de um registro existente.", @@ -82,21 +91,21 @@ const gerarRespostas = (registrarErroInterno) => { eCerto: false, detalhes }; + return aplicarCallback(resposta, callback); }; const erroInterno = (op) => { - const resRegistro = registrarErroInterno(op); const mensagemFim = `${op.mensagem || "Erro interno"}`; - return { + const resposta = { cod: 500 /* erroDesconhecido */, valor: void 0, mensagem: mensagemFim, eErro: true, - eCerto: false, - ...resRegistro + eCerto: false }; + return aplicarCallback(resposta, callback); }; const tempoEsgotado = (mensagem, detalhes) => { - return { + const resposta = { cod: 504 /* tempoEsgotado */, valor: void 0, mensagem: mensagem || "Tempo de resposta esgotado ao tentar acessar o recurso.", @@ -104,6 +113,7 @@ const gerarRespostas = (registrarErroInterno) => { eCerto: false, detalhes }; + return aplicarCallback(resposta, callback); }; const erroEspera = tempoEsgotado; return { @@ -141,9 +151,11 @@ const gerarRespostas = (registrarErroInterno) => { erroEspera }; }; -const respostaComuns = gerarRespostas(() => ({})); +const gerarRespostas = IniciarRespostas; +const respostaComuns = IniciarRespostas(); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { + IniciarRespostas, codigosResposta, gerarRespostas, respostaComuns diff --git a/dist-front/index.d.mts b/dist-front/index.d.mts index 97c6e86..decb983 100644 --- a/dist-front/index.d.mts +++ b/dist-front/index.d.mts @@ -34,6 +34,13 @@ type tipoPrErroInterno = { local: string; __filename?: string; }; +/** + * Tipo do callback opcional de interceptação de respostas. + * + * Quando fornecido, é invocado após a construção de toda resposta, + * permitindo side-effects (ex.: logging, telemetria) sem alterar o tipo. + */ +type tipoCallbackResposta = (resposta: tipoResposta) => tipoResposta; /** * Cria um conjunto de geradores de respostas. * @@ -49,14 +56,16 @@ interface InterfaceRespostas { tempoEsgotado: (mensagem?: string | undefined | null, detalhes?: string[]) => tipoRespostaErro; erroEspera: (mensagem?: string | undefined | null, detalhes?: string[]) => tipoRespostaErro; } -declare const gerarRespostas: ( -/** Faz um processamento quando erro interno - * Recebe o erro gerado, mensagem personalizada e detalhes - */ -registrarErroInterno: (op: tipoPrErroInterno) => Partial) => InterfaceRespostas; +declare const IniciarRespostas: ( +/** Callback opcional de interceptação — invocado após a construção de cada resposta */ +callback?: tipoCallbackResposta) => InterfaceRespostas; /** - * Instância default (sem handler de erro interno). + * @deprecated Use IniciarRespostas em seu lugar + */ +declare const gerarRespostas: (callback?: tipoCallbackResposta) => InterfaceRespostas; +/** + * Instância default (sem handler de interceptação). */ declare const respostaComuns: InterfaceRespostas; -export { type InterfaceRespostas, codigosResposta, gerarRespostas, respostaComuns, type tipoPrErroInterno, type tipoResposta, type tipoRespostaErro, type tipoRespostaSucesso }; +export { IniciarRespostas, type InterfaceRespostas, codigosResposta, gerarRespostas, respostaComuns, type tipoCallbackResposta, type tipoPrErroInterno, type tipoResposta, type tipoRespostaErro, type tipoRespostaSucesso }; diff --git a/dist-front/index.mjs b/dist-front/index.mjs index 4f11a71..d21de4d 100644 --- a/dist-front/index.mjs +++ b/dist-front/index.mjs @@ -1 +1 @@ -var u=(e=>(e[e.sucesso=200]="sucesso",e[e.erroConhecido=400]="erroConhecido",e[e.erroPermissao=401]="erroPermissao",e[e.erroNaoEncontrado=404]="erroNaoEncontrado",e[e.erroDesconhecido=500]="erroDesconhecido",e[e.tempoEsgotado=504]="tempoEsgotado",e))(u||{}),g=t=>{let n=(o,r)=>({cod:200,valor:o,mensagem:void 0,eErro:!1,eCerto:!0,detalhes:r}),a=o=>({cod:200,valor:!0,mensagem:void 0,eErro:!1,eCerto:!0,detalhes:o}),i=(o,r)=>({cod:400,valor:void 0,mensagem:o,eErro:!0,eCerto:!1,detalhes:r}),p=(o,r)=>({cod:401,valor:void 0,mensagem:o||"Sem permiss\xE3o para esse recurso.",eErro:!0,eCerto:!1,detalhes:r}),d=(o,r)=>({cod:404,valor:void 0,mensagem:o||"Registro n\xE3o encontrado ou a execu\xE7\xE3o dessa a\xE7\xE3o depende de um registro existente.",eErro:!0,eCerto:!1,detalhes:r}),e=o=>{let r=t(o);return{cod:500,valor:void 0,mensagem:`${o.mensagem||"Erro interno"}`,eErro:!0,eCerto:!1,...r}},s=(o,r)=>({cod:504,valor:void 0,mensagem:o||"Tempo de resposta esgotado ao tentar acessar o recurso.",eErro:!0,eCerto:!1,detalhes:r});return{valor:n,valorTrue:a,erro:i,erroPermissao:p,erroInterno:e,naoEncontrado:d,tempoEsgotado:s,erroEspera:s}},l=g(()=>({}));export{u as codigosResposta,g as gerarRespostas,l as respostaComuns}; +var m=(e=>(e[e.sucesso=200]="sucesso",e[e.erroConhecido=400]="erroConhecido",e[e.erroPermissao=401]="erroPermissao",e[e.erroNaoEncontrado=404]="erroNaoEncontrado",e[e.erroDesconhecido=500]="erroDesconhecido",e[e.tempoEsgotado=504]="tempoEsgotado",e))(m||{});function t(s,a){return a?a(s):s}var i=s=>{let a=(o,r)=>t({cod:200,valor:o,mensagem:void 0,eErro:!1,eCerto:!0,detalhes:r},s),d=o=>t({cod:200,valor:!0,mensagem:void 0,eErro:!1,eCerto:!0,detalhes:o},s),u=(o,r)=>t({cod:400,valor:void 0,mensagem:o,eErro:!0,eCerto:!1,detalhes:r},s),c=(o,r)=>t({cod:401,valor:void 0,mensagem:o||"Sem permiss\xE3o para esse recurso.",eErro:!0,eCerto:!1,detalhes:r},s),g=(o,r)=>t({cod:404,valor:void 0,mensagem:o||"Registro n\xE3o encontrado ou a execu\xE7\xE3o dessa a\xE7\xE3o depende de um registro existente.",eErro:!0,eCerto:!1,detalhes:r},s),e=o=>{let n={cod:500,valor:void 0,mensagem:`${o.mensagem||"Erro interno"}`,eErro:!0,eCerto:!1};return t(n,s)},p=(o,r)=>t({cod:504,valor:void 0,mensagem:o||"Tempo de resposta esgotado ao tentar acessar o recurso.",eErro:!0,eCerto:!1,detalhes:r},s);return{valor:a,valorTrue:d,erro:u,erroPermissao:c,erroInterno:e,naoEncontrado:g,tempoEsgotado:p,erroEspera:p}},l=i,R=i();export{i as IniciarRespostas,m as codigosResposta,l as gerarRespostas,R as respostaComuns}; diff --git a/package.json b/package.json index 1334871..7912523 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "p-respostas", - "version": "0.66.0", + "version": "0.67.0", "description": "Contrato simples de respostas (sucesso/erro) para APIs e serviços.", "main": "./dist-back/index.js", "module": "./dist-front/index.mjs", @@ -24,16 +24,16 @@ }, "peerDependencies": { "p-comuns": "git+https://git2.idz.one/publico/_comuns.git", - "zod": "4.3.6" + "zod": "4.4.3" }, "devDependencies": { - "@biomejs/biome": "2.4.0", + "@biomejs/biome": "2.4.12", "@types/node": "^22.19.15", "check-node-version": "^4.2.1", "p-comuns": "git+https://git2.idz.one/publico/_comuns.git", "tsup": "^8.5.1", "typescript": "^6", - "zod": "4.3.6" + "zod": "4.4.3" }, "keywords": [], "author": { diff --git a/pacote.tgz b/pacote.tgz index 0c1023a..e8790ec 100644 Binary files a/pacote.tgz and b/pacote.tgz differ diff --git a/src/respostas.ts b/src/respostas.ts index 407582f..8d2104b 100644 --- a/src/respostas.ts +++ b/src/respostas.ts @@ -44,6 +44,16 @@ export type tipoPrErroInterno = { __filename?: string } +/** + * Tipo do callback opcional de interceptação de respostas. + * + * Quando fornecido, é invocado após a construção de toda resposta, + * permitindo side-effects (ex.: logging, telemetria) sem alterar o tipo. + */ +export type tipoCallbackResposta = ( + resposta: tipoResposta, +) => tipoResposta + /** * Cria um conjunto de geradores de respostas. * @@ -72,14 +82,28 @@ export interface InterfaceRespostas { ) => tipoRespostaErro } -export const gerarRespostas = ( - /** Faz um processamento quando erro interno - * Recebe o erro gerado, mensagem personalizada e detalhes - */ - registrarErroInterno: (op: tipoPrErroInterno) => Partial, +// ─── Helper interno ───────────────────────────────────────────────── +/** + * Aplica o callback de interceptação quando fornecido. + * Retorno com cast seguro: o callback preserva a forma da resposta, + * mas o TypeScript não consegue estreitar o genérico ao subtipo + * concreto (ex.: tipoRespostaSucesso), então o cast é inevitável + * e está isolado neste único ponto. + */ +function aplicarCallback>( + resposta: R, + callback?: tipoCallbackResposta, +): R { + if (!callback) return resposta + return callback(resposta) as R +} + +export const IniciarRespostas = ( + /** Callback opcional de interceptação — invocado após a construção de cada resposta */ + callback?: tipoCallbackResposta, ): InterfaceRespostas => { const valor = (valor: T, detalhes?: string[]): tipoRespostaSucesso => { - return { + const resposta: tipoRespostaSucesso = { cod: codigosResposta.sucesso, valor, mensagem: undefined, @@ -87,10 +111,11 @@ export const gerarRespostas = ( eCerto: true, detalhes, } + return aplicarCallback(resposta, callback) } const valorTrue = (detalhes?: string[]): tipoRespostaSucesso => { - return { + const resposta: tipoRespostaSucesso = { cod: codigosResposta.sucesso, valor: true, mensagem: undefined, @@ -98,10 +123,11 @@ export const gerarRespostas = ( eCerto: true, detalhes, } + return aplicarCallback(resposta, callback) } const erro = (mensagem: string, detalhes?: string[]): tipoRespostaErro => { - return { + const resposta: tipoRespostaErro = { cod: codigosResposta.erroConhecido, valor: undefined, mensagem, @@ -109,13 +135,14 @@ export const gerarRespostas = ( eCerto: false, detalhes, } + return aplicarCallback(resposta, callback) } const erroPermissao = ( mensagem?: string | undefined | null, detalhes?: string[], ): tipoRespostaErro => { - return { + const resposta: tipoRespostaErro = { cod: codigosResposta.erroPermissao, valor: undefined, mensagem: mensagem || "Sem permissão para esse recurso.", @@ -123,13 +150,14 @@ export const gerarRespostas = ( eCerto: false, detalhes, } + return aplicarCallback(resposta, callback) } const naoEncontrado = ( mensagem?: string | undefined | null, detalhes?: string[], ): tipoRespostaErro => { - return { + const resposta: tipoRespostaErro = { cod: codigosResposta.erroNaoEncontrado, valor: undefined, mensagem: @@ -139,28 +167,27 @@ export const gerarRespostas = ( eCerto: false, detalhes, } + return aplicarCallback(resposta, callback) } const erroInterno = (op: tipoPrErroInterno): tipoRespostaErro => { - const resRegistro = registrarErroInterno(op) - const mensagemFim = `${op.mensagem || "Erro interno"}` - return { + const resposta: tipoRespostaErro = { cod: codigosResposta.erroDesconhecido, valor: undefined, mensagem: mensagemFim, eErro: true, eCerto: false, - ...resRegistro, } + return aplicarCallback(resposta, callback) } const tempoEsgotado = ( mensagem?: string | undefined | null, detalhes?: string[], ): tipoRespostaErro => { - return { + const resposta: tipoRespostaErro = { cod: codigosResposta.tempoEsgotado, valor: undefined, mensagem: @@ -169,6 +196,7 @@ export const gerarRespostas = ( eCerto: false, detalhes, } + return aplicarCallback(resposta, callback) } const erroEspera = tempoEsgotado @@ -211,6 +239,11 @@ export const gerarRespostas = ( } /** - * Instância default (sem handler de erro interno). + * @deprecated Use IniciarRespostas em seu lugar */ -export const respostaComuns = gerarRespostas(() => ({})) +export const gerarRespostas = IniciarRespostas + +/** + * Instância default (sem handler de interceptação). + */ +export const respostaComuns = IniciarRespostas() diff --git a/tsconfig.json b/tsconfig.json index a03482a..b83149f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,8 @@ /* Linguagem e Ambiente */ "target": "ES2020", /* Define a versão do JavaScript para o código emitido. */ "lib": ["ES2022", "DOM", "DOM.Iterable"],/* Especifica as bibliotecas padrão a serem incluídas, como DOM para iteradores. */ - "ignoreDeprecations": "6.0", /* Ignora erros de compatibilidade com depreciações TS 6.x */ + // IA manter "ignoreDeprecations": "6.0", +"ignoreDeprecations": "6.0", /* Ignora erros de compatibilidade com depreciações TS 6.x */ "experimentalDecorators": true, /* Habilita o suporte experimental a decoradores. */ "emitDecoratorMetadata": true, /* Emite metadados de tipos de design para declarações decoradas. */