@@ -4,7 +4,12 @@ import {
4
4
withNuqsTestingAdapter ,
5
5
type OnUrlUpdateFunction
6
6
} from './adapters/testing'
7
- import { parseAsArrayOf , parseAsJson , parseAsString } from './parsers'
7
+ import {
8
+ parseAsArrayOf ,
9
+ parseAsInteger ,
10
+ parseAsJson ,
11
+ parseAsString
12
+ } from './parsers'
8
13
import { useQueryStates } from './useQueryStates'
9
14
10
15
describe ( 'useQueryStates: referential equality' , ( ) => {
@@ -233,3 +238,64 @@ describe('useQueryStates: clearOnDefault', () => {
233
238
expect ( onUrlUpdate . mock . calls [ 0 ] ! [ 0 ] . queryString ) . toEqual ( '' )
234
239
} )
235
240
} )
241
+
242
+ describe ( 'useQueryStates: dynamic keys' , ( ) => {
243
+ it ( 'supports dynamic keys' , ( ) => {
244
+ const useTestHook = ( keys : string [ ] = [ 'a' , 'b' ] ) =>
245
+ useQueryStates ( {
246
+ [ keys [ 0 ] ! ] : parseAsInteger ,
247
+ [ keys [ 1 ] ! ] : parseAsInteger
248
+ } )
249
+ const { result, rerender } = renderHook ( useTestHook , {
250
+ wrapper : withNuqsTestingAdapter ( {
251
+ searchParams : '?a=1&b=2&c=3&d=4'
252
+ } )
253
+ } )
254
+ expect ( result . current [ 0 ] . a ) . toEqual ( 1 )
255
+ expect ( result . current [ 0 ] . b ) . toEqual ( 2 )
256
+ expect ( result . current [ 0 ] . c ) . toBeUndefined ( )
257
+ expect ( result . current [ 0 ] . d ) . toBeUndefined ( )
258
+ rerender ( [ 'c' , 'd' ] )
259
+ expect ( result . current [ 0 ] . a ) . toBeUndefined ( )
260
+ expect ( result . current [ 0 ] . b ) . toBeUndefined ( )
261
+ expect ( result . current [ 0 ] . c ) . toEqual ( 3 )
262
+ expect ( result . current [ 0 ] . d ) . toEqual ( 4 )
263
+ } )
264
+
265
+ it ( 'supports dynamic keys with remapping' , ( ) => {
266
+ const useTestHook = ( keys : string [ ] = [ 'a' , 'b' ] ) =>
267
+ useQueryStates (
268
+ {
269
+ [ keys [ 0 ] ! ] : parseAsInteger ,
270
+ [ keys [ 1 ] ! ] : parseAsInteger
271
+ } ,
272
+ {
273
+ urlKeys : {
274
+ a : 'x' ,
275
+ b : 'y' ,
276
+ c : 'z'
277
+ }
278
+ }
279
+ )
280
+ const { result, rerender } = renderHook ( useTestHook , {
281
+ wrapper : withNuqsTestingAdapter ( {
282
+ searchParams : '?x=1&y=2&z=3'
283
+ } )
284
+ } )
285
+ expect ( result . current [ 0 ] . a ) . toEqual ( 1 )
286
+ expect ( result . current [ 0 ] . b ) . toEqual ( 2 )
287
+ expect ( result . current [ 0 ] . c ) . toBeUndefined ( )
288
+ expect ( result . current [ 0 ] . d ) . toBeUndefined ( )
289
+ expect ( result . current [ 0 ] . x ) . toBeUndefined ( )
290
+ expect ( result . current [ 0 ] . y ) . toBeUndefined ( )
291
+ expect ( result . current [ 0 ] . z ) . toBeUndefined ( )
292
+ rerender ( [ 'c' , 'd' ] )
293
+ expect ( result . current [ 0 ] . a ) . toBeUndefined ( )
294
+ expect ( result . current [ 0 ] . b ) . toBeUndefined ( )
295
+ expect ( result . current [ 0 ] . c ) . toEqual ( 3 )
296
+ expect ( result . current [ 0 ] . d ) . toBeNull ( )
297
+ expect ( result . current [ 0 ] . x ) . toBeUndefined ( )
298
+ expect ( result . current [ 0 ] . y ) . toBeUndefined ( )
299
+ expect ( result . current [ 0 ] . z ) . toBeUndefined ( )
300
+ } )
301
+ } )
0 commit comments