arnaucube
arnaucube/comunicationLeapPublic Self-hosted repository
comunicationLeap/node_modules/qs/index.js
node_modules/qs/index.jsRaw
  1/**
  2 * Object#toString() ref for stringify().
  3 */
  4
  5var toString = Object.prototype.toString;
  6
  7/**
  8 * Object#hasOwnProperty ref
  9 */
 10
 11var hasOwnProperty = Object.prototype.hasOwnProperty;
 12
 13/**
 14 * Array#indexOf shim.
 15 */
 16
 17var indexOf = typeof Array.prototype.indexOf === 'function'
 18  ? function(arr, el) { return arr.indexOf(el); }
 19  : function(arr, el) {
 20      for (var i = 0; i < arr.length; i++) {
 21        if (arr[i] === el) return i;
 22      }
 23      return -1;
 24    };
 25
 26/**
 27 * Array.isArray shim.
 28 */
 29
 30var isArray = Array.isArray || function(arr) {
 31  return toString.call(arr) == '[object Array]';
 32};
 33
 34/**
 35 * Object.keys shim.
 36 */
 37
 38var objectKeys = Object.keys || function(obj) {
 39  var ret = [];
 40  for (var key in obj) ret.push(key);
 41  return ret;
 42};
 43
 44/**
 45 * Array#forEach shim.
 46 */
 47
 48var forEach = typeof Array.prototype.forEach === 'function'
 49  ? function(arr, fn) { return arr.forEach(fn); }
 50  : function(arr, fn) {
 51      for (var i = 0; i < arr.length; i++) fn(arr[i]);
 52    };
 53
 54/**
 55 * Array#reduce shim.
 56 */
 57
 58var reduce = function(arr, fn, initial) {
 59  if (typeof arr.reduce === 'function') return arr.reduce(fn, initial);
 60  var res = initial;
 61  for (var i = 0; i < arr.length; i++) res = fn(res, arr[i]);
 62  return res;
 63};
 64
 65/**
 66 * Create a nullary object if possible
 67 */
 68
 69function createObject() {
 70  return Object.create
 71    ? Object.create(null)
 72    : {};
 73}
 74
 75/**
 76 * Cache non-integer test regexp.
 77 */
 78
 79var isint = /^[0-9]+$/;
 80
 81function promote(parent, key) {
 82  if (parent[key].length == 0) return parent[key] = createObject();
 83  var t = createObject();
 84  for (var i in parent[key]) {
 85    if (hasOwnProperty.call(parent[key], i)) {
 86      t[i] = parent[key][i];
 87    }
 88  }
 89  parent[key] = t;
 90  return t;
 91}
 92
 93function parse(parts, parent, key, val) {
 94  var part = parts.shift();
 95  // end
 96  if (!part) {
 97    if (isArray(parent[key])) {
 98      parent[key].push(val);
 99    } else if ('object' == typeof parent[key]) {
100      parent[key] = val;
101    } else if ('undefined' == typeof parent[key]) {
102      parent[key] = val;
103    } else {
104      parent[key] = [parent[key], val];
105    }
106    // array
107  } else {
108    var obj = parent[key] = parent[key] || [];
109    if (']' == part) {
110      if (isArray(obj)) {
111        if ('' != val) obj.push(val);
112      } else if ('object' == typeof obj) {
113        obj[objectKeys(obj).length] = val;
114      } else {
115        obj = parent[key] = [parent[key], val];
116      }
117      // prop
118    } else if (~indexOf(part, ']')) {
119      part = part.substr(0, part.length - 1);
120      if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
121      parse(parts, obj, part, val);
122      // key
123    } else {
124      if (!isint.test(part) && isArray(obj)) obj = promote(parent, key);
125      parse(parts, obj, part, val);
126    }
127  }
128}
129
130/**
131 * Merge parent key/val pair.
132 */
133
134function merge(parent, key, val){
135  if (~indexOf(key, ']')) {
136    var parts = key.split('[')
137      , len = parts.length
138      , last = len - 1;
139    parse(parts, parent, 'base', val);
140    // optimize
141  } else {
142    if (!isint.test(key) && isArray(parent.base)) {
143      var t = createObject();
144      for (var k in parent.base) t[k] = parent.base[k];
145      parent.base = t;
146    }
147    set(parent.base, key, val);
148  }
149
150  return parent;
151}
152
153/**
154 * Compact sparse arrays.
155 */
156
157function compact(obj) {
158  if ('object' != typeof obj) return obj;
159
160  if (isArray(obj)) {
161    var ret = [];
162
163    for (var i in obj) {
164      if (hasOwnProperty.call(obj, i)) {
165        ret.push(obj[i]);
166      }
167    }
168
169    return ret;
170  }
171
172  for (var key in obj) {
173    obj[key] = compact(obj[key]);
174  }
175
176  return obj;
177}
178
179/**
180 * Restore Object.prototype.
181 * see pull-request #58
182 */
183
184function restoreProto(obj) {
185  if (!Object.create) return obj;
186  if (isArray(obj)) return obj;
187  if (obj && 'object' != typeof obj) return obj;
188
189  for (var key in obj) {
190    if (hasOwnProperty.call(obj, key)) {
191      obj[key] = restoreProto(obj[key]);
192    }
193  }
194
195  obj.__proto__ = Object.prototype;
196  return obj;
197}
198
199/**
200 * Parse the given obj.
201 */
202
203function parseObject(obj){
204  var ret = { base: {} };
205
206  forEach(objectKeys(obj), function(name){
207    merge(ret, name, obj[name]);
208  });
209
210  return compact(ret.base);
211}
212
213/**
214 * Parse the given str.
215 */
216
217function parseString(str){
218  var ret = reduce(String(str).split('&'), function(ret, pair){
219    var eql = indexOf(pair, '=')
220      , brace = lastBraceInKey(pair)
221      , key = pair.substr(0, brace || eql)
222      , val = pair.substr(brace || eql, pair.length)
223      , val = val.substr(indexOf(val, '=') + 1, val.length);
224
225    // ?foo
226    if ('' == key) key = pair, val = '';
227    if ('' == key) return ret;
228
229    return merge(ret, decode(key), decode(val));
230  }, { base: createObject() }).base;
231
232  return restoreProto(compact(ret));
233}
234
235/**
236 * Parse the given query `str` or `obj`, returning an object.
237 *
238 * @param {String} str | {Object} obj
239 * @return {Object}
240 * @api public
241 */
242
243exports.parse = function(str){
244  if (null == str || '' == str) return {};
245  return 'object' == typeof str
246    ? parseObject(str)
247    : parseString(str);
248};
249
250/**
251 * Turn the given `obj` into a query string
252 *
253 * @param {Object} obj
254 * @return {String}
255 * @api public
256 */
257
258var stringify = exports.stringify = function(obj, prefix) {
259  if (isArray(obj)) {
260    return stringifyArray(obj, prefix);
261  } else if ('[object Object]' == toString.call(obj)) {
262    return stringifyObject(obj, prefix);
263  } else if ('string' == typeof obj) {
264    return stringifyString(obj, prefix);
265  } else {
266    return prefix + '=' + encodeURIComponent(String(obj));
267  }
268};
269
270/**
271 * Stringify the given `str`.
272 *
273 * @param {String} str
274 * @param {String} prefix
275 * @return {String}
276 * @api private
277 */
278
279function stringifyString(str, prefix) {
280  if (!prefix) throw new TypeError('stringify expects an object');
281  return prefix + '=' + encodeURIComponent(str);
282}
283
284/**
285 * Stringify the given `arr`.
286 *
287 * @param {Array} arr
288 * @param {String} prefix
289 * @return {String}
290 * @api private
291 */
292
293function stringifyArray(arr, prefix) {
294  var ret = [];
295  if (!prefix) throw new TypeError('stringify expects an object');
296  for (var i = 0; i < arr.length; i++) {
297    ret.push(stringify(arr[i], prefix + '[' + i + ']'));
298  }
299  return ret.join('&');
300}
301
302/**
303 * Stringify the given `obj`.
304 *
305 * @param {Object} obj
306 * @param {String} prefix
307 * @return {String}
308 * @api private
309 */
310
311function stringifyObject(obj, prefix) {
312  var ret = []
313    , keys = objectKeys(obj)
314    , key;
315
316  for (var i = 0, len = keys.length; i < len; ++i) {
317    key = keys[i];
318    if ('' == key) continue;
319    if (null == obj[key]) {
320      ret.push(encodeURIComponent(key) + '=');
321    } else {
322      ret.push(stringify(obj[key], prefix
323        ? prefix + '[' + encodeURIComponent(key) + ']'
324        : encodeURIComponent(key)));
325    }
326  }
327
328  return ret.join('&');
329}
330
331/**
332 * Set `obj`'s `key` to `val` respecting
333 * the weird and wonderful syntax of a qs,
334 * where "foo=bar&foo=baz" becomes an array.
335 *
336 * @param {Object} obj
337 * @param {String} key
338 * @param {String} val
339 * @api private
340 */
341
342function set(obj, key, val) {
343  var v = obj[key];
344  if (undefined === v) {
345    obj[key] = val;
346  } else if (isArray(v)) {
347    v.push(val);
348  } else {
349    obj[key] = [v, val];
350  }
351}
352
353/**
354 * Locate last brace in `str` within the key.
355 *
356 * @param {String} str
357 * @return {Number}
358 * @api private
359 */
360
361function lastBraceInKey(str) {
362  var len = str.length
363    , brace
364    , c;
365  for (var i = 0; i < len; ++i) {
366    c = str[i];
367    if (']' == c) brace = false;
368    if ('[' == c) brace = true;
369    if ('=' == c && !brace) return i;
370  }
371}
372
373/**
374 * Decode `str`.
375 *
376 * @param {String} str
377 * @return {String}
378 * @api private
379 */
380
381function decode(str) {
382  try {
383    return decodeURIComponent(str.replace(/\+/g, ' '));
384  } catch (err) {
385    return str;
386  }
387}