Index: frontend/node_modules/object.groupby/test/implementation.js
===================================================================
--- frontend/node_modules/object.groupby/test/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/object.groupby/test/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+'use strict';
+
+var callBind = require('call-bind');
+var test = require('tape');
+
+var implementation = require('../implementation');
+var runTests = require('./tests');
+
+test('as a function', function (t) {
+	runTests(callBind(implementation, Object), t);
+
+	t.end();
+});
Index: frontend/node_modules/object.groupby/test/index.js
===================================================================
--- frontend/node_modules/object.groupby/test/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/object.groupby/test/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+'use strict';
+
+var test = require('tape');
+
+var index = require('../');
+var runTests = require('./tests');
+
+test('as a function', function (t) {
+	runTests(index, t);
+
+	t.end();
+});
Index: frontend/node_modules/object.groupby/test/shimmed.js
===================================================================
--- frontend/node_modules/object.groupby/test/shimmed.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/object.groupby/test/shimmed.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,35 @@
+'use strict';
+
+require('../auto');
+
+var test = require('tape');
+var defineProperties = require('define-properties');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var runTests = require('./tests');
+
+var name = 'groupBy';
+var fullName = 'Object.' + name;
+
+test('shimmed', function (t) {
+	var fn = Object[name];
+
+	t.equal(fn.length, 2, fullName + ' has a length of 2');
+
+	t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+		st.equal(fn.name, name, fullName + ' has name "' + name + '"');
+		st.end();
+	});
+
+	t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+		et.equal(false, isEnumerable.call(Object, name), fullName + ' is not enumerable');
+		et.end();
+	});
+
+	runTests(callBind(fn, Object), t);
+
+	t.end();
+});
Index: frontend/node_modules/object.groupby/test/tests.js
===================================================================
--- frontend/node_modules/object.groupby/test/tests.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/object.groupby/test/tests.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,62 @@
+'use strict';
+
+var inspect = require('object-inspect');
+var forEach = require('for-each');
+var v = require('es-value-fixtures');
+
+module.exports = function (groupBy, t) {
+	t.test('callback function', function (st) {
+		forEach(v.nonFunctions, function (nonFunction) {
+			st['throws'](
+				function () { groupBy([], nonFunction); },
+				TypeError,
+				inspect(nonFunction) + ' is not a function'
+			);
+		});
+
+		st.end();
+	});
+
+	t.test('grouping', function (st) {
+		st.deepEqual(
+			groupBy([], function () { return 'a'; }),
+			{ __proto__: null },
+			'an empty array produces an empty object'
+		);
+
+		var arr = [0, -0, 1, 2, 3, 4, 5, NaN, Infinity, -Infinity];
+		var parity = function (x) {
+			if (x !== x) {
+				return void undefined;
+			}
+			if (!isFinite(x)) {
+				return '∞';
+			}
+			return x % 2 === 0 ? 'even' : 'odd';
+		};
+		var grouped = {
+			__proto__: null,
+			even: [0, -0, 2, 4],
+			odd: [1, 3, 5],
+			undefined: [NaN],
+			'∞': [Infinity, -Infinity]
+		};
+		st.deepEqual(
+			groupBy(arr, parity),
+			grouped,
+			inspect(arr) + ' group by parity groups to ' + inspect(grouped)
+		);
+
+		st.deepEqual(
+			groupBy(arr, function (x, i) {
+				st.equal(this, undefined, 'receiver is as expected'); // eslint-disable-line no-invalid-this
+				st.equal(x, arr[i], 'second argument ' + i + ' is ' + inspect(arr[i]));
+				return 42;
+			}),
+			{ __proto__: null, 42: arr },
+			'thisArg and callback arguments are as expected'
+		);
+
+		st.end();
+	});
+};
