diff --git a/packages/core/src/url.ts b/packages/core/src/url.ts index ea9f5dd6c..fd281bebc 100644 --- a/packages/core/src/url.ts +++ b/packages/core/src/url.ts @@ -61,7 +61,7 @@ export function mergeDataIntoQueryString( const url = new URL(href.toString(), typeof window === 'undefined' ? 'http://localhost' : window.location.toString()) if (hasDataForQueryString) { - const parseOptions = { ignoreQueryPrefix: true, parseArrays: false } + const parseOptions = { ignoreQueryPrefix: true, arrayLimit: 0 } url.search = qs.stringify( { ...qs.parse(url.search, parseOptions), ...data }, { diff --git a/tests/core/url.test.ts b/tests/core/url.test.ts index 46590dbc9..e8129a67e 100644 --- a/tests/core/url.test.ts +++ b/tests/core/url.test.ts @@ -29,6 +29,27 @@ test.describe('url.ts', () => { expect(data).toEqual({}) }) + test('merges new data into an existing query string with array values', () => { + const [href, data] = mergeDataIntoQueryString('get', '/search?frameworks[]=react&frameworks[]=vue', { + q: 'bar', + }) + + expect(href).toBe('/search?frameworks[]=react&frameworks[]=vue&q=bar') + expect(data).toEqual({}) + }) + + test('merges new data into an existing query string with array values using index notation', () => { + const [href, data] = mergeDataIntoQueryString( + 'get', + '/search?frameworks[0]=react&frameworks[1]=vue', + { q: 'bar' }, + 'indices', + ) + + expect(href).toBe('/search?frameworks[0]=react&frameworks[1]=vue&q=bar') + expect(data).toEqual({}) + }) + test('overwrites existing keys in the query string when they also exist in the data', () => { const [href, data] = mergeDataIntoQueryString('get', '/search?q=old', { q: 'new' })