aboutsummaryrefslogtreecommitdiff
path: root/node_modules/querystring
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/querystring
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/querystring')
-rw-r--r--node_modules/querystring/.History.md.un~bin0 -> 7960 bytes
-rw-r--r--node_modules/querystring/.Readme.md.un~bin0 -> 3225 bytes
-rw-r--r--node_modules/querystring/.package.json.un~bin0 -> 5710 bytes
-rw-r--r--node_modules/querystring/.travis.yml4
-rw-r--r--node_modules/querystring/History.md20
-rw-r--r--node_modules/querystring/License.md19
-rw-r--r--node_modules/querystring/Readme.md15
-rw-r--r--node_modules/querystring/decode.js80
-rw-r--r--node_modules/querystring/encode.js64
-rw-r--r--node_modules/querystring/index.js4
-rw-r--r--node_modules/querystring/package.json65
-rw-r--r--node_modules/querystring/test/.index.js.un~bin0 -> 975 bytes
-rw-r--r--node_modules/querystring/test/common-index.js3
-rw-r--r--node_modules/querystring/test/index.js210
-rw-r--r--node_modules/querystring/test/tap-index.js3
15 files changed, 487 insertions, 0 deletions
diff --git a/node_modules/querystring/.History.md.un~ b/node_modules/querystring/.History.md.un~
new file mode 100644
index 000000000..c96a7dd8c
--- /dev/null
+++ b/node_modules/querystring/.History.md.un~
Binary files differ
diff --git a/node_modules/querystring/.Readme.md.un~ b/node_modules/querystring/.Readme.md.un~
new file mode 100644
index 000000000..71613b59b
--- /dev/null
+++ b/node_modules/querystring/.Readme.md.un~
Binary files differ
diff --git a/node_modules/querystring/.package.json.un~ b/node_modules/querystring/.package.json.un~
new file mode 100644
index 000000000..d86fe314c
--- /dev/null
+++ b/node_modules/querystring/.package.json.un~
Binary files differ
diff --git a/node_modules/querystring/.travis.yml b/node_modules/querystring/.travis.yml
new file mode 100644
index 000000000..895dbd362
--- /dev/null
+++ b/node_modules/querystring/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.6
+ - 0.8
diff --git a/node_modules/querystring/History.md b/node_modules/querystring/History.md
new file mode 100644
index 000000000..4fddbaf78
--- /dev/null
+++ b/node_modules/querystring/History.md
@@ -0,0 +1,20 @@
+# 0.2.0 / 2013-02-21
+
+ - Refactor into function per-module idiomatic style.
+ - Improved test coverage.
+
+# 0.1.0 / 2011-12-13
+
+ - Minor project reorganization
+
+# 0.0.3 / 2011-04-16
+ - Support for AMD module loaders
+
+# 0.0.2 / 2011-04-16
+
+ - Ported unit tests
+ - Removed functionality that depended on Buffers
+
+# 0.0.1 / 2011-04-15
+
+ - Initial release
diff --git a/node_modules/querystring/License.md b/node_modules/querystring/License.md
new file mode 100644
index 000000000..fc80e85f2
--- /dev/null
+++ b/node_modules/querystring/License.md
@@ -0,0 +1,19 @@
+
+Copyright 2012 Irakli Gozalishvili. All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/node_modules/querystring/Readme.md b/node_modules/querystring/Readme.md
new file mode 100644
index 000000000..a4fe2520d
--- /dev/null
+++ b/node_modules/querystring/Readme.md
@@ -0,0 +1,15 @@
+# querystring
+
+[![Build Status](https://secure.travis-ci.org/Gozala/querystring.png)](http://travis-ci.org/Gozala/querystring)
+
+
+[![Browser support](http://ci.testling.com/Gozala/querystring.png)](http://ci.testling.com/Gozala/querystring)
+
+
+
+Node's querystring module for all engines.
+
+## Install ##
+
+ npm install querystring
+
diff --git a/node_modules/querystring/decode.js b/node_modules/querystring/decode.js
new file mode 100644
index 000000000..a6518b8ff
--- /dev/null
+++ b/node_modules/querystring/decode.js
@@ -0,0 +1,80 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+module.exports = function(qs, sep, eq, options) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ var regexp = /\+/g;
+ qs = qs.split(sep);
+
+ var maxKeys = 1000;
+ if (options && typeof options.maxKeys === 'number') {
+ maxKeys = options.maxKeys;
+ }
+
+ var len = qs.length;
+ // maxKeys <= 0 means that we should not limit keys count
+ if (maxKeys > 0 && len > maxKeys) {
+ len = maxKeys;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var x = qs[i].replace(regexp, '%20'),
+ idx = x.indexOf(eq),
+ kstr, vstr, k, v;
+
+ if (idx >= 0) {
+ kstr = x.substr(0, idx);
+ vstr = x.substr(idx + 1);
+ } else {
+ kstr = x;
+ vstr = '';
+ }
+
+ k = decodeURIComponent(kstr);
+ v = decodeURIComponent(vstr);
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (Array.isArray(obj[k])) {
+ obj[k].push(v);
+ } else {
+ obj[k] = [obj[k], v];
+ }
+ }
+
+ return obj;
+};
diff --git a/node_modules/querystring/encode.js b/node_modules/querystring/encode.js
new file mode 100644
index 000000000..4f2b561b2
--- /dev/null
+++ b/node_modules/querystring/encode.js
@@ -0,0 +1,64 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+module.exports = function(obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+ if (obj === null) {
+ obj = undefined;
+ }
+
+ if (typeof obj === 'object') {
+ return Object.keys(obj).map(function(k) {
+ var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+ if (Array.isArray(obj[k])) {
+ return obj[k].map(function(v) {
+ return ks + encodeURIComponent(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ }
+
+ if (!name) return '';
+ return encodeURIComponent(stringifyPrimitive(name)) + eq +
+ encodeURIComponent(stringifyPrimitive(obj));
+};
diff --git a/node_modules/querystring/index.js b/node_modules/querystring/index.js
new file mode 100644
index 000000000..99826ea8a
--- /dev/null
+++ b/node_modules/querystring/index.js
@@ -0,0 +1,4 @@
+'use strict';
+
+exports.decode = exports.parse = require('./decode');
+exports.encode = exports.stringify = require('./encode');
diff --git a/node_modules/querystring/package.json b/node_modules/querystring/package.json
new file mode 100644
index 000000000..bdbc97073
--- /dev/null
+++ b/node_modules/querystring/package.json
@@ -0,0 +1,65 @@
+{
+ "name": "querystring",
+ "id": "querystring",
+ "version": "0.2.0",
+ "description": "Node's querystring module for all engines.",
+ "keywords": [ "commonjs", "query", "querystring" ],
+ "author": "Irakli Gozalishvili <rfobic@gmail.com>",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/Gozala/querystring.git",
+ "web": "https://github.com/Gozala/querystring"
+ },
+ "bugs": {
+ "url": "http://github.com/Gozala/querystring/issues/"
+ },
+ "devDependencies": {
+ "test": "~0.x.0",
+ "phantomify": "~0.x.0",
+ "retape": "~0.x.0",
+ "tape": "~0.1.5"
+ },
+ "engines": {
+ "node": ">=0.4.x"
+ },
+ "scripts": {
+ "test": "npm run test-node && npm run test-browser && npm run test-tap",
+ "test-browser": "node ./node_modules/phantomify/bin/cmd.js ./test/common-index.js",
+ "test-node": "node ./test/common-index.js",
+ "test-tap": "node ./test/tap-index.js"
+ },
+ "testling": {
+ "files": "test/tap-index.js",
+ "browsers": {
+ "iexplore": [
+ 9,
+ 10
+ ],
+ "chrome": [
+ 16,
+ 20,
+ 25,
+ "canary"
+ ],
+ "firefox": [
+ 10,
+ 15,
+ 16,
+ 17,
+ 18,
+ "nightly"
+ ],
+ "safari": [
+ 5,
+ 6
+ ],
+ "opera": [
+ 12
+ ]
+ }
+ },
+ "licenses": [{
+ "type" : "MIT",
+ "url" : "https://github.com/Gozala/enchain/License.md"
+ }]
+}
diff --git a/node_modules/querystring/test/.index.js.un~ b/node_modules/querystring/test/.index.js.un~
new file mode 100644
index 000000000..898eceddc
--- /dev/null
+++ b/node_modules/querystring/test/.index.js.un~
Binary files differ
diff --git a/node_modules/querystring/test/common-index.js b/node_modules/querystring/test/common-index.js
new file mode 100644
index 000000000..f356f9875
--- /dev/null
+++ b/node_modules/querystring/test/common-index.js
@@ -0,0 +1,3 @@
+"use strict";
+
+require("test").run(require("./index")) \ No newline at end of file
diff --git a/node_modules/querystring/test/index.js b/node_modules/querystring/test/index.js
new file mode 100644
index 000000000..62eb2ac89
--- /dev/null
+++ b/node_modules/querystring/test/index.js
@@ -0,0 +1,210 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+"use strict";
+
+// test using assert
+var qs = require('../');
+
+// folding block, commented to pass gjslint
+// {{{
+// [ wonkyQS, canonicalQS, obj ]
+var qsTestCases = [
+ ['foo=918854443121279438895193',
+ 'foo=918854443121279438895193',
+ {'foo': '918854443121279438895193'}],
+ ['foo=bar', 'foo=bar', {'foo': 'bar'}],
+ ['foo=bar&foo=quux', 'foo=bar&foo=quux', {'foo': ['bar', 'quux']}],
+ ['foo=1&bar=2', 'foo=1&bar=2', {'foo': '1', 'bar': '2'}],
+ ['my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F',
+ 'my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F',
+ {'my weird field': 'q1!2"\'w$5&7/z8)?' }],
+ ['foo%3Dbaz=bar', 'foo%3Dbaz=bar', {'foo=baz': 'bar'}],
+ ['foo=baz=bar', 'foo=baz%3Dbar', {'foo': 'baz=bar'}],
+ ['str=foo&arr=1&arr=2&arr=3&somenull=&undef=',
+ 'str=foo&arr=1&arr=2&arr=3&somenull=&undef=',
+ { 'str': 'foo',
+ 'arr': ['1', '2', '3'],
+ 'somenull': '',
+ 'undef': ''}],
+ [' foo = bar ', '%20foo%20=%20bar%20', {' foo ': ' bar '}],
+ // disable test that fails ['foo=%zx', 'foo=%25zx', {'foo': '%zx'}],
+ ['foo=%EF%BF%BD', 'foo=%EF%BF%BD', {'foo': '\ufffd' }],
+ // See: https://github.com/joyent/node/issues/1707
+ ['hasOwnProperty=x&toString=foo&valueOf=bar&__defineGetter__=baz',
+ 'hasOwnProperty=x&toString=foo&valueOf=bar&__defineGetter__=baz',
+ { hasOwnProperty: 'x',
+ toString: 'foo',
+ valueOf: 'bar',
+ __defineGetter__: 'baz' }],
+ // See: https://github.com/joyent/node/issues/3058
+ ['foo&bar=baz', 'foo=&bar=baz', { foo: '', bar: 'baz' }]
+];
+
+// [ wonkyQS, canonicalQS, obj ]
+var qsColonTestCases = [
+ ['foo:bar', 'foo:bar', {'foo': 'bar'}],
+ ['foo:bar;foo:quux', 'foo:bar;foo:quux', {'foo': ['bar', 'quux']}],
+ ['foo:1&bar:2;baz:quux',
+ 'foo:1%26bar%3A2;baz:quux',
+ {'foo': '1&bar:2', 'baz': 'quux'}],
+ ['foo%3Abaz:bar', 'foo%3Abaz:bar', {'foo:baz': 'bar'}],
+ ['foo:baz:bar', 'foo:baz%3Abar', {'foo': 'baz:bar'}]
+];
+
+// [wonkyObj, qs, canonicalObj]
+var extendedFunction = function() {};
+extendedFunction.prototype = {a: 'b'};
+var qsWeirdObjects = [
+ [{regexp: /./g}, 'regexp=', {'regexp': ''}],
+ [{regexp: new RegExp('.', 'g')}, 'regexp=', {'regexp': ''}],
+ [{fn: function() {}}, 'fn=', {'fn': ''}],
+ [{fn: new Function('')}, 'fn=', {'fn': ''}],
+ [{math: Math}, 'math=', {'math': ''}],
+ [{e: extendedFunction}, 'e=', {'e': ''}],
+ [{d: new Date()}, 'd=', {'d': ''}],
+ [{d: Date}, 'd=', {'d': ''}],
+ [{f: new Boolean(false), t: new Boolean(true)}, 'f=&t=', {'f': '', 't': ''}],
+ [{f: false, t: true}, 'f=false&t=true', {'f': 'false', 't': 'true'}],
+ [{n: null}, 'n=', {'n': ''}],
+ [{nan: NaN}, 'nan=', {'nan': ''}],
+ [{inf: Infinity}, 'inf=', {'inf': ''}]
+];
+// }}}
+
+var qsNoMungeTestCases = [
+ ['', {}],
+ ['foo=bar&foo=baz', {'foo': ['bar', 'baz']}],
+ ['blah=burp', {'blah': 'burp'}],
+ ['gragh=1&gragh=3&goo=2', {'gragh': ['1', '3'], 'goo': '2'}],
+ ['frappucino=muffin&goat%5B%5D=scone&pond=moose',
+ {'frappucino': 'muffin', 'goat[]': 'scone', 'pond': 'moose'}],
+ ['trololol=yes&lololo=no', {'trololol': 'yes', 'lololo': 'no'}]
+];
+
+exports['test basic'] = function(assert) {
+ assert.strictEqual('918854443121279438895193',
+ qs.parse('id=918854443121279438895193').id,
+ 'prase id=918854443121279438895193');
+};
+
+exports['test that the canonical qs is parsed properly'] = function(assert) {
+ qsTestCases.forEach(function(testCase) {
+ assert.deepEqual(testCase[2], qs.parse(testCase[0]),
+ 'parse ' + testCase[0]);
+ });
+};
+
+
+exports['test that the colon test cases can do the same'] = function(assert) {
+ qsColonTestCases.forEach(function(testCase) {
+ assert.deepEqual(testCase[2], qs.parse(testCase[0], ';', ':'),
+ 'parse ' + testCase[0] + ' -> ; :');
+ });
+};
+
+exports['test the weird objects, that they get parsed properly'] = function(assert) {
+ qsWeirdObjects.forEach(function(testCase) {
+ assert.deepEqual(testCase[2], qs.parse(testCase[1]),
+ 'parse ' + testCase[1]);
+ });
+};
+
+exports['test non munge test cases'] = function(assert) {
+ qsNoMungeTestCases.forEach(function(testCase) {
+ assert.deepEqual(testCase[0], qs.stringify(testCase[1], '&', '=', false),
+ 'stringify ' + JSON.stringify(testCase[1]) + ' -> & =');
+ });
+};
+
+exports['test the nested qs-in-qs case'] = function(assert) {
+ var f = qs.parse('a=b&q=x%3Dy%26y%3Dz');
+ f.q = qs.parse(f.q);
+ assert.deepEqual(f, { a: 'b', q: { x: 'y', y: 'z' } },
+ 'parse a=b&q=x%3Dy%26y%3Dz');
+};
+
+exports['test nested in colon'] = function(assert) {
+ var f = qs.parse('a:b;q:x%3Ay%3By%3Az', ';', ':');
+ f.q = qs.parse(f.q, ';', ':');
+ assert.deepEqual(f, { a: 'b', q: { x: 'y', y: 'z' } },
+ 'parse a:b;q:x%3Ay%3By%3Az -> ; :');
+};
+
+exports['test stringifying'] = function(assert) {
+ qsTestCases.forEach(function(testCase) {
+ assert.equal(testCase[1], qs.stringify(testCase[2]),
+ 'stringify ' + JSON.stringify(testCase[2]));
+ });
+
+ qsColonTestCases.forEach(function(testCase) {
+ assert.equal(testCase[1], qs.stringify(testCase[2], ';', ':'),
+ 'stringify ' + JSON.stringify(testCase[2]) + ' -> ; :');
+ });
+
+ qsWeirdObjects.forEach(function(testCase) {
+ assert.equal(testCase[1], qs.stringify(testCase[0]),
+ 'stringify ' + JSON.stringify(testCase[0]));
+ });
+};
+
+exports['test stringifying nested'] = function(assert) {
+ var f = qs.stringify({
+ a: 'b',
+ q: qs.stringify({
+ x: 'y',
+ y: 'z'
+ })
+ });
+ assert.equal(f, 'a=b&q=x%3Dy%26y%3Dz',
+ JSON.stringify({
+ a: 'b',
+ 'qs.stringify -> q': {
+ x: 'y',
+ y: 'z'
+ }
+ }));
+
+ var threw = false;
+ try { qs.parse(undefined); } catch(error) { threw = true; }
+ assert.ok(!threw, "does not throws on undefined");
+};
+
+exports['test nested in colon'] = function(assert) {
+ var f = qs.stringify({
+ a: 'b',
+ q: qs.stringify({
+ x: 'y',
+ y: 'z'
+ }, ';', ':')
+ }, ';', ':');
+ assert.equal(f, 'a:b;q:x%3Ay%3By%3Az',
+ 'stringify ' + JSON.stringify({
+ a: 'b',
+ 'qs.stringify -> q': {
+ x: 'y',
+ y: 'z'
+ }
+ }) + ' -> ; : ');
+
+
+ assert.deepEqual({}, qs.parse(), 'parse undefined');
+};
diff --git a/node_modules/querystring/test/tap-index.js b/node_modules/querystring/test/tap-index.js
new file mode 100644
index 000000000..70679b3fc
--- /dev/null
+++ b/node_modules/querystring/test/tap-index.js
@@ -0,0 +1,3 @@
+"use strict";
+
+require("retape")(require("./index")) \ No newline at end of file