-
Notifications
You must be signed in to change notification settings - Fork 0
/
urlbuilder.js
54 lines (46 loc) · 1.37 KB
/
urlbuilder.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(['underscore'], factory);
} else if (typeof exports === 'object') {
module.exports = factory(require('underscore'));
} else {
root.urlbuilder = factory(root._);
}
}(this, function (_) {
var urlbuilder = function (url, fields, data, options) {
if (!_.isString(url)) {
url = '';
}
if (!_.isObject(fields)) {
fields = {};
}
var config = _.extend({
slug: /:(\w+)/g,
separator: '+'
}, options);
var endpoint = url.replace(config.slug, function (match, name) {
var param = fields[name];
return !Object.prototype.hasOwnProperty.call(fields, name) ? match
: _.isArray(param) ? _.map(param, encodeURIComponent)
.join(config.separator)
: _.isFunction(param) ? encodeURIComponent(param(name, fields))
: encodeURIComponent(param);
});
var query = '';
if (data && _.keys(data).length > 0) {
query += endpoint.indexOf('?') === -1 ? '?' : '&';
query += _.chain(data)
.pairs()
.map(function (pair) {
var name = pair[0];
var value = pair[1];
return encodeURIComponent(name) +
'=' + encodeURIComponent(value);
})
.value()
.join('&');
}
return endpoint + query;
};
return urlbuilder;
}));