Skip to content

Commit c28efd2

Browse files
feat: decode option for getRouterParam (#556)
* feat: decode param * docs: new opt * chore: best commit ever permalink: http://whatthecommit.com/fd1e76a61e8173b57334cb93c79300f3 * feat: use func from `ufo` * support for getValidatedRouterParams * avoid muating original context --------- Co-authored-by: Pooya Parsa <[email protected]>
1 parent fa26af5 commit c28efd2

File tree

3 files changed

+54
-8
lines changed

3 files changed

+54
-8
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,9 @@ H3 has a concept of composable utilities that accept `event` (from `eventHandler
214214

215215
- `getQuery(event)`
216216
- `getValidatedQuery(event, validate)`
217-
- `getRouterParams(event)`
218-
- `getValidatedRouterParams(event, validate)`
219-
- `getRouterParam(event, name)`
217+
- `getRouterParams(event, { decode? })`
218+
- `getRouterParam(event, name, { decode? })`
219+
- `getValidatedRouterParams(event, validate, { decode? })`
220220
- `getMethod(event, default?)`
221221
- `isMethod(event, expected, allowHead?)`
222222
- `assertMethod(event, expected, allowHead?)`

src/utils/request.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getQuery as _getQuery } from "ufo";
1+
import { getQuery as _getQuery, decode as decodeURI } from "ufo";
22
import { createError } from "../error";
33
import type {
44
HTTPHeaderName,
@@ -29,26 +29,40 @@ export function getValidatedQuery<
2929

3030
export function getRouterParams(
3131
event: H3Event,
32+
opts: { decode?: boolean } = {},
3233
): NonNullable<H3Event["context"]["params"]> {
3334
// Fallback object needs to be returned in case router is not used (#149)
34-
return event.context.params || {};
35+
let params = event.context.params || {};
36+
if (opts.decode) {
37+
params = { ...params };
38+
for (const key in params) {
39+
params[key] = decodeURI(params[key]);
40+
}
41+
}
42+
43+
return params;
3544
}
3645

3746
export function getValidatedRouterParams<
3847
T,
3948
Event extends H3Event = H3Event,
4049
_T = InferEventInput<"routerParams", Event, T>,
41-
>(event: Event, validate: ValidateFunction<_T>): Promise<_T> {
42-
const routerParams = getRouterParams(event);
50+
>(
51+
event: Event,
52+
validate: ValidateFunction<_T>,
53+
opts: { decode?: boolean } = {},
54+
): Promise<_T> {
55+
const routerParams = getRouterParams(event, opts);
4356

4457
return validateData(routerParams, validate);
4558
}
4659

4760
export function getRouterParam(
4861
event: H3Event,
4962
name: string,
63+
opts: { decode?: boolean } = {},
5064
): string | undefined {
51-
const params = getRouterParams(event);
65+
const params = getRouterParams(event, opts);
5266

5367
return params[name];
5468
}

test/router.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,22 @@ describe("getRouterParams", () => {
189189

190190
expect(result.text).toBe("200");
191191
});
192+
193+
it("can decode router params", async () => {
194+
const router = createRouter().get(
195+
"/test/params/:name",
196+
eventHandler((event) => {
197+
expect(getRouterParams(event, { decode: true })).toMatchObject({
198+
name: "string with space",
199+
});
200+
return "200";
201+
}),
202+
);
203+
app.use(router);
204+
const result = await request.get("/test/params/string with space");
205+
206+
expect(result.text).toBe("200");
207+
});
192208
});
193209

194210
describe("without router", () => {
@@ -230,6 +246,22 @@ describe("getRouterParam", () => {
230246

231247
expect(result.text).toBe("200");
232248
});
249+
250+
it("can decode a value of router params corresponding to the given name", async () => {
251+
const router = createRouter().get(
252+
"/test/params/:name",
253+
eventHandler((event) => {
254+
expect(getRouterParam(event, "name", { decode: true })).toEqual(
255+
"string with space",
256+
);
257+
return "200";
258+
}),
259+
);
260+
app.use(router);
261+
const result = await request.get("/test/params/string with space");
262+
263+
expect(result.text).toBe("200");
264+
});
233265
});
234266

235267
describe("without router", () => {

0 commit comments

Comments
 (0)