Skip to content

Commit bba3f32

Browse files
alexchexesantfu
andauthored
feat(router): support partial transform (#4426)
Co-authored-by: Anthony Fu <[email protected]>
1 parent 67a9cf3 commit bba3f32

File tree

5 files changed

+108
-9
lines changed

5 files changed

+108
-9
lines changed

packages/router/_types.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ export interface ReactiveRouteOptions {
2626

2727
export interface ReactiveRouteOptionsWithTransform<V, R> extends ReactiveRouteOptions {
2828
/**
29-
* Function to transform data before return
29+
* Function to transform data before return, or an object with one or both functions:
30+
* `get` to transform data before returning, and `set` to transform data before setting
3031
*/
31-
transform?: ((val: V) => R) | {
32-
get: (value: V) => R
33-
set: (value: R) => V
34-
}
32+
transform?:
33+
| ((val: V) => R)
34+
| ({
35+
get?: (value: V) => R
36+
set?: (value: R) => V
37+
})
3538
}

packages/router/useRouteParams/index.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,44 @@ describe('useRouteParams', () => {
6565
expect(object.value).toEqual({ foo: 'baz' })
6666
})
6767

68+
it('should handle transform with only get', async () => {
69+
let route = getRoute({
70+
search: 'VUE3',
71+
})
72+
const router = { replace: (r: any) => route = r } as any
73+
74+
const search = useRouteParams('search', undefined, {
75+
transform: {
76+
get: (value: string) => value.toLowerCase(),
77+
},
78+
router,
79+
route,
80+
})
81+
82+
expect(search.value).toBe('vue3')
83+
expect(route.params.search).toBe('VUE3')
84+
})
85+
86+
it('should handle transform with only set', async () => {
87+
let route = getRoute()
88+
const router = { replace: (r: any) => route = r } as any
89+
90+
const search = useRouteParams('search', undefined, {
91+
transform: {
92+
set: (value: string) => value.toLowerCase(),
93+
},
94+
router,
95+
route,
96+
})
97+
98+
search.value = 'VUE3'
99+
expect(search.value).toBe('vue3')
100+
101+
await nextTick()
102+
103+
expect(route.params.search).toBe('vue3')
104+
})
105+
68106
it('should re-evaluate the value immediately', () => {
69107
let route = getRoute()
70108
const router = { replace: (r: any) => route = r } as any

packages/router/useRouteParams/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,18 @@ export function useRouteParams<
3636
transform,
3737
} = options
3838

39-
const transformGet = transform && 'get' in transform ? transform.get : transform ?? ((value: T) => value as any as K)
40-
const transformSet = transform && 'set' in transform ? transform.set : (value: K) => value as any as T
39+
let transformGet = (value: T) => value as unknown as K
40+
let transformSet = (value: K) => value as unknown as T
41+
42+
if (typeof transform === 'function') {
43+
transformGet = transform
44+
}
45+
else if (transform) {
46+
if (transform.get)
47+
transformGet = transform.get
48+
if (transform.set)
49+
transformSet = transform.set
50+
}
4151

4252
if (!_queue.has(router))
4353
_queue.set(router, new Map())

packages/router/useRouteQuery/index.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,44 @@ describe('useRouteQuery', () => {
6363
expect(object.value).toEqual({ foo: 'baz' })
6464
})
6565

66+
it('should handle transform with only get', async () => {
67+
let route = getRoute({
68+
search: 'VUE3',
69+
})
70+
const router = { replace: (r: any) => route = r } as any
71+
72+
const search = useRouteQuery('search', undefined, {
73+
transform: {
74+
get: (value: string) => value.toLowerCase(),
75+
},
76+
router,
77+
route,
78+
})
79+
80+
expect(search.value).toBe('vue3')
81+
expect(route.query.search).toBe('VUE3')
82+
})
83+
84+
it('should handle transform with only set', async () => {
85+
let route = getRoute()
86+
const router = { replace: (r: any) => route = r } as any
87+
88+
const search = useRouteQuery('search', undefined, {
89+
transform: {
90+
set: (value: string) => value.toLowerCase(),
91+
},
92+
router,
93+
route,
94+
})
95+
96+
search.value = 'VUE3'
97+
expect(search.value).toBe('vue3')
98+
99+
await nextTick()
100+
101+
expect(route.query.search).toBe('vue3')
102+
})
103+
66104
it('should re-evaluate the value immediately', () => {
67105
let route = getRoute({
68106
search: 'vue3',

packages/router/useRouteQuery/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,18 @@ export function useRouteQuery<
3636
transform,
3737
} = options
3838

39-
const transformGet = transform && 'get' in transform ? transform.get : transform ?? ((value: T) => value as any as K)
40-
const transformSet = transform && 'set' in transform ? transform.set : (value: K) => value as any as T
39+
let transformGet = (value: T) => value as unknown as K
40+
let transformSet = (value: K) => value as unknown as T
41+
42+
if (typeof transform === 'function') {
43+
transformGet = transform
44+
}
45+
else if (transform) {
46+
if (transform.get)
47+
transformGet = transform.get
48+
if (transform.set)
49+
transformSet = transform.set
50+
}
4151

4252
if (!_queue.has(router))
4353
_queue.set(router, new Map())

0 commit comments

Comments
 (0)