Index: frontend/node_modules/thunky/test.js
===================================================================
--- frontend/node_modules/thunky/test.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/thunky/test.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,122 @@
+var tape = require('tape')
+var thunky = require('./')
+
+tape('run only once', function (t) {
+  t.plan(3)
+
+  var ran = 0
+  var run = thunky(function (cb) {
+    ran++
+    cb()
+  })
+
+  run(function () {
+    t.same(ran, 1, 'ran once')
+  })
+  run(function () {
+    t.same(ran, 1, 'ran once')
+  })
+  run(function () {
+    t.same(ran, 1, 'ran once')
+  })
+})
+
+tape('run only once async', function (t) {
+  t.plan(3)
+
+  var ran = 0
+  var run = thunky(function (cb) {
+    process.nextTick(function () {
+      ran++
+      cb()
+    })
+  })
+
+  run(function () {
+    t.same(ran, 1, 'ran once')
+  })
+  run(function () {
+    t.same(ran, 1, 'ran once')
+  })
+  run(function () {
+    t.same(ran, 1, 'ran once')
+  })
+})
+
+tape('re-run on error', function (t) {
+  t.plan(3)
+
+  var ran = 0
+  var run = thunky(function (cb) {
+    ran++
+    cb(new Error('stop'))
+  })
+
+  run(function () {
+    t.same(ran, 1, 'ran once')
+    run(function () {
+      t.same(ran, 2, 'ran once')
+      run(function () {
+        t.same(ran, 3, 'ran once')
+      })
+    })
+  })
+})
+
+tape('pass arguments', function (t) {
+  t.plan(6)
+
+  var ran = 0
+  var run = thunky(function (fn) {
+    ran++
+    fn({ hello: 'world' })
+  })
+
+  run(function (val) {
+    t.same(ran, 1, 'ran once')
+    t.same(val, { hello: 'world' })
+    run(function (val) {
+      t.same(ran, 1, 'ran once')
+      t.same(val, { hello: 'world' })
+      run(function (val) {
+        t.same(ran, 1, 'ran once')
+        t.same(val, { hello: 'world' })
+      })
+    })
+  })
+})
+
+tape('callback is optional', function (t) {
+  t.plan(2)
+
+  var ran = 0
+  var run = thunky(function (fn) {
+    ran++
+    fn({ hello: 'world' })
+  })
+
+  run()
+  run(function (val) {
+    t.same(ran, 1, 'ran once')
+    t.same(val, { hello: 'world' })
+  })
+})
+
+tape('always async', function (t) {
+  t.plan(2)
+
+  var run = thunky(function (cb) {
+    process.nextTick(cb)
+  })
+
+  var sync = true
+  run(function () {
+    t.ok(!sync, 'not sync')
+    var innerSync = true
+    run(function () {
+      t.ok(!innerSync, 'not sync')
+    })
+    innerSync = false
+  })
+  sync = false
+})
