Skip to content

Commit 4b83bdf

Browse files
authoredAug 3, 2022
feat: add utility for router params (#120) (#158)
1 parent 272f883 commit 4b83bdf

File tree

3 files changed

+83
-1
lines changed

3 files changed

+83
-1
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ Instead of adding helpers to `req` and `res`, h3 exposes them as composable util
121121
- `setCookie(res, name, value, opts?)`
122122
- `deleteCookie(res, name, opts?)`
123123
- `useQuery(req)`
124+
- `getRouterParams(event)`
124125
- `send(res, data, type?)`
125126
- `sendRedirect(res, location, code=302)`
126127
- `getRequestHeaders(event, headers)` (alias: `getHeaders`)

‎src/utils/request.ts

+11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@ export function getQuery (event: CompatibilityEvent) {
1010
/** @deprecated Use `h3.getQuery` */
1111
export const useQuery = getQuery
1212

13+
export function getRouterParams (event: CompatibilityEvent): CompatibilityEvent['context'] {
14+
// Fallback object needs to be returned in case router is not used (#149)
15+
return event.context.params || {}
16+
}
17+
18+
export function getRouterParam (event: CompatibilityEvent, name: string): CompatibilityEvent['context'][string] {
19+
const params = getRouterParams(event)
20+
21+
return params[name]
22+
}
23+
1324
export function getMethod (event: CompatibilityEvent, defaultMethod: HTTPMethod = 'GET'): HTTPMethod {
1425
return (event.req.method || defaultMethod).toUpperCase() as HTTPMethod
1526
}

‎test/router.test.ts

+71-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import supertest, { SuperTest, Test } from 'supertest'
22
import { describe, it, expect, beforeEach } from 'vitest'
3-
import { createApp, createRouter, App, Router } from '../src'
3+
import { createApp, createRouter, App, Router, getRouterParams, getRouterParam } from '../src'
44

55
describe('router', () => {
66
let app: App
@@ -61,3 +61,73 @@ describe('router', () => {
6161
expect(res.status).toEqual(405)
6262
})
6363
})
64+
65+
describe('getRouterParams', () => {
66+
let app: App
67+
let request: SuperTest<Test>
68+
69+
beforeEach(() => {
70+
app = createApp({ debug: false })
71+
request = supertest(app)
72+
})
73+
74+
describe('with router', () => {
75+
it('can return router params', async () => {
76+
const router = createRouter().get('/test/params/:name', (request) => {
77+
expect(getRouterParams(request)).toMatchObject({ name: 'string' })
78+
return '200'
79+
})
80+
app.use(router)
81+
const result = await request.get('/test/params/string')
82+
83+
expect(result.text).toBe('200')
84+
})
85+
})
86+
87+
describe('without router', () => {
88+
it('can return an empty object if router is not used', async () => {
89+
app.use('/', (request) => {
90+
expect(getRouterParams(request)).toMatchObject({})
91+
return '200'
92+
})
93+
const result = await request.get('/test/empty/params')
94+
95+
expect(result.text).toBe('200')
96+
})
97+
})
98+
})
99+
100+
describe('getRouterParam', () => {
101+
let app: App
102+
let request: SuperTest<Test>
103+
104+
beforeEach(() => {
105+
app = createApp({ debug: false })
106+
request = supertest(app)
107+
})
108+
109+
describe('with router', () => {
110+
it('can return a value of router params corresponding to the given name', async () => {
111+
const router = createRouter().get('/test/params/:name', (request) => {
112+
expect(getRouterParam(request, 'name')).toEqual('string')
113+
return '200'
114+
})
115+
app.use(router)
116+
const result = await request.get('/test/params/string')
117+
118+
expect(result.text).toBe('200')
119+
})
120+
})
121+
122+
describe('without router', () => {
123+
it('can return `undefined` for any keys', async () => {
124+
app.use('/', (request) => {
125+
expect(getRouterParam(request, 'name')).toEqual(undefined)
126+
return '200'
127+
})
128+
const result = await request.get('/test/empty/params')
129+
130+
expect(result.text).toBe('200')
131+
})
132+
})
133+
})

0 commit comments

Comments
 (0)
Please sign in to comment.