Skip to content

Commit d4662bc

Browse files
author
Lucas Reppe Welander
committed
added sort function and pushed to version 2.0
1 parent e39ff6c commit d4662bc

File tree

9 files changed

+91
-44
lines changed

9 files changed

+91
-44
lines changed

CHANGELOG.md

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Changelog
2+
All notable changes on this project will be documented in this file.
3+
4+
## 2.0.0 - 2017-11-17
5+
### Added
6+
* Gave `add` function a `sort()` on object keys so it always returns the same URL even if the keys are shuffled, this is a must have for SEO:ers, before you had to manage the object passed in to add by youself, now qsm handles this for you.
7+
* Fixed so that `add` updates values for keys that already exists instead of appending them, there was issues when you could get multiple occurrences of the same key in your url.
8+
* Added a warning for users using the soon to be deprecated technique with arrays instead of pure objects. **Arrays will be deprecated in next major release.**
9+
10+
## 1.3.0 - 2017-04-28
11+
12+
### Changed
13+
* Changed how `encode` and `decode` works, they now both support of specifiying key that should get the encoded result or what key to decode. Instead of always using the `q` key for this.

README.md

-4
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ var qsm = require('qsm');
1515
Appends querystring to the url.
1616
```javascript
1717
var url = 'http://mywebsite.com';
18-
var newUrl = qsm.add(url, [{ query: 'userId', value: 1337 }]);
19-
> OR
2018
var newUrl = qsm.add(url, { userId: 1337 });
2119

2220
// newUrl outputs: http://mywebsite.com?userId=1337
@@ -42,8 +40,6 @@ var newurl = qsm.clear(url);
4240
Replaces current querystrings with new ones.
4341
```javascript
4442
var url = 'http://mywebsite.com?userId=1337&sort=type';
45-
var newurl = qsm.replace(url, [{ query: 'hasObject', value: true }]);
46-
> OR
4743
var newurl = qsm.replace(url, { hasObject: true });
4844

4945
// newurl outputs: http://mywebsite.com?hasObject=true

TODO.md

-4
This file was deleted.

build/build.js

+29-16
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,42 @@ var add = function add(_url, _params) {
44
var retUrl = _url;
55
var urlparts = _url.split('?');
66
if (_params.constructor === Object) {
7-
for (var item in _params) {
8-
if (_params.hasOwnProperty(item)) {
9-
if (retUrl.indexOf('?') >= 0) {
10-
retUrl += _add(_url, _params[item], item, true);
7+
var __params = sort(_params);
8+
for (var item in __params) {
9+
if (__params.hasOwnProperty(item)) {
10+
if (exist(retUrl, item)) {
11+
retUrl = replaceSpecific(_url, __params, item);
1112
} else {
12-
retUrl += _add(_url, _params[item], item, false);
13+
retUrl += _add(_url, __params[item], item, retUrl.indexOf('?') <= 0);
1314
}
1415
}
1516
}
1617
} else {
18+
console.warn('You are using a feature of QSM 2.0 that will get deprecated in next major release. Please use the object variant instead. More info at https://npmjs.com/package/qsm');
1719
if (urlparts.length >= 2) {
1820
for (var i = 0; i < _params.length; i++) {
19-
retUrl += _add(_url, _params[i], null, true);
21+
retUrl += _add(_url, _params[i], null, false);
2022
}
2123
} else {
2224
for (var i = 0; i < _params.length; i++) {
23-
if (i === 0) {
24-
retUrl += _add(_url, _params[i], null, false);
25-
} else {
26-
retUrl += _add(_url, _params[i], null, true);
27-
}
25+
retUrl += _add(_url, _params[i], null, i < 1);
2826
}
2927
}
3028
}
3129

3230
return retUrl;
3331
};
3432

35-
var _add = function _add(url, param, key, gotQueryStrings) {
33+
var _add = function _add(url, param, key, isFirst) {
3634
if (key) {
37-
if (!gotQueryStrings) {
35+
if (isFirst) {
3836
return '?' + key + '=' + param;
3937
}
4038

4139
return '&' + key + '=' + param;
4240
}
4341

44-
if (!gotQueryStrings) {
42+
if (isFirst) {
4543
return '?' + param.query + '=' + param.value;
4644
}
4745

@@ -79,8 +77,6 @@ var encode = function encode(url, obj, key) {
7977
return add(url, _temp);
8078
}
8179

82-
console.log(':KEY', key);
83-
8480
return add(url, { q: encoded });
8581
};
8682
var exist = function exist(url, param) {
@@ -225,6 +221,23 @@ var replaceSpecific = function replaceSpecific(url, parameter, replacer) {
225221
var _url = add(url, parameter);
226222
return _url;
227223
};
224+
var sort = function sort(obj) {
225+
var newObj = {};
226+
var keys = Object.keys(obj);
227+
228+
var sortedKeys = keys.sort(function (a, b) {
229+
if (a > b) return 1;
230+
if (a < b) return -1;
231+
return 0;
232+
});
233+
234+
sortedKeys.forEach(function (key) {
235+
newObj[key] = obj[key];
236+
});
237+
238+
return newObj;
239+
};
240+
228241
module.exports = {
229242
remove: remove,
230243
add: add,

lib/add.js

+14-16
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,42 @@ const add = (_url, _params) => {
22
var retUrl = _url;
33
var urlparts= _url.split('?');
44
if (_params.constructor === Object) {
5-
for (var item in _params) {
6-
if (_params.hasOwnProperty(item)) {
7-
if (retUrl.indexOf('?') >= 0) {
8-
retUrl += _add(_url, _params[item], item, true);
9-
} else {
10-
retUrl += _add(_url, _params[item], item, false);
11-
}
5+
var __params = sort(_params);
6+
for (var item in __params) {
7+
if (__params.hasOwnProperty(item)) {
8+
if (exist(retUrl, item)) {
9+
retUrl = replaceSpecific(_url, __params, item);
10+
} else {
11+
retUrl += _add(_url, __params[item], item, retUrl.indexOf('?') <= 0);
12+
}
1213
}
1314
}
1415
} else {
16+
console.warn('You are using a feature of QSM 2.0 that will get deprecated in next major release. Please use the object variant instead. More info at https://npmjs.com/package/qsm');
1517
if (urlparts.length>=2) {
1618
for (var i = 0; i < _params.length; i++) {
17-
retUrl += _add(_url, _params[i], null, true);
19+
retUrl += _add(_url, _params[i], null, false);
1820
}
1921
} else {
2022
for (var i = 0; i < _params.length; i++) {
21-
if (i === 0) {
22-
retUrl += _add(_url, _params[i], null, false);
23-
} else {
24-
retUrl += _add(_url, _params[i], null, true);
25-
}
23+
retUrl += _add(_url, _params[i], null, i < 1);
2624
}
2725
}
2826
}
2927

3028
return retUrl;
3129
}
3230

33-
const _add = (url, param, key, gotQueryStrings) => {
31+
const _add = (url, param, key, isFirst) => {
3432
if (key) {
35-
if (!gotQueryStrings) {
33+
if (isFirst) {
3634
return '?' + key + '=' + param;
3735
}
3836

3937
return '&' + key + '=' + param;
4038
}
4139

42-
if (!gotQueryStrings) {
40+
if (isFirst) {
4341
return '?' + param.query + '=' + param.value;
4442
}
4543

lib/helper/module_exports.js

+18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,22 @@
11

2+
const sort = (obj) => {
3+
const newObj = {};
4+
const keys = Object.keys(obj);
5+
6+
const sortedKeys = keys.sort((a, b) => {
7+
if (a > b) return 1;
8+
if (a < b) return -1;
9+
return 0;
10+
});
11+
12+
sortedKeys.forEach(key => {
13+
newObj[key] = obj[key];
14+
});
15+
16+
return newObj;
17+
}
18+
19+
220
module.exports = {
321
remove,
422
add,

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "qsm",
3-
"version": "1.3.0",
3+
"version": "2.0.0",
44
"description": "a simple tool that allows you to remove any querystring from the url",
55
"main": "qsm.js",
66
"scripts": {

qsm.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/test.js

+15-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ var test = {
55
clean: 'www.url.com',
66
case1: 'www.url.com?userId=1337',
77
case2: 'www.url.com?gender=female&userId=1337',
8-
case3: 'www.url.com?gender=female'
8+
case3: 'www.url.com?gender=female',
9+
case4: 'www.url.com?gender=male&userId=007'
910
}
1011

1112
describe('Add methods', function() {
@@ -19,7 +20,7 @@ describe('Add methods', function() {
1920
var url = qsm.add(test.case3, [{ query: 'userId', value: '1337' }]);
2021
assert.equal(test.case2, url);
2122
done();
22-
});
23+
});
2324

2425
it('Should add a querystring with comma separated values', function(done) {
2526
var url = qsm.add(test.clean, [{ query: 'userId', value: ['1337', '666', '11'] }]);
@@ -37,6 +38,18 @@ describe('Add methods', function() {
3738
var url = qsm.add(test.clean, { gender: 'female', userId: 1337 });
3839
assert.equal(test.case2, url);
3940
done();
41+
});
42+
43+
it('Add same object but different index of keys should return the same URL', function(done) {
44+
var url = qsm.add(test.clean, { userId: 1337, gender: 'female' });
45+
assert.equal(test.case2, url);
46+
done();
47+
});
48+
49+
it('Same keys but different values should update the URL', function(done) {
50+
var url = qsm.add(test.case1, { userId: '007', gender: 'male' });
51+
assert.equal(test.case4, url);
52+
done();
4053
});
4154

4255
it('Add method used with pure object 2', function(done) {

0 commit comments

Comments
 (0)