From 9453b000ab9f89d938e632e326d290908bb8ddc1 Mon Sep 17 00:00:00 2001 From: Michael Dougherty Date: Sat, 7 Jul 2018 17:57:11 -0600 Subject: [PATCH] Cut a release --- .babelrc | 7 + bin/start-sbot.js | 2 +- bin/test-client.js | 2 +- electron/index.html | 2 + electron/main.js | 6 +- electron/renderer.js | 2 - electron/start-sbot-mainnet.js | 40 +++ package.json | 3 +- src/App/Common.purs | 8 +- src/App/DB/Main.es6.js | 5 +- src/App/DB/Main.js | 4 +- src/App/DB/Main.purs | 5 +- src/App/Flume.purs | 28 +- src/App/UI/Action.purs | 15 +- src/App/UI/ClientQueries.es6.js | 2 +- src/App/UI/ClientQueries.js | 20 +- src/App/UI/Effect.purs | 2 - src/App/UI/Main.purs | 39 +-- src/App/UI/Model.purs | 2 +- src/App/UI/Sub.purs | 17 +- src/App/UI/View.purs | 12 +- src/App/UI/View/Dashboard.purs | 22 +- src/App/UI/View/Game.purs | 39 ++- src/App/Utils.purs | 2 +- src/Ssb/Client.es6.js | 3 +- src/Ssb/Client.js | 16 +- src/Ssb/Config.es6.js | 9 +- src/Ssb/Config.js | 18 +- src/Ssb/Config.purs | 5 +- src/Ssb/Friends.es6.js | 2 +- src/Ssb/Friends.js | 9 +- src/Ssb/MessageTypes.purs | 2 +- src/Ssb/PullStream.es6.js | 3 - src/Ssb/PullStream.js | 8 +- src/Ssb/Server.es6.js | 2 +- src/Ssb/Server.js | 9 +- src/Tenuki/Game.es6.js | 1 - src/Tenuki/Game.js | 17 +- src/Tenuki/Game.purs | 2 +- yarn.lock | 497 +++++++++++++++++++++++++++++++- 40 files changed, 699 insertions(+), 190 deletions(-) create mode 100644 .babelrc create mode 100644 electron/start-sbot-mainnet.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..16c30ec --- /dev/null +++ b/.babelrc @@ -0,0 +1,7 @@ +{ + "presets": [ + ["env", { + "modules": false + }] + ] +} diff --git a/bin/start-sbot.js b/bin/start-sbot.js index 2eea639..29b6a32 100755 --- a/bin/start-sbot.js +++ b/bin/start-sbot.js @@ -41,7 +41,7 @@ function startSbot (path, port) { return sbot } -const main = startSbot('./ssb-data', 8088) +const main = startSbot('./ssb-data', 8008) const devs = ['alice', 'bob', 'charlie'].map((name, i) => { const port = 8081 + i const sbot = startSbot(`./ssb-dev/${name}`, port) diff --git a/bin/test-client.js b/bin/test-client.js index a7947bf..5b29c43 100644 --- a/bin/test-client.js +++ b/bin/test-client.js @@ -10,7 +10,7 @@ const config = require('ssb-config/inject')('ssb', { path: path, // keys: keysMaster, host: "localhost", - port: 8088, + port: 8008, // master: keysMaster.id, // master: [keysMaster.id, keysAlice.id], caps: { diff --git a/electron/index.html b/electron/index.html index 6aa69a3..0f4dbb8 100755 --- a/electron/index.html +++ b/electron/index.html @@ -11,6 +11,8 @@
diff --git a/electron/main.js b/electron/main.js index 52ee4bf..73d3f06 100755 --- a/electron/main.js +++ b/electron/main.js @@ -6,6 +6,7 @@ const BrowserWindow = electron.BrowserWindow const path = require('path') const url = require('url') +const {startSbot} = require('./start-sbot-mainnet') require('electron-reload')(path.join(__dirname, 'ui')) @@ -40,7 +41,10 @@ function createWindow () { // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. -app.on('ready', () => {createWindow()}) +app.on('ready', () => { + const sbot = startSbot(8008) + createWindow() +}) // Quit when all windows are closed. app.on('window-all-closed', function () { diff --git a/electron/renderer.js b/electron/renderer.js index 7f04f0c..901d75e 100755 --- a/electron/renderer.js +++ b/electron/renderer.js @@ -1,5 +1,3 @@ // This file is required by the index.html file and will // be executed in the renderer process for that window. // All of the Node.js APIs are available in this process. - -require('../output/App.UI.Main').main() diff --git a/electron/start-sbot-mainnet.js b/electron/start-sbot-mainnet.js new file mode 100644 index 0000000..c8ac723 --- /dev/null +++ b/electron/start-sbot-mainnet.js @@ -0,0 +1,40 @@ + +const fs = require('fs') +const path = require('path') +const pull = require('pull-stream') +const ssbKeys = require('ssb-keys') +const bundle = require('../dist/db.js') +const {ssbIgoPlugin} = bundle + +console.log(ssbIgoPlugin) + +const sbotBuilder = + require('scuttlebot') + .use(require("scuttlebot/plugins/master")) + .use(require("scuttlebot/plugins/gossip")) + .use(require("scuttlebot/plugins/replicate")) + .use(require("ssb-private")) + .use(require("ssb-friends")) + .use(ssbIgoPlugin) + +function dumpManifest(sbot, filePath) { + const manifest = JSON.stringify(sbot.getManifest()) + fs.writeFileSync(path.join(filePath, "manifest.json"), manifest) +} + +exports.startSbot = (port) => { + + const config = require('ssb-config/inject')('ssb', { + host: "localhost", + port: port, + }); + + config.keys = ssbKeys.loadOrCreateSync(config.path + "/secret") + config.master = config.keys.id + console.log(`starting sbot in ${config.path} at port ${port}`) + + const sbot = sbotBuilder(config) + dumpManifest(sbot, config.path) + + return sbot +} diff --git a/package.json b/package.json index 8544d58..3c2098a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "build": "pulp build", - "bundle": "pulp build -O -I src --to dist/bundle.js -m App.UI.Main", + "bundle": "pulp build -O -I src --to dist/ui.js -m App.UI.Main && pulp build -O -I src --to dist/db.js -m App.DB.Main && cp output/Ssb.Common/foreign.js dist/ssb-common.js && echo \"Auto bundling done. Don't forget to manually add module.exports to db.js\"", "dev": "concurrently --raw --kill-others \"bin/watch-es6.sh\" \"sass --watch electron/style:electron/build\"", "electron": "electron ./electron/main.js", "sbot": "node bin/start-sbot.js", @@ -16,6 +16,7 @@ "author": "", "license": "ISC", "devDependencies": { + "babel-preset-env": "^1.7.0", "concurrently": "^3.5.1", "electron": "^1.8.4", "electron-reload": "^1.2.2", diff --git a/src/App/Common.purs b/src/App/Common.purs index e1ece11..d57b3cc 100644 --- a/src/App/Common.purs +++ b/src/App/Common.purs @@ -6,18 +6,18 @@ import Control.Monad.Eff (Eff) import Control.Monad.Eff.Class (liftEff) import Data.Array as Array import Data.Maybe (Maybe(..)) +import Debug.Trace (spy) import Spork.Html as H import Ssb.Client (getClient) import Ssb.Config (Config(..), SSB, ConfigData, defaultConfigData) +mainShs = "1KHLiKZvAvjbY1ziZEHMXawbCEIM6qwjCDm3VYRan/s=" testShs = "GVZDyNf1TrZuGv3W5Dpef0vaITW1UqOUO3aWLNBp+7A=" standardConfig :: ∀ fx. Eff ( ssb :: SSB | fx ) Config standardConfig = do - cfg <- defaultConfigData $ Just - { path: "./ssb-data" - , keys: Nothing } - pure $ Config $ cfg { port = 8088, shs = testShs } + cfg <- defaultConfigData $ Nothing + pure $ Config $ cfg { port = 8008, shs = mainShs } devConfig :: String -> Int -> ∀ fx. Eff ( ssb :: SSB | fx ) Config devConfig path port = do diff --git a/src/App/DB/Main.es6.js b/src/App/DB/Main.es6.js index 3fac3f6..ea1aea0 100644 --- a/src/App/DB/Main.es6.js +++ b/src/App/DB/Main.es6.js @@ -17,10 +17,7 @@ exports.flumeUse = sbot._flumeUse(indexName, view) exports.liveStream = - view => () => { - console.log('new stream') - return view.stream({live: true}) - } + view => () => view.stream({live: true}) exports._rawGet = view => { diff --git a/src/App/DB/Main.js b/src/App/DB/Main.js index 20fe414..2a14e6b 100644 --- a/src/App/DB/Main.js +++ b/src/App/DB/Main.js @@ -1,7 +1,6 @@ -'use strict'; var pull = require('pull-stream'); -var Reduce = require('flumeview-reduce'); +var Reduce = require("flumeview-reduce"); exports.mkFlumeReducer = function (version) { return function (reducer) { @@ -37,7 +36,6 @@ exports.flumeUse = function (sbot) { exports.liveStream = function (view) { return function () { - console.log('new stream'); return view.stream({ live: true }); }; }; diff --git a/src/App/DB/Main.purs b/src/App/DB/Main.purs index 8dc7f7d..e812997 100644 --- a/src/App/DB/Main.purs +++ b/src/App/DB/Main.purs @@ -23,6 +23,9 @@ import Ssb.PullStream (PullStream) import Ssb.Server (createFeed, createFeed', createFeedRemote', toPlugin) import Ssb.Types (Sbot) +main :: Eff () Foreign +main = pure $ toForeign ssbIgoPlugin + ssbIgoPlugin = { init: \sbot -> unsafePerformEff $ init sbot , name: "ssbIgo" @@ -79,4 +82,4 @@ foreign import mkFlumeReducer :: String -> ReduceFnImpl -> MapFn -> FlumeData -> foreign import mkFlumeReducer1 :: String -> ReduceFnImpl -> MapFn -> Codec FlumeData -> FlumeData -> FlumeReducer foreign import flumeUse :: ∀ fx. Sbot -> String -> FlumeReducer -> Eff (ssb :: SSB | fx) FlumeView foreign import liveStream :: ∀ fx. FlumeView -> Eff (ssb :: SSB | fx) PullStream -foreign import _rawGet :: FlumeView -> (FlumeData -> Unit) -- NOTE: the FFI here is hosed \ No newline at end of file +foreign import _rawGet :: FlumeView -> (FlumeData -> Unit) -- NOTE: the FFI here is hosed diff --git a/src/App/Flume.purs b/src/App/Flume.purs index 88f41ff..dbe1d44 100644 --- a/src/App/Flume.purs +++ b/src/App/Flume.purs @@ -3,19 +3,18 @@ module App.Flume where import Prelude import App.Common (messageTypeString) -import App.IgoMsg (AcceptMatchPayload, BoardPosition(..), DeclineMatchFields, DeclineMatchPayload, IgoMove(..), IgoMsg(..), MsgKey, OfferMatchPayload, PlayMovePayload, RequestMatchPayload, SsbIgoMsg(..), StoneColor(..), parseIgoMessage) -import App.Utils (trace', upsert, (&)) +import App.IgoMsg (AcceptMatchPayload, DeclineMatchFields, DeclineMatchPayload, IgoMove(Finalize, ToggleDead, Pass, PlayStone, Resign), IgoMsg(Kibitz, PlayMove, AcknowledgeDecline, DeclineMatch, AcceptMatch, WithdrawOffer, OfferMatch, ExpireRequest, RequestMatch), MsgKey, OfferMatchPayload, PlayMovePayload, RequestMatchPayload, StoneColor(Black, White), parseIgoMessage) +import App.Utils (upsert, (&)) import Control.Alt ((<|>)) import Data.Argonaut (Json, fromObject, jsonNull, toObject, toString) import Data.Argonaut.Generic.Argonaut (decodeJson, encodeJson) -import Data.Array (last, length, snoc) +import Data.Array (filter, last, snoc) import Data.Array as Array import Data.Bifunctor (lmap) -import Data.Either (Either(..), either, hush) -import Data.Foreign (Foreign, toForeign) +import Data.Either (either, hush) import Data.Function.Uncurried (Fn2) import Data.Generic (class Generic, gEq, gShow) -import Data.Maybe (Maybe(..), fromJust, fromMaybe, maybe) +import Data.Maybe (Maybe(Nothing, Just), maybe) import Data.Newtype (class Newtype, unwrap, wrap) import Data.Record as Record import Data.StrMap (StrMap, delete, fromFoldable, insert, lookup) @@ -23,11 +22,7 @@ import Data.StrMap as M import Data.Symbol (SProxy(..)) import Data.Traversable (sequence) import Data.Tuple (Tuple(..)) -import Data.Tuple.Nested ((/\)) -import Debug.Trace (spy, trace, traceA, traceAny, traceAnyA) -import Global.Unsafe (unsafeStringify) -import Partial (crashWith) -import Partial.Unsafe (unsafeCrashWith, unsafePartial) +import Debug.Trace (trace) import Ssb.Types (UserKey, MessageKey) @@ -223,7 +218,6 @@ reduceFn (db) json = newMove = IndexedMove payload {rootAccept} {key, author} moveStep = MoveStep {move, key} newMatch = match # unwrap >>> (\m -> m { moves = snoc m.moves moveStep }) >>> wrap - _ = traceAny {newMove, newMatch} in db { moves = M.insert key newMove db.moves , matches = M.insert rootAccept newMatch db.matches } Just err -> @@ -234,7 +228,7 @@ reduceFn (db) json = Nothing -> trace "invalid message chain" $ const db Just match@(IndexedMatch {acceptMeta}) -> let - newKibitz = spy $ KibitzStep {text, author} + newKibitz = KibitzStep {text, author} append arr = Just $ snoc arr newKibitz in db { matchKibitzes = upsert append acceptMeta.key [] db.matchKibitzes } @@ -315,6 +309,14 @@ nextMover db match@(IndexedMatch {offerPayload, offerMeta}) = Just (IndexedMove _ _ lastMeta) -> if author == lastMeta.author then opponentKey else author Nothing -> firstMover +moveNumber :: IndexedMatch -> Int +moveNumber match@(IndexedMatch {moves}) = + Array.length $ filter gameMove moves + where + gameMove (MoveStep {move}) = case move of + PlayStone _ -> true + _ -> false + isMatchEnd :: IndexedMatch -> Boolean isMatchEnd match@(IndexedMatch {moves}) = let lastTwo = _.move <<< unwrap <$> Array.drop (Array.length moves - 2) moves diff --git a/src/App/UI/Action.purs b/src/App/UI/Action.purs index 5578927..1a239e1 100644 --- a/src/App/UI/Action.purs +++ b/src/App/UI/Action.purs @@ -112,14 +112,15 @@ update model = case _ of else model { flume = FlumeDb $ reduceFn flume mapped } UpdateFriends json -> case decodeJson json :: Either String AboutMessage of - Left reason -> {model, effects: lift $ Aff.log reason *> Aff.log (show json) *> pure Noop} + Left reason -> {model, effects: lift $ pure Noop} Right (AboutMessage {content}) -> let - name = case content.name of - "" -> Nothing - a -> Just a + name = content.name key = content.about - user = { name, key } + user = M.lookup key model.userKeys # case _ of + Nothing -> { name, key } + Just u -> maybe {name, key} (\name -> u { name = Just name}) name + in purely $ model { userKeys = M.insert key user model.userKeys , userNames = maybe model.userNames (\n -> M.insert n user model.userNames) name @@ -196,8 +197,8 @@ update model = case _ of effect = liftEff do case (f val) of -- Left err -> preventDefault event *> traceA err *> pure Noop - Left err -> traceA err *> (pure $ UpdateModel (set (O.scratchOffer <<< O.errorMsg) $ Just err)) - Right f -> traceA "OK" *> pure $ UpdateModel f + Left err -> pure $ UpdateModel (set (O.scratchOffer <<< O.errorMsg) $ Just err) + Right f -> pure $ UpdateModel f in { model, effects: lift effect} diff --git a/src/App/UI/ClientQueries.es6.js b/src/App/UI/ClientQueries.es6.js index 8a616ff..0c32686 100644 --- a/src/App/UI/ClientQueries.es6.js +++ b/src/App/UI/ClientQueries.es6.js @@ -1,5 +1,5 @@ -const {exposeAff, exposeEff} = require('../../output/Ssb.Common/foreign') +const {exposeAff, exposeEff} = require('./ssb-common') exports.getStream = client => () => diff --git a/src/App/UI/ClientQueries.js b/src/App/UI/ClientQueries.js index 041a5b4..8680430 100644 --- a/src/App/UI/ClientQueries.js +++ b/src/App/UI/ClientQueries.js @@ -1,9 +1,6 @@ -'use strict'; - -var _require = require('../../output/Ssb.Common/foreign'); - -var exposeAff = _require.exposeAff; -var exposeEff = _require.exposeEff; +var _require = require('./ssb-common'), + exposeAff = _require.exposeAff, + exposeEff = _require.exposeEff; exports.getStream = function (client) { return function () { @@ -16,10 +13,9 @@ exports._getDb = function (client) { return client.ssbIgo.rawGet(function (err, val) { return err ? fail(err) : pass(val); }); - } - - // exports._testFeed = - // client => path => (fail, pass) => - // client.ssbIgo.rawTestFeed(path, (err, val) => err ? fail(err) : pass(val)) - ; + }; }; + +// exports._testFeed = +// client => path => (fail, pass) => +// client.ssbIgo.rawTestFeed(path, (err, val) => err ? fail(err) : pass(val)) diff --git a/src/App/UI/Effect.purs b/src/App/UI/Effect.purs index a67181e..43da765 100644 --- a/src/App/UI/Effect.purs +++ b/src/App/UI/Effect.purs @@ -9,7 +9,6 @@ import App.UI.Model (DevIdentity) import Control.Monad.Aff (Aff) import Control.Monad.Aff.Console (CONSOLE, log) import Control.Monad.Eff.Class (liftEff) -import Control.Monad.Eff.Console as Eff import DOM (DOM) import DOM.Classy.Event (currentTarget) import DOM.Classy.Node (nodeValue) @@ -53,7 +52,6 @@ runEffect = case _ of pure $ next who ReturnEventTarget event next -> liftEff do val <- nodeValue $ currentTarget event - Eff.log val pure $ next val RawEffect e -> e -- PublishPrivate msg recips next -> diff --git a/src/App/UI/Main.purs b/src/App/UI/Main.purs index d383435..eecf132 100644 --- a/src/App/UI/Main.purs +++ b/src/App/UI/Main.purs @@ -2,52 +2,25 @@ module App.UI.Main where import Prelude -import App.Common (getClient') -import App.Flume (IndexedMatch(..), MoveStep(..), lastMoveKey) -import App.IgoMsg (BoardPosition(..), IgoMove(..), IgoMsg(..), PlayMovePayload) -import App.IgoMsg as Msg import App.UI.Action (Action(..)) import App.UI.Action as Action -import App.UI.ClientQueries (devClient) -import App.UI.Effect (Affect, runEffect) +import App.UI.Effect (runEffect) import App.UI.Effect as E -import App.UI.Model (DevIdentity, Model, ezify, initialModel) -import App.UI.Routes (Route(..), routes) -import App.UI.Sub (Handler, Sub(..)) +import App.UI.Model (Model, initialModel) +import App.UI.Routes (routes) +import App.UI.Sub (Sub(..)) import App.UI.Sub as Sub import App.UI.View as View import Control.Monad.Aff (Aff, Error) import Control.Monad.Eff (Eff) -import Control.Monad.Eff.Class (liftEff) import Control.Monad.Eff.Console (CONSOLE, error) as Eff import DOM (DOM) -import DOM.Classy.Element (fromElement) as DOM -import DOM.Event.KeyboardEvent (key) as DOM -import DOM.Event.Types (KeyboardEvent) as DOM -import DOM.HTML (window) as DOM -import DOM.HTML.HTMLElement (focus) as DOM -import DOM.HTML.Window (localStorage) as DOM -import DOM.Node.Types (Element) as DOM -import DOM.WebStorage.Storage (getItem, setItem) as DOM -import Data.Argonaut (Json, jsonNull) import Data.Array (singleton) -import Data.Array as Array -import Data.Const (Const) -import Data.Foldable (for_) -import Data.Foldable as F -import Data.Maybe (Maybe(..), maybe) -import Data.Monoid (mempty) -import Data.Newtype (wrap) import Data.StrMap as M -import Data.Traversable (for) import Data.Tuple (Tuple(..)) -import Debug.Trace (spy, traceAny) -import Pipes (discard) -import Routing.Hash (hashes, matches) -import Simple.JSON (readJSON, writeJSON) +import Routing.Hash (matches) import Spork.App as App -import Spork.Html as H -import Spork.Interpreter (Interpreter(..), basicAff, liftNat, merge, never, throughAff) +import Spork.Interpreter (Interpreter, basicAff, merge) import Ssb.Config (SSB) diff --git a/src/App/UI/Model.purs b/src/App/UI/Model.purs index 4755648..503f8ec 100644 --- a/src/App/UI/Model.purs +++ b/src/App/UI/Model.purs @@ -32,7 +32,7 @@ initialModel :: Model initialModel = { flume: FlumeUnloaded , whoami: Nothing - , devIdentity: Just Alice + , devIdentity: Nothing -- Just Alice , userKeys: M.empty , userNames: M.empty , scratchOffer: diff --git a/src/App/UI/Sub.purs b/src/App/UI/Sub.purs index cb09960..696c25a 100644 --- a/src/App/UI/Sub.purs +++ b/src/App/UI/Sub.purs @@ -3,30 +3,23 @@ module App.UI.Sub where import Prelude hiding (sub) import App.Common (getClient') -import App.IgoMsg (IgoMove, BoardPositionData) -import App.UI.Action (Action) import App.UI.ClientQueries (devClient, getStream) import App.UI.Model (DevIdentity) -import Control.Monad.Aff (Fiber, error, joinFiber, killFiber, launchAff, launchAff_) -import Control.Monad.Aff.Console as Aff +import Control.Monad.Aff (Fiber, error, killFiber, launchAff, launchAff_) import Control.Monad.Eff (Eff) import Control.Monad.Eff.Class (liftEff) -import Control.Monad.Eff.Console (CONSOLE, info) -import Control.Monad.Eff.Console as Eff +import Control.Monad.Eff.Console (CONSOLE) import Data.Argonaut (Json) import Data.Foreign (toForeign) -import Data.Maybe (Maybe(..), isJust, maybe) +import Data.Maybe (Maybe(Just, Nothing), maybe) import Data.Traversable (traverse) -import Debug.Trace (traceA, traceAny, traceAnyA) import Spork.EventQueue (EventQueueInstance, EventQueueAccum) import Spork.EventQueue as EventQueue import Spork.Interpreter (Interpreter(..)) import Ssb.Config (SSB) -import Ssb.Friends (createFriendStream) import Ssb.PullStream (drainWith) import Ssb.Server (messagesByType) -import Ssb.Types (SbotConn, MessageKey) -import Tenuki.Game (TenukiGame, setMoveCallback) +import Tenuki.Game (TenukiGame) data Sub a = IdentityFeeds (Maybe DevIdentity) (SubCallbacks a) @@ -37,7 +30,7 @@ type SubCallbacks a = {igoCb :: (Json -> a), friendsCb :: (Json -> a)} -- type SubEffects eff = (console :: CONSOLE | eff) -type FX fx = (ssb :: SSB, console :: CONSOLE | fx) +type FX fx = (ssb :: SSB | fx) type E fx = Eff (FX fx) -- NOTE: couldn't use stepper here because can't directly return an `Eff fx Action` diff --git a/src/App/UI/View.purs b/src/App/UI/View.purs index ad0bb4f..2349cd3 100644 --- a/src/App/UI/View.purs +++ b/src/App/UI/View.purs @@ -21,15 +21,15 @@ render model = case ezify model of Nothing -> H.div [H.classes ["root-container"]] [ H.h1 [] [H.text "app loading..."] - , H.code [] - [ H.text (unsafeStringify model)] + -- , H.code [] + -- [ H.text (unsafeStringify model)] ] Just ez -> H.div [H.classes ["root-container"]] - [ Dev.devToolbar ez - , mainContent model ez - , H.code [] - [ H.text (unsafeStringify model)] + -- Dev.devToolbar ez + [ mainContent model ez + -- , H.code [] + -- [ H.text (unsafeStringify model)] ] where showDb = case model.flume of diff --git a/src/App/UI/View/Dashboard.purs b/src/App/UI/View/Dashboard.purs index 3fd732d..48cb0d1 100644 --- a/src/App/UI/View/Dashboard.purs +++ b/src/App/UI/View/Dashboard.purs @@ -3,7 +3,7 @@ module App.UI.View.Dashboard where import Prelude import App.Common (div_) -import App.Flume (IndexedMatch(..), IndexedOffer(IndexedOffer), IndexedRequest(IndexedRequest), assignColors') +import App.Flume (IndexedMatch(..), IndexedOffer(IndexedOffer), IndexedRequest(IndexedRequest), assignColors', isMatchFinalized, moveNumber) import App.IgoMsg (IgoMsg(..), StoneColor(..)) import App.UI.Action (Action(..)) import App.UI.Model (EzModel, Model) @@ -52,6 +52,12 @@ dashboard model ez@{db, whoami} = [ H.thead [] gameHeaders , H.tbody [] (map (gameRow model) otherGames) ] + + , H.h2 [] [H.text "completed games"] + , H.table [] + [ H.thead [] gameHeaders + , H.tbody [] (map (gameRow model) finalizedGames) + ] ] ] where @@ -59,17 +65,23 @@ dashboard model ez@{db, whoami} = incomingOffers = M.values db.offers # filter \(IndexedOffer {opponentKey} _) -> opponentKey == whoami + finalizedGames :: Array IndexedMatch + finalizedGames = M.values db.matches # filter isMatchFinalized + + normalGames = M.values db.matches # filter (not <<< isMatchFinalized) + myGames :: Array IndexedMatch - myGames = M.values db.matches + myGames = normalGames # filter \(IndexedMatch {acceptMeta, offerMeta}) -> acceptMeta.author == whoami || offerMeta.author == whoami otherGames :: Array IndexedMatch - otherGames = M.values db.matches + otherGames = normalGames # filter \(IndexedMatch {acceptMeta, offerMeta}) -> not $ (acceptMeta.author == whoami || offerMeta.author == whoami) + myRequest :: EzModel -> H.Html Action myRequest {db, whoami} = case r of @@ -132,11 +144,11 @@ gameHeaders = gameRow :: Model -> IndexedMatch -> (H.Html Action) -gameRow model (IndexedMatch {offerPayload, acceptPayload, moves, offerMeta, acceptMeta}) = +gameRow model match@(IndexedMatch {offerPayload, acceptPayload, moves, offerMeta, acceptMeta}) = H.tr [] [ H.td [] [userKeyMarkup model black] , H.td [] [userKeyMarkup model white] - , H.td [] [H.text $ show $ length moves] + , H.td [] [H.text $ show $ moveNumber match] , H.td [] [ link (ViewGame acceptMeta.key) H.button [class' "btn-main"] [H.text "view"]] ] diff --git a/src/App/UI/View/Game.purs b/src/App/UI/View/Game.purs index 94ee781..48b2284 100644 --- a/src/App/UI/View/Game.purs +++ b/src/App/UI/View/Game.purs @@ -3,8 +3,8 @@ module App.UI.View.Game where import Prelude import App.Common (div_) -import App.Flume (IndexedMatch(IndexedMatch), KibitzStep(KibitzStep), assignColors, lastMoveKey, matchKey, myColor, nextMover) -import App.IgoMsg (IgoMove(Pass), IgoMsg(PlayMove)) +import App.Flume (IndexedMatch(IndexedMatch), KibitzStep(KibitzStep), assignColors, isMatchEnd, lastMoveKey, matchKey, moveNumber, myColor, nextMover) +import App.IgoMsg (IgoMove(..), IgoMsg(PlayMove)) import App.UI.Action (Action(..)) import App.UI.Model (EzModel, Model, userNameFromKey) import App.UI.Optics as O @@ -55,19 +55,28 @@ viewGame model@{tenukiClient} ez@{db, whoami} maybeMatch = case maybeMatch of , div_ "caps" [H.text $ "captures: " <> show blackCaps] ] + moveSubmitter move = H.always_ $ Publish $ PlayMove + { move + , lastMove: lastMoveKey match + , subjectiveMoveNum: -1 + } + passButton active = H.button [ H.classes ["pass"] , H.disabled (not active) - , H.onClick $ H.always_ $ Publish $ PlayMove - { move: Pass - , lastMove: lastMoveKey match - , subjectiveMoveNum: -1 - } + , H.onClick $ moveSubmitter Pass ] [ H.text "pass" ] - resignButton active = H.button - [H.classes ["resign"], H.disabled (not active)] - [H.text "resign"] + + resignButton = H.button + [ H.classes ["resign"] ] + [ H.text "resign" ] + + finalizeButton = H.button + [ H.classes ["finalize"] + , H.onClick $ moveSubmitter Finalize + ] + [ H.text "done" ] kibitzes = maybe [] id $ M.lookup (matchKey match) db.matchKibitzes kibitzPanel = kibitzes <#> \(KibitzStep {text, author}) -> @@ -88,11 +97,15 @@ viewGame model@{tenukiClient} ez@{db, whoami} maybeMatch = case maybeMatch of H.always_ $ SubmitKibitz move controls = div_ "controls" - let active = nextMover db match == whoami - in [ passButton active, resignButton active ] + let + active = nextMover db match == whoami + firstButton = if isMatchEnd match + then finalizeButton + else passButton active + in [ firstButton, resignButton ] info = - [ datum "move" $ show $ length moves + [ datum "move" $ show $ moveNumber match , datum "komi" $ show terms.komi , datum "hand." $ show terms.handicap ] diff --git a/src/App/Utils.purs b/src/App/Utils.purs index 7cd93f5..7df9766 100644 --- a/src/App/Utils.purs +++ b/src/App/Utils.purs @@ -16,7 +16,7 @@ import Data.Newtype (class Newtype, unwrap, wrap) import Data.StrMap (StrMap, lookup) import Data.StrMap as M import Data.Tuple (Tuple(..)) -import Debug.Trace (class DebugWarning, spy, trace) +import Debug.Trace (class DebugWarning, trace) map_ :: forall m a b. Functor m => m b -> (b -> a) -> m a map_ = flip map diff --git a/src/Ssb/Client.es6.js b/src/Ssb/Client.es6.js index 541c656..2d549e1 100644 --- a/src/Ssb/Client.es6.js +++ b/src/Ssb/Client.es6.js @@ -1,5 +1,5 @@ const ssbClient = require('ssb-client') -const {exposeAff, exposeEff, exposePure} = require('../../output/Ssb.Common/foreign') +const {exposeAff, exposeEff, exposePure} = require('./ssb-common') exports.props = exposePure(0, null) @@ -35,7 +35,6 @@ exports._getClient = config => (error, success) => { } ) return (cancelError, cancelerError, cancelerSuccess) => { - console.log("CANCEL", _client) if (_client) { _client.close() cancelerSuccess() diff --git a/src/Ssb/Client.js b/src/Ssb/Client.js index d1d34d8..b75aee2 100644 --- a/src/Ssb/Client.js +++ b/src/Ssb/Client.js @@ -1,12 +1,9 @@ -'use strict'; - var ssbClient = require('ssb-client'); -var _require = require('../../output/Ssb.Common/foreign'); - -var exposeAff = _require.exposeAff; -var exposeEff = _require.exposeEff; -var exposePure = _require.exposePure; +var _require = require('./ssb-common'), + exposeAff = _require.exposeAff, + exposeEff = _require.exposeEff, + exposePure = _require.exposePure; exports.props = exposePure(0, null); @@ -16,6 +13,7 @@ exports.unboxPrivate = exposeEff(2, ['private', 'unbox']); //////////////// ASYNC + exports._close = function (client) { return function (error, success) { client.close(success); @@ -26,7 +24,8 @@ exports._getClient = function (config) { return function (error, success) { config.caps = { shs: config.shs, - sign: config.sign }; + sign: config.sign + }; var _client = null; ssbClient(config.keys, config, function (err, client) { @@ -34,7 +33,6 @@ exports._getClient = function (config) { if (err) error(err);else success(client); }); return function (cancelError, cancelerError, cancelerSuccess) { - console.log('CANCEL', _client); if (_client) { _client.close(); cancelerSuccess(); diff --git a/src/Ssb/Config.es6.js b/src/Ssb/Config.es6.js index 820bcdb..709da6d 100644 --- a/src/Ssb/Config.es6.js +++ b/src/Ssb/Config.es6.js @@ -2,12 +2,17 @@ const home = require('os-homedir') const ssbKeys = require('ssb-keys') exports._defaultConfig = path => keys => () => { - if (!path) path = home() || 'browser' + if (!path) path = home() + if (!path) { + path = 'browser' + } else { + path = path + '/.ssb' + } if (!keys) keys = ssbKeys.loadOrCreateSync(path + "/secret"); return { keys: keys, path: path, - shs: "GVZDyNf1TrZuGv3W5Dpef0vaITW1UqOUO3aWLNBp+7A=", // TODO change + // shs: "GVZDyNf1TrZuGv3W5Dpef0vaITW1UqOUO3aWLNBp+7A=", // TODO change sign: null, host: "localhost", port: 8008, diff --git a/src/Ssb/Config.js b/src/Ssb/Config.js index 61b5942..60a4732 100644 --- a/src/Ssb/Config.js +++ b/src/Ssb/Config.js @@ -1,21 +1,25 @@ -'use strict'; - var home = require('os-homedir'); var ssbKeys = require('ssb-keys'); exports._defaultConfig = function (path) { return function (keys) { return function () { - if (!path) path = home() || 'browser'; - if (!keys) keys = ssbKeys.loadOrCreateSync(path + '/secret'); + if (!path) path = home(); + if (!path) { + path = 'browser'; + } else { + path = path + '/.ssb'; + } + if (!keys) keys = ssbKeys.loadOrCreateSync(path + "/secret"); return { keys: keys, path: path, - shs: 'GVZDyNf1TrZuGv3W5Dpef0vaITW1UqOUO3aWLNBp+7A=', // TODO change + // shs: "GVZDyNf1TrZuGv3W5Dpef0vaITW1UqOUO3aWLNBp+7A=", // TODO change sign: null, - host: 'localhost', + host: "localhost", port: 8008, - manifest: null }; + manifest: null + }; }; }; }; diff --git a/src/Ssb/Config.purs b/src/Ssb/Config.purs index 92cc3bd..2371f70 100644 --- a/src/Ssb/Config.purs +++ b/src/Ssb/Config.purs @@ -1,11 +1,8 @@ module Ssb.Config where -import Prelude import Control.Monad.Eff (Eff, kind Effect) -import Data.Argonaut (class EncodeJson, Json, fromString, jsonEmptyObject, jsonNull, (:=), (~>)) -import Data.Argonaut.Generic.Argonaut (encodeJson) -import Data.Generic (class Generic) +import Data.Argonaut (Json, fromString, jsonEmptyObject, jsonNull, (:=), (~>)) import Data.Maybe (Maybe(..)) import Data.Record (insert) import Data.StrMap (StrMap) diff --git a/src/Ssb/Friends.es6.js b/src/Ssb/Friends.es6.js index 9bfe9ca..d673798 100644 --- a/src/Ssb/Friends.es6.js +++ b/src/Ssb/Friends.es6.js @@ -1,5 +1,5 @@ -const {exposeAff, exposeEff} = require('../../output/Ssb.Common/foreign') +const {exposeAff, exposeEff} = require('./ssb-common') exports._createFriendStream = exposeEff(1, 'friends.createFriendStream') exports._hops1 = exposeAff(1, 'friends.hops') diff --git a/src/Ssb/Friends.js b/src/Ssb/Friends.js index 792eaa6..a8ffd06 100644 --- a/src/Ssb/Friends.js +++ b/src/Ssb/Friends.js @@ -1,9 +1,6 @@ -'use strict'; - -var _require = require('../../output/Ssb.Common/foreign'); - -var exposeAff = _require.exposeAff; -var exposeEff = _require.exposeEff; +var _require = require('./ssb-common'), + exposeAff = _require.exposeAff, + exposeEff = _require.exposeEff; exports._createFriendStream = exposeEff(1, 'friends.createFriendStream'); exports._hops1 = exposeAff(1, 'friends.hops'); diff --git a/src/Ssb/MessageTypes.purs b/src/Ssb/MessageTypes.purs index adddec4..d7de04b 100644 --- a/src/Ssb/MessageTypes.purs +++ b/src/Ssb/MessageTypes.purs @@ -39,7 +39,7 @@ parsePayload json = do type AboutContent = { about :: UserKey - , name :: String + , name :: Maybe String } newtype AboutContentN = AboutContentN AboutContent diff --git a/src/Ssb/PullStream.es6.js b/src/Ssb/PullStream.es6.js index a9f43ac..db335d9 100644 --- a/src/Ssb/PullStream.es6.js +++ b/src/Ssb/PullStream.es6.js @@ -7,15 +7,12 @@ exports._drainWith = const op = d => fn(d)() const abortable = Abortable() const tag = Math.random(); - console.log('listen to ', tag) pull( stream, abortable, - pull.through(x => console.log("piping thru", tag, x)), pull.drain(op, success) ) return function (ce, cre, cs) { - console.info('aborting drain') abortable.abort() cs() } diff --git a/src/Ssb/PullStream.js b/src/Ssb/PullStream.js index 823bb27..e4547b3 100644 --- a/src/Ssb/PullStream.js +++ b/src/Ssb/PullStream.js @@ -1,5 +1,3 @@ -"use strict"; - var pull = require("pull-stream"); var Abortable = require("pull-abortable"); @@ -11,12 +9,8 @@ exports._drainWith = function (stream) { }; var abortable = Abortable(); var tag = Math.random(); - console.log("listen to ", tag); - pull(stream, abortable, pull.through(function (x) { - return console.log("piping thru", tag, x); - }), pull.drain(op, success)); + pull(stream, abortable, pull.drain(op, success)); return function (ce, cre, cs) { - console.info("aborting drain"); abortable.abort(); cs(); }; diff --git a/src/Ssb/Server.es6.js b/src/Ssb/Server.es6.js index a6b8595..36d702c 100644 --- a/src/Ssb/Server.es6.js +++ b/src/Ssb/Server.es6.js @@ -1,6 +1,6 @@ const scuttlebot = require('scuttlebot') -const {exposeAff, exposeEff} = require('../../output/Ssb.Common/foreign') +const {exposeAff, exposeEff} = require('./ssb-common') exports._sbotBuilder = plugins => () => { const r = (sbot, p) => sbot.use(p) diff --git a/src/Ssb/Server.js b/src/Ssb/Server.js index 8418205..551de82 100644 --- a/src/Ssb/Server.js +++ b/src/Ssb/Server.js @@ -1,11 +1,8 @@ -'use strict'; - var scuttlebot = require('scuttlebot'); -var _require = require('../../output/Ssb.Common/foreign'); - -var exposeAff = _require.exposeAff; -var exposeEff = _require.exposeEff; +var _require = require('./ssb-common'), + exposeAff = _require.exposeAff, + exposeEff = _require.exposeEff; exports._sbotBuilder = function (plugins) { return function () { diff --git a/src/Tenuki/Game.es6.js b/src/Tenuki/Game.es6.js index f5c9105..26e77bd 100644 --- a/src/Tenuki/Game.es6.js +++ b/src/Tenuki/Game.es6.js @@ -37,7 +37,6 @@ exports.playPass = opts => game => () => game.pass(opts) // exports.playResign = opts => game => () => game.playResign(opts) exports.playAt = opts => ({x, y}) => game => () => game.playAt(y, x, opts) exports.toggleDead = opts => ({x, y}) => game => () => { - console.log('toggle toggle', x,y); game.toggleDeadAt(y, x, opts) } exports.render = game => () => game.render() diff --git a/src/Tenuki/Game.js b/src/Tenuki/Game.js index 2bdd536..63cc6d9 100644 --- a/src/Tenuki/Game.js +++ b/src/Tenuki/Game.js @@ -1,14 +1,8 @@ -'use strict'; - var tenuki = require('tenuki'); var unwrapEff = function unwrapEff(cb) { return function () { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return cb.apply(undefined, args)(); + return cb.apply(undefined, arguments)(); }; }; @@ -70,8 +64,8 @@ exports.playPass = function (opts) { // exports.playResign = opts => game => () => game.playResign(opts) exports.playAt = function (opts) { return function (_ref) { - var x = _ref.x; - var y = _ref.y; + var x = _ref.x, + y = _ref.y; return function (game) { return function () { return game.playAt(y, x, opts); @@ -81,11 +75,10 @@ exports.playAt = function (opts) { }; exports.toggleDead = function (opts) { return function (_ref2) { - var x = _ref2.x; - var y = _ref2.y; + var x = _ref2.x, + y = _ref2.y; return function (game) { return function () { - console.log('toggle toggle', x, y); game.toggleDeadAt(y, x, opts); }; }; diff --git a/src/Tenuki/Game.purs b/src/Tenuki/Game.purs index 0ac77e1..4efa289 100644 --- a/src/Tenuki/Game.purs +++ b/src/Tenuki/Game.purs @@ -46,7 +46,7 @@ type TenukiClientCallbacks e = type PlayOpts = {render :: Boolean} setGameState :: ∀ e. TenukiGame -> Array IgoMove -> Eff e Unit -setGameState game moves = traverse_ runMove (spy moves) *> render game where +setGameState game moves = traverse_ runMove moves *> render game where opts = {render: false} runMove = case _ of Pass -> playPass opts game diff --git a/yarn.lock b/yarn.lock index fbfb98a..c84bc59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -167,6 +167,408 @@ aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + bail@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3" @@ -253,6 +655,13 @@ broadcast-stream@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/broadcast-stream/-/broadcast-stream-0.2.2.tgz#79e7bb14a9abba77f72ac9258220242a8fd3919d" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + buffer-alloc-unsafe@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz#ffe1f67551dd055737de253337bfe853dfab1a6a" @@ -300,6 +709,10 @@ camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" +caniuse-lite@^1.0.30000844: + version "1.0.30000864" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000864.tgz#7a08c78da670f23c06f11aa918831b8f2dd60ddc" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -318,7 +731,7 @@ chalk@0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^1.0.0, chalk@^1.1.0: +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -497,6 +910,10 @@ continuable@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/continuable/-/continuable-1.2.0.tgz#08277468d41136200074ccf87294308d169f25b6" +core-js@^2.4.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -531,7 +948,7 @@ date-fns@^1.23.0: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" -debug@2.6.9, debug@^2.0.0, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0: +debug@2.6.9, debug@^2.0.0, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -646,6 +1063,10 @@ electron-reload@^1.2.2: dependencies: chokidar "^1.5.1" +electron-to-chromium@^1.3.47: + version "1.3.51" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz#6a42b49daaf7f22a5b37b991daf949f34dbdb9b5" + electron@^1.8.4: version "1.8.6" resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.6.tgz#6d45e377b321a35b78a794b64e40b2cf8face6ae" @@ -727,6 +1148,10 @@ escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -1063,6 +1488,10 @@ glob@^7.0.5, glob@~7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + globby@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" @@ -1207,6 +1636,12 @@ int53@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/int53/-/int53-0.2.4.tgz#5ed8d7aad6c5c6567cae69aa7ffc4a109ee80f86" +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + ip@^0.3.3, ip@~0.3.2: version "0.3.3" resolved "https://registry.yarnpkg.com/ip/-/ip-0.3.3.tgz#8ee8309e92f0b040d287f72efaca1a21702d3fb4" @@ -1374,10 +1809,18 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + json-buffer@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-2.0.11.tgz#3e441fda3098be8d1e3171ad591bc62a33e2d55f" @@ -1602,7 +2045,7 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -lodash@^4.17.10, lodash@^4.5.1: +lodash@^4.17.10, lodash@^4.17.4, lodash@^4.5.1: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -1635,6 +2078,12 @@ looper@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/looper/-/looper-4.0.0.tgz#7706aded59a99edca06e6b54bb86c8ec19c95155" +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + lossy-store@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/lossy-store/-/lossy-store-1.2.3.tgz#562e2a9203d8661f60e8712de407fbdadf275dc9" @@ -2210,6 +2659,10 @@ private-box@^0.2.1: dependencies: chloride "^2.2.1" +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -2658,12 +3111,46 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + relative-url@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/relative-url/-/relative-url-1.0.2.tgz#d21c52a72d6061018bcee9f9c9fc106bf7d65287" @@ -3430,6 +3917,10 @@ to-buffer@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + to-vfile@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-1.0.0.tgz#88defecd43adb2ef598625f0e3d59f7f342941ba"