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

withValidator({ query }) keeps only the last value of a repeated query key

Aberta Para iniciantes
#645 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@Dazzanova já está trabalhando nisso.

Desde 31/10/2026.

  • #652 de @Dazzanova — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
78/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
typescript

Direção de pesquisa

Comece por runValidation em src/runtime/validator.ts, onde a issue diz que os parâmetros de consulta são copiados um por chave. Verifique como c.req.queries() representa chaves repetidas e compare o comportamento com o validador de consultas do Hono. O trabalho estará concluído quando uma chave repetida chegar ao schema como um array, uma chave única continuar sendo uma string e os testes pertinentes cobrirem o comportamento existente de validação de consultas.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

What happens

When a query key appears more than once, withValidator({ query }) passes only its last value to the schema. The earlier values are dropped without any error.

export const loader = defineHandler(
  withValidator({ query: z.object({ tag: z.union([z.string(), z.array(z.string())]) }) }),
  (c) => c.input.query,
);

GET /notes?tag=work&tag=urgent

  • Expected: { tag: ['work', 'urgent'] }
  • Actual: { tag: 'urgent' }

A schema that expects an array, like z.object({ tag: z.array(z.string()) }), never passes: Void always gives it a string.

Cause

runValidation in src/runtime/validator.ts copies the search params one key at a time, so each repeated key overwrites the one before:

const raw = {};
for (const [key, value] of url.searchParams) raw[key] = value;
Suggested fix

Do what Hono's validator('query') does: a key that appears once stays a string, and a key that repeats becomes an array.

const raw = {};
for (const [key, values] of Object.entries(c.req.queries())) {
  raw[key] = values.length === 1 ? values[0] : values;
}

For keys that appear once, this works exactly as before, so existing schemas aren't affected.

Why it matters

Multi-select filters (?tag=a&tag=b) are a common pattern, and HTML forms send a <select multiple> or a group of checkboxes this way. Other frameworks keep every value: Hono's own validator and Nuxt's getQuery() return arrays, and React Router and SvelteKit have searchParams.getAll().

Version: void 1.4.0

Linguagem predominante
TypeScript
Estrelas
627
Forks
66
Merge médio
12h 56min
PRs com merge (30d)
162

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.