withValidator({ query }) keeps only the last value of a repeated query key
Mantenedores costumam responder em até 1 dia
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
- Domínio
- backend-api-design
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
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de voidzero-dev/void
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 35/100
voidzero-dev/void#648 · 1 reação ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 50/100
voidzero-dev/void#647 ·
Mantenedores costumam responder em até 1 dia
-
void deploy cannot deploy a Worker with no URL after its first deploy, and --atomic refuses itAberta
Dificuldade 4/5 1-2 dias Facilidade para iniciantes 48/100
voidzero-dev/void#644 ·
Mantenedores costumam responder em até 1 dia
-
Static output always writes `foo.html`, so trailing-slash URLs 404 on hosts like GitHub PagesAberta
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 42/100
voidzero-dev/void#638 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 57/100
voidzero-dev/void#636 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de voidzero-dev/void
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
Northeastern-Electric-Racing/FinishLine#4660 ·
Mantenedores costumam responder em até 2 dias
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 86/100
excaliburjs/Excalibur#3895 ·
Mantenedores costumam responder em até 3 dias
-
infer_audio_type only recognises one MPEG Layer III frame header, so most MP3 files are rejectedTalvez já em andamento @Steve-20-ai assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
Earn report crashes with "RangeError: Invalid time value" when a report row has an unparsable timestampTalvez já em andamento @Gurkaran18 assumiu hoje. Abertabug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
joinmarket-webui/jam#1588 ·
Mantenedores costumam responder em até 3 dias
-
BeOS .json missingAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
mihaip/infinite-mac#475 ·