Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regression introduced in 9.1.1: parse cannot read back stringify when using bracket-seperator mode #398

Open
dubzzz opened this issue Nov 13, 2024 · 5 comments

Comments

@dubzzz
Copy link
Contributor

dubzzz commented Nov 13, 2024

Not sure if it was an expected impact of #392, but it seems it introduced a regression in 9.1.1.

The following piece of code does not behave the same in 9.1.0 and 9.1.1. In the later the parse function cannot read back itself.

import queryString from 'query-string';

const original = { key: [','] };
console.log({ original });

const stringified = queryString.stringify(original, { arrayFormat: 'bracket-separator' });
console.log({ stringified });

const parsed = queryString.parse(stringified, { arrayFormat: 'bracket-separator' });
console.log({ parsed });

Here are the output we get for each version:

// in 9.1.1
{ original: { key: [ ',' ] } }
{ stringified: 'key[]=%2C' }
{ parsed: [Object: null prototype] { key: [ '', '' ] } }

// in 9.1.0
{ original: { key: [ ',' ] } }
{ stringified: 'key[]=%2C' }
{ parsed: [Object: null prototype] { key: [ ',' ] } }
@sindresorhus
Copy link
Owner

// @scottenock

@scottenock
Copy link
Contributor

Thanks @sindresorhus - taking a look 💪

@scottenock
Copy link
Contributor

Hi @sindresorhus + @dubzzz - I managed to take a look at this and have determined that 9.1.1 is behaving as expected.

@dubzzz , in your example you are using bracket-separator and not passing in an arrayFormatSeparator option, therefore the default separator of , will be used, resulting in the comma being split:

queryString.parse('foo=,', { arrayFormat: 'bracket-separator' }) // => { foo : ['', ''] }

Note that your example will still work and be Idempotent if you specify an arrayFormatSeparator that isn't the character you are hoping to preserve:

queryString.parse('foo=,', { arrayFormat: 'bracket-separator',  arrayFormatSeparator: '|' }) // => { foo : [','] }

Also note that in both 9.1.1 and 9.1.0 that this is true for the arrayFormat separator:

queryString.parse('foo=,', { arrayFormat: 'separator' }) // => { foo : ['', ''] }

If you're happy with my findings @sindresorhus I think we can close this out 💪

@dubzzz
Copy link
Contributor Author

dubzzz commented Dec 31, 2024

Well in such a case you have an issue for an input being:

const original = { key: ['|'] };

More precisely how to handle something like:

const original = { key: [[...Array(256)].map((_, i) => String.fromCodePoint(i)).join('')] };

@scottenock
Copy link
Contributor

Happy new year everyone! 🥳

@dubzzz I'm not sure what you mean with that example?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants