Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

`void/log` serializes `Error` fields as `{}`, losing message and stack

Aberta
#577 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Esta issue ainda não foi avaliada.

Descrição

Summary

logger.error() is meant for surfacing caught errors (#168), but an Error passed as a field is logged as {}. Its message, stack and cause are non-enumerable, so JSON.stringify drops them. Nothing fails, so this goes unnoticed until someone needs the log.

Reproduction

[email protected] (same code on main):

import { logger } from 'void/log';

logger.error('save failed', { error: new Error('boom') });
// {"msg":"save failed","error":{}}

logger.error('save failed', { error: new Error('wrapped', { cause: new Error('inner') }) });
// {"msg":"save failed","error":{}}

class AppError extends Error {
  status = 500;
}
logger.error('save failed', { error: new AppError('boom') });
// {"msg":"save failed","error":{"status":500}}

Expected

The error's details are kept, for example:

{"msg":"save failed","error":{"name":"Error","message":"boom","stack":"Error: boom\n    at ..."}}

Suggested fix

Pass a replacer to the existing JSON.stringify call in format(). This also covers nested errors and cause chains, keeps custom enumerable fields such as status, and leaves the { msg, ...fields } shape unchanged:

function replacer(_key: string, value: unknown) {
  if (value instanceof Error) {
    return { ...value, name: value.name, message: value.message, stack: value.stack, cause: value.cause };
  }
  return value;
}

return JSON.stringify(payload, replacer);

The existing catch fallback still handles circular references.

If passing Error objects is intentionally unsupported, a note in the logger docs to pass error.message / error.stack as strings would help.

Linguagem predominante
TypeScript
Estrelas
580
Forks
56
Merge médio
8h 32min
PRs com merge (30d)
111

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de voidzero-dev/void

Todas as issues de voidzero-dev/void

Issues semelhantes

Mais issues de TypeScript

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.