| /** | ||
| * 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) |
+5
-0
| 0.2.0 / 2011-06-29 | ||
| ================== | ||
| * Added `qs.stringify()` [Cory Forsyth] | ||
| 0.1.0 / 2011-04-13 | ||
@@ -3,0 +8,0 @@ ================== |
+82
-2
@@ -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, |
+1
-1
| { | ||
| "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)", |
+14
-3
@@ -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' }] | ||
| // }); | ||
| // } | ||
| }; |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
179072
3.16%42
2.44%1585
10.84%49
28.95%