diff --git a/node_modules/json-stable-stringify-without-jsonify/test/cmp.js b/node_modules/json-stable-stringify-without-jsonify/test/cmp.js
new file mode 100644
index 0000000..2dbb393
--- /dev/null
+++ b/node_modules/json-stable-stringify-without-jsonify/test/cmp.js
@@ -0,0 +1,11 @@
+var test = require('tape');
+var stringify = require('../');
+
+test('custom comparison function', function (t) {
+    t.plan(1);
+    var obj = { c: 8, b: [{z:6,y:5,x:4},7], a: 3 };
+    var s = stringify(obj, function (a, b) {
+        return a.key < b.key ? 1 : -1;
+    });
+    t.equal(s, '{"c":8,"b":[{"z":6,"y":5,"x":4},7],"a":3}');
+});
diff --git a/node_modules/json-stable-stringify-without-jsonify/test/nested.js b/node_modules/json-stable-stringify-without-jsonify/test/nested.js
new file mode 100644
index 0000000..052c7d6
--- /dev/null
+++ b/node_modules/json-stable-stringify-without-jsonify/test/nested.js
@@ -0,0 +1,42 @@
+var test = require('tape');
+var stringify = require('../');
+
+test('nested', function (t) {
+    t.plan(1);
+    var obj = { c: 8, b: [{z:6,y:5,x:4},7], a: 3 };
+    t.equal(stringify(obj), '{"a":3,"b":[{"x":4,"y":5,"z":6},7],"c":8}');
+});
+
+test('cyclic (default)', function (t) {
+    t.plan(1);
+    var one = { a: 1 };
+    var two = { a: 2, one: one };
+    one.two = two;
+    try {
+    	stringify(one);
+    } catch (ex) {
+    	t.equal(ex.toString(), 'TypeError: Converting circular structure to JSON');
+    }
+});
+
+test('cyclic (specifically allowed)', function (t) {
+    t.plan(1);
+    var one = { a: 1 };
+    var two = { a: 2, one: one };
+    one.two = two;
+    t.equal(stringify(one, {cycles:true}), '{"a":1,"two":{"a":2,"one":"__cycle__"}}');
+});
+
+test('repeated non-cyclic value', function(t) {
+    t.plan(1);
+    var one = { x: 1 };
+    var two = { a: one, b: one };
+    t.equal(stringify(two), '{"a":{"x":1},"b":{"x":1}}');
+});
+
+test('acyclic but with reused obj-property pointers', function (t) {
+    t.plan(1);
+    var x = { a: 1 }
+    var y = { b: x, c: x }
+    t.equal(stringify(y), '{"b":{"a":1},"c":{"a":1}}');
+});
diff --git a/node_modules/json-stable-stringify-without-jsonify/test/replacer.js b/node_modules/json-stable-stringify-without-jsonify/test/replacer.js
new file mode 100644
index 0000000..98802a7
--- /dev/null
+++ b/node_modules/json-stable-stringify-without-jsonify/test/replacer.js
@@ -0,0 +1,74 @@
+var test = require('tape');
+var stringify = require('../');
+
+test('replace root', function (t) {
+	t.plan(1);
+
+	var obj = { a: 1, b: 2, c: false };
+	var replacer = function(key, value) { return 'one'; };
+
+	t.equal(stringify(obj, { replacer: replacer }), '"one"');
+});
+
+test('replace numbers', function (t) {
+	t.plan(1);
+
+	var obj = { a: 1, b: 2, c: false };
+	var replacer = function(key, value) {
+		if(value === 1) return 'one';
+		if(value === 2) return 'two';
+		return value;
+	};
+
+	t.equal(stringify(obj, { replacer: replacer }), '{"a":"one","b":"two","c":false}');
+});
+
+test('replace with object', function (t) {
+	t.plan(1);
+
+	var obj = { a: 1, b: 2, c: false };
+	var replacer = function(key, value) {
+		if(key === 'b') return { d: 1 };
+		if(value === 1) return 'one';
+		return value;
+	};
+
+	t.equal(stringify(obj, { replacer: replacer }), '{"a":"one","b":{"d":"one"},"c":false}');
+});
+
+test('replace with undefined', function (t) {
+	t.plan(1);
+
+	var obj = { a: 1, b: 2, c: false };
+	var replacer = function(key, value) {
+		if(value === false) return;
+		return value;
+	};
+
+	t.equal(stringify(obj, { replacer: replacer }), '{"a":1,"b":2}');
+});
+
+test('replace with array', function (t) {
+	t.plan(1);
+
+	var obj = { a: 1, b: 2, c: false };
+	var replacer = function(key, value) {
+		if(key === 'b') return ['one', 'two'];
+		return value;
+	};
+
+	t.equal(stringify(obj, { replacer: replacer }), '{"a":1,"b":["one","two"],"c":false}');
+});
+
+test('replace array item', function (t) {
+	t.plan(1);
+
+	var obj = { a: 1, b: 2, c: [1,2] };
+	var replacer = function(key, value) {
+		if(value === 1) return 'one';
+		if(value === 2) return 'two';
+		return value;
+	};
+
+	t.equal(stringify(obj, { replacer: replacer }), '{"a":"one","b":"two","c":["one","two"]}');
+});
diff --git a/node_modules/json-stable-stringify-without-jsonify/test/space.js b/node_modules/json-stable-stringify-without-jsonify/test/space.js
new file mode 100644
index 0000000..2621122
--- /dev/null
+++ b/node_modules/json-stable-stringify-without-jsonify/test/space.js
@@ -0,0 +1,59 @@
+var test = require('tape');
+var stringify = require('../');
+
+test('space parameter', function (t) {
+    t.plan(1);
+    var obj = { one: 1, two: 2 };
+    t.equal(stringify(obj, {space: '  '}), ''
+        + '{\n'
+        + '  "one": 1,\n'
+        + '  "two": 2\n'
+        + '}'
+    );
+});
+
+test('space parameter (with tabs)', function (t) {
+    t.plan(1);
+    var obj = { one: 1, two: 2 };
+    t.equal(stringify(obj, {space: '\t'}), ''
+        + '{\n'
+        + '\t"one": 1,\n'
+        + '\t"two": 2\n'
+        + '}'
+    );
+});
+
+test('space parameter (with a number)', function (t) {
+    t.plan(1);
+    var obj = { one: 1, two: 2 };
+    t.equal(stringify(obj, {space: 3}), ''
+        + '{\n'
+        + '   "one": 1,\n'
+        + '   "two": 2\n'
+        + '}'
+    );
+});
+
+test('space parameter (nested objects)', function (t) {
+    t.plan(1);
+    var obj = { one: 1, two: { b: 4, a: [2,3] } };
+    t.equal(stringify(obj, {space: '  '}), ''
+        + '{\n'
+        + '  "one": 1,\n'
+        + '  "two": {\n'
+        + '    "a": [\n'
+        + '      2,\n'
+        + '      3\n'
+        + '    ],\n'
+        + '    "b": 4\n'
+        + '  }\n'
+        + '}'
+    );
+});
+
+test('space parameter (same as native)', function (t) {
+    t.plan(1);
+    // for this test, properties need to be in alphabetical order
+    var obj = { one: 1, two: { a: [2,3], b: 4 } };
+    t.equal(stringify(obj, {space: '  '}), JSON.stringify(obj, null, '  '));
+});
diff --git a/node_modules/json-stable-stringify-without-jsonify/test/str.js b/node_modules/json-stable-stringify-without-jsonify/test/str.js
new file mode 100644
index 0000000..67426b9
--- /dev/null
+++ b/node_modules/json-stable-stringify-without-jsonify/test/str.js
@@ -0,0 +1,32 @@
+var test = require('tape');
+var stringify = require('../');
+
+test('simple object', function (t) {
+    t.plan(1);
+    var obj = { c: 6, b: [4,5], a: 3, z: null };
+    t.equal(stringify(obj), '{"a":3,"b":[4,5],"c":6,"z":null}');
+});
+
+test('object with undefined', function (t) {
+	t.plan(1);
+	var obj = { a: 3, z: undefined };
+	t.equal(stringify(obj), '{"a":3}');
+});
+
+test('array with undefined', function (t) {
+	t.plan(1);
+	var obj = [4, undefined, 6];
+	t.equal(stringify(obj), '[4,null,6]');
+});
+
+test('object with empty string', function (t) {
+	t.plan(1);
+	var obj = { a: 3, z: '' };
+	t.equal(stringify(obj), '{"a":3,"z":""}');
+});
+
+test('array with empty string', function (t) {
+	t.plan(1);
+	var obj = [4, '', 6];
+	t.equal(stringify(obj), '[4,"",6]');
+});
diff --git a/node_modules/json-stable-stringify-without-jsonify/test/to-json.js b/node_modules/json-stable-stringify-without-jsonify/test/to-json.js
new file mode 100644
index 0000000..ef9a980
--- /dev/null
+++ b/node_modules/json-stable-stringify-without-jsonify/test/to-json.js
@@ -0,0 +1,20 @@
+var test = require('tape');
+var stringify = require('../');
+
+test('toJSON function', function (t) {
+    t.plan(1);
+    var obj = { one: 1, two: 2, toJSON: function() { return { one: 1 }; } };
+    t.equal(stringify(obj), '{"one":1}' );
+});
+
+test('toJSON returns string', function (t) {
+	t.plan(1);
+	var obj = { one: 1, two: 2, toJSON: function() { return 'one'; } };
+	t.equal(stringify(obj), '"one"');
+});
+
+test('toJSON returns array', function (t) {
+	t.plan(1);
+	var obj = { one: 1, two: 2, toJSON: function() { return ['one']; } };
+	t.equal(stringify(obj), '["one"]');
+});
