Comparing version 0.3.2 to 0.4.0
0.4.0 / 2011-11-21 | ||
================== | ||
* Allow parsing of an existing object (for `bodyParser()`) [jackyz] | ||
* Replaced expresso with mocha | ||
0.3.2 / 2011-11-08 | ||
@@ -3,0 +9,0 @@ ================== |
@@ -0,1 +1,2 @@ | ||
/*! | ||
@@ -11,3 +12,3 @@ * querystring | ||
exports.version = '0.3.2'; | ||
exports.version = '0.4.0'; | ||
@@ -26,25 +27,91 @@ /** | ||
function promote(parent, key) { | ||
if (parent[key].length == 0) return parent[key] = {}; | ||
var t = {}; | ||
for (var i in parent[key]) t[i] = parent[key][i]; | ||
parent[key] = t; | ||
return t; | ||
} | ||
function parse(parts, parent, key, val) { | ||
var part = parts.shift(); | ||
// end | ||
if (!part) { | ||
if (Array.isArray(parent[key])) { | ||
parent[key].push(val); | ||
} else if ('object' == typeof parent[key]) { | ||
parent[key] = val; | ||
} else if ('undefined' == typeof parent[key]) { | ||
parent[key] = val; | ||
} else { | ||
parent[key] = [parent[key], val]; | ||
} | ||
// array | ||
} else { | ||
var obj = parent[key] = parent[key] || []; | ||
if (']' == part) { | ||
if (Array.isArray(obj)) { | ||
if ('' != val) obj.push(val); | ||
} else if ('object' == typeof obj) { | ||
obj[Object.keys(obj).length] = val; | ||
} else { | ||
obj = parent[key] = [parent[key], val]; | ||
} | ||
// prop | ||
} else if (~part.indexOf(']')) { | ||
part = part.substr(0, part.length - 1); | ||
if(notint.test(part) && Array.isArray(obj)) obj = promote(parent, key); | ||
parse(parts, obj, part, val); | ||
// key | ||
} else { | ||
if(notint.test(part) && Array.isArray(obj)) obj = promote(parent, key); | ||
parse(parts, obj, part, val); | ||
} | ||
} | ||
} | ||
/** | ||
* Parse the given query `str`, returning an object. | ||
* | ||
* @param {String} str | ||
* @return {Object} | ||
* @api public | ||
* Merge parent key/val pair. | ||
*/ | ||
exports.parse = function(str){ | ||
if (null == str || '' == str) return {}; | ||
function promote(parent, key) { | ||
if (parent[key].length == 0) return parent[key] = {}; | ||
var t = {}; | ||
for (var i in parent[key]) t[i] = parent[key][i]; | ||
parent[key] = t; | ||
return t; | ||
function merge(parent, key, val){ | ||
if (~key.indexOf(']')) { | ||
var parts = key.split('[') | ||
, len = parts.length | ||
, last = len - 1; | ||
parse(parts, parent, 'base', val); | ||
// optimize | ||
} else { | ||
if (notint.test(key) && Array.isArray(parent.base)) { | ||
var t = {}; | ||
for (var k in parent.base) t[k] = parent.base[k]; | ||
parent.base = t; | ||
} | ||
set(parent.base, key, val); | ||
} | ||
return parent; | ||
} | ||
/** | ||
* Parse the given obj. | ||
*/ | ||
function parseObject(obj){ | ||
var ret = { base: {} }; | ||
Object.keys(obj).forEach(function(name){ | ||
merge(ret, name, obj[name]); | ||
}); | ||
return ret.base; | ||
} | ||
/** | ||
* Parse the given str. | ||
*/ | ||
function parseString(str){ | ||
return String(str) | ||
.split('&') | ||
.reduce(function(ret, pair){ | ||
try{ | ||
try{ | ||
pair = decodeURIComponent(pair.replace(/\+/g, ' ')); | ||
@@ -59,4 +126,3 @@ } catch(e) { | ||
, val = pair.substr(brace || eql, pair.length) | ||
, val = val.substr(val.indexOf('=') + 1, val.length) | ||
, parent = ret; | ||
, val = val.substr(val.indexOf('=') + 1, val.length); | ||
@@ -66,59 +132,19 @@ // ?foo | ||
// nested | ||
if (~key.indexOf(']')) { | ||
var parts = key.split('[') | ||
, len = parts.length | ||
, last = len - 1; | ||
return merge(ret, key, val); | ||
}, { base: {} }).base; | ||
} | ||
function parse(parts, parent, key) { | ||
var part = parts.shift(); | ||
/** | ||
* Parse the given query `str` or `obj`, returning an object. | ||
* | ||
* @param {String} str | {Object} obj | ||
* @return {Object} | ||
* @api public | ||
*/ | ||
// end | ||
if (!part) { | ||
if (Array.isArray(parent[key])) { | ||
parent[key].push(val); | ||
} else if ('object' == typeof parent[key]) { | ||
parent[key] = val; | ||
} else if ('undefined' == typeof parent[key]) { | ||
parent[key] = val; | ||
} else { | ||
parent[key] = [parent[key], val]; | ||
} | ||
// array | ||
} else { | ||
var obj = parent[key] = parent[key] || []; | ||
if (']' == part) { | ||
if (Array.isArray(obj)) { | ||
if ('' != val) obj.push(val); | ||
} else if ('object' == typeof obj) { | ||
obj[Object.keys(obj).length] = val; | ||
} else { | ||
obj = parent[key] = [parent[key], val]; | ||
} | ||
// prop | ||
} else if (~part.indexOf(']')) { | ||
part = part.substr(0, part.length - 1); | ||
if(notint.test(part) && Array.isArray(obj)) obj = promote(parent, key); | ||
parse(parts, obj, part); | ||
// key | ||
} else { | ||
if(notint.test(part) && Array.isArray(obj)) obj = promote(parent, key); | ||
parse(parts, obj, part); | ||
} | ||
} | ||
} | ||
parse(parts, parent, 'base'); | ||
// optimize | ||
} else { | ||
if (notint.test(key) && Array.isArray(parent.base)) { | ||
var t = {}; | ||
for(var k in parent.base) t[k] = parent.base[k]; | ||
parent.base = t; | ||
} | ||
set(parent.base, key, val); | ||
} | ||
return ret; | ||
}, {base: {}}).base; | ||
exports.parse = function(str){ | ||
if (null == str || '' == str) return {}; | ||
return 'object' == typeof str | ||
? parseObject(str) | ||
: parseString(str); | ||
}; | ||
@@ -125,0 +151,0 @@ |
{ | ||
"name": "qs", | ||
"description": "querystring parser", | ||
"version": "0.3.2", | ||
"version": "0.4.0", | ||
"repository": { | ||
@@ -10,3 +10,3 @@ "type" : "git", | ||
"devDependencies": { | ||
"expresso": "0.9.2" | ||
"mocha": "*" | ||
, "should": "*" | ||
@@ -13,0 +13,0 @@ }, |
@@ -9,3 +9,2 @@ # node-querystring | ||
## Examples | ||
@@ -18,6 +17,5 @@ | ||
Update git submodules: | ||
Install dev dependencies: | ||
$ git submodule init | ||
$ git submodule update | ||
$ npm install -d | ||
@@ -24,0 +22,0 @@ and execute: |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
18548
13
473
47
1