From 2486e0a7001716e035b8778c2687ad68acd61d16 Mon Sep 17 00:00:00 2001 From: Nacho Torrella Date: Fri, 2 Aug 2024 09:55:27 +0200 Subject: [PATCH 1/2] feat(packages/sui-js): parse query string allow sparse config --- packages/sui-js/src/string/parse-query-string.js | 6 ++++-- packages/sui-js/test/stringSpec.js | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/sui-js/src/string/parse-query-string.js b/packages/sui-js/src/string/parse-query-string.js index 17fa3b811..790b4a9c4 100644 --- a/packages/sui-js/src/string/parse-query-string.js +++ b/packages/sui-js/src/string/parse-query-string.js @@ -5,14 +5,16 @@ import {parse} from 'qs' * * @param {string} query * @param {object} [options={}] - * @param {boolean} [options.ignoreQueryPrefix=true] - avoid the leading question mark + * @param {boolean} [options.allowSparse] - parse sparse arrays * @param {boolean} [options.comma] - comma to join array + * @param {boolean} [options.ignoreQueryPrefix=true] - avoid the leading question mark * @param {string} [options.delimiter] - delimiter */ function parseQueryString(query, options = {}) { - const {ignoreQueryPrefix = true, comma, delimiter} = options + const {allowSparse = false, ignoreQueryPrefix = true, comma, delimiter} = options const mergedOptions = { + allowSparse, ignoreQueryPrefix, ...(typeof comma !== 'undefined' && {comma}), ...(typeof delimiter !== 'undefined' && {delimiter}) diff --git a/packages/sui-js/test/stringSpec.js b/packages/sui-js/test/stringSpec.js index 849f9cc5e..cf3f3c5ea 100644 --- a/packages/sui-js/test/stringSpec.js +++ b/packages/sui-js/test/stringSpec.js @@ -86,6 +86,15 @@ describe('@s-ui/js', () => { const expected = {a: 'b', c: 'd'} expect(parsedQueryParams).to.deep.equal(expected) }) + + it('should convert query string to object params compacting a sparse array to only the existing values preserving their order', () => { + const query = '?a[0]=b&a[2]=c' + const options = {allowSparse: true} + const parsedQueryParams = parseQueryString(query, options) + + const expected = {a: ['b', undefined, 'c']} + expect(parsedQueryParams).to.deep.equal(expected) + }) }) describe('string:fromArrayToCommaQueryString', () => { it('should convert params array to comma separated object params', () => { From 79cb856156552001a602a3f5d62420ec4521be9a Mon Sep 17 00:00:00 2001 From: Nacho Torrella Date: Fri, 2 Aug 2024 11:03:56 +0200 Subject: [PATCH 2/2] docs(packages/sui-js): update readme --- packages/sui-js/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/sui-js/README.md b/packages/sui-js/README.md index e3afd3c6b..82251b4b4 100644 --- a/packages/sui-js/README.md +++ b/packages/sui-js/README.md @@ -123,6 +123,13 @@ console.log(hasAccents('Árbol')) // true import {parseQueryString} from '@s-ui/js/lib/string' console.log(parseQueryString('?targetPage=pta')) // {targetPage: "pta"} +console.log(parseQueryString('?makeIds[0]=123&makeIds[2]=456')) // {makeIds: ["123", "456"]} + +// example with allowSparse option +const query = '?makeIds[0]=123&makeIds[2]=456' +const options = {allowSparse: true} +const parsedQueryString = parseQueryString(query, options) +console.log(parsedQueryString) // {makeIds: ["123", undefined, "456"]} ``` ```js @@ -162,6 +169,18 @@ const queryParams = {a: 1, b: 'lorem/ipsum', m: [1, 2]} const options = {encode: false} const queryString = toQueryString(queryParams, options) console.log(queryString) // 'a=1&b=lorem/ipsum&m=1,2' + +// example with addQueryPrefix option +const queryParams = {a: 1, b: 2} +const options = {addQueryPrefix: true} +const queryString = toQueryString(queryParams, options) +console.log(queryString) // '?a=1&b=2' + +// example with skipNulls option +const queryParams = {a: 1, b: null} +const options = {skipNulls: true} +const queryString = toQueryString(queryParams, options) +console.log(queryString) // 'a=1' ``` ```js