4 * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
12 exports.version = '0.1.0';
15 * Parse the given query `str`, returning an object.
22 exports.parse = function(str) {
23 if (str == undefined || str == '') return {};
27 .reduce(function(ret, pair){
28 var pair = decodeURIComponent(pair.replace(/\+/g, ' '))
29 , eql = pair.indexOf('=')
30 , brace = lastBraceInKey(pair)
31 , key = pair.substr(0, brace || eql)
32 , val = pair.substr(brace || eql, pair.length)
33 , val = val.substr(val.indexOf('=') + 1, val.length)
37 if ('' == key) key = pair, val = '';
40 if (~key.indexOf(']')) {
41 var parts = key.split('[')
45 function parse(obj, parts, parent, key) {
46 var part = parts.shift();
50 if (Array.isArray(parent[key])) {
51 parent[key].push(val);
52 } else if ('object' == typeof parent[key]) {
55 parent[key] = [parent[key], val];
58 } else if (']' == part) {
59 obj = parent[key] = Array.isArray(parent[key])
62 if ('' != val) obj.push(val);
64 } else if (~part.indexOf(']')) {
65 part = part.substr(0, part.length - 1);
66 parse(obj[part] = obj[part] || {}, parts, obj, part);
69 parse(obj[part] = obj[part] || {}, parts, obj, part);
84 * Set `obj`'s `key` to `val` respecting
85 * the weird and wonderful syntax of a qs,
86 * where "foo=bar&foo=baz" becomes an array.
94 function set(obj, key, val) {
96 if (undefined === v) {
98 } else if (Array.isArray(v)) {
106 * Locate last brace in `str` within the key.
108 * @param {String} str
113 function lastBraceInKey(str) {
117 for (var i = 0; i < len; ++i) {
119 if (']' == c) brace = false;
120 if ('[' == c) brace = true;
121 if ('=' == c && !brace) return i;