Skip to content

Commit

Permalink
Merge pull request #9 from ambassify/bug/deeply-nested-query
Browse files Browse the repository at this point in the history
[query] fix merging of deeply nested properties
  • Loading branch information
JorgenEvens committed May 9, 2019
2 parents 34906bb + ce5caa2 commit 931cdb1
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
21 changes: 17 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
var URL = require('url');
var assign = require('lodash/assign');
var mergeWith = require('lodash/mergeWith');

var extensions = Object.create(URL);
extensions.URL = URL;
extensions.qs = require('qs');

function merge(base /*, updates... */) {
var args = [], args_i = arguments.length;
while (args_i-- > 1) args[args_i] = arguments[args_i];

args.unshift(base);
args.push(function(base, update) {
if (Array.isArray(base) || Array.isArray(update))
return update;
});

return mergeWith.apply(null, args);
}

function parseQuery(url) {
if (typeof url === 'string')
url = URL.parse(url);
Expand All @@ -23,7 +36,7 @@ function applyQuery(url, query) {
if (typeof url === 'string')
url = URL.parse(url);

url = assign({}, url, {
url = merge({}, url, {
search: query ? '?' + query : ''
});

Expand All @@ -36,9 +49,9 @@ function addQuery(url, additions, options) {
var query = parseQuery(url);

if (options.preferNew || typeof options.preferNew === 'undefined') {
query = assign(query, additions);
query = merge(query, additions);
} else {
query = assign({}, additions, query);
query = merge({}, additions, query);
}

return applyQuery(url, query);
Expand Down
9 changes: 9 additions & 0 deletions test/query.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,14 @@ describe('URL', function() {

assert.equal(next, 'https://www.google.com/');
});

it('Should handle deeply nested properties', function() {
var url = URL.URL.parse('https://www.google.com?test[field]=1');
var next = URL.query.add(url, {
test: { otherfield: 1 }
});

assert.equal(next, 'https://www.google.com/?test%5Bfield%5D=1&test%5Botherfield%5D=1');
});
});
});

0 comments on commit 931cdb1

Please sign in to comment.