Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

qs

Package Overview
Dependencies
Maintainers
0
Versions
147
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

qs - npm Package Compare versions

Comparing version
0.1.0
to
0.2.0
+133
test/parse.test.js
/**
* Module dependencies.
*/
var qs = require('../')
, should = require('should');
module.exports = {
'test basics': function(){
qs.parse('0=foo').should.eql({ '0': 'foo' });
qs.parse('foo=c++')
.should.eql({ foo: 'c ' });
qs.parse('a[>=]=23')
.should.eql({ a: { '>=': '23' }});
qs.parse('a[<=>]==23')
.should.eql({ a: { '<=>': '=23' }});
qs.parse('a[==]=23')
.should.eql({ a: { '==': '23' }});
qs.parse('foo')
.should.eql({ foo: '' });
qs.parse('foo=bar')
.should.eql({ foo: 'bar' });
qs.parse('foo%3Dbar=baz')
.should.eql({ foo: 'bar=baz' });
qs.parse(' foo = bar = baz ')
.should.eql({ ' foo ': ' bar = baz ' });
qs.parse('foo=bar=baz')
.should.eql({ foo: 'bar=baz' });
qs.parse('foo=bar&bar=baz')
.should.eql({ foo: 'bar', bar: 'baz' });
qs.parse('foo=bar&baz')
.should.eql({ foo: 'bar', baz: '' });
qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')
.should.eql({
cht: 'p3'
, chd: 't:60,40'
, chs: '250x100'
, chl: 'Hello|World'
});
},
'test nesting': function(){
qs.parse('ops[>=]=25')
.should.eql({ ops: { '>=': '25' }});
qs.parse('user[name]=tj')
.should.eql({ user: { name: 'tj' }});
qs.parse('user[name][first]=tj&user[name][last]=holowaychuk')
.should.eql({ user: { name: { first: 'tj', last: 'holowaychuk' }}});
},
'test escaping': function(){
qs.parse('foo=foo%20bar')
.should.eql({ foo: 'foo bar' });
},
'test arrays': function(){
qs.parse('images[]')
.should.eql({ images: [] });
qs.parse('user[]=tj')
.should.eql({ user: ['tj'] });
qs.parse('user[]=tj&user[]=tobi&user[]=jane')
.should.eql({ user: ['tj', 'tobi', 'jane'] });
qs.parse('user[names][]=tj&user[names][]=tyler')
.should.eql({ user: { names: ['tj', 'tyler'] }});
qs.parse('user[names][]=tj&user[names][]=tyler&user[email]=tj@vision-media.ca')
.should.eql({ user: { names: ['tj', 'tyler'], email: 'tj@vision-media.ca' }});
qs.parse('items=a&items=b')
.should.eql({ items: ['a', 'b'] });
qs.parse('user[names]=tj&user[names]=holowaychuk&user[names]=TJ')
.should.eql({ user: { names: ['tj', 'holowaychuk', 'TJ'] }});
qs.parse('user[name][first]=tj&user[name][first]=TJ')
.should.eql({ user: { name: { first: ['tj', 'TJ'] }}});
},
'test right-hand brackets': function(){
qs.parse('pets=["tobi"]')
.should.eql({ pets: '["tobi"]' });
qs.parse('operators=[">=", "<="]')
.should.eql({ operators: '[">=", "<="]' });
qs.parse('op[>=]=[1,2,3]')
.should.eql({ op: { '>=': '[1,2,3]' }});
qs.parse('op[>=]=[1,2,3]&op[=]=[[[[1]]]]')
.should.eql({ op: { '>=': '[1,2,3]', '=': '[[[[1]]]]' }});
},
'test duplicates': function(){
qs.parse('items=bar&items=baz&items=raz')
.should.eql({ items: ['bar', 'baz', 'raz'] });
},
'test empty': function(){
qs.parse('').should.eql({});
qs.parse(undefined).should.eql({});
qs.parse(null).should.eql({});
}
// 'test complex': function(){
// qs.parse('users[][name][first]=tj&users[foo]=bar')
// .should.eql({
// users: [ { name: 'tj' }, { name: 'tobi' }, { foo: 'bar' }]
// });
//
// qs.parse('users[][name][first]=tj&users[][name][first]=tobi')
// .should.eql({
// users: [ { name: 'tj' }, { name: 'tobi' }]
// });
// }
};
/**
* Module dependencies.
*/
var qs = require('../')
, should = require('should')
, query_string_identities = {
'basics': [
{query_string: 'foo=bar', parsed: {'foo' : 'bar'}},
{query_string: 'foo=%22bar%22', parsed: {'foo' : '\"bar\"'}},
{query_string: 'foo=', parsed: {'foo': ''}},
{query_string: 'foo=1&bar=2', parsed: {'foo' : '1', 'bar' : '2'}},
{query_string: 'my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F', parsed: {'my weird field': "q1!2\"'w$5&7/z8)?"}},
{query_string: 'foo%3Dbaz=bar', parsed: {'foo=baz': 'bar'}},
{query_string: 'foo=bar&bar=baz', parsed: {foo: 'bar', bar: 'baz'}}
],
'escaping': [
{query_string: 'foo=foo%20bar', parsed: {foo: 'foo bar'}},
{query_string: 'cht=p3&chd=t%3A60%2C40&chs=250x100&chl=Hello%7CWorld', parsed: {
cht: 'p3'
, chd: 't:60,40'
, chs: '250x100'
, chl: 'Hello|World'
}}
],
'nested': [
{query_string: 'foo[]=bar&foo[]=quux', parsed: {'foo' : ['bar', 'quux']}},
{query_string: 'foo[]=bar', parsed: {foo: ['bar']}},
{query_string: 'foo[]=1&foo[]=2', parsed: {'foo' : ['1', '2']}},
{query_string: 'foo=bar&baz[]=1&baz[]=2&baz[]=3', parsed: {'foo' : 'bar', 'baz' : ['1', '2', '3']}},
{query_string: 'foo[]=bar&baz[]=1&baz[]=2&baz[]=3', parsed: {'foo' : ['bar'], 'baz' : ['1', '2', '3']}},
{query_string: 'x[y][z]=1', parsed: {'x' : {'y' : {'z' : '1'}}}},
{query_string: 'x[y][z][]=1', parsed: {'x' : {'y' : {'z' : ['1']}}}},
{query_string: 'x[y][z]=2', parsed: {'x' : {'y' : {'z' : '2'}}}},
{query_string: 'x[y][z][]=1&x[y][z][]=2', parsed: {'x' : {'y' : {'z' : ['1', '2']}}}},
{query_string: 'x[y][][z]=1', parsed: {'x' : {'y' : [{'z' : '1'}]}}},
{query_string: 'x[y][][z][]=1', parsed: {'x' : {'y' : [{'z' : ['1']}]}}},
{query_string: 'x[y][][z]=1&x[y][][w]=2', parsed: {'x' : {'y' : [{'z' : '1', 'w' : '2'}]}}},
{query_string: 'x[y][][v][w]=1', parsed: {'x' : {'y' : [{'v' : {'w' : '1'}}]}}},
{query_string: 'x[y][][z]=1&x[y][][v][w]=2', parsed: {'x' : {'y' : [{'z' : '1', 'v' : {'w' : '2'}}]}}},
{query_string: 'x[y][][z]=1&x[y][][z]=2', parsed: {'x' : {'y' : [{'z' : '1'}, {'z' : '2'}]}}},
{query_string: 'x[y][][z]=1&x[y][][w]=a&x[y][][z]=2&x[y][][w]=3', parsed: {'x' : {'y' : [{'z' : '1', 'w' : 'a'}, {'z' : '2', 'w' : '3'}]}}},
{query_string: 'user[name][first]=tj&user[name][last]=holowaychuk', parsed: { user: { name: { first: 'tj', last: 'holowaychuk' }}}}
],
'errors': [
{ parsed: 'foo=bar', message: 'stringify expects an object' },
{ parsed: ['foo', 'bar'], message: 'stringify expects an object' }
]
};
// Assert error
function err(fn, msg){
var err;
try {
fn();
} catch (e) {
should.equal(e.message, msg);
return;
}
throw new Error('no exception thrown, expected "' + msg + '"');
}
function test(type) {
var str, obj;
for (var i = 0; i < query_string_identities[type].length; i++) {
str = query_string_identities[type][i].query_string;
obj = query_string_identities[type][i].parsed;
qs.stringify(obj).should.eql(str);
}
}
module.exports = {
'test basics': function() {
test('basics');
},
'test escaping': function() {
test('escaping');
},
'test nested': function() {
test('nested');
},
'test errors': function() {
var parsed, message;
for (var i = 0; i < query_string_identities['errors'].length; i++) {
message = query_string_identities['errors'][i].message;
parsed = query_string_identities['errors'][i].parsed;
err(function(){ qs.stringify(parsed) }, message);
}
}
};
+11
-11

@@ -9,32 +9,32 @@

var obj = qs.parse('foo');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('foo=bar=baz');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('users[]');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('name=tj&email=tj@vision-media.ca');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('users[]=tj&users[]=tobi&users[]=jane');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('user[name][first]=tj&user[name][last]=holowaychuk');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('users[][name][first]=tj&users[][name][last]=holowaychuk');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('a=a&a=b&a=c');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('user[tj]=tj&user[tj]=TJ');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('user[names]=tj&user[names]=TJ&user[names]=Tyler');
require('inspect')(obj)
console.log(obj)
var obj = qs.parse('user[name][first]=tj&user[name][first]=TJ');
require('inspect')(obj)
console.log(obj)
0.2.0 / 2011-06-29
==================
* Added `qs.stringify()` [Cory Forsyth]
0.1.0 / 2011-04-13

@@ -3,0 +8,0 @@ ==================

@@ -12,5 +12,11 @@

exports.version = '0.1.0';
exports.version = '0.2.0';
/**
* Object#toString() ref for stringify().
*/
var toString = Object.prototype.toString;
/**
* Parse the given query `str`, returning an object.

@@ -23,3 +29,3 @@ *

exports.parse = function(str) {
exports.parse = function(str){
if (str == undefined || str == '') return {};

@@ -86,2 +92,76 @@

/**
* Turn the given `obj` into a query string
*
* @param {Object} obj
* @return {String}
* @api public
*/
var stringify = exports.stringify = function(obj, prefix) {
if (Array.isArray(obj)) {
return stringifyArray(obj, prefix);
} else if ('[object Object]' == toString.call(obj)) {
return stringifyObject(obj, prefix);
} else if ('string' == typeof obj) {
return stringifyString(obj, prefix);
} else {
return prefix;
}
};
/**
* Stringify the given `str`.
*
* @param {String} str
* @param {String} prefix
* @return {String}
* @api private
*/
function stringifyString(str, prefix) {
if (!prefix) throw new TypeError('stringify expects an object');
return prefix + '=' + encodeURIComponent(str);
}
/**
* Stringify the given `arr`.
*
* @param {Array} arr
* @param {String} prefix
* @return {String}
* @api private
*/
function stringifyArray(arr, prefix) {
var ret = [];
if (!prefix) throw new TypeError('stringify expects an object');
for (var i = 0; i < arr.length; i++) {
ret.push(stringify(arr[i], prefix + '[]'));
}
return ret.join('&');
}
/**
* Stringify the given `obj`.
*
* @param {Object} obj
* @param {String} prefix
* @return {String}
* @api private
*/
function stringifyObject(obj, prefix) {
var ret = []
, keys = Object.keys(obj)
, key;
for (var i = 0, len = keys.length; i < len; ++i) {
key = keys[i];
ret.push(stringify(obj[key], prefix
? prefix + '[' + encodeURIComponent(key) + ']'
: encodeURIComponent(key)));
}
return ret.join('&');
}
/**
* Set `obj`'s `key` to `val` respecting

@@ -88,0 +168,0 @@ * the weird and wonderful syntax of a qs,

{
"name": "qs",
"description": "querystring parser",
"version": "0.1.0",
"version": "0.2.0",
"repository": {},

@@ -6,0 +6,0 @@ "author": "TJ Holowaychuk <tj@vision-media.ca> (http://tjholowaychuk.com)",

@@ -1,2 +0,1 @@

# node-querystring

@@ -10,7 +9,19 @@

## Examples
require('querystring').parse('user[name][first]=tj&user[email]=tj');
// => { user: { name: { first: 'tj' }}}
require('qs').parse('user[name][first]=tj&user[email]=tj');
// => { user: { name: { first: 'tj' }, email: 'tj' } }
## Testing
Update git submodules:
$ git submodule init
$ git submodule update
and execute:
$ make test
## License

@@ -17,0 +28,0 @@

/**
* Module dependencies.
*/
var qs = require('../')
, should = require('should');
module.exports = {
'test basics': function(){
qs.parse('0=foo').should.eql({ '0': 'foo' });
qs.parse('foo=c++')
.should.eql({ foo: 'c ' });
qs.parse('a[>=]=23')
.should.eql({ a: { '>=': '23' }});
qs.parse('a[<=>]==23')
.should.eql({ a: { '<=>': '=23' }});
qs.parse('a[==]=23')
.should.eql({ a: { '==': '23' }});
qs.parse('foo')
.should.eql({ foo: '' });
qs.parse('foo=bar')
.should.eql({ foo: 'bar' });
qs.parse('foo%3Dbar=baz')
.should.eql({ foo: 'bar=baz' });
qs.parse(' foo = bar = baz ')
.should.eql({ ' foo ': ' bar = baz ' });
qs.parse('foo=bar=baz')
.should.eql({ foo: 'bar=baz' });
qs.parse('foo=bar&bar=baz')
.should.eql({ foo: 'bar', bar: 'baz' });
qs.parse('foo=bar&baz')
.should.eql({ foo: 'bar', baz: '' });
qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')
.should.eql({
cht: 'p3'
, chd: 't:60,40'
, chs: '250x100'
, chl: 'Hello|World'
});
},
'test nesting': function(){
qs.parse('ops[>=]=25')
.should.eql({ ops: { '>=': '25' }});
qs.parse('user[name]=tj')
.should.eql({ user: { name: 'tj' }});
qs.parse('user[name][first]=tj&user[name][last]=holowaychuk')
.should.eql({ user: { name: { first: 'tj', last: 'holowaychuk' }}});
},
'test escaping': function(){
qs.parse('foo=foo%20bar')
.should.eql({ foo: 'foo bar' });
},
'test arrays': function(){
qs.parse('images[]')
.should.eql({ images: [] });
qs.parse('user[]=tj')
.should.eql({ user: ['tj'] });
qs.parse('user[]=tj&user[]=tobi&user[]=jane')
.should.eql({ user: ['tj', 'tobi', 'jane'] });
qs.parse('user[names][]=tj&user[names][]=tyler')
.should.eql({ user: { names: ['tj', 'tyler'] }});
qs.parse('user[names][]=tj&user[names][]=tyler&user[email]=tj@vision-media.ca')
.should.eql({ user: { names: ['tj', 'tyler'], email: 'tj@vision-media.ca' }});
qs.parse('items=a&items=b')
.should.eql({ items: ['a', 'b'] });
qs.parse('user[names]=tj&user[names]=holowaychuk&user[names]=TJ')
.should.eql({ user: { names: ['tj', 'holowaychuk', 'TJ'] }});
qs.parse('user[name][first]=tj&user[name][first]=TJ')
.should.eql({ user: { name: { first: ['tj', 'TJ'] }}});
},
'test right-hand brackets': function(){
qs.parse('pets=["tobi"]')
.should.eql({ pets: '["tobi"]' });
qs.parse('operators=[">=", "<="]')
.should.eql({ operators: '[">=", "<="]' });
qs.parse('op[>=]=[1,2,3]')
.should.eql({ op: { '>=': '[1,2,3]' }});
qs.parse('op[>=]=[1,2,3]&op[=]=[[[[1]]]]')
.should.eql({ op: { '>=': '[1,2,3]', '=': '[[[[1]]]]' }});
},
'test duplicates': function(){
qs.parse('items=bar&items=baz&items=raz')
.should.eql({ items: ['bar', 'baz', 'raz'] });
},
'test empty': function(){
qs.parse('').should.eql({});
qs.parse(undefined).should.eql({});
qs.parse(null).should.eql({});
}
// 'test complex': function(){
// qs.parse('users[][name][first]=tj&users[foo]=bar')
// .should.eql({
// users: [ { name: 'tj' }, { name: 'tobi' }, { foo: 'bar' }]
// });
//
// qs.parse('users[][name][first]=tj&users[][name][first]=tobi')
// .should.eql({
// users: [ { name: 'tj' }, { name: 'tobi' }]
// });
// }
};