UNPKG

2.11 kBJavaScriptView Raw
1// Copyright Joyent, Inc. and other Node contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and associated documentation files (the
5// "Software"), to deal in the Software without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Software, and to permit
8// persons to whom the Software is furnished to do so, subject to the
9// following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Software.
13//
14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20// USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22'use strict';
23
24var stringifyPrimitive = function(v) {
25 switch (typeof v) {
26 case 'string':
27 return v;
28
29 case 'boolean':
30 return v ? 'true' : 'false';
31
32 case 'number':
33 return isFinite(v) ? v : '';
34
35 default:
36 return '';
37 }
38};
39
40module.exports = function(obj, sep, eq, name) {
41 sep = sep || '&';
42 eq = eq || '=';
43 if (obj === null) {
44 obj = undefined;
45 }
46
47 if (typeof obj === 'object') {
48 return Object.keys(obj).map(function(k) {
49 var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
50 if (Array.isArray(obj[k])) {
51 return obj[k].map(function(v) {
52 return ks + encodeURIComponent(stringifyPrimitive(v));
53 }).join(sep);
54 } else {
55 return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
56 }
57 }).filter(Boolean).join(sep);
58
59 }
60
61 if (!name) return '';
62 return encodeURIComponent(stringifyPrimitive(name)) + eq +
63 encodeURIComponent(stringifyPrimitive(obj));
64};