From 1564c68afebd6855868392173340e6e5445de4f7 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 12:22:53 +0900 Subject: [PATCH 01/37] In progress work for Wire.Store --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 88f0b95..9065203 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,9 @@ "author": "", "license": "ISC", "devDependencies": { - "purescript": "^0.13.6", + "purescript": "^0.13.8", "purescript-psa": "^0.7.3", "purty": "^6.2.0", - "spago": "^0.15.2" + "spago": "^0.15.3" } } From b7e9aa788f3daf06f770f8c74b38e81adb820d8f Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 12:23:04 +0900 Subject: [PATCH 02/37] In progress work for Wire.Store --- packages.dhall | 2 +- spago.dhall | 3 ++ src/Wire/Event.purs | 72 +++++++++++++++++++--------------- src/Wire/Event/Queue.purs | 25 ------------ src/Wire/Event/Time.purs | 20 ++++------ src/Wire/Signal.purs | 68 +++++++++++++++++++++----------- src/Wire/Store.purs | 60 ++++++++++++++++++++++++++++ src/Wire/Store/Atom.purs | 27 +++++++++++++ src/Wire/Store/Atom/Async.purs | 31 +++++++++++++++ src/Wire/Store/Atom/Pure.purs | 20 ++++++++++ src/Wire/Store/Atom/Sync.purs | 28 +++++++++++++ src/Wire/Store/Atom/Types.purs | 60 ++++++++++++++++++++++++++++ src/Wire/Store/Selector.purs | 1 + test/Main.purs | 14 +++++-- yarn.lock | 30 +++++++------- 15 files changed, 350 insertions(+), 111 deletions(-) delete mode 100644 src/Wire/Event/Queue.purs create mode 100644 src/Wire/Store.purs create mode 100644 src/Wire/Store/Atom.purs create mode 100644 src/Wire/Store/Atom/Async.purs create mode 100644 src/Wire/Store/Atom/Pure.purs create mode 100644 src/Wire/Store/Atom/Sync.purs create mode 100644 src/Wire/Store/Atom/Types.purs create mode 100644 src/Wire/Store/Selector.purs diff --git a/packages.dhall b/packages.dhall index 569aa7b..f7782e4 100644 --- a/packages.dhall +++ b/packages.dhall @@ -119,7 +119,7 @@ let additions = let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.13.6-20200507/packages.dhall sha256:9c1e8951e721b79de1de551f31ecb5a339e82bbd43300eb5ccfb1bf8cf7bbd62 + https://github.com/purescript/package-sets/releases/download/psc-0.13.8-20200615/packages.dhall sha256:5d0cfad9408c84db0a3fdcea2d708f9ed8f64297e164dc57a7cf6328706df93a let overrides = {=} diff --git a/spago.dhall b/spago.dhall index 71bcf2d..971ce49 100644 --- a/spago.dhall +++ b/spago.dhall @@ -7,6 +7,9 @@ You can edit this file as you like. [ "arrays" , "avar" , "filterable" + , "foreign-object" + , "freet" + , "leibniz" , "profunctor" , "refs" , "unsafe-reference" diff --git a/src/Wire/Event.purs b/src/Wire/Event.purs index 15e17a6..68c77f4 100644 --- a/src/Wire/Event.purs +++ b/src/Wire/Event.purs @@ -4,45 +4,59 @@ import Prelude import Control.Alt (class Alt, alt) import Control.Alternative (class Alternative, class Plus, empty) import Control.Apply (lift2) -import Control.Monad.Rec.Class (Step(..), tailRecM) +import Control.Monad.Rec.Class (Step(..), forever, tailRecM) import Data.Array as Array import Data.Either (Either(..), either, hush) import Data.Filterable (class Compactable, class Filterable, filterMap, partitionMap) -import Data.Foldable (class Foldable, for_, sequence_, traverse_) +import Data.Foldable (class Foldable, for_, sequence_) import Data.Maybe (Maybe(..), fromJust, isJust) import Effect (Effect) -import Effect.Aff (Milliseconds(..)) +import Effect.AVar as AVar +import Effect.Aff (Aff, Milliseconds(..)) import Effect.Aff as Aff +import Effect.Aff.AVar as AffVar import Effect.Class (liftEffect) import Effect.Ref as Ref import Partial.Unsafe (unsafePartial) import Unsafe.Reference (unsafeRefEq) -import Wire.Event.Queue as Queue newtype Event a = Event (Subscriber a -> Effect Canceler) type Subscriber a - = a -> Effect Unit + = a -> Aff Unit type Canceler = Effect Unit -create :: forall a. Effect { event :: Event a, push :: a -> Effect Unit, cancel :: Effect Unit } +create :: forall a. Effect { event :: Event a, push :: a -> Aff Unit, cancel :: Canceler } create = do subscribers <- Ref.new [] - queue <- Queue.create \a -> Ref.read subscribers >>= traverse_ \k -> k a + queue <- AVar.empty + consumer <- + (Aff.launchAff <<< Aff.supervise <<< forever) do + next <- AffVar.take queue + subs <- liftEffect $ Ref.read subscribers + for_ subs \k -> Aff.forkAff (k next) let event = Event \emit -> do unsubscribing <- Ref.new false let - subscriber = \a -> unlessM (Ref.read unsubscribing) do emit a + isUnsubscribing = liftEffect do Ref.read unsubscribing + + subscriber = \a -> unlessM isUnsubscribing do emit a Ref.modify_ (flip Array.snoc subscriber) subscribers pure do Ref.write true unsubscribing Ref.modify_ (Array.deleteBy unsafeRefEq subscriber) subscribers - pure { event, push: queue.push, cancel: queue.kill } + + push = flip AffVar.put queue + + cancel = do + Aff.launchAff_ $ Aff.killFiber (Aff.error "shutting down consumer") consumer + AVar.kill (Aff.error "shutting down queue") queue + pure { event, push, cancel } makeEvent :: forall a. (Subscriber a -> Effect Canceler) -> Event a makeEvent = Event @@ -51,13 +65,15 @@ subscribe :: forall a. Event a -> Subscriber a -> Effect Canceler subscribe (Event event) = event filter :: forall a. (a -> Boolean) -> Event a -> Event a -filter f (Event event) = Event \emit -> event \a -> when (f a) (emit a) +filter pred (Event event) = Event \emit -> event \a -> if pred a then emit a else pure unit fold :: forall a b. (b -> a -> b) -> b -> Event a -> Event b fold f b (Event event) = Event \emit -> do accum <- Ref.new b - event \a -> Ref.modify (flip f a) accum >>= emit + event \a -> do + value <- liftEffect $ Ref.modify (flip f a) accum + emit value share :: forall a. Event a -> Effect (Event a) share source = do @@ -66,16 +82,16 @@ share source = do shared <- create let incrementCount = do - count <- liftEffect do Ref.modify (_ + 1) subscriberCount + count <- Ref.modify (_ + 1) subscriberCount when (count == 1) do - cancel <- subscribe source do liftEffect <<< shared.push - liftEffect do Ref.write (Just cancel) cancelSource + cancel <- subscribe source shared.push + Ref.write (Just cancel) cancelSource decrementCount = do - count <- liftEffect do Ref.modify (_ - 1) subscriberCount + count <- Ref.modify (_ - 1) subscriberCount when (count == 0) do liftEffect (Ref.read cancelSource) >>= sequence_ - liftEffect do Ref.write Nothing cancelSource + Ref.write Nothing cancelSource event = Event \emit -> do @@ -89,9 +105,9 @@ distinct (Event event) = Event \emit -> do latest <- Ref.new Nothing event \a -> do - b <- Ref.read latest + b <- liftEffect $ Ref.read latest when (pure a /= b) do - Ref.write (pure a) latest + liftEffect $ Ref.write (pure a) latest emit a bufferUntil :: forall b a. Event b -> Event a -> Event (Array a) @@ -111,10 +127,10 @@ fromFoldable xs = fiber <- Aff.launchAff do for_ xs \x -> do - liftEffect do emit x + emit x Aff.delay (Milliseconds 0.0) pure do - Aff.launchAff_ do Aff.killFiber (Aff.error "canceled") fiber + Aff.launchAff_ $ Aff.killFiber (Aff.error "canceled") fiber range :: Int -> Int -> Event Int range start end = @@ -122,16 +138,16 @@ range start end = let go pos | pos /= end = do - liftEffect do emit pos + emit pos Aff.delay (Milliseconds 0.0) pure (Loop (pos + step)) go _ = do - liftEffect do emit end + emit end pure (Done unit) fiber <- Aff.launchAff do tailRecM go start pure do - Aff.launchAff_ do Aff.killFiber (Aff.error "canceled") fiber + Aff.launchAff_ $ Aff.killFiber (Aff.error "canceled") fiber where step = if start < end then 1 else -1 @@ -142,13 +158,7 @@ times n times _ = empty instance functorEvent :: Functor Event where - map f (Event event) = - Event \emit -> do - queue <- Queue.create (emit <<< f) - cancel <- event queue.push - pure do - cancel - queue.kill + map f (Event event) = Event \emit -> event (emit <<< f) instance applyEvent :: Apply Event where apply eventF eventA = @@ -162,7 +172,7 @@ instance applyEvent :: Apply Event where # filterMap (\{ left, right } -> apply left right) instance applicativeEvent :: Applicative Event where - pure a = Event \emit -> emit a *> mempty + pure a = Event \emit -> Aff.launchAff_ (emit a) *> mempty instance bindEvent :: Bind Event where bind (Event outer) f = diff --git a/src/Wire/Event/Queue.purs b/src/Wire/Event/Queue.purs deleted file mode 100644 index 69e5c19..0000000 --- a/src/Wire/Event/Queue.purs +++ /dev/null @@ -1,25 +0,0 @@ -module Wire.Event.Queue where - -import Prelude -import Control.Monad.Rec.Class (forever) -import Effect (Effect) -import Effect.AVar as AVar -import Effect.Aff as Aff -import Effect.Aff.AVar as AffVar -import Effect.Class (liftEffect) - -create :: forall a b. (a -> Effect b) -> Effect { push :: a -> Effect Unit, kill :: Effect Unit } -create consumer = do - queue <- AVar.empty - fiber <- - (Aff.launchAff <<< forever) do - a <- AffVar.take queue - liftEffect do consumer a - let - killFiber = Aff.launchAff_ do Aff.killFiber (Aff.error "killing queue consumer") fiber - - killQueue = AVar.kill (Aff.error "killing queue") queue - pure - { push: \a -> Aff.launchAff_ do AffVar.put a queue - , kill: killFiber *> killQueue - } diff --git a/src/Wire/Event/Time.purs b/src/Wire/Event/Time.purs index 1cfb9a9..d95b428 100644 --- a/src/Wire/Event/Time.purs +++ b/src/Wire/Event/Time.purs @@ -5,25 +5,18 @@ import Control.Alt ((<|>)) import Control.Monad.Rec.Class (forever) import Data.Time.Duration (class Duration, fromDuration) import Effect.Aff as Aff -import Effect.Class (liftEffect) import Wire.Event (Event) import Wire.Event as Event -import Wire.Event.Queue as Queue delay :: forall offset a. Duration offset => offset -> Event a -> Event a delay offset event = do let ms = fromDuration offset Event.makeEvent \emit -> do - queue <- Queue.create emit - cancel <- - Event.subscribe event \a -> - Aff.launchAff_ do - Aff.delay ms - liftEffect do queue.push a - pure do - cancel - queue.kill + Event.subscribe event \next -> do + Aff.delay ms + _ <- Aff.forkAff $ emit next + pure unit interval :: forall spacing. Duration spacing => spacing -> Event Unit interval spacing = do @@ -31,9 +24,10 @@ interval spacing = do ms = fromDuration spacing Event.makeEvent \emit -> do fiber <- - (Aff.launchAff <<< forever) do + (Aff.launchAff <<< Aff.supervise <<< forever) do Aff.delay ms - liftEffect do emit unit + _ <- Aff.forkAff $ emit unit + pure unit pure do Aff.launchAff_ do Aff.killFiber (Aff.error "canceling") fiber diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index e0e80b3..4dedf68 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -1,7 +1,9 @@ module Wire.Signal where import Prelude +import Control.Plus (empty) import Effect (Effect) +import Effect.Aff as Aff import Effect.Ref as Ref import Wire.Event (Canceler, Event, Subscriber) import Wire.Event as Event @@ -10,48 +12,68 @@ newtype Signal a = Signal { event :: Event a , read :: Effect a - , write :: a -> Effect Unit - , modify :: (a -> a) -> Effect Unit } -create :: forall a. Eq a => a -> Effect { signal :: Signal a, cancel :: Effect Unit } +create :: + forall a. + a -> + Effect + { signal :: Signal a + , write :: a -> Effect Unit + , modify :: (a -> a) -> Effect Unit + , cancel :: Effect Unit + } create init = do value <- Ref.new init inner <- Event.create let - modify' f = Ref.modify f value >>= inner.push + modify' f = Ref.modify f value >>= Aff.launchAff_ <<< inner.push signal = Signal - { event: Event.distinct inner.event + { event: inner.event , read: Ref.read value - , write: modify' <<< const - , modify: modify' } - pure { signal, cancel: inner.cancel } + pure + { signal + , write: modify' <<< const + , modify: modify' + , cancel: inner.cancel + } + +distinct :: forall a. Eq a => Signal a -> Signal a +distinct (Signal s) = Signal s { event = Event.distinct s.event } + +createDistinct :: + forall a. + Eq a => + a -> + Effect + { cancel :: Effect Unit + , modify :: (a -> a) -> Effect Unit + , signal :: Signal a + , write :: a -> Effect Unit + } +createDistinct init = do + signal <- create init + pure $ signal { signal = distinct signal.signal } subscribe :: forall a. Signal a -> Subscriber a -> Effect Canceler subscribe (Signal s) k = do - s.read >>= k + s.read >>= Aff.launchAff_ <<< k Event.subscribe s.event k -event :: forall a. Signal a -> Event a +event :: Signal ~> Event event (Signal s) = s.event -read :: forall a. Signal a -> Effect a +read :: Signal ~> Effect read (Signal s) = s.read -write :: forall a. a -> Signal a -> Effect Unit -write a (Signal s) = s.write a +instance functorSignal :: Functor Signal where + map f (Signal s) = Signal { event: map f s.event, read: map f s.read } -modify :: forall a. (a -> a) -> Signal a -> Effect Unit -modify f (Signal s) = s.modify f +instance applySignal :: Apply Signal where + apply (Signal f) (Signal a) = Signal { event: apply f.event a.event, read: apply f.read a.read } -static :: forall a. a -> Signal a -static a = - Signal - { event: pure a - , read: pure a - , modify: const mempty - , write: const mempty - } +instance applicativeSignal :: Applicative Signal where + pure a = Signal { event: empty, read: pure a } diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs new file mode 100644 index 0000000..c116d67 --- /dev/null +++ b/src/Wire/Store.purs @@ -0,0 +1,60 @@ +module Wire.Store where + +import Prelude +import Data.Maybe (Maybe, fromJust) +import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) +import Effect (Effect) +import Foreign.Object (Object) +import Foreign.Object as Object +import Partial.Unsafe (unsafePartial) +import Prim.Row (class Cons, class Lacks) +import Unsafe.Coerce (unsafeCoerce) +import Wire.Signal (Signal) +import Wire.Store.Atom (Atom(..)) +import Wire.Store.Atom.Async as Async +import Wire.Store.Atom.Pure as Pure +import Wire.Store.Atom.Sync as Sync + +newtype Store (atoms :: # Type) + = Store { atoms :: Object Compressed } + +empty :: Store () +empty = Store { atoms: Object.empty } + +insert :: forall key value before after. IsSymbol key => Lacks key before => Cons key value before after => Atom key value -> Store before -> Effect (Store after) +insert atom (Store store) = do + atomStore <- case atom of + Async a -> Async.createStore a + Sync a -> Sync.createStore a + Pure a -> Pure.createStore a + pure $ Store store { atoms = Object.insert (reflectSymbol (SProxy :: _ key)) (compress atomStore) store.atoms } + +lookup :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> AtomStore value +lookup _ (Store { atoms }) = inflate $ unsafePartial fromJust $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms + +reset :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> Effect Unit +reset atom = + lookup atom + >>> case atom of + Async a -> Async.reset a + Sync a -> Sync.reset a + Pure a -> Pure.reset a + +update :: forall key value atoms r. IsSymbol key => Cons key value r atoms => value -> Atom key value -> Store atoms -> Effect Unit +update value atom = + lookup atom + >>> case atom of + Async a -> Async.update value a + Sync a -> Sync.update value a + Pure a -> Pure.update value a + +type AtomStore a + = { signal :: Signal (Maybe a), write :: Maybe a -> Effect Unit } + +data Compressed + +compress :: forall a. AtomStore a -> Compressed +compress = unsafeCoerce + +inflate :: forall a. Compressed -> AtomStore a +inflate = unsafeCoerce diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs new file mode 100644 index 0000000..9d155d5 --- /dev/null +++ b/src/Wire/Store/Atom.purs @@ -0,0 +1,27 @@ +module Wire.Store.Atom where + +import Prelude +import Data.Maybe (Maybe(..)) +import Effect (Effect) +import Effect.Aff (Aff) +import Wire.Signal as Signal +import Wire.Store.Atom.Async (Async(..)) +import Wire.Store.Atom.Async as Async +import Wire.Store.Atom.Pure (Pure(..)) +import Wire.Store.Atom.Sync (Sync(..)) +import Wire.Store.Atom.Sync as Sync +import Wire.Store.Atom.Types (AtomStore, Lifecycle, Handler) + +data Atom (key :: Symbol) a + = Async (Async a) + | Sync (Sync a) + | Pure (Pure a) + +makeAsync :: forall a key. (Lifecycle a -> Handler Aff a) -> Atom key a +makeAsync = Async <<< Async' + +makeSync :: forall a key. (Lifecycle a -> Handler Effect a) -> Atom key a +makeSync = Sync <<< Sync' + +makePure :: forall a key. a -> Atom key a +makePure = Pure <<< Pure' diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs new file mode 100644 index 0000000..fa9d520 --- /dev/null +++ b/src/Wire/Store/Atom/Async.purs @@ -0,0 +1,31 @@ +module Wire.Store.Atom.Async where + +import Prelude +import Control.Monad.Free.Trans (FreeT) +import Data.Maybe (Maybe(..)) +import Effect (Effect) +import Effect.Aff (Aff, launchAff_) +import Wire.Store.Atom.Types (AtomF, AtomStore, Lifecycle(..), createEmptyStore, interpret) + +newtype Async a + = Async' (Lifecycle a -> Handler a) + +type Handler a + = FreeT (AtomF a) Aff Unit + +createStore :: forall a. Async a -> Effect (AtomStore a) +createStore (Async' handler) = do + store <- createEmptyStore + run (handler Init) store + pure store + +run :: forall a. Handler a -> AtomStore a -> Effect Unit +run handler store = launchAff_ $ interpret store handler + +reset :: forall a. Async a -> AtomStore a -> Effect Unit +reset (Async' handler) store@{ write } = do + write Nothing + run (handler Init) store + +update :: forall a. a -> Async a -> AtomStore a -> Effect Unit +update value (Async' handler) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs new file mode 100644 index 0000000..db69f45 --- /dev/null +++ b/src/Wire/Store/Atom/Pure.purs @@ -0,0 +1,20 @@ +module Wire.Store.Atom.Pure where + +import Prelude +import Effect (Effect) +import Wire.Store.Atom.Types (AtomStore, createEmptyStore) + +newtype Pure a + = Pure' a + +createStore :: forall a. Pure a -> Effect (AtomStore a) +createStore (Pure' value) = do + store <- createEmptyStore + store.write (pure value) + pure store + +reset :: forall a. Pure a -> AtomStore a -> Effect Unit +reset (Pure' value) store = store.write (pure value) + +update :: forall a. a -> Pure a -> AtomStore a -> Effect Unit +update value _ store = store.write (pure value) diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs new file mode 100644 index 0000000..a07f253 --- /dev/null +++ b/src/Wire/Store/Atom/Sync.purs @@ -0,0 +1,28 @@ +module Wire.Store.Atom.Sync where + +import Prelude +import Control.Monad.Free.Trans (FreeT) +import Effect (Effect) +import Wire.Store.Atom.Types (AtomF, AtomStore, Lifecycle(..), createEmptyStore, interpret) + +newtype Sync a + = Sync' (Lifecycle a -> Handler a) + +type Handler a + = FreeT (AtomF a) Effect Unit + +createStore :: forall a. Sync a -> Effect (AtomStore a) +createStore (Sync' handler) = do + store <- createEmptyStore + run (handler Init) store + pure store + +run :: forall a. Handler a -> AtomStore a -> Effect Unit +run = flip interpret + +reset :: forall a. Sync a -> AtomStore a -> Effect Unit +reset (Sync' handler) store@{ write } = do + run (handler Init) store + +update :: forall a. a -> Sync a -> AtomStore a -> Effect Unit +update value (Sync' handler) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs new file mode 100644 index 0000000..dca3b0a --- /dev/null +++ b/src/Wire/Store/Atom/Types.purs @@ -0,0 +1,60 @@ +module Wire.Store.Atom.Types where + +import Prelude +import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) +import Control.Monad.Rec.Class (class MonadRec) +import Data.Foldable (class Foldable) +import Data.Maybe (Maybe(..)) +import Effect (Effect) +import Effect.Class (class MonadEffect, liftEffect) +import Wire.Signal (Signal) +import Wire.Signal as Signal + +data AtomF a next + = Peek (Maybe a -> next) + | Poke a next + +derive instance functorAtomF :: Functor (AtomF a) + +type Handler m a + = FreeT (AtomF a) m Unit + +peek :: forall a m. Monad m => FreeT (AtomF a) m (Maybe a) +peek = liftFreeT $ Peek identity + +poke :: forall a m. Monad m => a -> FreeT (AtomF a) m Unit +poke a = liftFreeT $ Poke a unit + +interpret :: forall a m. MonadEffect m => MonadRec m => AtomStore a -> FreeT (AtomF a) m Unit -> m Unit +interpret store = + runFreeT case _ of + Peek next -> do + a <- liftEffect (Signal.read store.signal) + pure (next a) + Poke a next -> do + liftEffect (store.write (pure a)) + pure next + +type AtomStore a + = { signal :: Signal (Maybe a) + , write :: Maybe a -> Effect Unit + } + +createEmptyStore :: forall a. Effect (AtomStore a) +createEmptyStore = do + { signal, write } <- Signal.create Nothing + pure { signal, write } + +data Lifecycle a + = Init + | Update a + +derive instance functorLifecycle :: Functor Lifecycle + +instance foldableMaybe :: Foldable Lifecycle where + foldr _ z Init = z + foldr f z (Update x) = x `f` z + foldl _ z Init = z + foldl f z (Update x) = z `f` x + foldMap f Init = mempty + foldMap f (Update x) = f x diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs new file mode 100644 index 0000000..872e22d --- /dev/null +++ b/src/Wire/Store/Selector.purs @@ -0,0 +1 @@ +module Wire.Store.Selector where diff --git a/test/Main.purs b/test/Main.purs index ce1ab04..e2a5956 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -2,17 +2,25 @@ module Test.Main where import Prelude import Data.Array as Array +import Data.Filterable (filter) import Data.FoldableWithIndex (foldlWithIndex) import Data.Int as Int import Data.String.CodeUnits as CodeUnits import Effect (Effect) +import Effect.Class (class MonadEffect) import Effect.Class.Console as Console import Wire.Event (Event) import Wire.Event as Event main :: Effect Unit main = do - void $ Event.subscribe ((\a b -> "Hi " <> show (a + b)) <$> Event.range 1 5 <*> (Event.range 6 10 >>= pure)) do Console.logShow + void $ Event.subscribe (combineWithProduct <$> sumOfSquaresFromOneToOneThousand <*> sumOfSquaresFromOneToOneThousand) logEquation + +combineWithProduct :: Number -> Number -> { left :: Number, right :: Number, product :: Number } +combineWithProduct left right = { left, right, product: left * right } + +logEquation :: forall m. MonadEffect m => { left :: Number, product :: Number, right :: Number } -> m Unit +logEquation { left, right, product } = Console.log (formatNumber left <> " * " <> formatNumber right <> " = " <> formatNumber product) sumOfSquaresFromOneToOneThousand :: Event Number sumOfSquaresFromOneToOneThousand = @@ -21,9 +29,9 @@ sumOfSquaresFromOneToOneThousand = # map (\x -> x * x) # Event.fold (+) 0.0 -formatNumber :: String -> String +formatNumber :: Number -> String formatNumber = - CodeUnits.dropRight 2 + show >>> CodeUnits.dropRight 2 >>> CodeUnits.toCharArray >>> Array.reverse >>> foldlWithIndex (\i o c -> if i /= 0 && i `mod` 3 == 0 then o <> [ ',', c ] else o <> [ c ]) [] diff --git a/yarn.lock b/yarn.lock index 5163364..82dbb5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -62,9 +62,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== balanced-match@^1.0.0: version "1.0.0" @@ -199,9 +199,9 @@ core-util-is@1.0.2, core-util-is@~1.0.0: integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cross-spawn@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -295,9 +295,9 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -768,9 +768,9 @@ purescript-psa@^0.7.3: integrity sha512-qcnhruybTHVunhJqAuurOEWnz1BOOc/7mpcnyH5yxm5caYCejxq8GOE4ZNWbiPMeTlcG79qUPIOz7gx5OVmk2Q== purescript@^0.13.6: - version "0.13.6" - resolved "https://registry.yarnpkg.com/purescript/-/purescript-0.13.6.tgz#f5f77680dd7a50b7e63ba671bd85e2ac121318b0" - integrity sha512-PC93xqr0zDs5l5xnfTlptKzv5jBWbML+dwtpDCZkOOH7h9wgLusQfU4PNfHvdwrSmsBntalGm+Cbd6VrokN7Sg== + version "0.13.8" + resolved "https://registry.yarnpkg.com/purescript/-/purescript-0.13.8.tgz#acab6f3008d75b8046478c8c1d6124079dc96f7e" + integrity sha512-1ZyVEVFLgcEcjPXxJYeVEyYn66DF2DnOLTWzo/K/MrQUF2chdLSyZ8sJpcarWyrz2HxXaubYceYbo5KexKzynA== dependencies: purescript-installer "^0.2.0" @@ -878,9 +878,9 @@ signal-exit@^3.0.2: integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== spago@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/spago/-/spago-0.15.2.tgz#4ef59ae21f269fdab1d903d6c83c0cba1e415c06" - integrity sha512-RaH7AaY8Dzb9uhzDdhN5fMXAYQm5/Js7Qnb7M9NgbapV29dS7gMy7vQ6i6FAoLEqzbvBDzbSjQ+VabLQmaGbEQ== + version "0.15.3" + resolved "https://registry.yarnpkg.com/spago/-/spago-0.15.3.tgz#348de88f2aa499abaee9289b7d66e1e049807f0c" + integrity sha512-CNpbJiI+6MPpttbCtGIGFUroegXze4I7joXCTfiiTRzOUKcMV925fm7dxyAa3AVUUUvGi3D55k65aniGR1cVMA== dependencies: request "^2.88.0" tar "^4.4.8" From 7595841a6c5b78575e2df740ef7c01ebb41fecf1 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 12:35:41 +0900 Subject: [PATCH 03/37] Added monad instance for Signal --- src/Wire/Signal.purs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index 4dedf68..c277f1d 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -77,3 +77,8 @@ instance applySignal :: Apply Signal where instance applicativeSignal :: Applicative Signal where pure a = Signal { event: empty, read: pure a } + +instance bindSignal :: Bind Signal where + bind (Signal s) f = Signal { event: s.event >>= f >>> event, read: s.read >>= f >>> read } + +instance monadSignal :: Monad Signal From 89687b5332d0e469bb6c507712931354d4dda9c3 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 13:01:11 +0900 Subject: [PATCH 04/37] Renaming and refactoring --- src/Wire/Store.purs | 23 ++++++++++------------- src/Wire/Store/Atom.purs | 6 +----- src/Wire/Store/Atom/Async.purs | 26 +++++++++++++------------- src/Wire/Store/Atom/Pure.purs | 20 ++++++++++---------- src/Wire/Store/Atom/Sync.purs | 21 ++++++++++----------- src/Wire/Store/Atom/Types.purs | 8 ++++---- 6 files changed, 48 insertions(+), 56 deletions(-) diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index c116d67..14b44f9 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -1,7 +1,7 @@ module Wire.Store where import Prelude -import Data.Maybe (Maybe, fromJust) +import Data.Maybe (fromJust) import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) import Effect (Effect) import Foreign.Object (Object) @@ -9,11 +9,11 @@ import Foreign.Object as Object import Partial.Unsafe (unsafePartial) import Prim.Row (class Cons, class Lacks) import Unsafe.Coerce (unsafeCoerce) -import Wire.Signal (Signal) import Wire.Store.Atom (Atom(..)) import Wire.Store.Atom.Async as Async import Wire.Store.Atom.Pure as Pure import Wire.Store.Atom.Sync as Sync +import Wire.Store.Atom.Types (AtomSignal) newtype Store (atoms :: # Type) = Store { atoms :: Object Compressed } @@ -23,13 +23,13 @@ empty = Store { atoms: Object.empty } insert :: forall key value before after. IsSymbol key => Lacks key before => Cons key value before after => Atom key value -> Store before -> Effect (Store after) insert atom (Store store) = do - atomStore <- case atom of - Async a -> Async.createStore a - Sync a -> Sync.createStore a - Pure a -> Pure.createStore a - pure $ Store store { atoms = Object.insert (reflectSymbol (SProxy :: _ key)) (compress atomStore) store.atoms } + signal <- case atom of + Async a -> Async.createSignal a + Sync a -> Sync.createSignal a + Pure a -> Pure.createSignal a + pure $ Store store { atoms = Object.insert (reflectSymbol (SProxy :: _ key)) (compress signal) store.atoms } -lookup :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> AtomStore value +lookup :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> AtomSignal value lookup _ (Store { atoms }) = inflate $ unsafePartial fromJust $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms reset :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> Effect Unit @@ -48,13 +48,10 @@ update value atom = Sync a -> Sync.update value a Pure a -> Pure.update value a -type AtomStore a - = { signal :: Signal (Maybe a), write :: Maybe a -> Effect Unit } - data Compressed -compress :: forall a. AtomStore a -> Compressed +compress :: forall a. AtomSignal a -> Compressed compress = unsafeCoerce -inflate :: forall a. Compressed -> AtomStore a +inflate :: forall a. Compressed -> AtomSignal a inflate = unsafeCoerce diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index 9d155d5..8bc72bf 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -1,16 +1,12 @@ module Wire.Store.Atom where import Prelude -import Data.Maybe (Maybe(..)) import Effect (Effect) import Effect.Aff (Aff) -import Wire.Signal as Signal import Wire.Store.Atom.Async (Async(..)) -import Wire.Store.Atom.Async as Async import Wire.Store.Atom.Pure (Pure(..)) import Wire.Store.Atom.Sync (Sync(..)) -import Wire.Store.Atom.Sync as Sync -import Wire.Store.Atom.Types (AtomStore, Lifecycle, Handler) +import Wire.Store.Atom.Types (Handler, Lifecycle) data Atom (key :: Symbol) a = Async (Async a) diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index fa9d520..ba51d2e 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,7 +5,7 @@ import Control.Monad.Free.Trans (FreeT) import Data.Maybe (Maybe(..)) import Effect (Effect) import Effect.Aff (Aff, launchAff_) -import Wire.Store.Atom.Types (AtomF, AtomStore, Lifecycle(..), createEmptyStore, interpret) +import Wire.Store.Atom.Types (AtomF, AtomSignal, Lifecycle(..), createEmptySignal, interpret) newtype Async a = Async' (Lifecycle a -> Handler a) @@ -13,19 +13,19 @@ newtype Async a type Handler a = FreeT (AtomF a) Aff Unit -createStore :: forall a. Async a -> Effect (AtomStore a) -createStore (Async' handler) = do - store <- createEmptyStore - run (handler Init) store - pure store +createSignal :: forall a. Async a -> Effect (AtomSignal a) +createSignal (Async' handler) = do + signal <- createEmptySignal + run (handler Init) signal + pure signal -run :: forall a. Handler a -> AtomStore a -> Effect Unit -run handler store = launchAff_ $ interpret store handler +run :: forall a. Handler a -> AtomSignal a -> Effect Unit +run handler signal = launchAff_ $ interpret signal handler -reset :: forall a. Async a -> AtomStore a -> Effect Unit -reset (Async' handler) store@{ write } = do - write Nothing - run (handler Init) store +reset :: forall a. Async a -> AtomSignal a -> Effect Unit +reset (Async' handler) signal = do + signal.write Nothing + run (handler Init) signal -update :: forall a. a -> Async a -> AtomStore a -> Effect Unit +update :: forall a. a -> Async a -> AtomSignal a -> Effect Unit update value (Async' handler) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index db69f45..e2ededf 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -2,19 +2,19 @@ module Wire.Store.Atom.Pure where import Prelude import Effect (Effect) -import Wire.Store.Atom.Types (AtomStore, createEmptyStore) +import Wire.Store.Atom.Types (AtomSignal, createEmptySignal) newtype Pure a = Pure' a -createStore :: forall a. Pure a -> Effect (AtomStore a) -createStore (Pure' value) = do - store <- createEmptyStore - store.write (pure value) - pure store +createSignal :: forall a. Pure a -> Effect (AtomSignal a) +createSignal (Pure' value) = do + signal <- createEmptySignal + signal.write (pure value) + pure signal -reset :: forall a. Pure a -> AtomStore a -> Effect Unit -reset (Pure' value) store = store.write (pure value) +reset :: forall a. Pure a -> AtomSignal a -> Effect Unit +reset (Pure' value) signal = signal.write (pure value) -update :: forall a. a -> Pure a -> AtomStore a -> Effect Unit -update value _ store = store.write (pure value) +update :: forall a. a -> Pure a -> AtomSignal a -> Effect Unit +update value _ signal = signal.write (pure value) diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index a07f253..1dc36df 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -3,7 +3,7 @@ module Wire.Store.Atom.Sync where import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) -import Wire.Store.Atom.Types (AtomF, AtomStore, Lifecycle(..), createEmptyStore, interpret) +import Wire.Store.Atom.Types (AtomF, AtomSignal, Lifecycle(..), createEmptySignal, interpret) newtype Sync a = Sync' (Lifecycle a -> Handler a) @@ -11,18 +11,17 @@ newtype Sync a type Handler a = FreeT (AtomF a) Effect Unit -createStore :: forall a. Sync a -> Effect (AtomStore a) -createStore (Sync' handler) = do - store <- createEmptyStore - run (handler Init) store - pure store +createSignal :: forall a. Sync a -> Effect (AtomSignal a) +createSignal (Sync' handler) = do + signal <- createEmptySignal + run (handler Init) signal + pure signal -run :: forall a. Handler a -> AtomStore a -> Effect Unit +run :: forall a. Handler a -> AtomSignal a -> Effect Unit run = flip interpret -reset :: forall a. Sync a -> AtomStore a -> Effect Unit -reset (Sync' handler) store@{ write } = do - run (handler Init) store +reset :: forall a. Sync a -> AtomSignal a -> Effect Unit +reset (Sync' handler) signal = run (handler Init) signal -update :: forall a. a -> Sync a -> AtomStore a -> Effect Unit +update :: forall a. a -> Sync a -> AtomSignal a -> Effect Unit update value (Sync' handler) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index dca3b0a..6c34e44 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -25,7 +25,7 @@ peek = liftFreeT $ Peek identity poke :: forall a m. Monad m => a -> FreeT (AtomF a) m Unit poke a = liftFreeT $ Poke a unit -interpret :: forall a m. MonadEffect m => MonadRec m => AtomStore a -> FreeT (AtomF a) m Unit -> m Unit +interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomF a) m Unit -> m Unit interpret store = runFreeT case _ of Peek next -> do @@ -35,13 +35,13 @@ interpret store = liftEffect (store.write (pure a)) pure next -type AtomStore a +type AtomSignal a = { signal :: Signal (Maybe a) , write :: Maybe a -> Effect Unit } -createEmptyStore :: forall a. Effect (AtomStore a) -createEmptyStore = do +createEmptySignal :: forall a. Effect (AtomSignal a) +createEmptySignal = do { signal, write } <- Signal.create Nothing pure { signal, write } From c46027c6547fc35a34d7331b0e427c9ff292a8b7 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 14:25:01 +0900 Subject: [PATCH 05/37] Some renaming --- src/Wire/Store.purs | 8 ++++---- src/Wire/Store/Atom.purs | 6 +++--- src/Wire/Store/Atom/Async.purs | 16 ++++++++-------- src/Wire/Store/Atom/Pure.purs | 8 ++++---- src/Wire/Store/Atom/Sync.purs | 16 ++++++++-------- src/Wire/Store/Atom/Types.purs | 20 ++++++++++---------- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 14b44f9..6144f9c 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -13,7 +13,7 @@ import Wire.Store.Atom (Atom(..)) import Wire.Store.Atom.Async as Async import Wire.Store.Atom.Pure as Pure import Wire.Store.Atom.Sync as Sync -import Wire.Store.Atom.Types (AtomSignal) +import Wire.Store.Atom.Types (StoreSignal) newtype Store (atoms :: # Type) = Store { atoms :: Object Compressed } @@ -29,7 +29,7 @@ insert atom (Store store) = do Pure a -> Pure.createSignal a pure $ Store store { atoms = Object.insert (reflectSymbol (SProxy :: _ key)) (compress signal) store.atoms } -lookup :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> AtomSignal value +lookup :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> StoreSignal value lookup _ (Store { atoms }) = inflate $ unsafePartial fromJust $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms reset :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> Effect Unit @@ -50,8 +50,8 @@ update value atom = data Compressed -compress :: forall a. AtomSignal a -> Compressed +compress :: forall a. StoreSignal a -> Compressed compress = unsafeCoerce -inflate :: forall a. Compressed -> AtomSignal a +inflate :: forall a. Compressed -> StoreSignal a inflate = unsafeCoerce diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index 8bc72bf..de2106a 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -6,17 +6,17 @@ import Effect.Aff (Aff) import Wire.Store.Atom.Async (Async(..)) import Wire.Store.Atom.Pure (Pure(..)) import Wire.Store.Atom.Sync (Sync(..)) -import Wire.Store.Atom.Types (Handler, Lifecycle) +import Wire.Store.Atom.Types (Handler, Action) data Atom (key :: Symbol) a = Async (Async a) | Sync (Sync a) | Pure (Pure a) -makeAsync :: forall a key. (Lifecycle a -> Handler Aff a) -> Atom key a +makeAsync :: forall a key. (Action a -> Handler Aff a) -> Atom key a makeAsync = Async <<< Async' -makeSync :: forall a key. (Lifecycle a -> Handler Effect a) -> Atom key a +makeSync :: forall a key. (Action a -> Handler Effect a) -> Atom key a makeSync = Sync <<< Sync' makePure :: forall a key. a -> Atom key a diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index ba51d2e..b1d4f0b 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,27 +5,27 @@ import Control.Monad.Free.Trans (FreeT) import Data.Maybe (Maybe(..)) import Effect (Effect) import Effect.Aff (Aff, launchAff_) -import Wire.Store.Atom.Types (AtomF, AtomSignal, Lifecycle(..), createEmptySignal, interpret) +import Wire.Store.Atom.Types (AtomF, StoreSignal, Action(..), createEmptySignal, interpret) newtype Async a - = Async' (Lifecycle a -> Handler a) + = Async' (Action a -> Handler a) type Handler a = FreeT (AtomF a) Aff Unit -createSignal :: forall a. Async a -> Effect (AtomSignal a) +createSignal :: forall a. Async a -> Effect (StoreSignal a) createSignal (Async' handler) = do signal <- createEmptySignal - run (handler Init) signal + run (handler Initialize) signal pure signal -run :: forall a. Handler a -> AtomSignal a -> Effect Unit +run :: forall a. Handler a -> StoreSignal a -> Effect Unit run handler signal = launchAff_ $ interpret signal handler -reset :: forall a. Async a -> AtomSignal a -> Effect Unit +reset :: forall a. Async a -> StoreSignal a -> Effect Unit reset (Async' handler) signal = do signal.write Nothing - run (handler Init) signal + run (handler Initialize) signal -update :: forall a. a -> Async a -> AtomSignal a -> Effect Unit +update :: forall a. a -> Async a -> StoreSignal a -> Effect Unit update value (Async' handler) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index e2ededf..f3f0af5 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -2,19 +2,19 @@ module Wire.Store.Atom.Pure where import Prelude import Effect (Effect) -import Wire.Store.Atom.Types (AtomSignal, createEmptySignal) +import Wire.Store.Atom.Types (StoreSignal, createEmptySignal) newtype Pure a = Pure' a -createSignal :: forall a. Pure a -> Effect (AtomSignal a) +createSignal :: forall a. Pure a -> Effect (StoreSignal a) createSignal (Pure' value) = do signal <- createEmptySignal signal.write (pure value) pure signal -reset :: forall a. Pure a -> AtomSignal a -> Effect Unit +reset :: forall a. Pure a -> StoreSignal a -> Effect Unit reset (Pure' value) signal = signal.write (pure value) -update :: forall a. a -> Pure a -> AtomSignal a -> Effect Unit +update :: forall a. a -> Pure a -> StoreSignal a -> Effect Unit update value _ signal = signal.write (pure value) diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index 1dc36df..ec81c98 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -3,25 +3,25 @@ module Wire.Store.Atom.Sync where import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) -import Wire.Store.Atom.Types (AtomF, AtomSignal, Lifecycle(..), createEmptySignal, interpret) +import Wire.Store.Atom.Types (AtomF, StoreSignal, Action(..), createEmptySignal, interpret) newtype Sync a - = Sync' (Lifecycle a -> Handler a) + = Sync' (Action a -> Handler a) type Handler a = FreeT (AtomF a) Effect Unit -createSignal :: forall a. Sync a -> Effect (AtomSignal a) +createSignal :: forall a. Sync a -> Effect (StoreSignal a) createSignal (Sync' handler) = do signal <- createEmptySignal - run (handler Init) signal + run (handler Initialize) signal pure signal -run :: forall a. Handler a -> AtomSignal a -> Effect Unit +run :: forall a. Handler a -> StoreSignal a -> Effect Unit run = flip interpret -reset :: forall a. Sync a -> AtomSignal a -> Effect Unit -reset (Sync' handler) signal = run (handler Init) signal +reset :: forall a. Sync a -> StoreSignal a -> Effect Unit +reset (Sync' handler) signal = run (handler Initialize) signal -update :: forall a. a -> Sync a -> AtomSignal a -> Effect Unit +update :: forall a. a -> Sync a -> StoreSignal a -> Effect Unit update value (Sync' handler) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index 6c34e44..b7a5fcd 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -25,7 +25,7 @@ peek = liftFreeT $ Peek identity poke :: forall a m. Monad m => a -> FreeT (AtomF a) m Unit poke a = liftFreeT $ Poke a unit -interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomF a) m Unit -> m Unit +interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomF a) m Unit -> m Unit interpret store = runFreeT case _ of Peek next -> do @@ -35,26 +35,26 @@ interpret store = liftEffect (store.write (pure a)) pure next -type AtomSignal a +type StoreSignal a = { signal :: Signal (Maybe a) , write :: Maybe a -> Effect Unit } -createEmptySignal :: forall a. Effect (AtomSignal a) +createEmptySignal :: forall a. Effect (StoreSignal a) createEmptySignal = do { signal, write } <- Signal.create Nothing pure { signal, write } -data Lifecycle a - = Init +data Action a + = Initialize | Update a -derive instance functorLifecycle :: Functor Lifecycle +derive instance functorAction :: Functor Action -instance foldableMaybe :: Foldable Lifecycle where - foldr _ z Init = z +instance foldableAction :: Foldable Action where + foldr _ z Initialize = z foldr f z (Update x) = x `f` z - foldl _ z Init = z + foldl _ z Initialize = z foldl f z (Update x) = z `f` x - foldMap f Init = mempty + foldMap f Initialize = mempty foldMap f (Update x) = f x From ebb92236a7650b8fe1e073c2cdb7c17c597e37d6 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 14:25:21 +0900 Subject: [PATCH 06/37] Is this magic? --- src/Wire/Store/Selector.purs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 872e22d..c102347 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -1 +1,26 @@ module Wire.Store.Selector where + +import Prelude +import Control.Monad.Free.Trans (FreeT, freeT) +import Control.Monad.Maybe.Trans (MaybeT(..), lift) +import Data.Either (Either(..)) +import Data.Symbol (class IsSymbol) +import Effect (Effect) +import Prim.Row (class Cons) +import Wire.Signal (Signal) +import Wire.Store (Store) +import Wire.Store as Store +import Wire.Store.Atom (Atom) + +data Selector key (atoms :: # Type) a + = Selector' (FreeT (SelectorF atoms) (MaybeT Signal) a) (a -> Effect Unit) + +data SelectorF (atoms :: # Type) next + = Select (Store atoms -> next) + +derive instance functorSelectorF :: Functor (SelectorF atoms) + +select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectorF atoms) (MaybeT Signal) value +select atom = + freeT \_ -> + pure $ Right $ Select \store -> lift $ MaybeT (Store.lookup atom store).signal From e575b1d12d06b30af684fce45be731aa732beba6 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 15:39:51 +0900 Subject: [PATCH 07/37] More selectoring --- src/Wire/Store/Atom/Async.purs | 7 ++++--- src/Wire/Store/Atom/Pure.purs | 6 +++--- src/Wire/Store/Atom/Sync.purs | 8 +++++--- src/Wire/Store/Atom/Types.purs | 33 +++++++++++++++----------------- src/Wire/Store/Selector.purs | 35 +++++++++++++++++++++++++--------- 5 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index b1d4f0b..751a22b 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,17 +5,18 @@ import Control.Monad.Free.Trans (FreeT) import Data.Maybe (Maybe(..)) import Effect (Effect) import Effect.Aff (Aff, launchAff_) -import Wire.Store.Atom.Types (AtomF, StoreSignal, Action(..), createEmptySignal, interpret) +import Wire.Signal as Signal +import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) newtype Async a = Async' (Action a -> Handler a) type Handler a - = FreeT (AtomF a) Aff Unit + = FreeT (AtomicF a) Aff Unit createSignal :: forall a. Async a -> Effect (StoreSignal a) createSignal (Async' handler) = do - signal <- createEmptySignal + signal <- Signal.create Nothing run (handler Initialize) signal pure signal diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index f3f0af5..97fcf19 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -2,15 +2,15 @@ module Wire.Store.Atom.Pure where import Prelude import Effect (Effect) -import Wire.Store.Atom.Types (StoreSignal, createEmptySignal) +import Wire.Signal as Signal +import Wire.Store.Atom.Types (StoreSignal) newtype Pure a = Pure' a createSignal :: forall a. Pure a -> Effect (StoreSignal a) createSignal (Pure' value) = do - signal <- createEmptySignal - signal.write (pure value) + signal <- Signal.create (pure value) pure signal reset :: forall a. Pure a -> StoreSignal a -> Effect Unit diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index ec81c98..f1d049b 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -2,18 +2,20 @@ module Wire.Store.Atom.Sync where import Prelude import Control.Monad.Free.Trans (FreeT) +import Data.Maybe (Maybe(..)) import Effect (Effect) -import Wire.Store.Atom.Types (AtomF, StoreSignal, Action(..), createEmptySignal, interpret) +import Wire.Signal as Signal +import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) newtype Sync a = Sync' (Action a -> Handler a) type Handler a - = FreeT (AtomF a) Effect Unit + = FreeT (AtomicF a) Effect Unit createSignal :: forall a. Sync a -> Effect (StoreSignal a) createSignal (Sync' handler) = do - signal <- createEmptySignal + signal <- Signal.create Nothing run (handler Initialize) signal pure signal diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index b7a5fcd..143f7ef 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -4,47 +4,44 @@ import Prelude import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) import Control.Monad.Rec.Class (class MonadRec) import Data.Foldable (class Foldable) -import Data.Maybe (Maybe(..)) +import Data.Maybe (Maybe) import Effect (Effect) import Effect.Class (class MonadEffect, liftEffect) import Wire.Signal (Signal) import Wire.Signal as Signal -data AtomF a next - = Peek (Maybe a -> next) - | Poke a next +data AtomicF a next + = Read (Maybe a -> next) + | Write a next -derive instance functorAtomF :: Functor (AtomF a) +derive instance functorAtomicF :: Functor (AtomicF a) type Handler m a - = FreeT (AtomF a) m Unit + = FreeT (AtomicF a) m Unit -peek :: forall a m. Monad m => FreeT (AtomF a) m (Maybe a) -peek = liftFreeT $ Peek identity +read :: forall a m. Monad m => FreeT (AtomicF a) m (Maybe a) +read = liftFreeT $ Read identity -poke :: forall a m. Monad m => a -> FreeT (AtomF a) m Unit -poke a = liftFreeT $ Poke a unit +write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit +write a = liftFreeT $ Write a unit -interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomF a) m Unit -> m Unit +interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomicF a) m Unit -> m Unit interpret store = runFreeT case _ of - Peek next -> do + Read next -> do a <- liftEffect (Signal.read store.signal) pure (next a) - Poke a next -> do + Write a next -> do liftEffect (store.write (pure a)) pure next type StoreSignal a = { signal :: Signal (Maybe a) , write :: Maybe a -> Effect Unit + , modify :: (Maybe a -> Maybe a) -> Effect Unit + , cancel :: Effect Unit } -createEmptySignal :: forall a. Effect (StoreSignal a) -createEmptySignal = do - { signal, write } <- Signal.create Nothing - pure { signal, write } - data Action a = Initialize | Update a diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index c102347..b1e6a71 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -4,23 +4,40 @@ import Prelude import Control.Monad.Free.Trans (FreeT, freeT) import Control.Monad.Maybe.Trans (MaybeT(..), lift) import Data.Either (Either(..)) +import Data.Maybe (Maybe) import Data.Symbol (class IsSymbol) import Effect (Effect) import Prim.Row (class Cons) import Wire.Signal (Signal) +import Wire.Signal as Signal import Wire.Store (Store) import Wire.Store as Store import Wire.Store.Atom (Atom) -data Selector key (atoms :: # Type) a - = Selector' (FreeT (SelectorF atoms) (MaybeT Signal) a) (a -> Effect Unit) +newtype Selector key (atoms :: # Type) a + = Selector' + { select :: FreeT (SelectF atoms) (MaybeT Signal) a + , update :: a -> FreeT (SelectF atoms) Effect Unit + } -data SelectorF (atoms :: # Type) next - = Select (Store atoms -> next) +makeSelector :: + forall a atoms key. + { select :: FreeT (SelectF atoms) (MaybeT Signal) a + , update :: a -> FreeT (SelectF atoms) Effect Unit + } -> + Selector key atoms a +makeSelector = Selector' -derive instance functorSelectorF :: Functor (SelectorF atoms) +data SelectF (atoms :: # Type) next + = Apply (Store atoms -> next) -select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectorF atoms) (MaybeT Signal) value -select atom = - freeT \_ -> - pure $ Right $ Select \store -> lift $ MaybeT (Store.lookup atom store).signal +derive instance functorSelectF :: Functor (SelectF atoms) + +select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) (MaybeT Signal) value +select atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ MaybeT (Store.lookup atom store).signal + +read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Effect (Maybe value) +read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.lookup atom store).signal + +write :: forall r atoms value key. IsSymbol key => Cons key value r atoms => value -> Atom key value -> FreeT (SelectF atoms) Effect Unit +write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ (Store.lookup atom store).write $ pure value From 1549ef4cef8b78e66f9fa3a0a3f2741f5f602a20 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 15:41:32 +0900 Subject: [PATCH 08/37] Removed MaybeT --- src/Wire/Store/Selector.purs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index b1e6a71..49a45c8 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -2,7 +2,7 @@ module Wire.Store.Selector where import Prelude import Control.Monad.Free.Trans (FreeT, freeT) -import Control.Monad.Maybe.Trans (MaybeT(..), lift) +import Control.Monad.Trans.Class (lift) import Data.Either (Either(..)) import Data.Maybe (Maybe) import Data.Symbol (class IsSymbol) @@ -16,13 +16,13 @@ import Wire.Store.Atom (Atom) newtype Selector key (atoms :: # Type) a = Selector' - { select :: FreeT (SelectF atoms) (MaybeT Signal) a + { select :: FreeT (SelectF atoms) Signal a , update :: a -> FreeT (SelectF atoms) Effect Unit } makeSelector :: forall a atoms key. - { select :: FreeT (SelectF atoms) (MaybeT Signal) a + { select :: FreeT (SelectF atoms) Signal a , update :: a -> FreeT (SelectF atoms) Effect Unit } -> Selector key atoms a @@ -33,8 +33,8 @@ data SelectF (atoms :: # Type) next derive instance functorSelectF :: Functor (SelectF atoms) -select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) (MaybeT Signal) value -select atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ MaybeT (Store.lookup atom store).signal +select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Signal (Maybe value) +select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.lookup atom store).signal read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Effect (Maybe value) read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.lookup atom store).signal From 6567adfbf6127ab0d49a71f6d2e2df85dd02d99e Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 15:57:14 +0900 Subject: [PATCH 09/37] Remove Maybe, added defaults --- src/Wire/Store/Atom.purs | 8 ++++---- src/Wire/Store/Atom/Async.purs | 16 +++++++++------- src/Wire/Store/Atom/Pure.purs | 6 +++--- src/Wire/Store/Atom/Sync.purs | 16 ++++++++++------ src/Wire/Store/Atom/Types.purs | 13 ++++++------- src/Wire/Store/Selector.purs | 7 +++---- 6 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index de2106a..971dd4a 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -13,11 +13,11 @@ data Atom (key :: Symbol) a | Sync (Sync a) | Pure (Pure a) -makeAsync :: forall a key. (Action a -> Handler Aff a) -> Atom key a -makeAsync = Async <<< Async' +makeAsync :: forall a key. a -> (Action a -> Handler Aff a) -> Atom key a +makeAsync default handler = Async (Async' { default, handler }) -makeSync :: forall a key. (Action a -> Handler Effect a) -> Atom key a -makeSync = Sync <<< Sync' +makeSync :: forall a key. a -> (Action a -> Handler Effect a) -> Atom key a +makeSync default handler = Sync (Sync' { default, handler }) makePure :: forall a key. a -> Atom key a makePure = Pure <<< Pure' diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 751a22b..1ae0146 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -2,21 +2,23 @@ module Wire.Store.Atom.Async where import Prelude import Control.Monad.Free.Trans (FreeT) -import Data.Maybe (Maybe(..)) import Effect (Effect) import Effect.Aff (Aff, launchAff_) import Wire.Signal as Signal import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) newtype Async a - = Async' (Action a -> Handler a) + = Async' + { default :: a + , handler :: Action a -> Handler a + } type Handler a = FreeT (AtomicF a) Aff Unit createSignal :: forall a. Async a -> Effect (StoreSignal a) -createSignal (Async' handler) = do - signal <- Signal.create Nothing +createSignal (Async' { default, handler }) = do + signal <- Signal.create default run (handler Initialize) signal pure signal @@ -24,9 +26,9 @@ run :: forall a. Handler a -> StoreSignal a -> Effect Unit run handler signal = launchAff_ $ interpret signal handler reset :: forall a. Async a -> StoreSignal a -> Effect Unit -reset (Async' handler) signal = do - signal.write Nothing +reset (Async' { default, handler }) signal = do + signal.write default run (handler Initialize) signal update :: forall a. a -> Async a -> StoreSignal a -> Effect Unit -update value (Async' handler) = run (handler (Update value)) +update value (Async' { handler }) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 97fcf19..815872f 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -10,11 +10,11 @@ newtype Pure a createSignal :: forall a. Pure a -> Effect (StoreSignal a) createSignal (Pure' value) = do - signal <- Signal.create (pure value) + signal <- Signal.create value pure signal reset :: forall a. Pure a -> StoreSignal a -> Effect Unit -reset (Pure' value) signal = signal.write (pure value) +reset (Pure' value) signal = signal.write value update :: forall a. a -> Pure a -> StoreSignal a -> Effect Unit -update value _ signal = signal.write (pure value) +update value _ signal = signal.write value diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index f1d049b..d97c52e 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -2,20 +2,22 @@ module Wire.Store.Atom.Sync where import Prelude import Control.Monad.Free.Trans (FreeT) -import Data.Maybe (Maybe(..)) import Effect (Effect) import Wire.Signal as Signal import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) newtype Sync a - = Sync' (Action a -> Handler a) + = Sync' + { default :: a + , handler :: Action a -> Handler a + } type Handler a = FreeT (AtomicF a) Effect Unit createSignal :: forall a. Sync a -> Effect (StoreSignal a) -createSignal (Sync' handler) = do - signal <- Signal.create Nothing +createSignal (Sync' { default, handler }) = do + signal <- Signal.create default run (handler Initialize) signal pure signal @@ -23,7 +25,9 @@ run :: forall a. Handler a -> StoreSignal a -> Effect Unit run = flip interpret reset :: forall a. Sync a -> StoreSignal a -> Effect Unit -reset (Sync' handler) signal = run (handler Initialize) signal +reset (Sync' { default, handler }) signal = do + signal.write default + run (handler Initialize) signal update :: forall a. a -> Sync a -> StoreSignal a -> Effect Unit -update value (Sync' handler) = run (handler (Update value)) +update value (Sync' { handler }) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index 143f7ef..a389df1 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -4,14 +4,13 @@ import Prelude import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) import Control.Monad.Rec.Class (class MonadRec) import Data.Foldable (class Foldable) -import Data.Maybe (Maybe) import Effect (Effect) import Effect.Class (class MonadEffect, liftEffect) import Wire.Signal (Signal) import Wire.Signal as Signal data AtomicF a next - = Read (Maybe a -> next) + = Read (a -> next) | Write a next derive instance functorAtomicF :: Functor (AtomicF a) @@ -19,7 +18,7 @@ derive instance functorAtomicF :: Functor (AtomicF a) type Handler m a = FreeT (AtomicF a) m Unit -read :: forall a m. Monad m => FreeT (AtomicF a) m (Maybe a) +read :: forall a m. Monad m => FreeT (AtomicF a) m a read = liftFreeT $ Read identity write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit @@ -32,13 +31,13 @@ interpret store = a <- liftEffect (Signal.read store.signal) pure (next a) Write a next -> do - liftEffect (store.write (pure a)) + liftEffect (store.write a) pure next type StoreSignal a - = { signal :: Signal (Maybe a) - , write :: Maybe a -> Effect Unit - , modify :: (Maybe a -> Maybe a) -> Effect Unit + = { signal :: Signal a + , write :: a -> Effect Unit + , modify :: (a -> a) -> Effect Unit , cancel :: Effect Unit } diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 49a45c8..bb9ca00 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -4,7 +4,6 @@ import Prelude import Control.Monad.Free.Trans (FreeT, freeT) import Control.Monad.Trans.Class (lift) import Data.Either (Either(..)) -import Data.Maybe (Maybe) import Data.Symbol (class IsSymbol) import Effect (Effect) import Prim.Row (class Cons) @@ -33,11 +32,11 @@ data SelectF (atoms :: # Type) next derive instance functorSelectF :: Functor (SelectF atoms) -select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Signal (Maybe value) +select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Signal value select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.lookup atom store).signal -read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Effect (Maybe value) +read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Effect value read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.lookup atom store).signal write :: forall r atoms value key. IsSymbol key => Cons key value r atoms => value -> Atom key value -> FreeT (SelectF atoms) Effect Unit -write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ (Store.lookup atom store).write $ pure value +write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ (Store.lookup atom store).write value From 3cb4e3a9d8632d694cdccc50ba5a99f892deeae3 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 15:58:56 +0900 Subject: [PATCH 10/37] Changed to proper atom update call --- src/Wire/Store/Selector.purs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index bb9ca00..e115a69 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -39,4 +39,4 @@ read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.lookup atom store).signal write :: forall r atoms value key. IsSymbol key => Cons key value r atoms => value -> Atom key value -> FreeT (SelectF atoms) Effect Unit -write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ (Store.lookup atom store).write value +write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update value atom store From 71f952e9d6d74e2d1f3f67a2ce8befe05c533b66 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 16:07:07 +0900 Subject: [PATCH 11/37] Reworked AtomicF --- src/Wire/Store/Atom/Types.purs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index a389df1..8279392 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -10,8 +10,7 @@ import Wire.Signal (Signal) import Wire.Signal as Signal data AtomicF a next - = Read (a -> next) - | Write a next + = Modify (a -> a) (a -> next) derive instance functorAtomicF :: Functor (AtomicF a) @@ -19,20 +18,24 @@ type Handler m a = FreeT (AtomicF a) m Unit read :: forall a m. Monad m => FreeT (AtomicF a) m a -read = liftFreeT $ Read identity +read = liftFreeT $ Modify identity identity write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit -write a = liftFreeT $ Write a unit +write a = liftFreeT $ Modify (const a) (const unit) + +modify :: forall m a. Monad m => (a -> a) -> FreeT (AtomicF a) m a +modify f = liftFreeT $ Modify f identity + +modify_ :: forall m a. Monad m => (a -> a) -> FreeT (AtomicF a) m Unit +modify_ f = liftFreeT $ Modify f (const unit) interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomicF a) m Unit -> m Unit interpret store = runFreeT case _ of - Read next -> do + Modify f next -> do + liftEffect (store.modify f) a <- liftEffect (Signal.read store.signal) pure (next a) - Write a next -> do - liftEffect (store.write a) - pure next type StoreSignal a = { signal :: Signal a From a753c68480107caafff326ff9efa2526475edc97 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 16:09:16 +0900 Subject: [PATCH 12/37] Renamed AtomicF to StateF --- src/Wire/Store/Atom/Async.purs | 4 ++-- src/Wire/Store/Atom/Sync.purs | 4 ++-- src/Wire/Store/Atom/Types.purs | 28 ++++++++++++++-------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 1ae0146..915b34e 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,7 +5,7 @@ import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Effect.Aff (Aff, launchAff_) import Wire.Signal as Signal -import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) +import Wire.Store.Atom.Types (StateF, StoreSignal, Action(..), interpret) newtype Async a = Async' @@ -14,7 +14,7 @@ newtype Async a } type Handler a - = FreeT (AtomicF a) Aff Unit + = FreeT (StateF a) Aff Unit createSignal :: forall a. Async a -> Effect (StoreSignal a) createSignal (Async' { default, handler }) = do diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index d97c52e..9748bb8 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -4,7 +4,7 @@ import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Wire.Signal as Signal -import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) +import Wire.Store.Atom.Types (StateF, StoreSignal, Action(..), interpret) newtype Sync a = Sync' @@ -13,7 +13,7 @@ newtype Sync a } type Handler a - = FreeT (AtomicF a) Effect Unit + = FreeT (StateF a) Effect Unit createSignal :: forall a. Sync a -> Effect (StoreSignal a) createSignal (Sync' { default, handler }) = do diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index 8279392..e0201ec 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -9,30 +9,30 @@ import Effect.Class (class MonadEffect, liftEffect) import Wire.Signal (Signal) import Wire.Signal as Signal -data AtomicF a next - = Modify (a -> a) (a -> next) +data StateF a next + = State (a -> a) (a -> next) -derive instance functorAtomicF :: Functor (AtomicF a) +derive instance functorStateF :: Functor (StateF a) type Handler m a - = FreeT (AtomicF a) m Unit + = FreeT (StateF a) m Unit -read :: forall a m. Monad m => FreeT (AtomicF a) m a -read = liftFreeT $ Modify identity identity +read :: forall a m. Monad m => FreeT (StateF a) m a +read = liftFreeT $ State identity identity -write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit -write a = liftFreeT $ Modify (const a) (const unit) +write :: forall a m. Monad m => a -> FreeT (StateF a) m Unit +write a = liftFreeT $ State (const a) (const unit) -modify :: forall m a. Monad m => (a -> a) -> FreeT (AtomicF a) m a -modify f = liftFreeT $ Modify f identity +modify :: forall m a. Monad m => (a -> a) -> FreeT (StateF a) m a +modify f = liftFreeT $ State f identity -modify_ :: forall m a. Monad m => (a -> a) -> FreeT (AtomicF a) m Unit -modify_ f = liftFreeT $ Modify f (const unit) +modify_ :: forall m a. Monad m => (a -> a) -> FreeT (StateF a) m Unit +modify_ f = liftFreeT $ State f (const unit) -interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomicF a) m Unit -> m Unit +interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (StateF a) m Unit -> m Unit interpret store = runFreeT case _ of - Modify f next -> do + State f next -> do liftEffect (store.modify f) a <- liftEffect (Signal.read store.signal) pure (next a) From c4019dacab820fac51676add1c8ae5ec0df051c3 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 16:11:15 +0900 Subject: [PATCH 13/37] Reverted changes to AtomicF for performance reasons --- src/Wire/Store/Atom/Async.purs | 4 ++-- src/Wire/Store/Atom/Sync.purs | 4 ++-- src/Wire/Store/Atom/Types.purs | 31 ++++++++++++++----------------- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 915b34e..1ae0146 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,7 +5,7 @@ import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Effect.Aff (Aff, launchAff_) import Wire.Signal as Signal -import Wire.Store.Atom.Types (StateF, StoreSignal, Action(..), interpret) +import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) newtype Async a = Async' @@ -14,7 +14,7 @@ newtype Async a } type Handler a - = FreeT (StateF a) Aff Unit + = FreeT (AtomicF a) Aff Unit createSignal :: forall a. Async a -> Effect (StoreSignal a) createSignal (Async' { default, handler }) = do diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index 9748bb8..d97c52e 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -4,7 +4,7 @@ import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Wire.Signal as Signal -import Wire.Store.Atom.Types (StateF, StoreSignal, Action(..), interpret) +import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) newtype Sync a = Sync' @@ -13,7 +13,7 @@ newtype Sync a } type Handler a - = FreeT (StateF a) Effect Unit + = FreeT (AtomicF a) Effect Unit createSignal :: forall a. Sync a -> Effect (StoreSignal a) createSignal (Sync' { default, handler }) = do diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index e0201ec..a389df1 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -9,33 +9,30 @@ import Effect.Class (class MonadEffect, liftEffect) import Wire.Signal (Signal) import Wire.Signal as Signal -data StateF a next - = State (a -> a) (a -> next) +data AtomicF a next + = Read (a -> next) + | Write a next -derive instance functorStateF :: Functor (StateF a) +derive instance functorAtomicF :: Functor (AtomicF a) type Handler m a - = FreeT (StateF a) m Unit + = FreeT (AtomicF a) m Unit -read :: forall a m. Monad m => FreeT (StateF a) m a -read = liftFreeT $ State identity identity +read :: forall a m. Monad m => FreeT (AtomicF a) m a +read = liftFreeT $ Read identity -write :: forall a m. Monad m => a -> FreeT (StateF a) m Unit -write a = liftFreeT $ State (const a) (const unit) +write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit +write a = liftFreeT $ Write a unit -modify :: forall m a. Monad m => (a -> a) -> FreeT (StateF a) m a -modify f = liftFreeT $ State f identity - -modify_ :: forall m a. Monad m => (a -> a) -> FreeT (StateF a) m Unit -modify_ f = liftFreeT $ State f (const unit) - -interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (StateF a) m Unit -> m Unit +interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomicF a) m Unit -> m Unit interpret store = runFreeT case _ of - State f next -> do - liftEffect (store.modify f) + Read next -> do a <- liftEffect (Signal.read store.signal) pure (next a) + Write a next -> do + liftEffect (store.write a) + pure next type StoreSignal a = { signal :: Signal a From 79279a8bc919779f3af560a766ac2c19c3dcb85d Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 18:27:40 +0900 Subject: [PATCH 14/37] Got it working --- .gitignore | 2 + package.json | 4 + spago.dhall | 1 + src/Wire/Event.purs | 95 +- src/Wire/Event/Time.purs | 35 - src/Wire/Event/Transformer.purs | 60 - src/Wire/Signal.purs | 58 +- src/Wire/Store.purs | 57 +- src/Wire/Store/Atom/Async.purs | 10 +- src/Wire/Store/Atom/Pure.purs | 8 +- src/Wire/Store/Atom/Sync.purs | 10 +- src/Wire/Store/Atom/Types.purs | 5 +- src/Wire/Store/Selector.purs | 34 +- test/Main.purs | 79 +- test/index.html | 14 + test/index.js | 1 + yarn.lock | 4777 ++++++++++++++++++++++++++++++- 17 files changed, 4944 insertions(+), 306 deletions(-) delete mode 100644 src/Wire/Event/Time.purs delete mode 100644 src/Wire/Event/Transformer.purs create mode 100644 test/index.html create mode 100644 test/index.js diff --git a/.gitignore b/.gitignore index 30efe19..4a07308 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ /.purs* /.psa* /.spago +/.cache +/dist diff --git a/package.json b/package.json index 9065203..16addbf 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,18 @@ "main": "index.js", "scripts": { "build": "spago build", + "serve": "spago --config spago.test.dhall build && parcel serve test/index.html", "test": "spago --config spago.test.dhall test" }, "author": "", "license": "ISC", "devDependencies": { + "parcel-bundler": "^1.12.4", "purescript": "^0.13.8", "purescript-psa": "^0.7.3", "purty": "^6.2.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", "spago": "^0.15.3" } } diff --git a/spago.dhall b/spago.dhall index 971ce49..a428b2f 100644 --- a/spago.dhall +++ b/spago.dhall @@ -11,6 +11,7 @@ You can edit this file as you like. , "freet" , "leibniz" , "profunctor" + , "react-basic-hooks" , "refs" , "unsafe-reference" ] diff --git a/src/Wire/Event.purs b/src/Wire/Event.purs index 68c77f4..7ebbe52 100644 --- a/src/Wire/Event.purs +++ b/src/Wire/Event.purs @@ -4,76 +4,58 @@ import Prelude import Control.Alt (class Alt, alt) import Control.Alternative (class Alternative, class Plus, empty) import Control.Apply (lift2) -import Control.Monad.Rec.Class (Step(..), forever, tailRecM) +import Control.Monad.Rec.Class (Step(..), tailRecM) import Data.Array as Array import Data.Either (Either(..), either, hush) import Data.Filterable (class Compactable, class Filterable, filterMap, partitionMap) -import Data.Foldable (class Foldable, for_, sequence_) +import Data.Foldable (class Foldable, for_, sequence_, traverse_) import Data.Maybe (Maybe(..), fromJust, isJust) import Effect (Effect) -import Effect.AVar as AVar -import Effect.Aff (Aff, Milliseconds(..)) +import Effect.Aff (Milliseconds(..)) import Effect.Aff as Aff -import Effect.Aff.AVar as AffVar import Effect.Class (liftEffect) import Effect.Ref as Ref import Partial.Unsafe (unsafePartial) import Unsafe.Reference (unsafeRefEq) newtype Event a - = Event (Subscriber a -> Effect Canceler) + = Event ((a -> Effect Unit) -> Effect (Effect Unit)) -type Subscriber a - = a -> Aff Unit - -type Canceler - = Effect Unit - -create :: forall a. Effect { event :: Event a, push :: a -> Aff Unit, cancel :: Canceler } +create :: forall a. Effect { event :: Event a, push :: a -> Effect Unit } create = do subscribers <- Ref.new [] - queue <- AVar.empty - consumer <- - (Aff.launchAff <<< Aff.supervise <<< forever) do - next <- AffVar.take queue - subs <- liftEffect $ Ref.read subscribers - for_ subs \k -> Aff.forkAff (k next) let event = - Event \emit -> do + Event \notify -> do unsubscribing <- Ref.new false let - isUnsubscribing = liftEffect do Ref.read unsubscribing + isUnsubscribing = Ref.read unsubscribing - subscriber = \a -> unlessM isUnsubscribing do emit a + subscriber = \a -> unlessM isUnsubscribing do notify a Ref.modify_ (flip Array.snoc subscriber) subscribers pure do Ref.write true unsubscribing Ref.modify_ (Array.deleteBy unsafeRefEq subscriber) subscribers - push = flip AffVar.put queue - - cancel = do - Aff.launchAff_ $ Aff.killFiber (Aff.error "shutting down consumer") consumer - AVar.kill (Aff.error "shutting down queue") queue - pure { event, push, cancel } + push a = Ref.read subscribers >>= traverse_ \notify -> notify a + pure { event, push } -makeEvent :: forall a. (Subscriber a -> Effect Canceler) -> Event a +makeEvent :: forall a. ((a -> Effect Unit) -> Effect (Effect Unit)) -> Event a makeEvent = Event -subscribe :: forall a. Event a -> Subscriber a -> Effect Canceler +subscribe :: forall a. Event a -> (a -> Effect Unit) -> Effect (Effect Unit) subscribe (Event event) = event filter :: forall a. (a -> Boolean) -> Event a -> Event a -filter pred (Event event) = Event \emit -> event \a -> if pred a then emit a else pure unit +filter pred (Event event) = Event \notify -> event \a -> if pred a then notify a else pure unit fold :: forall a b. (b -> a -> b) -> b -> Event a -> Event b fold f b (Event event) = - Event \emit -> do + Event \notify -> do accum <- Ref.new b event \a -> do - value <- liftEffect $ Ref.modify (flip f a) accum - emit value + value <- Ref.modify (flip f a) accum + notify value share :: forall a. Event a -> Effect (Event a) share source = do @@ -90,25 +72,25 @@ share source = do decrementCount = do count <- Ref.modify (_ - 1) subscriberCount when (count == 0) do - liftEffect (Ref.read cancelSource) >>= sequence_ + Ref.read cancelSource >>= sequence_ Ref.write Nothing cancelSource event = - Event \emit -> do + Event \notify -> do incrementCount - cancel <- subscribe shared.event emit + cancel <- subscribe shared.event notify pure do cancel *> decrementCount pure event distinct :: forall a. Eq a => Event a -> Event a distinct (Event event) = - Event \emit -> do + Event \notify -> do latest <- Ref.new Nothing event \a -> do - b <- liftEffect $ Ref.read latest + b <- Ref.read latest when (pure a /= b) do - liftEffect $ Ref.write (pure a) latest - emit a + Ref.write (pure a) latest + notify a bufferUntil :: forall b a. Event b -> Event a -> Event (Array a) bufferUntil flush source = @@ -123,27 +105,27 @@ bufferUntil flush source = fromFoldable :: forall a f. Foldable f => f a -> Event a fromFoldable xs = - Event \emit -> do + Event \notify -> do fiber <- Aff.launchAff do for_ xs \x -> do - emit x + liftEffect $ notify x Aff.delay (Milliseconds 0.0) pure do Aff.launchAff_ $ Aff.killFiber (Aff.error "canceled") fiber range :: Int -> Int -> Event Int range start end = - Event \emit -> do + Event \notify -> do let go pos | pos /= end = do - emit pos + liftEffect $ notify pos Aff.delay (Milliseconds 0.0) pure (Loop (pos + step)) go _ = do - emit end + liftEffect $ notify end pure (Done unit) fiber <- Aff.launchAff do tailRecM go start pure do @@ -158,7 +140,7 @@ times n times _ = empty instance functorEvent :: Functor Event where - map f (Event event) = Event \emit -> event (emit <<< f) + map f (Event event) = Event \notify -> event (notify <<< f) instance applyEvent :: Apply Event where apply eventF eventA = @@ -172,18 +154,17 @@ instance applyEvent :: Apply Event where # filterMap (\{ left, right } -> apply left right) instance applicativeEvent :: Applicative Event where - pure a = Event \emit -> Aff.launchAff_ (emit a) *> mempty + pure a = Event \notify -> notify a *> mempty instance bindEvent :: Bind Event where bind (Event outer) f = - Event \emit -> do + Event \notify -> do cancelInner <- Ref.new Nothing cancelOuter <- - outer \a -> - liftEffect do - Ref.read cancelInner >>= sequence_ - cancel <- subscribe (f a) emit - Ref.write (Just cancel) cancelInner + outer \a -> do + Ref.read cancelInner >>= sequence_ + c <- subscribe (f a) notify + Ref.write (Just c) cancelInner pure do Ref.read cancelInner >>= sequence_ cancelOuter @@ -197,9 +178,9 @@ instance alternativeEvent :: Alternative Event instance altEvent :: Alt Event where alt (Event event1) (Event event2) = - Event \emit -> do - cancel1 <- event1 emit - cancel2 <- event2 emit + Event \notify -> do + cancel1 <- event1 notify + cancel2 <- event2 notify pure do cancel1 *> cancel2 instance semigroupEvent :: Semigroup a => Semigroup (Event a) where diff --git a/src/Wire/Event/Time.purs b/src/Wire/Event/Time.purs deleted file mode 100644 index d95b428..0000000 --- a/src/Wire/Event/Time.purs +++ /dev/null @@ -1,35 +0,0 @@ -module Wire.Event.Time where - -import Prelude -import Control.Alt ((<|>)) -import Control.Monad.Rec.Class (forever) -import Data.Time.Duration (class Duration, fromDuration) -import Effect.Aff as Aff -import Wire.Event (Event) -import Wire.Event as Event - -delay :: forall offset a. Duration offset => offset -> Event a -> Event a -delay offset event = do - let - ms = fromDuration offset - Event.makeEvent \emit -> do - Event.subscribe event \next -> do - Aff.delay ms - _ <- Aff.forkAff $ emit next - pure unit - -interval :: forall spacing. Duration spacing => spacing -> Event Unit -interval spacing = do - let - ms = fromDuration spacing - Event.makeEvent \emit -> do - fiber <- - (Aff.launchAff <<< Aff.supervise <<< forever) do - Aff.delay ms - _ <- Aff.forkAff $ emit unit - pure unit - pure do - Aff.launchAff_ do Aff.killFiber (Aff.error "canceling") fiber - -timer :: forall offset spacing. Duration offset => Duration spacing => offset -> spacing -> Event Unit -timer offset spacing = delay offset do pure unit <|> interval spacing diff --git a/src/Wire/Event/Transformer.purs b/src/Wire/Event/Transformer.purs deleted file mode 100644 index 4b10b83..0000000 --- a/src/Wire/Event/Transformer.purs +++ /dev/null @@ -1,60 +0,0 @@ -module Wire.Event.Transformer where - -import Prelude -import Control.Alt (alt) -import Data.Compactable (class Compactable, compact, separate) -import Data.Either (Either(..)) -import Data.Filterable (class Filterable, filter, filterMap, partition, partitionMap) -import Data.Profunctor (class Profunctor) -import Data.Profunctor.Choice (class Choice) -import Wire.Event (Event) - -newtype Transformer i o - = Transformer (Event i -> Event o) - -transform :: forall o i. Transformer i o -> Event i -> Event o -transform (Transformer t) = t - -transformFlipped :: forall i o. Event i -> Transformer i o -> Event o -transformFlipped = flip transform - -infixr 2 transform as <~: - -infixl 2 transformFlipped as :~> - -lift :: forall i o. (Event i -> Event o) -> Transformer i o -lift = Transformer - -derive instance functorTransformer :: Functor (Transformer i) - -instance semigroupoidTransformer :: Semigroupoid Transformer where - compose (Transformer f) (Transformer g) = Transformer (compose f g) - -instance categoryTransformer :: Category Transformer where - identity = Transformer identity - -instance profunctorTransformer :: Profunctor Transformer where - dimap a2b c2d (Transformer t) = Transformer (map c2d <<< t <<< map a2b) - -instance choiceTransformer :: Choice Transformer where - left (Transformer t) = Transformer (separate >>> \event -> alt (Left <$> t event.left) (Right <$> event.right)) - right (Transformer t) = Transformer (separate >>> \event -> alt (Left <$> event.left) (Right <$> t event.right)) - -instance compactableTransformer :: Compactable (Transformer i) where - compact (Transformer t) = Transformer (compact <<< t) - separate (Transformer t) = - { left: Transformer (_.left <<< separate <<< t) - , right: Transformer (_.right <<< separate <<< t) - } - -instance filterableTransformer :: Filterable (Transformer i) where - partitionMap f (Transformer t) = - { left: Transformer (_.left <<< partitionMap f <<< t) - , right: Transformer (_.right <<< partitionMap f <<< t) - } - partition f (Transformer t) = - { yes: Transformer (_.yes <<< partition f <<< t) - , no: Transformer (_.no <<< partition f <<< t) - } - filterMap f (Transformer t) = Transformer (filterMap f <<< t) - filter f (Transformer t) = Transformer (filter f <<< t) diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index c277f1d..ef3ae4b 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -1,11 +1,10 @@ module Wire.Signal where import Prelude -import Control.Plus (empty) +import Control.Monad.Rec.Class (class MonadRec, Step(..)) import Effect (Effect) -import Effect.Aff as Aff import Effect.Ref as Ref -import Wire.Event (Canceler, Event, Subscriber) +import Wire.Event (Event) import Wire.Event as Event newtype Signal a @@ -21,24 +20,29 @@ create :: { signal :: Signal a , write :: a -> Effect Unit , modify :: (a -> a) -> Effect Unit - , cancel :: Effect Unit } create init = do value <- Ref.new init inner <- Event.create let - modify' f = Ref.modify f value >>= Aff.launchAff_ <<< inner.push + read' = Ref.read value + + event = + Event.makeEvent \notify -> do + read' >>= notify + Event.subscribe inner.event notify + + modify' f = Ref.modify f value >>= inner.push signal = Signal - { event: inner.event - , read: Ref.read value + { event + , read: read' } pure { signal , write: modify' <<< const , modify: modify' - , cancel: inner.cancel } distinct :: forall a. Eq a => Signal a -> Signal a @@ -49,22 +53,19 @@ createDistinct :: Eq a => a -> Effect - { cancel :: Effect Unit - , modify :: (a -> a) -> Effect Unit - , signal :: Signal a + { signal :: Signal a , write :: a -> Effect Unit + , modify :: (a -> a) -> Effect Unit } createDistinct init = do signal <- create init pure $ signal { signal = distinct signal.signal } -subscribe :: forall a. Signal a -> Subscriber a -> Effect Canceler -subscribe (Signal s) k = do - s.read >>= Aff.launchAff_ <<< k - Event.subscribe s.event k +subscribe :: forall a. Signal a -> (a -> Effect Unit) -> Effect (Effect Unit) +subscribe (Signal s) notify = Event.subscribe s.event notify -event :: Signal ~> Event -event (Signal s) = s.event +toEvent :: Signal ~> Event +toEvent (Signal s) = s.event read :: Signal ~> Effect read (Signal s) = s.read @@ -73,12 +74,29 @@ instance functorSignal :: Functor Signal where map f (Signal s) = Signal { event: map f s.event, read: map f s.read } instance applySignal :: Apply Signal where - apply (Signal f) (Signal a) = Signal { event: apply f.event a.event, read: apply f.read a.read } + apply (Signal f) (Signal a) = + Signal + { event: apply f.event a.event + , read: apply f.read a.read + } instance applicativeSignal :: Applicative Signal where - pure a = Signal { event: empty, read: pure a } + pure a = Signal { event: pure a, read: pure a } instance bindSignal :: Bind Signal where - bind (Signal s) f = Signal { event: s.event >>= f >>> event, read: s.read >>= f >>> read } + bind (Signal s) f = + Signal + { event: s.event >>= f >>> toEvent + , read: s.read >>= f >>> read + } instance monadSignal :: Monad Signal + +instance monadRecSignal ∷ MonadRec Signal where + tailRecM k = go + where + go a = do + res ← k a + case res of + Done r → pure r + Loop b → go b diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 6144f9c..24b8554 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -4,6 +4,7 @@ import Prelude import Data.Maybe (fromJust) import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) import Effect (Effect) +import Foreign (Foreign) import Foreign.Object (Object) import Foreign.Object as Object import Partial.Unsafe (unsafePartial) @@ -13,45 +14,59 @@ import Wire.Store.Atom (Atom(..)) import Wire.Store.Atom.Async as Async import Wire.Store.Atom.Pure as Pure import Wire.Store.Atom.Sync as Sync -import Wire.Store.Atom.Types (StoreSignal) +import Wire.Store.Atom.Types (AtomSignal) newtype Store (atoms :: # Type) - = Store { atoms :: Object Compressed } + = Store { atoms :: Object Foreign } empty :: Store () empty = Store { atoms: Object.empty } -insert :: forall key value before after. IsSymbol key => Lacks key before => Cons key value before after => Atom key value -> Store before -> Effect (Store after) -insert atom (Store store) = do +withAtom :: + forall key value before after. + IsSymbol key => + Lacks key before => + Cons key value before after => + Atom key value -> + Store before -> + Effect (Store after) +withAtom atom (Store store) = do signal <- case atom of Async a -> Async.createSignal a Sync a -> Sync.createSignal a Pure a -> Pure.createSignal a - pure $ Store store { atoms = Object.insert (reflectSymbol (SProxy :: _ key)) (compress signal) store.atoms } + pure + $ Store + store + { atoms = + Object.insert (reflectSymbol (SProxy :: _ key)) + ((unsafeCoerce :: forall a. AtomSignal a -> Foreign) signal) + store.atoms + } -lookup :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> StoreSignal value -lookup _ (Store { atoms }) = inflate $ unsafePartial fromJust $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms +getAtomSignal :: + forall key value atoms r. + IsSymbol key => + Cons key value r atoms => + Atom key value -> + Store atoms -> AtomSignal value +getAtomSignal _ (Store { atoms }) = + (unsafeCoerce :: forall a. Foreign -> AtomSignal a) + $ unsafePartial fromJust + $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms -reset :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> Effect Unit -reset atom = - lookup atom +resetAtom :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> Effect Unit +resetAtom atom = + getAtomSignal atom >>> case atom of Async a -> Async.reset a Sync a -> Sync.reset a Pure a -> Pure.reset a -update :: forall key value atoms r. IsSymbol key => Cons key value r atoms => value -> Atom key value -> Store atoms -> Effect Unit -update value atom = - lookup atom +updateAtom :: forall key value atoms r. IsSymbol key => Cons key value r atoms => value -> Atom key value -> Store atoms -> Effect Unit +updateAtom value atom = + getAtomSignal atom >>> case atom of Async a -> Async.update value a Sync a -> Sync.update value a Pure a -> Pure.update value a - -data Compressed - -compress :: forall a. StoreSignal a -> Compressed -compress = unsafeCoerce - -inflate :: forall a. Compressed -> StoreSignal a -inflate = unsafeCoerce diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 1ae0146..f82e8c8 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,7 +5,7 @@ import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Effect.Aff (Aff, launchAff_) import Wire.Signal as Signal -import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) +import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) newtype Async a = Async' @@ -16,19 +16,19 @@ newtype Async a type Handler a = FreeT (AtomicF a) Aff Unit -createSignal :: forall a. Async a -> Effect (StoreSignal a) +createSignal :: forall a. Async a -> Effect (AtomSignal a) createSignal (Async' { default, handler }) = do signal <- Signal.create default run (handler Initialize) signal pure signal -run :: forall a. Handler a -> StoreSignal a -> Effect Unit +run :: forall a. Handler a -> AtomSignal a -> Effect Unit run handler signal = launchAff_ $ interpret signal handler -reset :: forall a. Async a -> StoreSignal a -> Effect Unit +reset :: forall a. Async a -> AtomSignal a -> Effect Unit reset (Async' { default, handler }) signal = do signal.write default run (handler Initialize) signal -update :: forall a. a -> Async a -> StoreSignal a -> Effect Unit +update :: forall a. a -> Async a -> AtomSignal a -> Effect Unit update value (Async' { handler }) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 815872f..cf7d36b 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -3,18 +3,18 @@ module Wire.Store.Atom.Pure where import Prelude import Effect (Effect) import Wire.Signal as Signal -import Wire.Store.Atom.Types (StoreSignal) +import Wire.Store.Atom.Types (AtomSignal) newtype Pure a = Pure' a -createSignal :: forall a. Pure a -> Effect (StoreSignal a) +createSignal :: forall a. Pure a -> Effect (AtomSignal a) createSignal (Pure' value) = do signal <- Signal.create value pure signal -reset :: forall a. Pure a -> StoreSignal a -> Effect Unit +reset :: forall a. Pure a -> AtomSignal a -> Effect Unit reset (Pure' value) signal = signal.write value -update :: forall a. a -> Pure a -> StoreSignal a -> Effect Unit +update :: forall a. a -> Pure a -> AtomSignal a -> Effect Unit update value _ signal = signal.write value diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index d97c52e..1c7593a 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -4,7 +4,7 @@ import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Wire.Signal as Signal -import Wire.Store.Atom.Types (AtomicF, StoreSignal, Action(..), interpret) +import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) newtype Sync a = Sync' @@ -15,19 +15,19 @@ newtype Sync a type Handler a = FreeT (AtomicF a) Effect Unit -createSignal :: forall a. Sync a -> Effect (StoreSignal a) +createSignal :: forall a. Sync a -> Effect (AtomSignal a) createSignal (Sync' { default, handler }) = do signal <- Signal.create default run (handler Initialize) signal pure signal -run :: forall a. Handler a -> StoreSignal a -> Effect Unit +run :: forall a. Handler a -> AtomSignal a -> Effect Unit run = flip interpret -reset :: forall a. Sync a -> StoreSignal a -> Effect Unit +reset :: forall a. Sync a -> AtomSignal a -> Effect Unit reset (Sync' { default, handler }) signal = do signal.write default run (handler Initialize) signal -update :: forall a. a -> Sync a -> StoreSignal a -> Effect Unit +update :: forall a. a -> Sync a -> AtomSignal a -> Effect Unit update value (Sync' { handler }) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index a389df1..6edf0d5 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -24,7 +24,7 @@ read = liftFreeT $ Read identity write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit write a = liftFreeT $ Write a unit -interpret :: forall a m. MonadEffect m => MonadRec m => StoreSignal a -> FreeT (AtomicF a) m Unit -> m Unit +interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomicF a) m Unit -> m Unit interpret store = runFreeT case _ of Read next -> do @@ -34,11 +34,10 @@ interpret store = liftEffect (store.write a) pure next -type StoreSignal a +type AtomSignal a = { signal :: Signal a , write :: a -> Effect Unit , modify :: (a -> a) -> Effect Unit - , cancel :: Effect Unit } data Action a diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index e115a69..9a4b5f0 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -1,11 +1,14 @@ module Wire.Store.Selector where import Prelude -import Control.Monad.Free.Trans (FreeT, freeT) +import Control.Monad.Free.Trans (FreeT, freeT, runFreeT) +import Control.Monad.Rec.Class (class MonadRec) import Control.Monad.Trans.Class (lift) import Data.Either (Either(..)) -import Data.Symbol (class IsSymbol) +import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) import Effect (Effect) +import Effect.Class.Console as Console +import Effect.Unsafe (unsafePerformEffect) import Prim.Row (class Cons) import Wire.Signal (Signal) import Wire.Signal as Signal @@ -13,18 +16,18 @@ import Wire.Store (Store) import Wire.Store as Store import Wire.Store.Atom (Atom) -newtype Selector key (atoms :: # Type) a +newtype Selector (atoms :: # Type) a = Selector' { select :: FreeT (SelectF atoms) Signal a , update :: a -> FreeT (SelectF atoms) Effect Unit } makeSelector :: - forall a atoms key. + forall a atoms. { select :: FreeT (SelectF atoms) Signal a , update :: a -> FreeT (SelectF atoms) Effect Unit } -> - Selector key atoms a + Selector atoms a makeSelector = Selector' data SelectF (atoms :: # Type) next @@ -33,10 +36,25 @@ data SelectF (atoms :: # Type) next derive instance functorSelectF :: Functor (SelectF atoms) select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Signal value -select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.lookup atom store).signal +select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.getAtomSignal atom store).signal read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Effect value -read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.lookup atom store).signal +read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.getAtomSignal atom store).signal write :: forall r atoms value key. IsSymbol key => Cons key value r atoms => value -> Atom key value -> FreeT (SelectF atoms) Effect Unit -write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update value atom store +write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom value atom store + +interpret :: forall a m atoms. MonadRec m => Store atoms -> FreeT (SelectF atoms) m a -> m a +interpret store = runFreeT \(Apply run) -> pure (run store) + +build :: + forall a atoms. + Selector atoms a -> + Store atoms -> + { signal :: Signal a + , write :: a -> Effect Unit + } +build (Selector' selector) store = + { signal: interpret store selector.select + , write: \a -> interpret store (selector.update a) + } diff --git a/test/Main.purs b/test/Main.purs index e2a5956..b613726 100644 --- a/test/Main.purs +++ b/test/Main.purs @@ -1,39 +1,62 @@ module Test.Main where import Prelude -import Data.Array as Array -import Data.Filterable (filter) -import Data.FoldableWithIndex (foldlWithIndex) -import Data.Int as Int -import Data.String.CodeUnits as CodeUnits import Effect (Effect) -import Effect.Class (class MonadEffect) +import Effect.Aff (Milliseconds(..), delay, launchAff_) +import Effect.Class (liftEffect) import Effect.Class.Console as Console -import Wire.Event (Event) -import Wire.Event as Event +import Wire.Signal as Signal +import Wire.Store as Store +import Wire.Store.Atom (Atom) +import Wire.Store.Atom as Atom +import Wire.Store.Selector (Selector) +import Wire.Store.Selector as Selector + +main1 :: Effect Unit +main1 = do + Console.log "test:" + let + signal = do + a <- pure 1 + b <- pure 2 + c <- pure 3 + pure (a + b + c) + void $ Signal.subscribe signal Console.logShow main :: Effect Unit main = do - void $ Event.subscribe (combineWithProduct <$> sumOfSquaresFromOneToOneThousand <*> sumOfSquaresFromOneToOneThousand) logEquation - -combineWithProduct :: Number -> Number -> { left :: Number, right :: Number, product :: Number } -combineWithProduct left right = { left, right, product: left * right } + store <- + Store.empty + # ( Store.withAtom testAtom1 + >=> Store.withAtom testAtom2 + ) + _ <- Signal.subscribe (Selector.build testSelector store).signal Console.logShow + launchAff_ do + delay $ Milliseconds 2000.0 + liftEffect $ Store.updateAtom 4.0 testAtom1 store + delay $ Milliseconds 5000.0 + liftEffect $ Store.updateAtom 50.0 testAtom2 store -logEquation :: forall m. MonadEffect m => { left :: Number, product :: Number, right :: Number } -> m Unit -logEquation { left, right, product } = Console.log (formatNumber left <> " * " <> formatNumber right <> " = " <> formatNumber product) +testAtom1 :: Atom "test1" Number +testAtom1 = Atom.makePure 2.0 -sumOfSquaresFromOneToOneThousand :: Event Number -sumOfSquaresFromOneToOneThousand = - Event.range 1 1_000 - # map Int.toNumber - # map (\x -> x * x) - # Event.fold (+) 0.0 +testAtom2 :: Atom "test2" Number +testAtom2 = Atom.makePure 100.0 -formatNumber :: Number -> String -formatNumber = - show >>> CodeUnits.dropRight 2 - >>> CodeUnits.toCharArray - >>> Array.reverse - >>> foldlWithIndex (\i o c -> if i /= 0 && i `mod` 3 == 0 then o <> [ ',', c ] else o <> [ c ]) [] - >>> Array.reverse - >>> CodeUnits.fromCharArray +testSelector :: + forall atoms. + Selector + ( test1 :: Number + , test2 :: Number + | atoms + ) + Number +testSelector = + Selector.makeSelector + { select: + do + test1 <- Selector.select testAtom1 + test2 <- Selector.select testAtom2 + pure $ test2 / test1 + , update: mempty + } diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..0607077 --- /dev/null +++ b/test/index.html @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..5bb4bf4 --- /dev/null +++ b/test/index.js @@ -0,0 +1 @@ +require("../output/Test.Main").main(); diff --git a/yarn.lock b/yarn.lock index 82dbb5b..dc21604 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,934 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.3.tgz#324bcfd8d35cd3d47dae18cde63d752086435e9a" + integrity sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg== + dependencies: + "@babel/highlight" "^7.10.3" + +"@babel/compat-data@^7.10.1", "@babel/compat-data@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.3.tgz#9af3e033f36e8e2d6e47570db91e64a846f5d382" + integrity sha512-BDIfJ9uNZuI0LajPfoYV28lX8kyCPMHY6uY4WH1lJdcicmAfxCK5ASzaeV0D/wsUaRH/cLk+amuxtC37sZ8TUg== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.3.tgz#73b0e8ddeec1e3fdd7a2de587a60e17c440ec77e" + integrity sha512-5YqWxYE3pyhIi84L84YcwjeEgS+fa7ZjK6IBVGTjDVfm64njkR2lfDhVR5OudLk8x2GK59YoSyVv+L/03k1q9w== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helpers" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.3", "@babel/generator@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.3.tgz#32b9a0d963a71d7a54f5f6c15659c3dbc2a523a5" + integrity sha512-drt8MUHbEqRzNR0xnF8nMehbY11b1SDkRw03PSNH/3Rb2Z35oxkddVSi3rcaak0YJQ86PCuE7Qx1jSFhbLNBMA== + dependencies: + "@babel/types" "^7.10.3" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268" + integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.3.tgz#4e9012d6701bef0030348d7f9c808209bd3e8687" + integrity sha512-lo4XXRnBlU6eRM92FkiZxpo1xFLmv3VsPFk61zJKMm7XYJfwqXHsYJTY6agoc4a3L8QPw1HqWehO18coZgbT6A== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-builder-react-jsx-experimental@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8" + integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-module-imports" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-builder-react-jsx@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.3.tgz#62c4b7bb381153a0a5f8d83189b94b9fb5384fc5" + integrity sha512-vkxmuFvmovtqTZknyMGj9+uQAZzz5Z9mrbnkJnPkaYGfKTaSsYcjQdXP0lgrWLVh8wU6bCjOmXOpx+kqUi+S5Q== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/types" "^7.10.3" + +"@babel/helper-compilation-targets@^7.10.2": + version "7.10.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285" + integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA== + dependencies: + "@babel/compat-data" "^7.10.1" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.1": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.3.tgz#2783daa6866822e3d5ed119163b50f0fc3ae4b35" + integrity sha512-iRT9VwqtdFmv7UheJWthGc/h2s7MqoweBF9RUj77NFZsg9VfISvBTum3k6coAhJ8RWv2tj3yUjA03HxPd0vfpQ== + dependencies: + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-member-expression-to-functions" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + +"@babel/helper-create-regexp-features-plugin@^7.10.1", "@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd" + integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.3.tgz#d27120a5e57c84727b30944549b2dfeca62401a8" + integrity sha512-bxRzDi4Sin/k0drWCczppOhov1sBSdBvXJObM1NLHQzjhXhwRtn7aRWGvLJWCYbuu2qUk3EKs6Ci9C9ps8XokQ== + dependencies: + "@babel/helper-function-name" "^7.10.3" + "@babel/types" "^7.10.3" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.3.tgz#9dc14f0cfa2833ea830a9c8a1c742b6e7461b05e" + integrity sha512-0nKcR64XrOC3lsl+uhD15cwxPvaB6QKUDlD84OT9C3myRbhJqTMYir69/RWItUvHpharv0eJ/wk7fl34ONSwZw== + dependencies: + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-function-name@^7.10.1", "@babel/helper-function-name@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.3.tgz#79316cd75a9fa25ba9787ff54544307ed444f197" + integrity sha512-FvSj2aiOd8zbeqijjgqdMDSyxsGHaMt5Tr0XjQsGKHD3/1FP3wksjnLAWzxw7lvXiej8W1Jt47SKTZ6upQNiRw== + dependencies: + "@babel/helper-get-function-arity" "^7.10.3" + "@babel/template" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-get-function-arity@^7.10.1", "@babel/helper-get-function-arity@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.3.tgz#3a28f7b28ccc7719eacd9223b659fdf162e4c45e" + integrity sha512-iUD/gFsR+M6uiy69JA6fzM5seno8oE85IYZdbVVEuQaZlEzMO2MXblh+KSPJgsZAUx0EEbWXU0yJaW7C9CdAVg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-hoist-variables@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.3.tgz#d554f52baf1657ffbd7e5137311abc993bb3f068" + integrity sha512-9JyafKoBt5h20Yv1+BXQMdcXXavozI1vt401KBiRc2qzUepbVnd7ogVNymY1xkQN9fekGwfxtotH2Yf5xsGzgg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-member-expression-to-functions@^7.10.1", "@babel/helper-member-expression-to-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.3.tgz#bc3663ac81ac57c39148fef4c69bf48a77ba8dd6" + integrity sha512-q7+37c4EPLSjNb2NmWOjNwj0+BOyYlssuQ58kHEWk1Z78K5i8vTUsteq78HMieRPQSl/NtpQyJfdjt3qZ5V2vw== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-module-imports@^7.10.1", "@babel/helper-module-imports@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.3.tgz#766fa1d57608e53e5676f23ae498ec7a95e1b11a" + integrity sha512-Jtqw5M9pahLSUWA+76nhK9OG8nwYXzhQzVIGFoNaHnXF/r4l7kz4Fl0UAW7B6mqC5myoJiBP5/YQlXQTMfHI9w== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-module-transforms@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" + integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.1", "@babel/helper-optimise-call-expression@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.3.tgz#f53c4b6783093195b0f69330439908841660c530" + integrity sha512-kT2R3VBH/cnSz+yChKpaKRJQJWxdGoc6SjioRId2wkeV3bK0wLLioFpJROrX0U4xr/NmxSSAWT/9Ih5snwIIzg== + dependencies: + "@babel/types" "^7.10.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.10.3", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.3.tgz#aac45cccf8bc1873b99a85f34bceef3beb5d3244" + integrity sha512-j/+j8NAWUTxOtx4LKHybpSClxHoq6I91DQ/mKgAXn5oNUPIUiGppjPIX3TDtJWPrdfP9Kfl7e4fgVMiQR9VE/g== + +"@babel/helper-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96" + integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.10.1", "@babel/helper-remap-async-to-generator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.3.tgz#18564f8a6748be466970195b876e8bba3bccf442" + integrity sha512-sLB7666ARbJUGDO60ZormmhQOyqMX/shKBXZ7fy937s+3ID8gSrneMvKSSb+8xIM5V7Vn6uNVtOY1vIm26XLtA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-wrap-function" "^7.10.1" + "@babel/template" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/helper-replace-supers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" + integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.1" + "@babel/helper-optimise-call-expression" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-simple-access@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" + integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helper-split-export-declaration@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" + integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== + dependencies: + "@babel/types" "^7.10.1" + +"@babel/helper-validator-identifier@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15" + integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw== + +"@babel/helper-wrap-function@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" + integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/helpers@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" + integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== + dependencies: + "@babel/template" "^7.10.1" + "@babel/traverse" "^7.10.1" + "@babel/types" "^7.10.1" + +"@babel/highlight@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d" + integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.3", "@babel/parser@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.3.tgz#7e71d892b0d6e7d04a1af4c3c79d72c1f10f5315" + integrity sha512-oJtNJCMFdIMwXGmx+KxuaD7i3b8uS7TTFYW/FNG2BT8m+fmGHoiPYoH0Pe3gya07WuFmM5FCDIr1x0irkD/hyA== + +"@babel/plugin-proposal-async-generator-functions@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.3.tgz#5a02453d46e5362e2073c7278beab2e53ad7d939" + integrity sha512-WUUWM7YTOudF4jZBAJIW9D7aViYC/Fn0Pln4RIHlQALyno3sXSjqmTA4Zy1TKC2D49RCR8Y/Pn4OIUtEypK3CA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-remap-async-to-generator" "^7.10.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" + integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-dynamic-import@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0" + integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09" + integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78" + integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123" + integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" + +"@babel/plugin-proposal-object-rest-spread@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.3.tgz#b8d0d22f70afa34ad84b7a200ff772f9b9fce474" + integrity sha512-ZZh5leCIlH9lni5bU/wB/UcjtcVLgR8gc+FAgW2OOY+m9h1II3ItTO1/cewNUcsIDZSYcSaz/rYVls+Fb0ExVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2" + integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.3.tgz#9a726f94622b653c0a3a7a59cdce94730f526f7c" + integrity sha512-yyG3n9dJ1vZ6v5sfmIlMMZ8azQoqx/5/nZTSWX1td6L1H1bsjzA8TInDChpafCZiJkeOFzp/PtrfigAQXxI1Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598" + integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f" + integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5" + integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-flow@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz#cd4bbca62fb402babacb174f64f8734310d742f0" + integrity sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da" + integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99" + integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362" + integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-arrow-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b" + integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-async-to-generator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062" + integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg== + dependencies: + "@babel/helper-module-imports" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-remap-async-to-generator" "^7.10.1" + +"@babel/plugin-transform-block-scoped-functions@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d" + integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-block-scoping@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e" + integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.3.tgz#8d9a656bc3d01f3ff69e1fccb354b0f9d72ac544" + integrity sha512-irEX0ChJLaZVC7FvvRoSIxJlmk0IczFLcwaRXUArBKYHCHbOhe57aG8q3uw/fJsoSXvZhjRX960hyeAGlVBXZw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-define-map" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-optimise-call-expression" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/helper-replace-supers" "^7.10.1" + "@babel/helper-split-export-declaration" "^7.10.1" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.3.tgz#d3aa6eef67cb967150f76faff20f0abbf553757b" + integrity sha512-GWzhaBOsdbjVFav96drOz7FzrcEW6AP5nax0gLIpstiFaI3LOb2tAg06TimaWU6YKOfUACK3FVrxPJ4GSc5TgA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-destructuring@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907" + integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee" + integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-duplicate-keys@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9" + integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-exponentiation-operator@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3" + integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-flow-strip-types@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.1.tgz#59eafbff9ae85ec8932d4c16c068654be814ec5e" + integrity sha512-i4o0YwiJBIsIx7/liVCZ3Q2WkWr1/Yu39PksBOnh/khW2SwIFsGa5Ze+MSon5KbDfrEHP9NeyefAgvUSXzaEkw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/plugin-syntax-flow" "^7.10.1" + +"@babel/plugin-transform-for-of@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5" + integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-function-name@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d" + integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw== + dependencies: + "@babel/helper-function-name" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a" + integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-member-expression-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39" + integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-modules-amd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a" + integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.10.1", "@babel/plugin-transform-modules-commonjs@^7.4.4": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301" + integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-simple-access" "^7.10.1" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.3.tgz#004ae727b122b7b146b150d50cba5ffbff4ac56b" + integrity sha512-GWXWQMmE1GH4ALc7YXW56BTh/AlzvDWhUNn9ArFF0+Cz5G8esYlVbXfdyHa1xaD1j+GnBoCeoQNlwtZTVdiG/A== + dependencies: + "@babel/helper-hoist-variables" "^7.10.3" + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595" + integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA== + dependencies: + "@babel/helper-module-transforms" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.3.tgz#a4f8444d1c5a46f35834a410285f2c901c007ca6" + integrity sha512-I3EH+RMFyVi8Iy/LekQm948Z4Lz4yKT7rK+vuCAeRm0kTa6Z5W7xuhRxDNJv0FPya/her6AUgrDITb70YHtTvA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + +"@babel/plugin-transform-new-target@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324" + integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-object-super@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde" + integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-replace-supers" "^7.10.1" + +"@babel/plugin-transform-parameters@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd" + integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg== + dependencies: + "@babel/helper-get-function-arity" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-property-literals@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d" + integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.3.tgz#c07ad86b7c159287c89b643f201f59536231048e" + integrity sha512-Y21E3rZmWICRJnvbGVmDLDZ8HfNDIwjGF3DXYHx1le0v0mIHCs0Gv5SavyW5Z/jgAHLaAoJPiwt+Dr7/zZKcOQ== + dependencies: + "@babel/helper-builder-react-jsx" "^7.10.3" + "@babel/helper-builder-react-jsx-experimental" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-syntax-jsx" "^7.10.1" + +"@babel/plugin-transform-regenerator@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.3.tgz#6ec680f140a5ceefd291c221cb7131f6d7e8cb6d" + integrity sha512-H5kNeW0u8mbk0qa1jVIVTeJJL6/TJ81ltD4oyPx0P499DhMJrTmmIFCmJ3QloGpQG8K9symccB7S7SJpCKLwtw== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86" + integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-shorthand-properties@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3" + integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-spread@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8" + integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-sticky-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00" + integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + "@babel/helper-regex" "^7.10.1" + +"@babel/plugin-transform-template-literals@^7.10.3": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.3.tgz#69d39b3d44b31e7b4864173322565894ce939b25" + integrity sha512-yaBn9OpxQra/bk0/CaA4wr41O0/Whkg6nqjqApcinxM7pro51ojhX6fv1pimAnVjVfDy14K0ULoRL70CA9jWWA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.3" + +"@babel/plugin-transform-typeof-symbol@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e" + integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-escapes@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940" + integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/plugin-transform-unicode-regex@^7.10.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f" + integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.1" + "@babel/helper-plugin-utils" "^7.10.1" + +"@babel/preset-env@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.3.tgz#3e58c9861bbd93b6a679987c7e4bd365c56c80c9" + integrity sha512-jHaSUgiewTmly88bJtMHbOd1bJf2ocYxb5BWKSDQIP5tmgFuS/n0gl+nhSrYDhT33m0vPxp+rP8oYYgPgMNQlg== + dependencies: + "@babel/compat-data" "^7.10.3" + "@babel/helper-compilation-targets" "^7.10.2" + "@babel/helper-module-imports" "^7.10.3" + "@babel/helper-plugin-utils" "^7.10.3" + "@babel/plugin-proposal-async-generator-functions" "^7.10.3" + "@babel/plugin-proposal-class-properties" "^7.10.1" + "@babel/plugin-proposal-dynamic-import" "^7.10.1" + "@babel/plugin-proposal-json-strings" "^7.10.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1" + "@babel/plugin-proposal-numeric-separator" "^7.10.1" + "@babel/plugin-proposal-object-rest-spread" "^7.10.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.1" + "@babel/plugin-proposal-optional-chaining" "^7.10.3" + "@babel/plugin-proposal-private-methods" "^7.10.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.1" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.1" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.10.1" + "@babel/plugin-transform-arrow-functions" "^7.10.1" + "@babel/plugin-transform-async-to-generator" "^7.10.1" + "@babel/plugin-transform-block-scoped-functions" "^7.10.1" + "@babel/plugin-transform-block-scoping" "^7.10.1" + "@babel/plugin-transform-classes" "^7.10.3" + "@babel/plugin-transform-computed-properties" "^7.10.3" + "@babel/plugin-transform-destructuring" "^7.10.1" + "@babel/plugin-transform-dotall-regex" "^7.10.1" + "@babel/plugin-transform-duplicate-keys" "^7.10.1" + "@babel/plugin-transform-exponentiation-operator" "^7.10.1" + "@babel/plugin-transform-for-of" "^7.10.1" + "@babel/plugin-transform-function-name" "^7.10.1" + "@babel/plugin-transform-literals" "^7.10.1" + "@babel/plugin-transform-member-expression-literals" "^7.10.1" + "@babel/plugin-transform-modules-amd" "^7.10.1" + "@babel/plugin-transform-modules-commonjs" "^7.10.1" + "@babel/plugin-transform-modules-systemjs" "^7.10.3" + "@babel/plugin-transform-modules-umd" "^7.10.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.3" + "@babel/plugin-transform-new-target" "^7.10.1" + "@babel/plugin-transform-object-super" "^7.10.1" + "@babel/plugin-transform-parameters" "^7.10.1" + "@babel/plugin-transform-property-literals" "^7.10.1" + "@babel/plugin-transform-regenerator" "^7.10.3" + "@babel/plugin-transform-reserved-words" "^7.10.1" + "@babel/plugin-transform-shorthand-properties" "^7.10.1" + "@babel/plugin-transform-spread" "^7.10.1" + "@babel/plugin-transform-sticky-regex" "^7.10.1" + "@babel/plugin-transform-template-literals" "^7.10.3" + "@babel/plugin-transform-typeof-symbol" "^7.10.1" + "@babel/plugin-transform-unicode-escapes" "^7.10.1" + "@babel/plugin-transform-unicode-regex" "^7.10.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.3" + browserslist "^4.12.0" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.4.4", "@babel/runtime@^7.8.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.3.tgz#670d002655a7c366540c67f6fd3342cd09500364" + integrity sha512-RzGO0RLSdokm9Ipe/YD+7ww8X2Ro79qiXZF3HU9ljrM+qnJmH1Vqth+hbiQZy761LnMJTMitHDuKVYTk3k4dLw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.1", "@babel/template@^7.10.3", "@babel/template@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.3.tgz#4d13bc8e30bf95b0ce9d175d30306f42a2c9a7b8" + integrity sha512-5BjI4gdtD+9fHZUsaxPHPNpwa+xRkDO7c7JbhYn2afvrkDu5SfAAbi9AIMXw2xEhO/BR35TqiW97IqNvCo/GqA== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + +"@babel/traverse@^7.10.1", "@babel/traverse@^7.10.3", "@babel/traverse@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.3.tgz#0b01731794aa7b77b214bcd96661f18281155d7e" + integrity sha512-qO6623eBFhuPm0TmmrUFMT1FulCmsSeJuVGhiLodk2raUDFhhTECLd9E9jC4LBIWziqt4wgF6KuXE4d+Jz9yug== + dependencies: + "@babel/code-frame" "^7.10.3" + "@babel/generator" "^7.10.3" + "@babel/helper-function-name" "^7.10.3" + "@babel/helper-split-export-declaration" "^7.10.1" + "@babel/parser" "^7.10.3" + "@babel/types" "^7.10.3" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.10.1", "@babel/types@^7.10.3", "@babel/types@^7.4.4": + version "7.10.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.3.tgz#6535e3b79fea86a6b09e012ea8528f935099de8e" + integrity sha512-nZxaJhBXBQ8HVoIcGsf9qWep3Oh3jCENK54V4mRF7qaJabVsAYdbTtmSD8WmAp1R6ytPiu5apMwSXyxB1WlaBA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.3" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@iarna/toml@^2.2.0": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@parcel/fs@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-1.11.0.tgz#fb8a2be038c454ad46a50dc0554c1805f13535cd" + integrity sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA== + dependencies: + "@parcel/utils" "^1.11.0" + mkdirp "^0.5.1" + rimraf "^2.6.2" + +"@parcel/logger@^1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-1.11.1.tgz#c55b0744bcbe84ebc291155627f0ec406a23e2e6" + integrity sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA== + dependencies: + "@parcel/workers" "^1.11.0" + chalk "^2.1.0" + grapheme-breaker "^0.3.2" + ora "^2.1.0" + strip-ansi "^4.0.0" + +"@parcel/utils@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-1.11.0.tgz#539e08fff8af3b26eca11302be80b522674b51ea" + integrity sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ== + +"@parcel/watcher@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-1.12.1.tgz#b98b3df309fcab93451b5583fc38e40826696dad" + integrity sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA== + dependencies: + "@parcel/utils" "^1.11.0" + chokidar "^2.1.5" + +"@parcel/workers@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-1.11.0.tgz#7b8dcf992806f4ad2b6cecf629839c41c2336c59" + integrity sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ== + dependencies: + "@parcel/utils" "^1.11.0" + physical-cpu-count "^2.0.0" + +"@types/q@^1.5.1": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +acorn-globals@^4.3.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^6.0.1, acorn@^6.0.4: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +acorn@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== + ajv@^6.5.5: version "6.12.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" @@ -12,16 +940,36 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -29,6 +977,21 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-to-html@^0.6.4: + version "0.6.14" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.14.tgz#65fe6d08bba5dd9db33f44a20aec331e0010dad8" + integrity sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA== + dependencies: + entities "^1.1.2" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -39,6 +1002,47 @@ arch@^2.1.1: resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -51,11 +1055,39 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -66,11 +1098,63 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-runtime@^6.11.6, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-types@^6.15.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon-walk@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce" + integrity sha1-OxWl3btIKni0zpwByLoYFwLZ1s4= + dependencies: + babel-runtime "^6.11.6" + babel-types "^6.15.0" + lodash.clone "^4.5.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -78,11 +1162,38 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -91,11 +1202,142 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brfs@^1.2.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" + integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== + dependencies: + quote-stream "^1.0.1" + resolve "^1.1.5" + static-module "^2.2.0" + through2 "^2.0.0" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.12.0, browserslist@^4.8.5: + version "4.12.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.2.tgz#76653d7e4c57caa8a1a28513e2f4e197dc11a711" + integrity sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw== + dependencies: + caniuse-lite "^1.0.30001088" + electron-to-chromium "^1.3.483" + escalade "^3.0.1" + node-releases "^1.1.58" + +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + byline@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" @@ -121,12 +1363,82 @@ cacache@^11.3.2: unique-filename "^1.1.1" y18n "^4.0.0" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001088: + version "1.0.30001090" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001090.tgz#ff7766332f60e80fea4903f30d360622e5551850" + integrity sha512-QzPRKDCyp7RhjczTPZaqK3CjPA5Ht2UnXhZhCI4f7QiB5JK6KEuZBxIzyWnB3wO4hgAj4GMRxAhuiacfw0Psjg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.4.2: +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -135,11 +1447,48 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chokidar@^2.1.5: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -147,7 +1496,48 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -color-convert@^1.9.0: +cli-spinners@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -159,6 +1549,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" + integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -166,12 +1577,27 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-exists@^1.2.6: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.11.0, commander@^2.19.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -181,48 +1607,492 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +core-js@^2.4.0, core-js@^2.6.5: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== + +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" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.4: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-modules-loader-core@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + integrity sha1-WQhmgpShvs0mGuCkziGwtVHyHRY= + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-selector-tokenizer@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87" + integrity sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + regexpu-core "^4.6.0" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" + integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.0.0, cssnano@^4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== + dependencies: + css-tree "1.0.0-alpha.39" + +cssom@0.3.x, cssom@^0.3.4: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +deasync@^0.1.14: + version "0.1.20" + resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.20.tgz#546fd2660688a1eeed55edce2308c5cf7104f9da" + integrity sha512-E1GI7jMI57hL30OX6Ht/hfQU8DO4AuB9m72WFm4c38GNbUD4Q03//XZaOIHZiY+H1xUaomcot5yk2q/qIZQkGQ== + dependencies: + bindings "^1.5.0" + node-addon-api "^1.7.1" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" + domelementtype "1" -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" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +dot-prop@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" + integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + is-obj "^2.0.0" -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" +dotenv@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" @@ -242,11 +2112,39 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.483: + version "1.3.483" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz#9269e7cfc1c8e72709824da171cbe47ca5e3ca9e" + integrity sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg== + +elliptic@^6.0.0, elliptic@^6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -254,16 +2152,136 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +entities@^1.1.1, entities@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== -escape-string-regexp@^1.0.5: +envinfo@^7.3.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.1.tgz#93c26897225a00457c75e734d354ea9106a72236" + integrity sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" + integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.11.0, escodegen@^1.11.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +escodegen@~1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + execa@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-2.1.0.tgz#e5d3ecd837d2a60ec50f3da78fd39767747bbe99" @@ -279,11 +2297,53 @@ execa@^2.0.3: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -294,26 +2354,85 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +falafel@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" + integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== + dependencies: + acorn "^7.1.1" + foreach "^2.0.5" + isarray "^2.0.1" + object-keys "^1.0.6" + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^2.2.2: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + filesize@^4.1.2: version "4.2.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.1.tgz#ab1cb2069db5d415911c1a13e144c0e743bc89bc" integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -322,6 +2441,16 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -336,6 +2465,18 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -366,6 +2507,34 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-port@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= + get-stream@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" @@ -373,6 +2542,11 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -380,6 +2554,19 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -392,11 +2579,24 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2: +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +grapheme-breaker@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac" + integrity sha1-W55reMODJFLSuiuxy4MPlidkEKw= + dependencies: + brfs "^1.2.0" + unicode-trie "^0.3.1" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -410,11 +2610,161 @@ har-validator@~5.1.3: ajv "^6.5.5" har-schema "^2.0.0" +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-tags@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98" + integrity sha1-x43mW1Zjqll5id0rerSSANfk25g= + +htmlnano@^0.2.2: + version "0.2.5" + resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.2.5.tgz#134fd9548c7cbe51c8508ce434a3f9488cff1b0b" + integrity sha512-X1iPSwXG/iF9bVs+/obt2n6F64uH0ETkA8zp7qFDmLW9/+A6ueHGeb/+qD67T21qUY22owZPMdawljN50ajkqA== + dependencies: + cssnano "^4.1.10" + normalize-html-whitespace "^1.0.0" + posthtml "^0.12.0" + posthtml-render "^1.1.5" + purgecss "^1.4.0" + svgo "^1.3.2" + terser "^4.3.9" + uncss "^0.17.2" + +htmlparser2@^3.9.2: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -424,16 +2774,51 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -442,51 +2827,348 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-html@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464" + integrity sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ= + dependencies: + html-tags "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-plain-obj@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" + integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== + dependencies: + has-symbols "^1.0.1" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + is-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -isarray@~1.0.0: +is-url@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.10.0, js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^14.1.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b" + integrity sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng== + dependencies: + abab "^2.0.0" + acorn "^6.0.4" + acorn-globals "^4.3.0" + array-equal "^1.0.0" + cssom "^0.3.4" + cssstyle "^1.1.1" + data-urls "^1.1.0" + domexception "^1.0.1" + escodegen "^1.11.0" + html-encoding-sniffer "^1.0.2" + nwsapi "^2.1.3" + parse5 "5.1.0" + pn "^1.1.0" + request "^2.88.0" + request-promise-native "^1.0.5" + saxes "^3.1.9" + symbol-tree "^3.2.2" + tough-cookie "^2.5.0" + w3c-hr-time "^1.0.1" + w3c-xmlserializer "^1.1.2" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^7.0.0" + ws "^6.1.2" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -502,6 +3184,20 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -512,6 +3208,90 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.4: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -528,6 +3308,13 @@ log-update@^3.2.0: cli-cursor "^2.1.0" wrap-ansi "^5.0.0" +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -535,11 +3322,88 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +magic-string@^0.22.4: + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== + dependencies: + vlq "^0.2.2" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + +merge-source-map@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= + dependencies: + source-map "^0.5.6" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.2.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -552,6 +3416,11 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.44.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -562,6 +3431,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -569,7 +3448,7 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -605,7 +3484,15 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" -mkdirp@^0.5.0, mkdirp@^0.5.1: +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -624,11 +3511,114 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@^2.1.2: +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1, ms@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +nan@^2.12.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^1.7.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-forge@^0.7.1: + version "0.7.6" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== + +node-libs-browser@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.58: + version "1.1.58" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" + integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== + +normalize-html-whitespace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34" + integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA== + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + npm-run-path@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" @@ -636,11 +3626,101 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nwsapi@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-inspect@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" + integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" + integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + has "^1.0.3" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -662,11 +3742,76 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +opn@^5.1.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ora@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" + integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== + dependencies: + chalk "^2.3.1" + cli-cursor "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + p-finally@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parallel-transform@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" @@ -676,36 +3821,584 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parcel-bundler@^1.12.4: + version "1.12.4" + resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.12.4.tgz#31223f4ab4d00323a109fce28d5e46775409a9ee" + integrity sha512-G+iZGGiPEXcRzw0fiRxWYCKxdt/F7l9a0xkiU4XbcVRJCSlBnioWEwJMutOCCpoQmaQtjB4RBHDGIHN85AIhLQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.4.4" + "@babel/generator" "^7.4.4" + "@babel/parser" "^7.4.4" + "@babel/plugin-transform-flow-strip-types" "^7.4.4" + "@babel/plugin-transform-modules-commonjs" "^7.4.4" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/preset-env" "^7.4.4" + "@babel/runtime" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + "@iarna/toml" "^2.2.0" + "@parcel/fs" "^1.11.0" + "@parcel/logger" "^1.11.1" + "@parcel/utils" "^1.11.0" + "@parcel/watcher" "^1.12.1" + "@parcel/workers" "^1.11.0" + ansi-to-html "^0.6.4" + babylon-walk "^1.0.2" + browserslist "^4.1.0" + chalk "^2.1.0" + clone "^2.1.1" + command-exists "^1.2.6" + commander "^2.11.0" + core-js "^2.6.5" + cross-spawn "^6.0.4" + css-modules-loader-core "^1.1.0" + cssnano "^4.0.0" + deasync "^0.1.14" + dotenv "^5.0.0" + dotenv-expand "^5.1.0" + envinfo "^7.3.1" + fast-glob "^2.2.2" + filesize "^3.6.0" + get-port "^3.2.0" + htmlnano "^0.2.2" + is-glob "^4.0.0" + is-url "^1.2.2" + js-yaml "^3.10.0" + json5 "^1.0.1" + micromatch "^3.0.4" + mkdirp "^0.5.1" + node-forge "^0.7.1" + node-libs-browser "^2.0.0" + opn "^5.1.0" + postcss "^7.0.11" + postcss-value-parser "^3.3.1" + posthtml "^0.11.2" + posthtml-parser "^0.4.0" + posthtml-render "^1.1.3" + resolve "^1.4.0" + semver "^5.4.1" + serialize-to-js "^3.0.0" + serve-static "^1.12.4" + source-map "0.6.1" + terser "^3.7.3" + v8-compile-cache "^2.0.0" + ws "^5.1.1" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" + integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +physical-cpu-count@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" + integrity sha1-GN4vl+S/epVRrXURlCtUlverpmA= + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz#504efcd008ca0273120568b0792b16cdcde8aac1" + integrity sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + integrity sha1-thTJcgvmgW6u41+zpfqh26agXds= + dependencies: + postcss "^6.0.1" + +postcss-modules-local-by-default@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-scope@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + +postcss-modules-values@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@6.0.2, postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + integrity sha1-AA29H47vIXqjaLmiEsX8QLKo8/I= + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^6.0.1: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.27: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +posthtml-parser@^0.4.0, posthtml-parser@^0.4.1, posthtml-parser@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1" + integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg== + dependencies: + htmlparser2 "^3.9.2" + +posthtml-render@^1.1.3, posthtml-render@^1.1.5, posthtml-render@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.2.2.tgz#f554a19ed40d40e2bfc160826b0a91d4a23656cd" + integrity sha512-MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ== + +posthtml@^0.11.2: + version "0.11.6" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.6.tgz#e349d51af7929d0683b9d8c3abd8166beecc90a8" + integrity sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw== + dependencies: + posthtml-parser "^0.4.1" + posthtml-render "^1.1.5" + +posthtml@^0.12.0: + version "0.12.3" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.12.3.tgz#8fa5b903907e9c10ba5b883863cc550189a309d5" + integrity sha512-Fbpi95+JJyR0tqU7pUy1zTSQFjAsluuwB9pJ1h0jtnGk7n/O2TBtP5nDl9rV0JVACjQ1Lm5wSp4ppChr8u3MhA== + dependencies: + posthtml-parser "^0.4.2" + posthtml-render "^1.2.2" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -731,6 +4424,16 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -767,24 +4470,102 @@ purescript-psa@^0.7.3: resolved "https://registry.yarnpkg.com/purescript-psa/-/purescript-psa-0.7.3.tgz#0e1ff29cbd6a0fe2429717e7147d0c1cbd4760a9" integrity sha512-qcnhruybTHVunhJqAuurOEWnz1BOOc/7mpcnyH5yxm5caYCejxq8GOE4ZNWbiPMeTlcG79qUPIOz7gx5OVmk2Q== -purescript@^0.13.6: +purescript@^0.13.8: version "0.13.8" resolved "https://registry.yarnpkg.com/purescript/-/purescript-0.13.8.tgz#acab6f3008d75b8046478c8c1d6124079dc96f7e" integrity sha512-1ZyVEVFLgcEcjPXxJYeVEyYn66DF2DnOLTWzo/K/MrQUF2chdLSyZ8sJpcarWyrz2HxXaubYceYbo5KexKzynA== dependencies: purescript-installer "^0.2.0" +purgecss@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-1.4.2.tgz#67ab50cb4f5c163fcefde56002467c974e577f41" + integrity sha512-hkOreFTgiyMHMmC2BxzdIw5DuC6kxAbP/gGOGd3MEsF3+5m69rIvUEPaxrnoUtfODTFKe9hcXjGwC6jcjoyhOw== + dependencies: + glob "^7.1.3" + postcss "^7.0.14" + postcss-selector-parser "^6.0.0" + yargs "^14.0.0" + purty@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/purty/-/purty-6.2.0.tgz#e3556b9bff8482f05a374e2f8d91328e3b68baac" integrity sha512-JfT8kJHSyxuOFQtRiH2x55SiPxXZsSdedQlZap8JehQ7KzB49B5C9cWwVybtSB36BdADQcxPvtw8D52z4EPnBw== +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6: +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +quote-stream@^1.0.1, quote-stream@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= + dependencies: + buffer-equal "0.0.1" + minimist "^1.1.3" + through2 "^2.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -797,6 +4578,117 @@ qs@~6.5.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.1.1, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz#5266857896518d1616a78a0479337a30ea974cc7" + integrity sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw== + dependencies: + "@babel/runtime" "^7.8.4" + private "^0.1.8" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^4.6.0, regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -823,6 +4715,33 @@ request@^2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.1.5, resolve@^1.3.2, resolve@^1.4.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -831,13 +4750,36 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -rimraf@^2.5.4, rimraf@^2.6.3: +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -845,7 +4787,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -855,11 +4797,127 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^3.1.9: + version "3.1.11" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" + integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== + dependencies: + xmlchars "^2.1.1" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-to-js@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-3.1.1.tgz#b3e77d0568ee4a60bfe66287f991e104d3a1a4ac" + integrity sha512-F+NGU0UHMBO4Q965tjw7rvieNVjlH6Lqi2emq/Lc9LUURYJbiCzmpi4Cy1OOjjVPtxu0c+NE85LU6968Wko5ZA== + +serve-static@^1.12.4: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -867,6 +4925,11 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -877,7 +4940,78 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -spago@^0.15.2: +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.10, source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spago@^0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/spago/-/spago-0.15.3.tgz#348de88f2aa499abaee9289b7d66e1e049807f0c" integrity sha512-CNpbJiI+6MPpttbCtGIGFUroegXze4I7joXCTfiiTRzOUKcMV925fm7dxyAa3AVUUUvGi3D55k65aniGR1cVMA== @@ -885,6 +5019,18 @@ spago@^0.15.2: request "^2.88.0" tar "^4.4.8" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -907,6 +5053,64 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-eval@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" + integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== + dependencies: + escodegen "^1.11.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +static-module@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" + integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== + dependencies: + concat-stream "~1.6.0" + convert-source-map "^1.5.1" + duplexer2 "~0.1.4" + escodegen "~1.9.0" + falafel "^2.1.0" + has "^1.0.1" + magic-string "^0.22.4" + merge-source-map "1.0.4" + object-inspect "~1.4.0" + quote-stream "~1.0.2" + readable-stream "~2.3.3" + shallow-copy "~0.0.1" + static-eval "^2.0.0" + through2 "~2.0.3" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -915,12 +5119,23 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -929,6 +5144,29 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -936,7 +5174,21 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -948,13 +5200,65 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -supports-color@^5.3.0: +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +svgo@^1.0.0, svgo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + tar@^4.4.6, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -968,7 +5272,25 @@ tar@^4.4.6, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.3" -through2@^2.0.0: +terser@^3.7.3: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +terser@^4.3.9: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0, through2@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -976,7 +5298,69 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -tough-cookie@~2.5.0: +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-inflate@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +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" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.5.0, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -984,6 +5368,18 @@ tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -996,11 +5392,84 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +uncss@^0.17.2: + version "0.17.3" + resolved "https://registry.yarnpkg.com/uncss/-/uncss-0.17.3.tgz#50fc1eb4ed573ffff763458d801cd86e4d69ea11" + integrity sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog== + dependencies: + commander "^2.20.0" + glob "^7.1.4" + is-absolute-url "^3.0.1" + is-html "^1.1.0" + jsdom "^14.1.0" + lodash "^4.17.15" + postcss "^7.0.17" + postcss-selector-parser "6.0.2" + request "^2.88.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +unicode-trie@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" + integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU= + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -1015,6 +5484,24 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -1022,16 +5509,68 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@~1.0.1: +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -1041,7 +5580,71 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -which@^1.3.1: +vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +w3c-hr-time@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" + integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== + dependencies: + domexception "^1.0.1" + webidl-conversions "^4.0.2" + xml-name-validator "^3.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -1055,7 +5658,12 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -wrap-ansi@^5.0.0: +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^5.0.0, wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== @@ -1069,7 +5677,31 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -xtend@~4.0.1: +ws@^5.1.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -1084,6 +5716,31 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^14.0.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + zen-observable@^0.8.14: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" From 16767e161a8eb5d65b68cc2ccb894fc89652953d Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 23:26:51 +0900 Subject: [PATCH 15/37] Polymorphic atoms --- src/Wire/Store.purs | 65 ++++++++++++++++++---------------- src/Wire/Store/Atom.purs | 39 ++++++++++++-------- src/Wire/Store/Atom/Async.purs | 39 +++++++++++--------- src/Wire/Store/Atom/Class.purs | 10 ++++++ src/Wire/Store/Atom/Pure.purs | 24 ++++++------- src/Wire/Store/Atom/Sync.purs | 39 +++++++++++--------- src/Wire/Store/Builder.purs | 27 ++++++++++++++ src/Wire/Store/Selector.purs | 43 +++++++++++++++------- 8 files changed, 180 insertions(+), 106 deletions(-) create mode 100644 src/Wire/Store/Atom/Class.purs create mode 100644 src/Wire/Store/Builder.purs diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 24b8554..d489a44 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -10,10 +10,8 @@ import Foreign.Object as Object import Partial.Unsafe (unsafePartial) import Prim.Row (class Cons, class Lacks) import Unsafe.Coerce (unsafeCoerce) -import Wire.Store.Atom (Atom(..)) -import Wire.Store.Atom.Async as Async -import Wire.Store.Atom.Pure as Pure -import Wire.Store.Atom.Sync as Sync +import Wire.Store.Atom.Class (class Atom) +import Wire.Store.Atom.Class as Class import Wire.Store.Atom.Types (AtomSignal) newtype Store (atoms :: # Type) @@ -22,19 +20,17 @@ newtype Store (atoms :: # Type) empty :: Store () empty = Store { atoms: Object.empty } -withAtom :: - forall key value before after. +insertAtom :: + forall key value before after atom. + Atom atom key value => IsSymbol key => Lacks key before => Cons key value before after => - Atom key value -> + atom -> Store before -> Effect (Store after) -withAtom atom (Store store) = do - signal <- case atom of - Async a -> Async.createSignal a - Sync a -> Sync.createSignal a - Pure a -> Pure.createSignal a +insertAtom atom (Store store) = do + signal <- Class.create atom pure $ Store store @@ -44,29 +40,36 @@ withAtom atom (Store store) = do store.atoms } -getAtomSignal :: - forall key value atoms r. +getAtom :: + forall key value atoms r atom. + Atom atom key value => IsSymbol key => Cons key value r atoms => - Atom key value -> - Store atoms -> AtomSignal value -getAtomSignal _ (Store { atoms }) = + atom -> + Store atoms -> + AtomSignal value +getAtom _ (Store { atoms }) = (unsafeCoerce :: forall a. Foreign -> AtomSignal a) $ unsafePartial fromJust $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms -resetAtom :: forall key value atoms r. IsSymbol key => Cons key value r atoms => Atom key value -> Store atoms -> Effect Unit -resetAtom atom = - getAtomSignal atom - >>> case atom of - Async a -> Async.reset a - Sync a -> Sync.reset a - Pure a -> Pure.reset a +resetAtom :: + forall key value atoms r atom. + Atom atom key value => + IsSymbol key => + Cons key value r atoms => + atom -> + Store atoms -> + Effect Unit +resetAtom atom = getAtom atom >>> Class.reset atom -updateAtom :: forall key value atoms r. IsSymbol key => Cons key value r atoms => value -> Atom key value -> Store atoms -> Effect Unit -updateAtom value atom = - getAtomSignal atom - >>> case atom of - Async a -> Async.update value a - Sync a -> Sync.update value a - Pure a -> Pure.update value a +updateAtom :: + forall key value atoms r atom. + Atom atom key value => + IsSymbol key => + Cons key value r atoms => + atom -> + value -> + Store atoms -> + Effect Unit +updateAtom atom value = getAtom atom >>> Class.update atom value diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index 971dd4a..823457b 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -1,23 +1,32 @@ module Wire.Store.Atom where import Prelude +import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Effect.Aff (Aff) -import Wire.Store.Atom.Async (Async(..)) -import Wire.Store.Atom.Pure (Pure(..)) -import Wire.Store.Atom.Sync (Sync(..)) -import Wire.Store.Atom.Types (Handler, Action) +import Wire.Store.Atom.Async (Async) +import Wire.Store.Atom.Async as Async +import Wire.Store.Atom.Pure (Pure) +import Wire.Store.Atom.Pure as Pure +import Wire.Store.Atom.Sync (Sync) +import Wire.Store.Atom.Sync as Sync +import Wire.Store.Atom.Types (Action, AtomicF) -data Atom (key :: Symbol) a - = Async (Async a) - | Sync (Sync a) - | Pure (Pure a) +newAsync :: + forall value key. + { default :: value + , handler :: Action value -> FreeT (AtomicF value) Aff Unit + } -> + Async key value +newAsync = Async.new -makeAsync :: forall a key. a -> (Action a -> Handler Aff a) -> Atom key a -makeAsync default handler = Async (Async' { default, handler }) +newSync :: + forall value key. + { default :: value + , handler :: Action value -> FreeT (AtomicF value) Effect Unit + } -> + Sync key value +newSync = Sync.new -makeSync :: forall a key. a -> (Action a -> Handler Effect a) -> Atom key a -makeSync default handler = Sync (Sync' { default, handler }) - -makePure :: forall a key. a -> Atom key a -makePure = Pure <<< Pure' +newPure :: forall value key. value -> Pure key value +newPure = Pure.new diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index f82e8c8..8595397 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -5,30 +5,35 @@ import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Effect.Aff (Aff, launchAff_) import Wire.Signal as Signal +import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) -newtype Async a - = Async' - { default :: a - , handler :: Action a -> Handler a +newtype Async (key :: Symbol) value + = Async + { default :: value + , handler :: Action value -> Handler value } +new :: + forall value key. + { default :: value + , handler :: Action value -> FreeT (AtomicF value) Aff Unit + } -> + Async key value +new = Async + type Handler a = FreeT (AtomicF a) Aff Unit -createSignal :: forall a. Async a -> Effect (AtomSignal a) -createSignal (Async' { default, handler }) = do - signal <- Signal.create default - run (handler Initialize) signal - pure signal +instance atomAsync :: Atom (Async key value) key value where + create (Async { default, handler }) = do + signal <- Signal.create default + run (handler Initialize) signal + pure signal + reset (Async { default, handler }) signal = do + signal.write default + run (handler Initialize) signal + update (Async { handler }) value = run (handler (Update value)) run :: forall a. Handler a -> AtomSignal a -> Effect Unit run handler signal = launchAff_ $ interpret signal handler - -reset :: forall a. Async a -> AtomSignal a -> Effect Unit -reset (Async' { default, handler }) signal = do - signal.write default - run (handler Initialize) signal - -update :: forall a. a -> Async a -> AtomSignal a -> Effect Unit -update value (Async' { handler }) = run (handler (Update value)) diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/Atom/Class.purs new file mode 100644 index 0000000..a0de1f6 --- /dev/null +++ b/src/Wire/Store/Atom/Class.purs @@ -0,0 +1,10 @@ +module Wire.Store.Atom.Class where + +import Prelude +import Effect (Effect) +import Wire.Store.Atom.Types (AtomSignal) + +class Atom atom (key :: Symbol) value | atom -> key value where + create :: atom -> Effect (AtomSignal value) + reset :: atom -> AtomSignal value -> Effect Unit + update :: atom -> value -> AtomSignal value -> Effect Unit diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index cf7d36b..50a04f1 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -1,20 +1,18 @@ module Wire.Store.Atom.Pure where import Prelude -import Effect (Effect) import Wire.Signal as Signal -import Wire.Store.Atom.Types (AtomSignal) +import Wire.Store.Atom.Class (class Atom) -newtype Pure a - = Pure' a +newtype Pure (key :: Symbol) value + = Pure value -createSignal :: forall a. Pure a -> Effect (AtomSignal a) -createSignal (Pure' value) = do - signal <- Signal.create value - pure signal +new :: forall value key. value -> Pure key value +new = Pure -reset :: forall a. Pure a -> AtomSignal a -> Effect Unit -reset (Pure' value) signal = signal.write value - -update :: forall a. a -> Pure a -> AtomSignal a -> Effect Unit -update value _ signal = signal.write value +instance atomPure :: Atom (Pure key value) key value where + create (Pure value) = do + signal <- Signal.create value + pure signal + reset (Pure value) signal = signal.write value + update _ value signal = signal.write value diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index 1c7593a..80e6f5f 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -4,30 +4,35 @@ import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Wire.Signal as Signal +import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) -newtype Sync a - = Sync' - { default :: a - , handler :: Action a -> Handler a +newtype Sync (key :: Symbol) value + = Sync + { default :: value + , handler :: Action value -> Handler value } type Handler a = FreeT (AtomicF a) Effect Unit -createSignal :: forall a. Sync a -> Effect (AtomSignal a) -createSignal (Sync' { default, handler }) = do - signal <- Signal.create default - run (handler Initialize) signal - pure signal +new :: + forall value key. + { default :: value + , handler :: Action value -> FreeT (AtomicF value) Effect Unit + } -> + Sync key value +new = Sync + +instance atomSync :: Atom (Sync key value) key value where + create (Sync { default, handler }) = do + signal <- Signal.create default + run (handler Initialize) signal + pure signal + reset (Sync { default, handler }) signal = do + signal.write default + run (handler Initialize) signal + update (Sync { handler }) value = run (handler (Update value)) run :: forall a. Handler a -> AtomSignal a -> Effect Unit run = flip interpret - -reset :: forall a. Sync a -> AtomSignal a -> Effect Unit -reset (Sync' { default, handler }) signal = do - signal.write default - run (handler Initialize) signal - -update :: forall a. a -> Sync a -> AtomSignal a -> Effect Unit -update value (Sync' { handler }) = run (handler (Update value)) diff --git a/src/Wire/Store/Builder.purs b/src/Wire/Store/Builder.purs new file mode 100644 index 0000000..7d9bd60 --- /dev/null +++ b/src/Wire/Store/Builder.purs @@ -0,0 +1,27 @@ +module Wire.Store.Builder where + +import Prelude + +import Data.Profunctor.Star (Star(..)) +import Data.Symbol (class IsSymbol) +import Effect (Effect) +import Prim.Row (class Cons, class Lacks) +import Wire.Store (Store) +import Wire.Store as Store +import Wire.Store.Atom.Class (class Atom) + +newtype Builder i o + = Builder (Star Effect (Store i) (Store o)) + +insert :: + forall atom value key o i. + Atom atom key value => + IsSymbol key => + Lacks key i => + Cons key value i o => + atom -> + Builder i o +insert atom = Builder $ Star $ Store.insertAtom atom + +build :: forall o i. Builder i o -> Store i -> Effect (Store o) +build (Builder (Star runBuilder)) = runBuilder diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 9a4b5f0..1d57d95 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -5,19 +5,17 @@ import Control.Monad.Free.Trans (FreeT, freeT, runFreeT) import Control.Monad.Rec.Class (class MonadRec) import Control.Monad.Trans.Class (lift) import Data.Either (Either(..)) -import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) +import Data.Symbol (class IsSymbol) import Effect (Effect) -import Effect.Class.Console as Console -import Effect.Unsafe (unsafePerformEffect) import Prim.Row (class Cons) import Wire.Signal (Signal) import Wire.Signal as Signal import Wire.Store (Store) import Wire.Store as Store -import Wire.Store.Atom (Atom) +import Wire.Store.Atom.Class (class Atom) newtype Selector (atoms :: # Type) a - = Selector' + = Selector { select :: FreeT (SelectF atoms) Signal a , update :: a -> FreeT (SelectF atoms) Effect Unit } @@ -28,21 +26,40 @@ makeSelector :: , update :: a -> FreeT (SelectF atoms) Effect Unit } -> Selector atoms a -makeSelector = Selector' +makeSelector = Selector data SelectF (atoms :: # Type) next = Apply (Store atoms -> next) derive instance functorSelectF :: Functor (SelectF atoms) -select :: forall key r atoms value. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Signal value -select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.getAtomSignal atom store).signal +select :: + forall atom key r atoms value. + Atom atom key value => + IsSymbol key => + Cons key value r atoms => + atom -> + FreeT (SelectF atoms) Signal value +select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.getAtom atom store).signal -read :: forall value r atoms key. IsSymbol key => Cons key value r atoms => Atom key value -> FreeT (SelectF atoms) Effect value -read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.getAtomSignal atom store).signal +read :: + forall atom value r atoms key. + Atom atom key value => + IsSymbol key => + Cons key value r atoms => + atom -> + FreeT (SelectF atoms) Effect value +read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.getAtom atom store).signal -write :: forall r atoms value key. IsSymbol key => Cons key value r atoms => value -> Atom key value -> FreeT (SelectF atoms) Effect Unit -write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom value atom store +write :: + forall atom r atoms value key. + Atom atom key value => + IsSymbol key => + Cons key value r atoms => + value -> + atom -> + FreeT (SelectF atoms) Effect Unit +write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom atom value store interpret :: forall a m atoms. MonadRec m => Store atoms -> FreeT (SelectF atoms) m a -> m a interpret store = runFreeT \(Apply run) -> pure (run store) @@ -54,7 +71,7 @@ build :: { signal :: Signal a , write :: a -> Effect Unit } -build (Selector' selector) store = +build (Selector selector) store = { signal: interpret store selector.select , write: \a -> interpret store (selector.update a) } From da58046c86f634e89952e536c86e9983481691de Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Tue, 30 Jun 2020 23:38:32 +0900 Subject: [PATCH 16/37] Now mono-kinded atoms --- src/Wire/Store.purs | 16 ++++++++-------- src/Wire/Store/Atom/Async.purs | 2 +- src/Wire/Store/Atom/Class.purs | 8 ++++---- src/Wire/Store/Atom/Pure.purs | 2 +- src/Wire/Store/Atom/Sync.purs | 2 +- src/Wire/Store/Builder.purs | 5 ++--- src/Wire/Store/Selector.purs | 14 +++++++------- 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index d489a44..8aac965 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -22,11 +22,11 @@ empty = Store { atoms: Object.empty } insertAtom :: forall key value before after atom. - Atom atom key value => + Atom atom => IsSymbol key => Lacks key before => Cons key value before after => - atom -> + atom key value -> Store before -> Effect (Store after) insertAtom atom (Store store) = do @@ -42,10 +42,10 @@ insertAtom atom (Store store) = do getAtom :: forall key value atoms r atom. - Atom atom key value => + Atom atom => IsSymbol key => Cons key value r atoms => - atom -> + atom key value -> Store atoms -> AtomSignal value getAtom _ (Store { atoms }) = @@ -55,20 +55,20 @@ getAtom _ (Store { atoms }) = resetAtom :: forall key value atoms r atom. - Atom atom key value => + Atom atom => IsSymbol key => Cons key value r atoms => - atom -> + atom key value -> Store atoms -> Effect Unit resetAtom atom = getAtom atom >>> Class.reset atom updateAtom :: forall key value atoms r atom. - Atom atom key value => + Atom atom => IsSymbol key => Cons key value r atoms => - atom -> + atom key value -> value -> Store atoms -> Effect Unit diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 8595397..95a55a2 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -25,7 +25,7 @@ new = Async type Handler a = FreeT (AtomicF a) Aff Unit -instance atomAsync :: Atom (Async key value) key value where +instance atomAsync :: Atom Async where create (Async { default, handler }) = do signal <- Signal.create default run (handler Initialize) signal diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/Atom/Class.purs index a0de1f6..010912a 100644 --- a/src/Wire/Store/Atom/Class.purs +++ b/src/Wire/Store/Atom/Class.purs @@ -4,7 +4,7 @@ import Prelude import Effect (Effect) import Wire.Store.Atom.Types (AtomSignal) -class Atom atom (key :: Symbol) value | atom -> key value where - create :: atom -> Effect (AtomSignal value) - reset :: atom -> AtomSignal value -> Effect Unit - update :: atom -> value -> AtomSignal value -> Effect Unit +class Atom (atom :: Symbol -> Type -> Type) where + create :: forall key value. atom key value -> Effect (AtomSignal value) + reset :: forall key value. atom key value -> AtomSignal value -> Effect Unit + update :: forall key value. atom key value -> value -> AtomSignal value -> Effect Unit diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 50a04f1..0223148 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -10,7 +10,7 @@ newtype Pure (key :: Symbol) value new :: forall value key. value -> Pure key value new = Pure -instance atomPure :: Atom (Pure key value) key value where +instance atomPure :: Atom Pure where create (Pure value) = do signal <- Signal.create value pure signal diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index 80e6f5f..6a29780 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -24,7 +24,7 @@ new :: Sync key value new = Sync -instance atomSync :: Atom (Sync key value) key value where +instance atomSync :: Atom Sync where create (Sync { default, handler }) = do signal <- Signal.create default run (handler Initialize) signal diff --git a/src/Wire/Store/Builder.purs b/src/Wire/Store/Builder.purs index 7d9bd60..921be70 100644 --- a/src/Wire/Store/Builder.purs +++ b/src/Wire/Store/Builder.purs @@ -1,7 +1,6 @@ module Wire.Store.Builder where import Prelude - import Data.Profunctor.Star (Star(..)) import Data.Symbol (class IsSymbol) import Effect (Effect) @@ -15,11 +14,11 @@ newtype Builder i o insert :: forall atom value key o i. - Atom atom key value => + Atom atom => IsSymbol key => Lacks key i => Cons key value i o => - atom -> + atom key value -> Builder i o insert atom = Builder $ Star $ Store.insertAtom atom diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 1d57d95..bab35a7 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -35,31 +35,31 @@ derive instance functorSelectF :: Functor (SelectF atoms) select :: forall atom key r atoms value. - Atom atom key value => + Atom atom => IsSymbol key => Cons key value r atoms => - atom -> + atom key value -> FreeT (SelectF atoms) Signal value select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.getAtom atom store).signal read :: forall atom value r atoms key. - Atom atom key value => + Atom atom => IsSymbol key => Cons key value r atoms => - atom -> + atom key value -> FreeT (SelectF atoms) Effect value read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.getAtom atom store).signal write :: forall atom r atoms value key. - Atom atom key value => + Atom atom => IsSymbol key => Cons key value r atoms => + atom key value -> value -> - atom -> FreeT (SelectF atoms) Effect Unit -write value atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom atom value store +write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom atom value store interpret :: forall a m atoms. MonadRec m => Store atoms -> FreeT (SelectF atoms) m a -> m a interpret store = runFreeT \(Apply run) -> pure (run store) From b03cd4ada6d9c4354824490d32046833b523a624 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 00:00:38 +0900 Subject: [PATCH 17/37] Change from row types to records for tracking atoms --- src/Wire/Store.purs | 17 ++++++++--------- src/Wire/Store/Builder.purs | 7 +++---- src/Wire/Store/Selector.purs | 16 ++++++++-------- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 8aac965..8ba84fb 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -8,27 +8,26 @@ import Foreign (Foreign) import Foreign.Object (Object) import Foreign.Object as Object import Partial.Unsafe (unsafePartial) -import Prim.Row (class Cons, class Lacks) +import Prim.Row (class Cons) import Unsafe.Coerce (unsafeCoerce) import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Class as Class import Wire.Store.Atom.Types (AtomSignal) -newtype Store (atoms :: # Type) +newtype Store atoms = Store { atoms :: Object Foreign } -empty :: Store () +empty :: Store {} empty = Store { atoms: Object.empty } insertAtom :: forall key value before after atom. Atom atom => IsSymbol key => - Lacks key before => Cons key value before after => atom key value -> - Store before -> - Effect (Store after) + Store { | before } -> + Effect (Store { | after }) insertAtom atom (Store store) = do signal <- Class.create atom pure @@ -46,7 +45,7 @@ getAtom :: IsSymbol key => Cons key value r atoms => atom key value -> - Store atoms -> + Store { | atoms } -> AtomSignal value getAtom _ (Store { atoms }) = (unsafeCoerce :: forall a. Foreign -> AtomSignal a) @@ -59,7 +58,7 @@ resetAtom :: IsSymbol key => Cons key value r atoms => atom key value -> - Store atoms -> + Store { | atoms } -> Effect Unit resetAtom atom = getAtom atom >>> Class.reset atom @@ -70,6 +69,6 @@ updateAtom :: Cons key value r atoms => atom key value -> value -> - Store atoms -> + Store { | atoms } -> Effect Unit updateAtom atom value = getAtom atom >>> Class.update atom value diff --git a/src/Wire/Store/Builder.purs b/src/Wire/Store/Builder.purs index 921be70..e061c50 100644 --- a/src/Wire/Store/Builder.purs +++ b/src/Wire/Store/Builder.purs @@ -4,7 +4,7 @@ import Prelude import Data.Profunctor.Star (Star(..)) import Data.Symbol (class IsSymbol) import Effect (Effect) -import Prim.Row (class Cons, class Lacks) +import Prim.Row (class Cons) import Wire.Store (Store) import Wire.Store as Store import Wire.Store.Atom.Class (class Atom) @@ -16,11 +16,10 @@ insert :: forall atom value key o i. Atom atom => IsSymbol key => - Lacks key i => Cons key value i o => atom key value -> - Builder i o + Builder { | i } { | o } insert atom = Builder $ Star $ Store.insertAtom atom -build :: forall o i. Builder i o -> Store i -> Effect (Store o) +build :: forall o i. Builder { | i } { | o } -> Store { | i } -> Effect (Store { | o }) build (Builder (Star runBuilder)) = runBuilder diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index bab35a7..8a0e010 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -14,7 +14,7 @@ import Wire.Store (Store) import Wire.Store as Store import Wire.Store.Atom.Class (class Atom) -newtype Selector (atoms :: # Type) a +newtype Selector atoms a = Selector { select :: FreeT (SelectF atoms) Signal a , update :: a -> FreeT (SelectF atoms) Effect Unit @@ -28,7 +28,7 @@ makeSelector :: Selector atoms a makeSelector = Selector -data SelectF (atoms :: # Type) next +data SelectF atoms next = Apply (Store atoms -> next) derive instance functorSelectF :: Functor (SelectF atoms) @@ -39,7 +39,7 @@ select :: IsSymbol key => Cons key value r atoms => atom key value -> - FreeT (SelectF atoms) Signal value + FreeT (SelectF { | atoms }) Signal value select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.getAtom atom store).signal read :: @@ -48,7 +48,7 @@ read :: IsSymbol key => Cons key value r atoms => atom key value -> - FreeT (SelectF atoms) Effect value + FreeT (SelectF { | atoms }) Effect value read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.getAtom atom store).signal write :: @@ -58,16 +58,16 @@ write :: Cons key value r atoms => atom key value -> value -> - FreeT (SelectF atoms) Effect Unit + FreeT (SelectF { | atoms }) Effect Unit write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom atom value store -interpret :: forall a m atoms. MonadRec m => Store atoms -> FreeT (SelectF atoms) m a -> m a +interpret :: forall a m atoms. MonadRec m => Store { | atoms } -> FreeT (SelectF { | atoms }) m a -> m a interpret store = runFreeT \(Apply run) -> pure (run store) build :: forall a atoms. - Selector atoms a -> - Store atoms -> + Selector { | atoms } a -> + Store { | atoms } -> { signal :: Signal a , write :: a -> Effect Unit } From 2c7c146e25aed2bd7c524af04b5ca0b7c1f91bd3 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 00:07:59 +0900 Subject: [PATCH 18/37] Added Category instances for Builder --- src/Wire/Store/Builder.purs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Wire/Store/Builder.purs b/src/Wire/Store/Builder.purs index e061c50..33e8aaf 100644 --- a/src/Wire/Store/Builder.purs +++ b/src/Wire/Store/Builder.purs @@ -12,6 +12,12 @@ import Wire.Store.Atom.Class (class Atom) newtype Builder i o = Builder (Star Effect (Store i) (Store o)) +instance semigroupoidBuilder :: Semigroupoid Builder where + compose (Builder f) (Builder g) = Builder (compose f g) + +instance categoryBuilder :: Category Builder where + identity = Builder identity + insert :: forall atom value key o i. Atom atom => From 2a38a65f0a75d5ba0f4854d9559e34946bdf4471 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 00:11:34 +0900 Subject: [PATCH 19/37] Removed Star --- src/Wire/Store/Builder.purs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Wire/Store/Builder.purs b/src/Wire/Store/Builder.purs index 33e8aaf..1f80bcc 100644 --- a/src/Wire/Store/Builder.purs +++ b/src/Wire/Store/Builder.purs @@ -1,7 +1,6 @@ module Wire.Store.Builder where import Prelude -import Data.Profunctor.Star (Star(..)) import Data.Symbol (class IsSymbol) import Effect (Effect) import Prim.Row (class Cons) @@ -10,13 +9,13 @@ import Wire.Store as Store import Wire.Store.Atom.Class (class Atom) newtype Builder i o - = Builder (Star Effect (Store i) (Store o)) + = Builder (Store i -> Effect (Store o)) instance semigroupoidBuilder :: Semigroupoid Builder where - compose (Builder f) (Builder g) = Builder (compose f g) + compose (Builder f) (Builder g) = Builder (f <=< g) instance categoryBuilder :: Category Builder where - identity = Builder identity + identity = Builder pure insert :: forall atom value key o i. @@ -25,7 +24,7 @@ insert :: Cons key value i o => atom key value -> Builder { | i } { | o } -insert atom = Builder $ Star $ Store.insertAtom atom +insert atom = Builder $ Store.insertAtom atom build :: forall o i. Builder { | i } { | o } -> Store { | i } -> Effect (Store { | o }) -build (Builder (Star runBuilder)) = runBuilder +build (Builder runBuilder) = runBuilder From 323dfd5ff19bd51e7868f96860cf7f4bc8185e7f Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 00:36:33 +0900 Subject: [PATCH 20/37] Added Transformer back --- src/Wire/Event/Transformer.purs | 59 +++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/Wire/Event/Transformer.purs diff --git a/src/Wire/Event/Transformer.purs b/src/Wire/Event/Transformer.purs new file mode 100644 index 0000000..b626dfd --- /dev/null +++ b/src/Wire/Event/Transformer.purs @@ -0,0 +1,59 @@ +module Wire.Event.Transformer where + +import Prelude +import Control.Alt (class Alt, alt) +import Data.Compactable (class Compactable, compact, separate) +import Data.Either (Either(..)) +import Data.Filterable (class Filterable, filter, filterMap, partition, partitionMap) +import Data.Profunctor (class Profunctor) +import Data.Profunctor.Choice (class Choice) + +newtype Transformer f i o + = Transformer (f i -> f o) + +transform :: forall f o i. Transformer f i o -> f i -> f o +transform (Transformer t) = t + +transformFlipped :: forall f i o. f i -> Transformer f i o -> f o +transformFlipped = flip transform + +infixr 2 transform as <~: + +infixl 2 transformFlipped as :~> + +lift :: forall f i o. (f i -> f o) -> Transformer f i o +lift = Transformer + +derive instance functorTransformer :: Functor f => Functor (Transformer f i) + +instance semigroupoidTransformer :: Semigroupoid (Transformer f) where + compose (Transformer f) (Transformer g) = Transformer (compose f g) + +instance categoryTransformer :: Category (Transformer f) where + identity = Transformer identity + +instance profunctorTransformer :: Functor f => Profunctor (Transformer f) where + dimap a2b c2d (Transformer t) = Transformer (map c2d <<< t <<< map a2b) + +instance choiceTransformer :: (Alt f, Compactable f) => Choice (Transformer f) where + left (Transformer t) = Transformer (separate >>> \event -> alt (Left <$> t event.left) (Right <$> event.right)) + right (Transformer t) = Transformer (separate >>> \event -> alt (Left <$> event.left) (Right <$> t event.right)) + +instance compactableTransformer :: Compactable f => Compactable (Transformer f i) where + compact (Transformer t) = Transformer (compact <<< t) + separate (Transformer t) = + { left: Transformer (_.left <<< separate <<< t) + , right: Transformer (_.right <<< separate <<< t) + } + +instance filterableTransformer :: Filterable f => Filterable (Transformer f i) where + partitionMap f (Transformer t) = + { left: Transformer (_.left <<< partitionMap f <<< t) + , right: Transformer (_.right <<< partitionMap f <<< t) + } + partition f (Transformer t) = + { yes: Transformer (_.yes <<< partition f <<< t) + , no: Transformer (_.no <<< partition f <<< t) + } + filterMap f (Transformer t) = Transformer (filterMap f <<< t) + filter f (Transformer t) = Transformer (filter f <<< t) From 0eec301ff615163a0a86ad1d393d01f4965a5d64 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 01:07:20 +0900 Subject: [PATCH 21/37] And removed it again. Not sure if it's useful --- src/Wire/Event/Transformer.purs | 59 --------------------------------- 1 file changed, 59 deletions(-) delete mode 100644 src/Wire/Event/Transformer.purs diff --git a/src/Wire/Event/Transformer.purs b/src/Wire/Event/Transformer.purs deleted file mode 100644 index b626dfd..0000000 --- a/src/Wire/Event/Transformer.purs +++ /dev/null @@ -1,59 +0,0 @@ -module Wire.Event.Transformer where - -import Prelude -import Control.Alt (class Alt, alt) -import Data.Compactable (class Compactable, compact, separate) -import Data.Either (Either(..)) -import Data.Filterable (class Filterable, filter, filterMap, partition, partitionMap) -import Data.Profunctor (class Profunctor) -import Data.Profunctor.Choice (class Choice) - -newtype Transformer f i o - = Transformer (f i -> f o) - -transform :: forall f o i. Transformer f i o -> f i -> f o -transform (Transformer t) = t - -transformFlipped :: forall f i o. f i -> Transformer f i o -> f o -transformFlipped = flip transform - -infixr 2 transform as <~: - -infixl 2 transformFlipped as :~> - -lift :: forall f i o. (f i -> f o) -> Transformer f i o -lift = Transformer - -derive instance functorTransformer :: Functor f => Functor (Transformer f i) - -instance semigroupoidTransformer :: Semigroupoid (Transformer f) where - compose (Transformer f) (Transformer g) = Transformer (compose f g) - -instance categoryTransformer :: Category (Transformer f) where - identity = Transformer identity - -instance profunctorTransformer :: Functor f => Profunctor (Transformer f) where - dimap a2b c2d (Transformer t) = Transformer (map c2d <<< t <<< map a2b) - -instance choiceTransformer :: (Alt f, Compactable f) => Choice (Transformer f) where - left (Transformer t) = Transformer (separate >>> \event -> alt (Left <$> t event.left) (Right <$> event.right)) - right (Transformer t) = Transformer (separate >>> \event -> alt (Left <$> event.left) (Right <$> t event.right)) - -instance compactableTransformer :: Compactable f => Compactable (Transformer f i) where - compact (Transformer t) = Transformer (compact <<< t) - separate (Transformer t) = - { left: Transformer (_.left <<< separate <<< t) - , right: Transformer (_.right <<< separate <<< t) - } - -instance filterableTransformer :: Filterable f => Filterable (Transformer f i) where - partitionMap f (Transformer t) = - { left: Transformer (_.left <<< partitionMap f <<< t) - , right: Transformer (_.right <<< partitionMap f <<< t) - } - partition f (Transformer t) = - { yes: Transformer (_.yes <<< partition f <<< t) - , no: Transformer (_.no <<< partition f <<< t) - } - filterMap f (Transformer t) = Transformer (filterMap f <<< t) - filter f (Transformer t) = Transformer (filter f <<< t) From 3064665a5a2313f24f08b088e08bbde9a0ac91f9 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 12:41:08 +0900 Subject: [PATCH 22/37] More big changes --- src/Wire/Store.purs | 102 +++++++++++++++------------------ src/Wire/Store/Atom.purs | 31 ---------- src/Wire/Store/Atom/Async.purs | 47 ++++++++++----- src/Wire/Store/Atom/Class.purs | 11 ++-- src/Wire/Store/Atom/Pure.purs | 43 ++++++++++---- src/Wire/Store/Atom/Sync.purs | 47 ++++++++++----- src/Wire/Store/Builder.purs | 30 ---------- src/Wire/Store/Selector.purs | 63 +++++++------------- 8 files changed, 173 insertions(+), 201 deletions(-) delete mode 100644 src/Wire/Store/Builder.purs diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 8ba84fb..2129fff 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -1,74 +1,62 @@ module Wire.Store where import Prelude -import Data.Maybe (fromJust) -import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) +import Data.Foldable (traverse_) +import Data.Maybe (Maybe(..)) import Effect (Effect) +import Effect.Console as Console +import Effect.Ref (Ref) +import Effect.Ref as Ref +import Effect.Unsafe (unsafePerformEffect) import Foreign (Foreign) import Foreign.Object (Object) import Foreign.Object as Object -import Partial.Unsafe (unsafePartial) -import Prim.Row (class Cons) import Unsafe.Coerce (unsafeCoerce) +import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Class as Class import Wire.Store.Atom.Types (AtomSignal) -newtype Store atoms - = Store { atoms :: Object Foreign } +newtype Store + = Store { atoms :: Ref (Object Foreign) } -empty :: Store {} -empty = Store { atoms: Object.empty } +create :: Effect Store +create = do + atoms <- Ref.new Object.empty + pure $ Store { atoms } -insertAtom :: - forall key value before after atom. - Atom atom => - IsSymbol key => - Cons key value before after => - atom key value -> - Store { | before } -> - Effect (Store { | after }) -insertAtom atom (Store store) = do - signal <- Class.create atom - pure - $ Store - store - { atoms = - Object.insert (reflectSymbol (SProxy :: _ key)) - ((unsafeCoerce :: forall a. AtomSignal a -> Foreign) signal) - store.atoms - } +toForeign :: forall atom value. Atom atom => atom value -> AtomSignal value -> Foreign +toForeign _ = unsafeCoerce -getAtom :: - forall key value atoms r atom. - Atom atom => - IsSymbol key => - Cons key value r atoms => - atom key value -> - Store { | atoms } -> - AtomSignal value -getAtom _ (Store { atoms }) = - (unsafeCoerce :: forall a. Foreign -> AtomSignal a) - $ unsafePartial fromJust - $ Object.lookup (reflectSymbol (SProxy :: _ key)) atoms +fromForeign :: forall atom value. Atom atom => atom value -> Foreign -> AtomSignal value +fromForeign _ = unsafeCoerce -resetAtom :: - forall key value atoms r atom. - Atom atom => - IsSymbol key => - Cons key value r atoms => - atom key value -> - Store { | atoms } -> - Effect Unit -resetAtom atom = getAtom atom >>> Class.reset atom +lookup :: forall value atom. Atom atom => atom value -> Store -> Effect (Maybe (AtomSignal value)) +lookup atom (Store store) = do + let + storeKey = Class.toStoreKey atom + storedSignal <- map (fromForeign atom) <<< Object.lookup storeKey <$> Ref.read store.atoms + isInitialised <- Class.isInitialised atom + case storedSignal, isInitialised of + Just signal, true -> do + pure $ pure signal + Nothing, false -> do + signal <- Signal.create $ Class.defaultValue atom + Ref.modify_ (Object.insert storeKey (toForeign atom signal)) store.atoms + Class.initialise atom signal + pure $ pure signal + Nothing, true -> do + Console.warn $ "The atom " <> show storeKey <> " has been initialised but cannot be found in the store." + pure Nothing + Just _, false -> do + Console.warn $ "A different atom with the key " <> show storeKey <> " is already in the store." + pure Nothing -updateAtom :: - forall key value atoms r atom. - Atom atom => - IsSymbol key => - Cons key value r atoms => - atom key value -> - value -> - Store { | atoms } -> - Effect Unit -updateAtom atom value = getAtom atom >>> Class.update atom value +unsafeLookup :: forall atom value. Atom atom => atom value -> Store -> Maybe (AtomSignal value) +unsafeLookup atom store = unsafePerformEffect $ lookup atom store + +reset :: forall atom value. Atom atom => atom value -> Store -> Effect Unit +reset atom store = lookup atom store >>= traverse_ (Class.resetValue atom) + +update :: forall atom value. Atom atom => atom value -> value -> Store -> Effect Unit +update atom value store = lookup atom store >>= traverse_ (Class.updateValue atom value) diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index 823457b..44b872d 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -1,32 +1 @@ module Wire.Store.Atom where - -import Prelude -import Control.Monad.Free.Trans (FreeT) -import Effect (Effect) -import Effect.Aff (Aff) -import Wire.Store.Atom.Async (Async) -import Wire.Store.Atom.Async as Async -import Wire.Store.Atom.Pure (Pure) -import Wire.Store.Atom.Pure as Pure -import Wire.Store.Atom.Sync (Sync) -import Wire.Store.Atom.Sync as Sync -import Wire.Store.Atom.Types (Action, AtomicF) - -newAsync :: - forall value key. - { default :: value - , handler :: Action value -> FreeT (AtomicF value) Aff Unit - } -> - Async key value -newAsync = Async.new - -newSync :: - forall value key. - { default :: value - , handler :: Action value -> FreeT (AtomicF value) Effect Unit - } -> - Sync key value -newSync = Sync.new - -newPure :: forall value key. value -> Pure key value -newPure = Pure.new diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 95a55a2..8b41f32 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -4,36 +4,55 @@ import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) import Effect.Aff (Aff, launchAff_) +import Effect.Ref (Ref) +import Effect.Ref as Ref +import Effect.Unsafe (unsafePerformEffect) import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) -newtype Async (key :: Symbol) value +newtype Async value = Async - { default :: value + { key :: String + , default :: value , handler :: Action value -> Handler value + , initialised :: Ref Boolean } -new :: - forall value key. +create :: + forall value. + { default :: value + , handler :: Action value -> FreeT (AtomicF value) Aff Unit + , key :: String + } -> + Effect (Async value) +create { key, default, handler } = do + initialised <- Ref.new false + pure $ Async { key, initialised, default, handler } + +unsafeCreate :: + forall value. { default :: value , handler :: Action value -> FreeT (AtomicF value) Aff Unit + , key :: String } -> - Async key value -new = Async + Async value +unsafeCreate = unsafePerformEffect <<< create type Handler a = FreeT (AtomicF a) Aff Unit instance atomAsync :: Atom Async where - create (Async { default, handler }) = do - signal <- Signal.create default - run (handler Initialize) signal - pure signal - reset (Async { default, handler }) signal = do - signal.write default - run (handler Initialize) signal - update (Async { handler }) value = run (handler (Update value)) + toStoreKey (Async atom) = atom.key + defaultValue (Async atom) = atom.default + isInitialised (Async atom) = Ref.read atom.initialised + initialise (Async atom) signal = do + Ref.write true atom.initialised + run (atom.handler Initialize) signal + resetValue (Async atom) signal = do + signal.write atom.default + run (atom.handler Initialize) signal + updateValue (Async atom) value = run (atom.handler (Update value)) run :: forall a. Handler a -> AtomSignal a -> Effect Unit run handler signal = launchAff_ $ interpret signal handler diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/Atom/Class.purs index 010912a..d96254d 100644 --- a/src/Wire/Store/Atom/Class.purs +++ b/src/Wire/Store/Atom/Class.purs @@ -4,7 +4,10 @@ import Prelude import Effect (Effect) import Wire.Store.Atom.Types (AtomSignal) -class Atom (atom :: Symbol -> Type -> Type) where - create :: forall key value. atom key value -> Effect (AtomSignal value) - reset :: forall key value. atom key value -> AtomSignal value -> Effect Unit - update :: forall key value. atom key value -> value -> AtomSignal value -> Effect Unit +class Atom (atom :: Type -> Type) where + toStoreKey :: forall value. atom value -> String + defaultValue :: forall value. atom value -> value + isInitialised :: forall value. atom value -> Effect Boolean + initialise :: forall value. atom value -> AtomSignal value -> Effect Unit + resetValue :: forall value. atom value -> AtomSignal value -> Effect Unit + updateValue :: forall value. atom value -> value -> AtomSignal value -> Effect Unit diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 0223148..5874afc 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -1,18 +1,41 @@ module Wire.Store.Atom.Pure where import Prelude -import Wire.Signal as Signal +import Effect (Effect) +import Effect.Ref (Ref) +import Effect.Ref as Ref +import Effect.Unsafe (unsafePerformEffect) import Wire.Store.Atom.Class (class Atom) -newtype Pure (key :: Symbol) value - = Pure value +newtype Pure value + = Pure + { key :: String + , default :: value + , initialised :: Ref Boolean + } -new :: forall value key. value -> Pure key value -new = Pure +create :: + forall value. + { default :: value + , key :: String + } -> + Effect (Pure value) +create { key, default } = do + initialised <- Ref.new false + pure $ Pure { key, default, initialised } + +unsafeCreate :: + forall value. + { default :: value + , key :: String + } -> + Pure value +unsafeCreate = unsafePerformEffect <<< create instance atomPure :: Atom Pure where - create (Pure value) = do - signal <- Signal.create value - pure signal - reset (Pure value) signal = signal.write value - update _ value signal = signal.write value + toStoreKey (Pure atom) = atom.key + defaultValue (Pure atom) = atom.default + isInitialised (Pure atom) = Ref.read atom.initialised + initialise (Pure atom) _ = Ref.write true atom.initialised + resetValue (Pure atom) signal = signal.write atom.default + updateValue _ value signal = signal.write value diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index 6a29780..b109be7 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -3,36 +3,55 @@ module Wire.Store.Atom.Sync where import Prelude import Control.Monad.Free.Trans (FreeT) import Effect (Effect) +import Effect.Ref (Ref) +import Effect.Ref as Ref +import Effect.Unsafe (unsafePerformEffect) import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) -newtype Sync (key :: Symbol) value +newtype Sync value = Sync - { default :: value + { key :: String + , default :: value , handler :: Action value -> Handler value + , initialised :: Ref Boolean } type Handler a = FreeT (AtomicF a) Effect Unit -new :: - forall value key. +create :: + forall value. + { default :: value + , handler :: Action value -> FreeT (AtomicF value) Effect Unit + , key :: String + } -> + Effect (Sync value) +create { key, default, handler } = do + initialised <- Ref.new false + pure $ Sync { key, initialised, default, handler } + +unsafeCreate :: + forall value. { default :: value , handler :: Action value -> FreeT (AtomicF value) Effect Unit + , key :: String } -> - Sync key value -new = Sync + Sync value +unsafeCreate = unsafePerformEffect <<< create instance atomSync :: Atom Sync where - create (Sync { default, handler }) = do - signal <- Signal.create default - run (handler Initialize) signal - pure signal - reset (Sync { default, handler }) signal = do - signal.write default - run (handler Initialize) signal - update (Sync { handler }) value = run (handler (Update value)) + toStoreKey (Sync atom) = atom.key + defaultValue (Sync atom) = atom.default + isInitialised (Sync atom) = Ref.read atom.initialised + initialise (Sync atom) signal = do + Ref.write true atom.initialised + run (atom.handler Initialize) signal + resetValue (Sync atom) signal = do + signal.write atom.default + run (atom.handler Initialize) signal + updateValue (Sync atom) value = run (atom.handler (Update value)) run :: forall a. Handler a -> AtomSignal a -> Effect Unit run = flip interpret diff --git a/src/Wire/Store/Builder.purs b/src/Wire/Store/Builder.purs deleted file mode 100644 index 1f80bcc..0000000 --- a/src/Wire/Store/Builder.purs +++ /dev/null @@ -1,30 +0,0 @@ -module Wire.Store.Builder where - -import Prelude -import Data.Symbol (class IsSymbol) -import Effect (Effect) -import Prim.Row (class Cons) -import Wire.Store (Store) -import Wire.Store as Store -import Wire.Store.Atom.Class (class Atom) - -newtype Builder i o - = Builder (Store i -> Effect (Store o)) - -instance semigroupoidBuilder :: Semigroupoid Builder where - compose (Builder f) (Builder g) = Builder (f <=< g) - -instance categoryBuilder :: Category Builder where - identity = Builder pure - -insert :: - forall atom value key o i. - Atom atom => - IsSymbol key => - Cons key value i o => - atom key value -> - Builder { | i } { | o } -insert atom = Builder $ Store.insertAtom atom - -build :: forall o i. Builder { | i } { | o } -> Store { | i } -> Effect (Store { | o }) -build (Builder runBuilder) = runBuilder diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 8a0e010..06a4dcb 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -5,69 +5,50 @@ import Control.Monad.Free.Trans (FreeT, freeT, runFreeT) import Control.Monad.Rec.Class (class MonadRec) import Control.Monad.Trans.Class (lift) import Data.Either (Either(..)) -import Data.Symbol (class IsSymbol) +import Data.Maybe (maybe') import Effect (Effect) -import Prim.Row (class Cons) import Wire.Signal (Signal) import Wire.Signal as Signal import Wire.Store (Store) import Wire.Store as Store import Wire.Store.Atom.Class (class Atom) +import Wire.Store.Atom.Class as Class -newtype Selector atoms a +newtype Selector a = Selector - { select :: FreeT (SelectF atoms) Signal a - , update :: a -> FreeT (SelectF atoms) Effect Unit + { select :: FreeT StoreF Signal a + , update :: a -> FreeT StoreF Effect Unit } makeSelector :: - forall a atoms. - { select :: FreeT (SelectF atoms) Signal a - , update :: a -> FreeT (SelectF atoms) Effect Unit + forall a. + { select :: FreeT StoreF Signal a + , update :: a -> FreeT StoreF Effect Unit } -> - Selector atoms a + Selector a makeSelector = Selector -data SelectF atoms next - = Apply (Store atoms -> next) +data StoreF next + = Apply (Store -> next) -derive instance functorSelectF :: Functor (SelectF atoms) +derive instance functorStoreF :: Functor StoreF -select :: - forall atom key r atoms value. - Atom atom => - IsSymbol key => - Cons key value r atoms => - atom key value -> - FreeT (SelectF { | atoms }) Signal value -select atom = freeT \_ -> pure $ Right $ Apply \store -> lift (Store.getAtom atom store).signal +select :: forall atom value. Atom atom => atom value -> FreeT StoreF Signal value +select atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.defaultValue atom) _.signal $ Store.unsafeLookup atom store -read :: - forall atom value r atoms key. - Atom atom => - IsSymbol key => - Cons key value r atoms => - atom key value -> - FreeT (SelectF { | atoms }) Effect value -read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ Signal.read (Store.getAtom atom store).signal +read :: forall atom value. Atom atom => atom value -> FreeT StoreF Effect value +read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.defaultValue atom) (Signal.read <<< _.signal) $ Store.unsafeLookup atom store -write :: - forall atom r atoms value key. - Atom atom => - IsSymbol key => - Cons key value r atoms => - atom key value -> - value -> - FreeT (SelectF { | atoms }) Effect Unit -write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updateAtom atom value store +write :: forall atom value. Atom atom => atom value -> value -> FreeT StoreF Effect Unit +write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update atom value store -interpret :: forall a m atoms. MonadRec m => Store { | atoms } -> FreeT (SelectF { | atoms }) m a -> m a +interpret :: forall a m. MonadRec m => Store -> FreeT StoreF m a -> m a interpret store = runFreeT \(Apply run) -> pure (run store) build :: - forall a atoms. - Selector { | atoms } a -> - Store { | atoms } -> + forall a. + Selector a -> + Store -> { signal :: Signal a , write :: a -> Effect Unit } From 00765ff8b3b16cddf0ac99269104df563cc61af6 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 13:46:53 +0900 Subject: [PATCH 23/37] Added initial hook implementations --- src/Wire/Store.purs | 13 +++-- src/Wire/Store/Atom/Async.purs | 20 ++++---- src/Wire/Store/Atom/Class.purs | 8 +-- src/Wire/Store/Atom/Pure.purs | 18 +++---- src/Wire/Store/Atom/Sync.purs | 21 ++++---- src/Wire/Store/Hooks.purs | 93 ++++++++++++++++++++++++++++++++++ src/Wire/Store/Selector.purs | 4 +- 7 files changed, 137 insertions(+), 40 deletions(-) create mode 100644 src/Wire/Store/Hooks.purs diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 2129fff..32878ad 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -11,6 +11,8 @@ import Effect.Unsafe (unsafePerformEffect) import Foreign (Foreign) import Foreign.Object (Object) import Foreign.Object as Object +import React.Basic (ReactContext) +import React.Basic as React import Unsafe.Coerce (unsafeCoerce) import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) @@ -20,6 +22,9 @@ import Wire.Store.Atom.Types (AtomSignal) newtype Store = Store { atoms :: Ref (Object Foreign) } +context :: ReactContext Store +context = unsafePerformEffect $ React.createContext =<< create + create :: Effect Store create = do atoms <- Ref.new Object.empty @@ -34,14 +39,14 @@ fromForeign _ = unsafeCoerce lookup :: forall value atom. Atom atom => atom value -> Store -> Effect (Maybe (AtomSignal value)) lookup atom (Store store) = do let - storeKey = Class.toStoreKey atom + storeKey = Class.storeKey atom storedSignal <- map (fromForeign atom) <<< Object.lookup storeKey <$> Ref.read store.atoms isInitialised <- Class.isInitialised atom case storedSignal, isInitialised of Just signal, true -> do pure $ pure signal Nothing, false -> do - signal <- Signal.create $ Class.defaultValue atom + signal <- Signal.create $ Class.initialValue atom Ref.modify_ (Object.insert storeKey (toForeign atom signal)) store.atoms Class.initialise atom signal pure $ pure signal @@ -56,7 +61,7 @@ unsafeLookup :: forall atom value. Atom atom => atom value -> Store -> Maybe (At unsafeLookup atom store = unsafePerformEffect $ lookup atom store reset :: forall atom value. Atom atom => atom value -> Store -> Effect Unit -reset atom store = lookup atom store >>= traverse_ (Class.resetValue atom) +reset atom store = lookup atom store >>= traverse_ (Class.reset atom) update :: forall atom value. Atom atom => atom value -> value -> Store -> Effect Unit -update atom value store = lookup atom store >>= traverse_ (Class.updateValue atom value) +update atom value store = lookup atom store >>= traverse_ (Class.update atom value) diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 8b41f32..f065457 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -14,25 +14,25 @@ import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) newtype Async value = Async { key :: String - , default :: value + , initial :: value , handler :: Action value -> Handler value , initialised :: Ref Boolean } create :: forall value. - { default :: value + { initial :: value , handler :: Action value -> FreeT (AtomicF value) Aff Unit , key :: String } -> Effect (Async value) -create { key, default, handler } = do +create { key, initial, handler } = do initialised <- Ref.new false - pure $ Async { key, initialised, default, handler } + pure $ Async { key, initialised, initial, handler } unsafeCreate :: forall value. - { default :: value + { initial :: value , handler :: Action value -> FreeT (AtomicF value) Aff Unit , key :: String } -> @@ -43,16 +43,16 @@ type Handler a = FreeT (AtomicF a) Aff Unit instance atomAsync :: Atom Async where - toStoreKey (Async atom) = atom.key - defaultValue (Async atom) = atom.default + storeKey (Async atom) = atom.key + initialValue (Async atom) = atom.initial isInitialised (Async atom) = Ref.read atom.initialised initialise (Async atom) signal = do Ref.write true atom.initialised run (atom.handler Initialize) signal - resetValue (Async atom) signal = do - signal.write atom.default + reset (Async atom) signal = do + signal.write atom.initial run (atom.handler Initialize) signal - updateValue (Async atom) value = run (atom.handler (Update value)) + update (Async atom) value = run (atom.handler (Update value)) run :: forall a. Handler a -> AtomSignal a -> Effect Unit run handler signal = launchAff_ $ interpret signal handler diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/Atom/Class.purs index d96254d..eb5153d 100644 --- a/src/Wire/Store/Atom/Class.purs +++ b/src/Wire/Store/Atom/Class.purs @@ -5,9 +5,9 @@ import Effect (Effect) import Wire.Store.Atom.Types (AtomSignal) class Atom (atom :: Type -> Type) where - toStoreKey :: forall value. atom value -> String - defaultValue :: forall value. atom value -> value + storeKey :: forall value. atom value -> String + initialValue :: forall value. atom value -> value isInitialised :: forall value. atom value -> Effect Boolean initialise :: forall value. atom value -> AtomSignal value -> Effect Unit - resetValue :: forall value. atom value -> AtomSignal value -> Effect Unit - updateValue :: forall value. atom value -> value -> AtomSignal value -> Effect Unit + reset :: forall value. atom value -> AtomSignal value -> Effect Unit + update :: forall value. atom value -> value -> AtomSignal value -> Effect Unit diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 5874afc..2d94793 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -10,32 +10,32 @@ import Wire.Store.Atom.Class (class Atom) newtype Pure value = Pure { key :: String - , default :: value + , initial :: value , initialised :: Ref Boolean } create :: forall value. - { default :: value + { initial :: value , key :: String } -> Effect (Pure value) -create { key, default } = do +create { key, initial } = do initialised <- Ref.new false - pure $ Pure { key, default, initialised } + pure $ Pure { key, initial, initialised } unsafeCreate :: forall value. - { default :: value + { initial :: value , key :: String } -> Pure value unsafeCreate = unsafePerformEffect <<< create instance atomPure :: Atom Pure where - toStoreKey (Pure atom) = atom.key - defaultValue (Pure atom) = atom.default + storeKey (Pure atom) = atom.key + initialValue (Pure atom) = atom.initial isInitialised (Pure atom) = Ref.read atom.initialised initialise (Pure atom) _ = Ref.write true atom.initialised - resetValue (Pure atom) signal = signal.write atom.default - updateValue _ value signal = signal.write value + reset (Pure atom) signal = signal.write atom.initial + update _ value signal = signal.write value diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index b109be7..a1a3828 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -6,14 +6,13 @@ import Effect (Effect) import Effect.Ref (Ref) import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) -import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) newtype Sync value = Sync { key :: String - , default :: value + , initial :: value , handler :: Action value -> Handler value , initialised :: Ref Boolean } @@ -23,18 +22,18 @@ type Handler a create :: forall value. - { default :: value + { initial :: value , handler :: Action value -> FreeT (AtomicF value) Effect Unit , key :: String } -> Effect (Sync value) -create { key, default, handler } = do +create { key, initial, handler } = do initialised <- Ref.new false - pure $ Sync { key, initialised, default, handler } + pure $ Sync { key, initialised, initial, handler } unsafeCreate :: forall value. - { default :: value + { initial :: value , handler :: Action value -> FreeT (AtomicF value) Effect Unit , key :: String } -> @@ -42,16 +41,16 @@ unsafeCreate :: unsafeCreate = unsafePerformEffect <<< create instance atomSync :: Atom Sync where - toStoreKey (Sync atom) = atom.key - defaultValue (Sync atom) = atom.default + storeKey (Sync atom) = atom.key + initialValue (Sync atom) = atom.initial isInitialised (Sync atom) = Ref.read atom.initialised initialise (Sync atom) signal = do Ref.write true atom.initialised run (atom.handler Initialize) signal - resetValue (Sync atom) signal = do - signal.write atom.default + reset (Sync atom) signal = do + signal.write atom.initial run (atom.handler Initialize) signal - updateValue (Sync atom) value = run (atom.handler (Update value)) + update (Sync atom) value = run (atom.handler (Update value)) run :: forall a. Handler a -> AtomSignal a -> Effect Unit run = flip interpret diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs new file mode 100644 index 0000000..3d56f16 --- /dev/null +++ b/src/Wire/Store/Hooks.purs @@ -0,0 +1,93 @@ +module Wire.Store.Hooks where + +import Prelude +import Data.Maybe (Maybe(..)) +import Data.Newtype (class Newtype) +import Data.Tuple (fst) +import Data.Tuple.Nested (type (/\), (/\)) +import Effect (Effect) +import Effect.Unsafe (unsafePerformEffect) +import React.Basic.Hooks (Hook, UseContext, UseEffect, UseLazy, UseState) +import React.Basic.Hooks as React +import Wire.Signal (Signal) +import Wire.Signal as Signal +import Wire.Store (Store) +import Wire.Store as Store +import Wire.Store.Atom.Class (class Atom) +import Wire.Store.Atom.Class as Atom +import Wire.Store.Selector (Selector) +import Wire.Store.Selector as Selector + +newtype UseSignal a hooks + = UseSignal (UseEffect Unit (UseState a hooks)) + +derive instance newtypeUseSignal :: Newtype (UseSignal a hooks) _ + +useSignal :: forall a. Signal a -> Hook (UseSignal a) a +useSignal signal = + React.coerceHook React.do + value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal + React.useEffectOnce $ Signal.subscribe signal setValue + pure value + +newtype UseAtom a hooks + = UseAtom + ( UseEffect Unit + ( UseState a + ( UseLazy Unit + { modify :: (a -> a) -> Effect Unit + , signal :: Signal a + , write :: a -> Effect Unit + } + (UseContext Store hooks) + ) + ) + ) + +derive instance newtypeUseAtom :: Newtype (UseAtom a hooks) _ + +useAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ (a -> Effect Unit)) +useAtom atom = + React.coerceHook React.do + store <- React.useContext Store.context + { signal, write } <- + React.useLazy unit \_ -> case Store.unsafeLookup atom store of + Nothing -> + { signal: pure $ Atom.initialValue atom + , write: mempty + , modify: mempty + } + Just storedSignal -> storedSignal + value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal + React.useEffectOnce $ Signal.subscribe signal setValue + pure $ value /\ write + +useAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a +useAtomValue atom = fst <$> useAtom atom + +newtype UseSelector a hooks + = UseSelector + ( UseEffect Unit + ( UseState a + ( UseLazy Unit + { signal :: Signal a + , write :: a -> Effect Unit + } + (UseContext Store hooks) + ) + ) + ) + +derive instance newtypeUseSelector :: Newtype (UseSelector a hooks) _ + +useSelector :: forall a. Selector a -> Hook (UseSelector a) (a /\ (a -> Effect Unit)) +useSelector selector = + React.coerceHook React.do + store <- React.useContext Store.context + { signal, write } <- React.useLazy unit \_ -> Selector.build selector store + value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal + React.useEffectOnce $ Signal.subscribe signal setValue + pure $ value /\ write + +useSelectorValue :: forall a. Selector a -> Hook (UseSelector a) a +useSelectorValue selector = fst <$> useSelector selector diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 06a4dcb..1db4fa3 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -34,10 +34,10 @@ data StoreF next derive instance functorStoreF :: Functor StoreF select :: forall atom value. Atom atom => atom value -> FreeT StoreF Signal value -select atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.defaultValue atom) _.signal $ Store.unsafeLookup atom store +select atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.initialValue atom) _.signal $ Store.unsafeLookup atom store read :: forall atom value. Atom atom => atom value -> FreeT StoreF Effect value -read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.defaultValue atom) (Signal.read <<< _.signal) $ Store.unsafeLookup atom store +read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.initialValue atom) (Signal.read <<< _.signal) $ Store.unsafeLookup atom store write :: forall atom value. Atom atom => atom value -> value -> FreeT StoreF Effect Unit write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update atom value store From 0f01bf0223f643585725e3366f6b605dab0a2d63 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 13:51:36 +0900 Subject: [PATCH 24/37] Removed modify from Signal --- src/Wire/Signal.purs | 7 ++----- src/Wire/Store/Atom/Async.purs | 1 - src/Wire/Store/Atom/Types.purs | 1 - src/Wire/Store/Hooks.purs | 4 +--- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index ef3ae4b..d7dbd1a 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -19,7 +19,6 @@ create :: Effect { signal :: Signal a , write :: a -> Effect Unit - , modify :: (a -> a) -> Effect Unit } create init = do value <- Ref.new init @@ -32,7 +31,7 @@ create init = do read' >>= notify Event.subscribe inner.event notify - modify' f = Ref.modify f value >>= inner.push + write a = Ref.write a value *> inner.push a signal = Signal @@ -41,8 +40,7 @@ create init = do } pure { signal - , write: modify' <<< const - , modify: modify' + , write } distinct :: forall a. Eq a => Signal a -> Signal a @@ -55,7 +53,6 @@ createDistinct :: Effect { signal :: Signal a , write :: a -> Effect Unit - , modify :: (a -> a) -> Effect Unit } createDistinct init = do signal <- create init diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index f065457..3142169 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -7,7 +7,6 @@ import Effect.Aff (Aff, launchAff_) import Effect.Ref (Ref) import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) -import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs index 6edf0d5..f32f843 100644 --- a/src/Wire/Store/Atom/Types.purs +++ b/src/Wire/Store/Atom/Types.purs @@ -37,7 +37,6 @@ interpret store = type AtomSignal a = { signal :: Signal a , write :: a -> Effect Unit - , modify :: (a -> a) -> Effect Unit } data Action a diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs index 3d56f16..cbb491f 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/Hooks.purs @@ -35,8 +35,7 @@ newtype UseAtom a hooks ( UseEffect Unit ( UseState a ( UseLazy Unit - { modify :: (a -> a) -> Effect Unit - , signal :: Signal a + { signal :: Signal a , write :: a -> Effect Unit } (UseContext Store hooks) @@ -55,7 +54,6 @@ useAtom atom = Nothing -> { signal: pure $ Atom.initialValue atom , write: mempty - , modify: mempty } Just storedSignal -> storedSignal value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal From afc5ac5cde56540fcf71c8c9f5536776f69d5429 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 13:53:40 +0900 Subject: [PATCH 25/37] One-lined some types --- src/Wire/Store/Selector.purs | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 1db4fa3..9c157d9 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -20,12 +20,7 @@ newtype Selector a , update :: a -> FreeT StoreF Effect Unit } -makeSelector :: - forall a. - { select :: FreeT StoreF Signal a - , update :: a -> FreeT StoreF Effect Unit - } -> - Selector a +makeSelector :: forall a. { select :: FreeT StoreF Signal a, update :: a -> FreeT StoreF Effect Unit } -> Selector a makeSelector = Selector data StoreF next @@ -45,13 +40,7 @@ write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.updat interpret :: forall a m. MonadRec m => Store -> FreeT StoreF m a -> m a interpret store = runFreeT \(Apply run) -> pure (run store) -build :: - forall a. - Selector a -> - Store -> - { signal :: Signal a - , write :: a -> Effect Unit - } +build :: forall a. Selector a -> Store -> { signal :: Signal a, write :: a -> Effect Unit } build (Selector selector) store = { signal: interpret store selector.select , write: \a -> interpret store (selector.update a) From 22917d50f5b3c55d629682f2477fa2cb30df923f Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 14:53:48 +0900 Subject: [PATCH 26/37] Added useReset* --- src/Wire/Store/Hooks.purs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs index cbb491f..72faf90 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/Hooks.purs @@ -51,11 +51,11 @@ useAtom atom = store <- React.useContext Store.context { signal, write } <- React.useLazy unit \_ -> case Store.unsafeLookup atom store of + Just storedSignal -> storedSignal Nothing -> { signal: pure $ Atom.initialValue atom , write: mempty } - Just storedSignal -> storedSignal value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal React.useEffectOnce $ Signal.subscribe signal setValue pure $ value /\ write @@ -63,6 +63,26 @@ useAtom atom = useAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useAtomValue atom = fst <$> useAtom atom +useResetAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ (a -> Effect Unit)) +useResetAtom atom = + React.coerceHook React.do + store <- React.useContext Store.context + { signal, write } <- + React.useLazy unit \_ -> case Store.unsafeLookup atom store of + Just storedSignal -> storedSignal + Nothing -> + { signal: pure $ Atom.initialValue atom + , write: mempty + } + value /\ setValue <- React.useState' $ Atom.initialValue atom + React.useEffectOnce do + Store.reset atom store + Signal.subscribe signal setValue + pure $ value /\ write + +useResetAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a +useResetAtomValue atom = fst <$> useAtom atom + newtype UseSelector a hooks = UseSelector ( UseEffect Unit From b7b52d4fd4cd658f9cf65a2444ec0086695ee555 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 14:57:55 +0900 Subject: [PATCH 27/37] Refactored out lookupAtom --- src/Wire/Store/Hooks.purs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs index 72faf90..da4e1e9 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/Hooks.purs @@ -49,13 +49,7 @@ useAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ (a -> Ef useAtom atom = React.coerceHook React.do store <- React.useContext Store.context - { signal, write } <- - React.useLazy unit \_ -> case Store.unsafeLookup atom store of - Just storedSignal -> storedSignal - Nothing -> - { signal: pure $ Atom.initialValue atom - , write: mempty - } + { signal, write } <- lookupAtom atom store value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal React.useEffectOnce $ Signal.subscribe signal setValue pure $ value /\ write @@ -67,13 +61,7 @@ useResetAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ (a useResetAtom atom = React.coerceHook React.do store <- React.useContext Store.context - { signal, write } <- - React.useLazy unit \_ -> case Store.unsafeLookup atom store of - Just storedSignal -> storedSignal - Nothing -> - { signal: pure $ Atom.initialValue atom - , write: mempty - } + { signal, write } <- lookupAtom atom store value /\ setValue <- React.useState' $ Atom.initialValue atom React.useEffectOnce do Store.reset atom store @@ -83,6 +71,22 @@ useResetAtom atom = useResetAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useResetAtomValue atom = fst <$> useAtom atom +lookupAtom :: + forall a atom. + Atom atom => + atom a -> + Store -> + Hook + (UseLazy Unit { signal :: Signal a, write :: a -> Effect Unit }) + { signal :: Signal a, write :: a -> Effect Unit } +lookupAtom atom store = + React.useLazy unit \_ -> case Store.unsafeLookup atom store of + Just storedSignal -> storedSignal + Nothing -> + { signal: pure $ Atom.initialValue atom + , write: mempty + } + newtype UseSelector a hooks = UseSelector ( UseEffect Unit From 5bae78e324def3becd5c6342481738fa598ef64d Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 15:01:25 +0900 Subject: [PATCH 28/37] Cleaning up some types --- src/Wire/Store.purs | 6 +++--- src/Wire/Store/Hooks.purs | 10 ++-------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 32878ad..56dde7f 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -20,7 +20,7 @@ import Wire.Store.Atom.Class as Class import Wire.Store.Atom.Types (AtomSignal) newtype Store - = Store { atoms :: Ref (Object Foreign) } + = Store { atoms :: Ref (Object (AtomSignal Foreign)) } context :: ReactContext Store context = unsafePerformEffect $ React.createContext =<< create @@ -30,10 +30,10 @@ create = do atoms <- Ref.new Object.empty pure $ Store { atoms } -toForeign :: forall atom value. Atom atom => atom value -> AtomSignal value -> Foreign +toForeign :: forall atom value. Atom atom => atom value -> AtomSignal value -> AtomSignal Foreign toForeign _ = unsafeCoerce -fromForeign :: forall atom value. Atom atom => atom value -> Foreign -> AtomSignal value +fromForeign :: forall atom value. Atom atom => atom value -> AtomSignal Foreign -> AtomSignal value fromForeign _ = unsafeCoerce lookup :: forall value atom. Atom atom => atom value -> Store -> Effect (Maybe (AtomSignal value)) diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs index da4e1e9..dd385ad 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/Hooks.purs @@ -34,10 +34,7 @@ newtype UseAtom a hooks = UseAtom ( UseEffect Unit ( UseState a - ( UseLazy Unit - { signal :: Signal a - , write :: a -> Effect Unit - } + ( UseLazy Unit { signal :: Signal a, write :: a -> Effect Unit } (UseContext Store hooks) ) ) @@ -91,10 +88,7 @@ newtype UseSelector a hooks = UseSelector ( UseEffect Unit ( UseState a - ( UseLazy Unit - { signal :: Signal a - , write :: a -> Effect Unit - } + ( UseLazy Unit { signal :: Signal a, write :: a -> Effect Unit } (UseContext Store hooks) ) ) From 0c09b4d00ba160da6e0faaf3e2ff3683b524ca2f Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 16:43:12 +0900 Subject: [PATCH 29/37] Refactoring --- src/Wire/Store.purs | 8 ++--- src/Wire/Store/Atom.purs | 55 +++++++++++++++++++++++++++++++++- src/Wire/Store/Atom/Async.purs | 4 +-- src/Wire/Store/Atom/Class.purs | 2 +- src/Wire/Store/Atom/Pure.purs | 2 +- src/Wire/Store/Atom/Sync.purs | 4 +-- src/Wire/Store/Atom/Types.purs | 54 --------------------------------- src/Wire/Store/Hooks.purs | 4 +-- src/Wire/Store/Selector.purs | 4 +-- 9 files changed, 68 insertions(+), 69 deletions(-) delete mode 100644 src/Wire/Store/Atom/Types.purs diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index 56dde7f..b6b25fb 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -1,4 +1,4 @@ -module Wire.Store where +module Wire.Store (Store, context, create, lookup, unsafeLookup, reset, update) where import Prelude import Data.Foldable (traverse_) @@ -15,9 +15,9 @@ import React.Basic (ReactContext) import React.Basic as React import Unsafe.Coerce (unsafeCoerce) import Wire.Signal as Signal +import Wire.Store.Atom (AtomSignal) import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Class as Class -import Wire.Store.Atom.Types (AtomSignal) newtype Store = Store { atoms :: Ref (Object (AtomSignal Foreign)) } @@ -63,5 +63,5 @@ unsafeLookup atom store = unsafePerformEffect $ lookup atom store reset :: forall atom value. Atom atom => atom value -> Store -> Effect Unit reset atom store = lookup atom store >>= traverse_ (Class.reset atom) -update :: forall atom value. Atom atom => atom value -> value -> Store -> Effect Unit -update atom value store = lookup atom store >>= traverse_ (Class.update atom value) +update :: forall atom value. Atom atom => atom value -> Store -> value -> Effect Unit +update atom store value = lookup atom store >>= traverse_ (Class.update atom value) diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index 44b872d..ad33e13 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -1 +1,54 @@ -module Wire.Store.Atom where +module Wire.Store.Atom (AtomicF, AtomSignal, read, write, interpret, Action(..)) where + +import Prelude +import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) +import Control.Monad.Rec.Class (class MonadRec) +import Data.Foldable (class Foldable) +import Effect (Effect) +import Effect.Class (class MonadEffect, liftEffect) +import Wire.Signal (Signal) +import Wire.Signal as Signal + +data AtomicF a next + = Read (a -> next) + | Write a next + +derive instance functorAtomicF :: Functor (AtomicF a) + +type Handler m a + = FreeT (AtomicF a) m Unit + +read :: forall a m. Monad m => FreeT (AtomicF a) m a +read = liftFreeT $ Read identity + +write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit +write a = liftFreeT $ Write a unit + +interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomicF a) m Unit -> m Unit +interpret store = + runFreeT case _ of + Read next -> do + a <- liftEffect (Signal.read store.signal) + pure (next a) + Write a next -> do + liftEffect (store.write a) + pure next + +type AtomSignal a + = { signal :: Signal a + , write :: a -> Effect Unit + } + +data Action a + = Initialize + | Update a + +derive instance functorAction :: Functor Action + +instance foldableAction :: Foldable Action where + foldr _ z Initialize = z + foldr f z (Update x) = x `f` z + foldl _ z Initialize = z + foldl f z (Update x) = z `f` x + foldMap f Initialize = mempty + foldMap f (Update x) = f x diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index 3142169..f6c87dc 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Async where +module Wire.Store.Atom.Async (Async, create, unsafeCreate) where import Prelude import Control.Monad.Free.Trans (FreeT) @@ -8,7 +8,7 @@ import Effect.Ref (Ref) import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) +import Wire.Store.Atom (AtomicF, AtomSignal, Action(..), interpret) newtype Async value = Async diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/Atom/Class.purs index eb5153d..03d8d0f 100644 --- a/src/Wire/Store/Atom/Class.purs +++ b/src/Wire/Store/Atom/Class.purs @@ -2,7 +2,7 @@ module Wire.Store.Atom.Class where import Prelude import Effect (Effect) -import Wire.Store.Atom.Types (AtomSignal) +import Wire.Store.Atom (AtomSignal) class Atom (atom :: Type -> Type) where storeKey :: forall value. atom value -> String diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 2d94793..07eb0eb 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Pure where +module Wire.Store.Atom.Pure (Pure, create, unsafeCreate) where import Prelude import Effect (Effect) diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index a1a3828..ead271c 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Sync where +module Wire.Store.Atom.Sync (Sync, create, unsafeCreate) where import Prelude import Control.Monad.Free.Trans (FreeT) @@ -7,7 +7,7 @@ import Effect.Ref (Ref) import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom.Types (AtomicF, AtomSignal, Action(..), interpret) +import Wire.Store.Atom (AtomicF, AtomSignal, Action(..), interpret) newtype Sync value = Sync diff --git a/src/Wire/Store/Atom/Types.purs b/src/Wire/Store/Atom/Types.purs deleted file mode 100644 index f32f843..0000000 --- a/src/Wire/Store/Atom/Types.purs +++ /dev/null @@ -1,54 +0,0 @@ -module Wire.Store.Atom.Types where - -import Prelude -import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) -import Control.Monad.Rec.Class (class MonadRec) -import Data.Foldable (class Foldable) -import Effect (Effect) -import Effect.Class (class MonadEffect, liftEffect) -import Wire.Signal (Signal) -import Wire.Signal as Signal - -data AtomicF a next - = Read (a -> next) - | Write a next - -derive instance functorAtomicF :: Functor (AtomicF a) - -type Handler m a - = FreeT (AtomicF a) m Unit - -read :: forall a m. Monad m => FreeT (AtomicF a) m a -read = liftFreeT $ Read identity - -write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit -write a = liftFreeT $ Write a unit - -interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomicF a) m Unit -> m Unit -interpret store = - runFreeT case _ of - Read next -> do - a <- liftEffect (Signal.read store.signal) - pure (next a) - Write a next -> do - liftEffect (store.write a) - pure next - -type AtomSignal a - = { signal :: Signal a - , write :: a -> Effect Unit - } - -data Action a - = Initialize - | Update a - -derive instance functorAction :: Functor Action - -instance foldableAction :: Foldable Action where - foldr _ z Initialize = z - foldr f z (Update x) = x `f` z - foldl _ z Initialize = z - foldl f z (Update x) = z `f` x - foldMap f Initialize = mempty - foldMap f (Update x) = f x diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs index dd385ad..402ec18 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/Hooks.purs @@ -49,7 +49,7 @@ useAtom atom = { signal, write } <- lookupAtom atom store value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal React.useEffectOnce $ Signal.subscribe signal setValue - pure $ value /\ write + pure $ value /\ Store.update atom store useAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useAtomValue atom = fst <$> useAtom atom @@ -63,7 +63,7 @@ useResetAtom atom = React.useEffectOnce do Store.reset atom store Signal.subscribe signal setValue - pure $ value /\ write + pure $ value /\ Store.update atom store useResetAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useResetAtomValue atom = fst <$> useAtom atom diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index 9c157d9..b27da73 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -1,4 +1,4 @@ -module Wire.Store.Selector where +module Wire.Store.Selector (Selector, makeSelector, StoreF, select, read, write, build) where import Prelude import Control.Monad.Free.Trans (FreeT, freeT, runFreeT) @@ -35,7 +35,7 @@ read :: forall atom value. Atom atom => atom value -> FreeT StoreF Effect value read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.initialValue atom) (Signal.read <<< _.signal) $ Store.unsafeLookup atom store write :: forall atom value. Atom atom => atom value -> value -> FreeT StoreF Effect Unit -write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update atom value store +write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update atom store value interpret :: forall a m. MonadRec m => Store -> FreeT StoreF m a -> m a interpret store = runFreeT \(Apply run) -> pure (run store) From a072395265928b806bc8113b576b0c309b4c53ac Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Wed, 1 Jul 2020 18:27:29 +0900 Subject: [PATCH 30/37] Removed old dependencies --- spago.dhall | 2 -- 1 file changed, 2 deletions(-) diff --git a/spago.dhall b/spago.dhall index a428b2f..ef8e376 100644 --- a/spago.dhall +++ b/spago.dhall @@ -5,11 +5,9 @@ You can edit this file as you like. { name = "wire" , dependencies = [ "arrays" - , "avar" , "filterable" , "foreign-object" , "freet" - , "leibniz" , "profunctor" , "react-basic-hooks" , "refs" From 739c9f17cfa1684f013d445e1d518248ff1b1ea0 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 9 Jul 2020 16:57:30 +0900 Subject: [PATCH 31/37] More huge refactorings --- spago.dhall | 2 +- src/Wire/Event.purs | 41 +++++++---- src/Wire/Signal.purs | 94 ++++--------------------- src/Wire/Store.purs | 125 +++++++++++++++------------------ src/Wire/Store/Atom.purs | 100 ++++++++++++-------------- src/Wire/Store/Atom/Async.purs | 96 +++++++++++++++---------- src/Wire/Store/Atom/Class.purs | 14 ++-- src/Wire/Store/Atom/Pure.purs | 46 +++++------- src/Wire/Store/Atom/Sync.purs | 70 ++++++++---------- src/Wire/Store/Hooks.purs | 92 ++++++------------------ src/Wire/Store/Selector.purs | 93 ++++++++++++++++-------- 11 files changed, 339 insertions(+), 434 deletions(-) diff --git a/spago.dhall b/spago.dhall index ef8e376..34ac91b 100644 --- a/spago.dhall +++ b/spago.dhall @@ -7,8 +7,8 @@ You can edit this file as you like. [ "arrays" , "filterable" , "foreign-object" + , "free" , "freet" - , "profunctor" , "react-basic-hooks" , "refs" , "unsafe-reference" diff --git a/src/Wire/Event.purs b/src/Wire/Event.purs index 7ebbe52..7cf20d2 100644 --- a/src/Wire/Event.purs +++ b/src/Wire/Event.purs @@ -4,7 +4,7 @@ import Prelude import Control.Alt (class Alt, alt) import Control.Alternative (class Alternative, class Plus, empty) import Control.Apply (lift2) -import Control.Monad.Rec.Class (Step(..), tailRecM) +import Control.Monad.Rec.Class (class MonadRec, Step(..), tailRecM) import Data.Array as Array import Data.Either (Either(..), either, hush) import Data.Filterable (class Compactable, class Filterable, filterMap, partitionMap) @@ -31,7 +31,7 @@ create = do let isUnsubscribing = Ref.read unsubscribing - subscriber = \a -> unlessM isUnsubscribing do notify a + subscriber = \a -> unlessM isUnsubscribing $ notify a Ref.modify_ (flip Array.snoc subscriber) subscribers pure do Ref.write true unsubscribing @@ -43,8 +43,8 @@ create = do makeEvent :: forall a. ((a -> Effect Unit) -> Effect (Effect Unit)) -> Event a makeEvent = Event -subscribe :: forall a. Event a -> (a -> Effect Unit) -> Effect (Effect Unit) -subscribe (Event event) = event +subscribe :: forall a b. Event a -> (a -> Effect b) -> Effect (Effect Unit) +subscribe (Event event) = event <<< (void <<< _) filter :: forall a. (a -> Boolean) -> Event a -> Event a filter pred (Event event) = Event \notify -> event \a -> if pred a then notify a else pure unit @@ -79,7 +79,7 @@ share source = do Event \notify -> do incrementCount cancel <- subscribe shared.event notify - pure do cancel *> decrementCount + pure $ cancel *> decrementCount pure event distinct :: forall a. Eq a => Event a -> Event a @@ -107,12 +107,13 @@ fromFoldable :: forall a f. Foldable f => f a -> Event a fromFoldable xs = Event \notify -> do fiber <- - Aff.launchAff do - for_ xs \x -> do - liftEffect $ notify x - Aff.delay (Milliseconds 0.0) - pure do - Aff.launchAff_ $ Aff.killFiber (Aff.error "canceled") fiber + Aff.launchAff + $ for_ xs \x -> do + liftEffect $ notify x + Aff.delay (Milliseconds 0.0) + pure + $ Aff.launchAff_ + $ Aff.killFiber (Aff.error "canceled") fiber range :: Int -> Int -> Event Int range start end = @@ -127,9 +128,10 @@ range start end = go _ = do liftEffect $ notify end pure (Done unit) - fiber <- Aff.launchAff do tailRecM go start - pure do - Aff.launchAff_ $ Aff.killFiber (Aff.error "canceled") fiber + fiber <- Aff.launchAff $ tailRecM go start + pure + $ Aff.launchAff_ + $ Aff.killFiber (Aff.error "canceled") fiber where step = if start < end then 1 else -1 @@ -171,6 +173,15 @@ instance bindEvent :: Bind Event where instance monadEvent :: Monad Event +instance monadRecEvent ∷ MonadRec Event where + tailRecM k = go + where + go a = do + res ← k a + case res of + Done r → pure r + Loop b → go b + instance plusEvent :: Plus Event where empty = Event \_ -> mempty @@ -181,7 +192,7 @@ instance altEvent :: Alt Event where Event \notify -> do cancel1 <- event1 notify cancel2 <- event2 notify - pure do cancel1 *> cancel2 + pure $ cancel1 *> cancel2 instance semigroupEvent :: Semigroup a => Semigroup (Event a) where append = lift2 append diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index d7dbd1a..85c27cb 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -1,99 +1,29 @@ module Wire.Signal where import Prelude -import Control.Monad.Rec.Class (class MonadRec, Step(..)) import Effect (Effect) import Effect.Ref as Ref import Wire.Event (Event) import Wire.Event as Event -newtype Signal a - = Signal - { event :: Event a - , read :: Effect a - } - -create :: - forall a. - a -> - Effect - { signal :: Signal a - , write :: a -> Effect Unit +type Signal a + = { event :: Event a + , read :: Effect a + , modify :: (a -> a) -> Effect Unit } + +create :: forall a. a -> Effect (Signal a) create init = do value <- Ref.new init inner <- Event.create let - read' = Ref.read value + read = Ref.read value event = Event.makeEvent \notify -> do - read' >>= notify - Event.subscribe inner.event notify - - write a = Ref.write a value *> inner.push a - - signal = - Signal - { event - , read: read' - } - pure - { signal - , write - } - -distinct :: forall a. Eq a => Signal a -> Signal a -distinct (Signal s) = Signal s { event = Event.distinct s.event } - -createDistinct :: - forall a. - Eq a => - a -> - Effect - { signal :: Signal a - , write :: a -> Effect Unit - } -createDistinct init = do - signal <- create init - pure $ signal { signal = distinct signal.signal } - -subscribe :: forall a. Signal a -> (a -> Effect Unit) -> Effect (Effect Unit) -subscribe (Signal s) notify = Event.subscribe s.event notify - -toEvent :: Signal ~> Event -toEvent (Signal s) = s.event - -read :: Signal ~> Effect -read (Signal s) = s.read - -instance functorSignal :: Functor Signal where - map f (Signal s) = Signal { event: map f s.event, read: map f s.read } - -instance applySignal :: Apply Signal where - apply (Signal f) (Signal a) = - Signal - { event: apply f.event a.event - , read: apply f.read a.read - } - -instance applicativeSignal :: Applicative Signal where - pure a = Signal { event: pure a, read: pure a } - -instance bindSignal :: Bind Signal where - bind (Signal s) f = - Signal - { event: s.event >>= f >>> toEvent - , read: s.read >>= f >>> read - } - -instance monadSignal :: Monad Signal + unsubscribe <- Event.subscribe inner.event notify + read >>= notify + pure unsubscribe -instance monadRecSignal ∷ MonadRec Signal where - tailRecM k = go - where - go a = do - res ← k a - case res of - Done r → pure r - Loop b → go b + modify f = Ref.modify f value >>= inner.push + pure { event, read, modify } diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs index b6b25fb..902bc57 100644 --- a/src/Wire/Store.purs +++ b/src/Wire/Store.purs @@ -1,67 +1,58 @@ -module Wire.Store (Store, context, create, lookup, unsafeLookup, reset, update) where - -import Prelude -import Data.Foldable (traverse_) -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Console as Console -import Effect.Ref (Ref) -import Effect.Ref as Ref -import Effect.Unsafe (unsafePerformEffect) -import Foreign (Foreign) -import Foreign.Object (Object) -import Foreign.Object as Object -import React.Basic (ReactContext) -import React.Basic as React -import Unsafe.Coerce (unsafeCoerce) -import Wire.Signal as Signal -import Wire.Store.Atom (AtomSignal) -import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom.Class as Class - -newtype Store - = Store { atoms :: Ref (Object (AtomSignal Foreign)) } - -context :: ReactContext Store -context = unsafePerformEffect $ React.createContext =<< create - -create :: Effect Store -create = do - atoms <- Ref.new Object.empty - pure $ Store { atoms } - -toForeign :: forall atom value. Atom atom => atom value -> AtomSignal value -> AtomSignal Foreign -toForeign _ = unsafeCoerce - -fromForeign :: forall atom value. Atom atom => atom value -> AtomSignal Foreign -> AtomSignal value -fromForeign _ = unsafeCoerce - -lookup :: forall value atom. Atom atom => atom value -> Store -> Effect (Maybe (AtomSignal value)) -lookup atom (Store store) = do - let - storeKey = Class.storeKey atom - storedSignal <- map (fromForeign atom) <<< Object.lookup storeKey <$> Ref.read store.atoms - isInitialised <- Class.isInitialised atom - case storedSignal, isInitialised of - Just signal, true -> do - pure $ pure signal - Nothing, false -> do - signal <- Signal.create $ Class.initialValue atom - Ref.modify_ (Object.insert storeKey (toForeign atom signal)) store.atoms - Class.initialise atom signal - pure $ pure signal - Nothing, true -> do - Console.warn $ "The atom " <> show storeKey <> " has been initialised but cannot be found in the store." - pure Nothing - Just _, false -> do - Console.warn $ "A different atom with the key " <> show storeKey <> " is already in the store." - pure Nothing - -unsafeLookup :: forall atom value. Atom atom => atom value -> Store -> Maybe (AtomSignal value) -unsafeLookup atom store = unsafePerformEffect $ lookup atom store - -reset :: forall atom value. Atom atom => atom value -> Store -> Effect Unit -reset atom store = lookup atom store >>= traverse_ (Class.reset atom) - -update :: forall atom value. Atom atom => atom value -> Store -> value -> Effect Unit -update atom store value = lookup atom store >>= traverse_ (Class.update atom value) +module Wire.Store where + +-- import Prelude +-- import Data.Foldable (traverse_) +-- import Data.Maybe (Maybe(..)) +-- import Effect (Effect) +-- import Effect.Console as Console +-- import Effect.Ref (Ref) +-- import Effect.Ref as Ref +-- import Effect.Unsafe (unsafePerformEffect) +-- import Foreign (Foreign) +-- import Foreign.Object (Object) +-- import Foreign.Object as Object +-- import React.Basic (ReactContext) +-- import React.Basic as React +-- import Unsafe.Coerce (unsafeCoerce) +-- import Wire.Signal as Signal +-- import Wire.Store.Atom (AtomSignal) +-- import Wire.Store.Atom.Class (class Atom) +-- import Wire.Store.Atom.Class as Class +-- newtype Store +-- = Store { atoms :: Ref (Object (AtomSignal Foreign)) } +-- context :: ReactContext Store +-- context = unsafePerformEffect $ React.createContext =<< create +-- create :: Effect Store +-- create = do +-- atoms <- Ref.new Object.empty +-- pure $ Store { atoms } +-- toForeign :: forall atom value. Atom atom => atom value -> AtomSignal value -> AtomSignal Foreign +-- toForeign _ = unsafeCoerce +-- fromForeign :: forall atom value. Atom atom => atom value -> AtomSignal Foreign -> AtomSignal value +-- fromForeign _ = unsafeCoerce +-- lookup :: forall value atom. Atom atom => atom value -> Store -> Effect (Maybe (AtomSignal value)) +-- lookup atom (Store store) = do +-- let +-- storeKey = Class.storeKey atom +-- storedSignal <- map (fromForeign atom) <<< Object.lookup storeKey <$> Ref.read store.atoms +-- isInitialised <- Class.isInitialised atom +-- case storedSignal, isInitialised of +-- Just signal, true -> do +-- pure $ pure signal +-- Nothing, false -> do +-- signal <- Signal.create $ Class.initialValue atom +-- Ref.modify_ (Object.insert storeKey (toForeign atom signal)) store.atoms +-- Class.initialise atom signal +-- pure $ pure signal +-- Nothing, true -> do +-- Console.warn $ "The atom " <> show storeKey <> " has been initialised but cannot be found in the store." +-- pure Nothing +-- Just _, false -> do +-- Console.warn $ "A different atom with the key " <> show storeKey <> " is already in the store." +-- pure Nothing +-- unsafeLookup :: forall atom value. Atom atom => atom value -> Store -> Maybe (AtomSignal value) +-- unsafeLookup atom store = unsafePerformEffect $ lookup atom store +-- reset :: forall atom value. Atom atom => atom value -> Store -> Effect Unit +-- reset atom store = lookup atom store >>= traverse_ (Class.reset atom) +-- update :: forall atom value. Atom atom => atom value -> Store -> value -> Effect Unit +-- update atom store value = lookup atom store >>= traverse_ (Class.update atom value) diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs index ad33e13..f15cc53 100644 --- a/src/Wire/Store/Atom.purs +++ b/src/Wire/Store/Atom.purs @@ -1,54 +1,46 @@ -module Wire.Store.Atom (AtomicF, AtomSignal, read, write, interpret, Action(..)) where - -import Prelude -import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) -import Control.Monad.Rec.Class (class MonadRec) -import Data.Foldable (class Foldable) -import Effect (Effect) -import Effect.Class (class MonadEffect, liftEffect) -import Wire.Signal (Signal) -import Wire.Signal as Signal - -data AtomicF a next - = Read (a -> next) - | Write a next - -derive instance functorAtomicF :: Functor (AtomicF a) - -type Handler m a - = FreeT (AtomicF a) m Unit - -read :: forall a m. Monad m => FreeT (AtomicF a) m a -read = liftFreeT $ Read identity - -write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit -write a = liftFreeT $ Write a unit - -interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomicF a) m Unit -> m Unit -interpret store = - runFreeT case _ of - Read next -> do - a <- liftEffect (Signal.read store.signal) - pure (next a) - Write a next -> do - liftEffect (store.write a) - pure next - -type AtomSignal a - = { signal :: Signal a - , write :: a -> Effect Unit - } - -data Action a - = Initialize - | Update a - -derive instance functorAction :: Functor Action - -instance foldableAction :: Foldable Action where - foldr _ z Initialize = z - foldr f z (Update x) = x `f` z - foldl _ z Initialize = z - foldl f z (Update x) = z `f` x - foldMap f Initialize = mempty - foldMap f (Update x) = f x +module Wire.Store.Atom where + +-- import Prelude +-- import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) +-- import Control.Monad.Rec.Class (class MonadRec) +-- import Data.Foldable (class Foldable) +-- import Effect (Effect) +-- import Effect.Class (class MonadEffect, liftEffect) +-- import Wire.Signal (Signal) +-- import Wire.Signal as Signal +-- data AtomicF a next +-- = Read (a -> next) +-- | Modify (a -> a) next +-- derive instance functorAtomicF :: Functor (AtomicF a) +-- type Handler m a +-- = FreeT (AtomicF a) m Unit +-- read :: forall a m. Monad m => FreeT (AtomicF a) m a +-- read = liftFreeT $ Read identity +-- write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit +-- write a = liftFreeT $ Modify (const a) unit +-- modify :: forall m a. Monad m => (a -> a) -> FreeT (AtomicF a) m Unit +-- modify f = liftFreeT $ Modify f unit +-- interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomicF a) m Unit -> m Unit +-- interpret store = +-- runFreeT case _ of +-- Read next -> do +-- a <- liftEffect (Signal.read store.signal) +-- pure (next a) +-- Modify f next -> do +-- liftEffect (store.modify f) +-- pure next +-- type AtomSignal a +-- = { signal :: Signal a +-- , modify :: (a -> a) -> Effect Unit +-- } +-- data Action a +-- = Initialize +-- | Update a +-- derive instance functorAction :: Functor Action +-- instance foldableAction :: Foldable Action where +-- foldr _ z Initialize = z +-- foldr f z (Update x) = x `f` z +-- foldl _ z Initialize = z +-- foldl f z (Update x) = z `f` x +-- foldMap f Initialize = mempty +-- foldMap f (Update x) = f x diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/Atom/Async.purs index f6c87dc..dfc0e8d 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/Atom/Async.purs @@ -1,57 +1,75 @@ -module Wire.Store.Atom.Async (Async, create, unsafeCreate) where +module Wire.Store.Atom.Async where import Prelude -import Control.Monad.Free.Trans (FreeT) +import Data.Foldable (for_) +import Data.Maybe (Maybe(..), isJust) import Effect (Effect) -import Effect.Aff (Aff, launchAff_) -import Effect.Ref (Ref) +import Effect.Aff (Aff) +import Effect.Aff as Aff +import Effect.Class (liftEffect) import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) +import Wire.Event as Event +import Wire.Signal (Signal) +import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom (AtomicF, AtomSignal, Action(..), interpret) -newtype Async value +newtype Async a = Async - { key :: String - , initial :: value - , handler :: Action value -> Handler value - , initialised :: Ref Boolean + { initial :: a + , load :: Effect Unit + , save :: a -> Effect Unit + , signal :: Signal a } create :: - forall value. - { initial :: value - , handler :: Action value -> FreeT (AtomicF value) Aff Unit - , key :: String + forall a. + { initial :: a + , load :: Aff a + , save :: a -> Aff Unit } -> - Effect (Async value) -create { key, initial, handler } = do - initialised <- Ref.new false - pure $ Async { key, initialised, initial, handler } + Effect (Async a) +create { initial, load, save } = do + signal <- Signal.create initial + loadFiber <- Ref.new Nothing + saveFiber <- Ref.new Nothing + let + load' = do + inProgress <- isJust <$> Ref.read loadFiber + unless inProgress do + fiber <- + Aff.launchAff do + value <- load + liftEffect $ signal.modify (const value) + Ref.write (Just fiber) loadFiber + + save' value = do + inProgress <- isJust <$> Ref.read saveFiber + when inProgress do + oldFiber <- Ref.read saveFiber + for_ oldFiber (Aff.launchAff_ <<< Aff.killFiber (Aff.error "New save triggered, cancelling save in progress")) + fiber <- Aff.launchAff $ save value + Ref.write (Just fiber) loadFiber + load' + pure $ Async { initial, load: load', save: save', signal } unsafeCreate :: - forall value. - { initial :: value - , handler :: Action value -> FreeT (AtomicF value) Aff Unit - , key :: String + forall a. + { initial :: a + , load :: Aff a + , save :: a -> Aff Unit } -> - Async value + Async a unsafeCreate = unsafePerformEffect <<< create -type Handler a - = FreeT (AtomicF a) Aff Unit - instance atomAsync :: Atom Async where - storeKey (Async atom) = atom.key - initialValue (Async atom) = atom.initial - isInitialised (Async atom) = Ref.read atom.initialised - initialise (Async atom) signal = do - Ref.write true atom.initialised - run (atom.handler Initialize) signal - reset (Async atom) signal = do - signal.write atom.initial - run (atom.handler Initialize) signal - update (Async atom) value = run (atom.handler (Update value)) - -run :: forall a. Handler a -> AtomSignal a -> Effect Unit -run handler signal = launchAff_ $ interpret signal handler + default (Async atom) = atom.initial + read (Async atom) = atom.signal.read + modify f (Async atom) = do + atom.signal.modify f + atom.signal.read >>= atom.save + reset (Async atom) = do + atom.signal.modify (const atom.initial) + atom.load + subscribe notify (Async atom) = Event.subscribe atom.signal.event notify + signal (Async atom) = atom.signal diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/Atom/Class.purs index 03d8d0f..e51f06a 100644 --- a/src/Wire/Store/Atom/Class.purs +++ b/src/Wire/Store/Atom/Class.purs @@ -2,12 +2,12 @@ module Wire.Store.Atom.Class where import Prelude import Effect (Effect) -import Wire.Store.Atom (AtomSignal) +import Wire.Signal (Signal) class Atom (atom :: Type -> Type) where - storeKey :: forall value. atom value -> String - initialValue :: forall value. atom value -> value - isInitialised :: forall value. atom value -> Effect Boolean - initialise :: forall value. atom value -> AtomSignal value -> Effect Unit - reset :: forall value. atom value -> AtomSignal value -> Effect Unit - update :: forall value. atom value -> value -> AtomSignal value -> Effect Unit + default :: forall value. atom value -> value + read :: forall value. atom value -> Effect value + modify :: forall value. (value -> value) -> atom value -> Effect Unit + reset :: forall value. atom value -> Effect Unit + subscribe :: forall value. (value -> Effect Unit) -> atom value -> Effect (Effect Unit) + signal :: forall value. atom value -> Signal value diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/Atom/Pure.purs index 07eb0eb..4915b18 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/Atom/Pure.purs @@ -1,41 +1,31 @@ -module Wire.Store.Atom.Pure (Pure, create, unsafeCreate) where +module Wire.Store.Atom.Pure where import Prelude import Effect (Effect) -import Effect.Ref (Ref) -import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) +import Wire.Event as Event +import Wire.Signal (Signal) +import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) -newtype Pure value +newtype Pure a = Pure - { key :: String - , initial :: value - , initialised :: Ref Boolean + { initial :: a + , signal :: Signal a } -create :: - forall value. - { initial :: value - , key :: String - } -> - Effect (Pure value) -create { key, initial } = do - initialised <- Ref.new false - pure $ Pure { key, initial, initialised } +create :: forall a. a -> Effect (Pure a) +create initial = do + signal <- Signal.create initial + pure $ Pure { initial, signal } -unsafeCreate :: - forall value. - { initial :: value - , key :: String - } -> - Pure value +unsafeCreate :: forall a. a -> Pure a unsafeCreate = unsafePerformEffect <<< create instance atomPure :: Atom Pure where - storeKey (Pure atom) = atom.key - initialValue (Pure atom) = atom.initial - isInitialised (Pure atom) = Ref.read atom.initialised - initialise (Pure atom) _ = Ref.write true atom.initialised - reset (Pure atom) signal = signal.write atom.initial - update _ value signal = signal.write value + default (Pure atom) = atom.initial + read (Pure atom) = atom.signal.read + modify f (Pure atom) = atom.signal.modify f + reset (Pure atom) = atom.signal.modify (const atom.initial) + subscribe k (Pure atom) = Event.subscribe atom.signal.event k + signal (Pure atom) = atom.signal diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/Atom/Sync.purs index ead271c..c38292b 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/Atom/Sync.purs @@ -1,56 +1,48 @@ -module Wire.Store.Atom.Sync (Sync, create, unsafeCreate) where +module Wire.Store.Atom.Sync where import Prelude -import Control.Monad.Free.Trans (FreeT) import Effect (Effect) -import Effect.Ref (Ref) -import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) +import Wire.Event as Event +import Wire.Signal (Signal) +import Wire.Signal as Signal import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom (AtomicF, AtomSignal, Action(..), interpret) -newtype Sync value +newtype Sync a = Sync - { key :: String - , initial :: value - , handler :: Action value -> Handler value - , initialised :: Ref Boolean + { initial :: a + , load :: Effect a + , save :: a -> Effect Unit + , signal :: Signal a } -type Handler a - = FreeT (AtomicF a) Effect Unit - create :: - forall value. - { initial :: value - , handler :: Action value -> FreeT (AtomicF value) Effect Unit - , key :: String + forall a. + { load :: Effect a + , save :: a -> Effect Unit } -> - Effect (Sync value) -create { key, initial, handler } = do - initialised <- Ref.new false - pure $ Sync { key, initialised, initial, handler } + Effect (Sync a) +create { load, save } = do + initial <- load + signal <- Signal.create initial + pure $ Sync { initial, load, save, signal } unsafeCreate :: - forall value. - { initial :: value - , handler :: Action value -> FreeT (AtomicF value) Effect Unit - , key :: String + forall a. + { load :: Effect a + , save :: a -> Effect Unit } -> - Sync value + Sync a unsafeCreate = unsafePerformEffect <<< create instance atomSync :: Atom Sync where - storeKey (Sync atom) = atom.key - initialValue (Sync atom) = atom.initial - isInitialised (Sync atom) = Ref.read atom.initialised - initialise (Sync atom) signal = do - Ref.write true atom.initialised - run (atom.handler Initialize) signal - reset (Sync atom) signal = do - signal.write atom.initial - run (atom.handler Initialize) signal - update (Sync atom) value = run (atom.handler (Update value)) - -run :: forall a. Handler a -> AtomSignal a -> Effect Unit -run = flip interpret + default (Sync atom) = atom.initial + read (Sync atom) = atom.signal.read + modify f (Sync atom) = do + atom.signal.modify f + atom.signal.read >>= atom.save + reset (Sync atom) = do + value <- atom.load + atom.signal.modify (const value) + subscribe notify (Sync atom) = Event.subscribe atom.signal.event notify + signal (Sync atom) = atom.signal diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/Hooks.purs index 402ec18..1b23970 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/Hooks.purs @@ -1,22 +1,17 @@ module Wire.Store.Hooks where import Prelude -import Data.Maybe (Maybe(..)) import Data.Newtype (class Newtype) import Data.Tuple (fst) import Data.Tuple.Nested (type (/\), (/\)) import Effect (Effect) import Effect.Unsafe (unsafePerformEffect) -import React.Basic.Hooks (Hook, UseContext, UseEffect, UseLazy, UseState) +import React.Basic.Hooks (Hook, UseEffect, UseState) import React.Basic.Hooks as React +import Wire.Event as Event import Wire.Signal (Signal) -import Wire.Signal as Signal -import Wire.Store (Store) -import Wire.Store as Store import Wire.Store.Atom.Class (class Atom) import Wire.Store.Atom.Class as Atom -import Wire.Store.Selector (Selector) -import Wire.Store.Selector as Selector newtype UseSignal a hooks = UseSignal (UseEffect Unit (UseState a hooks)) @@ -26,84 +21,37 @@ derive instance newtypeUseSignal :: Newtype (UseSignal a hooks) _ useSignal :: forall a. Signal a -> Hook (UseSignal a) a useSignal signal = React.coerceHook React.do - value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal - React.useEffectOnce $ Signal.subscribe signal setValue + value /\ setValue <- React.useState' $ unsafePerformEffect signal.read + React.useEffectOnce $ Event.subscribe signal.event setValue pure value newtype UseAtom a hooks - = UseAtom - ( UseEffect Unit - ( UseState a - ( UseLazy Unit { signal :: Signal a, write :: a -> Effect Unit } - (UseContext Store hooks) - ) - ) - ) + = UseAtom (UseEffect Unit (UseState a hooks)) derive instance newtypeUseAtom :: Newtype (UseAtom a hooks) _ -useAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ (a -> Effect Unit)) +useAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ ((a -> a) -> Effect Unit)) useAtom atom = React.coerceHook React.do - store <- React.useContext Store.context - { signal, write } <- lookupAtom atom store - value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal - React.useEffectOnce $ Signal.subscribe signal setValue - pure $ value /\ Store.update atom store + value /\ setValue <- React.useState' $ unsafePerformEffect $ Atom.read atom + React.useEffectOnce $ Event.subscribe (Atom.signal atom).event setValue + pure $ value /\ flip Atom.modify atom useAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useAtomValue atom = fst <$> useAtom atom -useResetAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ (a -> Effect Unit)) -useResetAtom atom = - React.coerceHook React.do - store <- React.useContext Store.context - { signal, write } <- lookupAtom atom store - value /\ setValue <- React.useState' $ Atom.initialValue atom - React.useEffectOnce do - Store.reset atom store - Signal.subscribe signal setValue - pure $ value /\ Store.update atom store - -useResetAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a -useResetAtomValue atom = fst <$> useAtom atom +newtype UseAtomReset a hooks + = UseAtomReset (UseAtom a (UseEffect Unit hooks)) -lookupAtom :: - forall a atom. - Atom atom => - atom a -> - Store -> - Hook - (UseLazy Unit { signal :: Signal a, write :: a -> Effect Unit }) - { signal :: Signal a, write :: a -> Effect Unit } -lookupAtom atom store = - React.useLazy unit \_ -> case Store.unsafeLookup atom store of - Just storedSignal -> storedSignal - Nothing -> - { signal: pure $ Atom.initialValue atom - , write: mempty - } +derive instance newtypeUseAtomReset :: Newtype (UseAtomReset a hooks) _ -newtype UseSelector a hooks - = UseSelector - ( UseEffect Unit - ( UseState a - ( UseLazy Unit { signal :: Signal a, write :: a -> Effect Unit } - (UseContext Store hooks) - ) - ) - ) - -derive instance newtypeUseSelector :: Newtype (UseSelector a hooks) _ - -useSelector :: forall a. Selector a -> Hook (UseSelector a) (a /\ (a -> Effect Unit)) -useSelector selector = +useAtomReset :: forall atom a. Atom atom => atom a -> Hook (UseAtomReset a) (a /\ ((a -> a) -> Effect Unit)) +useAtomReset atom = React.coerceHook React.do - store <- React.useContext Store.context - { signal, write } <- React.useLazy unit \_ -> Selector.build selector store - value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal - React.useEffectOnce $ Signal.subscribe signal setValue - pure $ value /\ write + React.useEffectOnce do + Atom.reset atom + mempty + useAtom atom -useSelectorValue :: forall a. Selector a -> Hook (UseSelector a) a -useSelectorValue selector = fst <$> useSelector selector +useAtomResetValue :: forall atom a. Atom atom => atom a -> Hook (UseAtomReset a) a +useAtomResetValue atom = fst <$> useAtomReset atom diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/Selector.purs index b27da73..1d99621 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/Selector.purs @@ -1,47 +1,80 @@ -module Wire.Store.Selector (Selector, makeSelector, StoreF, select, read, write, build) where +module Wire.Store.Selector where import Prelude -import Control.Monad.Free.Trans (FreeT, freeT, runFreeT) -import Control.Monad.Rec.Class (class MonadRec) -import Control.Monad.Trans.Class (lift) -import Data.Either (Either(..)) -import Data.Maybe (maybe') +import Control.Monad.Free (Free, liftF, runFreeM) import Effect (Effect) +import Effect.Unsafe (unsafePerformEffect) +import Wire.Event (Event) +import Wire.Event as Event import Wire.Signal (Signal) -import Wire.Signal as Signal -import Wire.Store (Store) -import Wire.Store as Store import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom.Class as Class +import Wire.Store.Atom.Class as Atom newtype Selector a = Selector - { select :: FreeT StoreF Signal a - , update :: a -> FreeT StoreF Effect Unit + { initial :: a + , signal :: Signal a } -makeSelector :: forall a. { select :: FreeT StoreF Signal a, update :: a -> FreeT StoreF Effect Unit } -> Selector a -makeSelector = Selector +create :: + forall a. + { select :: Free Select a + , update :: a -> Free Update Unit + } -> + Effect (Selector a) +create { select: select', update } = do + let + event = runEvent select' -data StoreF next - = Apply (Store -> next) + read' = runRead select' -derive instance functorStoreF :: Functor StoreF + modify' f = read' >>= runUpdate <<< update <<< f + initial <- read' + pure $ Selector { initial, signal: { event, read: read', modify: modify' } } -select :: forall atom value. Atom atom => atom value -> FreeT StoreF Signal value -select atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.initialValue atom) _.signal $ Store.unsafeLookup atom store +unsafeCreate :: + forall a. + { select :: Free Select a + , update :: a -> Free Update Unit + } -> + Selector a +unsafeCreate = unsafePerformEffect <<< create -read :: forall atom value. Atom atom => atom value -> FreeT StoreF Effect value -read atom = freeT \_ -> pure $ Right $ Apply \store -> lift $ maybe' (\_ -> pure $ Class.initialValue atom) (Signal.read <<< _.signal) $ Store.unsafeLookup atom store +instance atomSelector :: Atom Selector where + default (Selector atom) = atom.initial + read (Selector atom) = atom.signal.read + modify f (Selector atom) = atom.signal.modify f + reset _ = mempty + subscribe notify (Selector atom) = Event.subscribe atom.signal.event notify + signal (Selector atom) = atom.signal -write :: forall atom value. Atom atom => atom value -> value -> FreeT StoreF Effect Unit -write atom value = freeT \_ -> pure $ Right $ Apply \store -> lift $ Store.update atom store value +newtype Select next + = Select { event :: Event next, read :: Effect next } -interpret :: forall a m. MonadRec m => Store -> FreeT StoreF m a -> m a -interpret store = runFreeT \(Apply run) -> pure (run store) +derive instance functorSelect :: Functor Select -build :: forall a. Selector a -> Store -> { signal :: Signal a, write :: a -> Effect Unit } -build (Selector selector) store = - { signal: interpret store selector.select - , write: \a -> interpret store (selector.update a) - } +runEvent :: forall a. Free Select a -> Event a +runEvent = runFreeM case _ of Select s -> s.event + +runRead :: forall a. Free Select a -> Effect a +runRead = runFreeM case _ of Select s -> s.read + +select :: forall value atom. Atom atom => atom value -> Free Select value +select = \atom -> liftF $ Select { event: (Atom.signal atom).event, read: Atom.read atom } + +data Update next + = Update (Effect next) + +derive instance functorUpdate :: Functor Update + +runUpdate :: forall a. Free Update a -> Effect a +runUpdate = runFreeM case _ of Update next -> next + +read :: forall atom value. Atom atom => atom value -> Free Update value +read atom = liftF $ Update $ Atom.read atom + +modify :: forall atom value. Atom atom => (value -> value) -> atom value -> Free Update Unit +modify f atom = liftF $ Update $ Atom.modify f atom + +write :: forall atom value. Atom atom => value -> atom value -> Free Update Unit +write = modify <<< const From 25fb035e0a7cc1f18db8b50834c7b2c7ee89a7be Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 9 Jul 2020 17:01:00 +0900 Subject: [PATCH 32/37] Deleting old files and reorganising --- src/Wire/Store.purs | 58 ----------------------- src/Wire/Store/Atom.purs | 46 ------------------ src/Wire/Store/{Hooks.purs => React.purs} | 12 ++--- src/Wire/Store/{Atom => React}/Async.purs | 4 +- src/Wire/Store/{Atom => React}/Class.purs | 2 +- src/Wire/Store/{Atom => React}/Pure.purs | 4 +- src/Wire/Store/{ => React}/Selector.purs | 12 ++--- src/Wire/Store/{Atom => React}/Sync.purs | 4 +- 8 files changed, 19 insertions(+), 123 deletions(-) delete mode 100644 src/Wire/Store.purs delete mode 100644 src/Wire/Store/Atom.purs rename src/Wire/Store/{Hooks.purs => React.purs} (87%) rename src/Wire/Store/{Atom => React}/Async.purs (96%) rename src/Wire/Store/{Atom => React}/Class.purs (93%) rename src/Wire/Store/{Atom => React}/Pure.purs (91%) rename src/Wire/Store/{ => React}/Selector.purs (86%) rename src/Wire/Store/{Atom => React}/Sync.purs (93%) diff --git a/src/Wire/Store.purs b/src/Wire/Store.purs deleted file mode 100644 index 902bc57..0000000 --- a/src/Wire/Store.purs +++ /dev/null @@ -1,58 +0,0 @@ -module Wire.Store where - --- import Prelude --- import Data.Foldable (traverse_) --- import Data.Maybe (Maybe(..)) --- import Effect (Effect) --- import Effect.Console as Console --- import Effect.Ref (Ref) --- import Effect.Ref as Ref --- import Effect.Unsafe (unsafePerformEffect) --- import Foreign (Foreign) --- import Foreign.Object (Object) --- import Foreign.Object as Object --- import React.Basic (ReactContext) --- import React.Basic as React --- import Unsafe.Coerce (unsafeCoerce) --- import Wire.Signal as Signal --- import Wire.Store.Atom (AtomSignal) --- import Wire.Store.Atom.Class (class Atom) --- import Wire.Store.Atom.Class as Class --- newtype Store --- = Store { atoms :: Ref (Object (AtomSignal Foreign)) } --- context :: ReactContext Store --- context = unsafePerformEffect $ React.createContext =<< create --- create :: Effect Store --- create = do --- atoms <- Ref.new Object.empty --- pure $ Store { atoms } --- toForeign :: forall atom value. Atom atom => atom value -> AtomSignal value -> AtomSignal Foreign --- toForeign _ = unsafeCoerce --- fromForeign :: forall atom value. Atom atom => atom value -> AtomSignal Foreign -> AtomSignal value --- fromForeign _ = unsafeCoerce --- lookup :: forall value atom. Atom atom => atom value -> Store -> Effect (Maybe (AtomSignal value)) --- lookup atom (Store store) = do --- let --- storeKey = Class.storeKey atom --- storedSignal <- map (fromForeign atom) <<< Object.lookup storeKey <$> Ref.read store.atoms --- isInitialised <- Class.isInitialised atom --- case storedSignal, isInitialised of --- Just signal, true -> do --- pure $ pure signal --- Nothing, false -> do --- signal <- Signal.create $ Class.initialValue atom --- Ref.modify_ (Object.insert storeKey (toForeign atom signal)) store.atoms --- Class.initialise atom signal --- pure $ pure signal --- Nothing, true -> do --- Console.warn $ "The atom " <> show storeKey <> " has been initialised but cannot be found in the store." --- pure Nothing --- Just _, false -> do --- Console.warn $ "A different atom with the key " <> show storeKey <> " is already in the store." --- pure Nothing --- unsafeLookup :: forall atom value. Atom atom => atom value -> Store -> Maybe (AtomSignal value) --- unsafeLookup atom store = unsafePerformEffect $ lookup atom store --- reset :: forall atom value. Atom atom => atom value -> Store -> Effect Unit --- reset atom store = lookup atom store >>= traverse_ (Class.reset atom) --- update :: forall atom value. Atom atom => atom value -> Store -> value -> Effect Unit --- update atom store value = lookup atom store >>= traverse_ (Class.update atom value) diff --git a/src/Wire/Store/Atom.purs b/src/Wire/Store/Atom.purs deleted file mode 100644 index f15cc53..0000000 --- a/src/Wire/Store/Atom.purs +++ /dev/null @@ -1,46 +0,0 @@ -module Wire.Store.Atom where - --- import Prelude --- import Control.Monad.Free.Trans (FreeT, liftFreeT, runFreeT) --- import Control.Monad.Rec.Class (class MonadRec) --- import Data.Foldable (class Foldable) --- import Effect (Effect) --- import Effect.Class (class MonadEffect, liftEffect) --- import Wire.Signal (Signal) --- import Wire.Signal as Signal --- data AtomicF a next --- = Read (a -> next) --- | Modify (a -> a) next --- derive instance functorAtomicF :: Functor (AtomicF a) --- type Handler m a --- = FreeT (AtomicF a) m Unit --- read :: forall a m. Monad m => FreeT (AtomicF a) m a --- read = liftFreeT $ Read identity --- write :: forall a m. Monad m => a -> FreeT (AtomicF a) m Unit --- write a = liftFreeT $ Modify (const a) unit --- modify :: forall m a. Monad m => (a -> a) -> FreeT (AtomicF a) m Unit --- modify f = liftFreeT $ Modify f unit --- interpret :: forall a m. MonadEffect m => MonadRec m => AtomSignal a -> FreeT (AtomicF a) m Unit -> m Unit --- interpret store = --- runFreeT case _ of --- Read next -> do --- a <- liftEffect (Signal.read store.signal) --- pure (next a) --- Modify f next -> do --- liftEffect (store.modify f) --- pure next --- type AtomSignal a --- = { signal :: Signal a --- , modify :: (a -> a) -> Effect Unit --- } --- data Action a --- = Initialize --- | Update a --- derive instance functorAction :: Functor Action --- instance foldableAction :: Foldable Action where --- foldr _ z Initialize = z --- foldr f z (Update x) = x `f` z --- foldl _ z Initialize = z --- foldl f z (Update x) = z `f` x --- foldMap f Initialize = mempty --- foldMap f (Update x) = f x diff --git a/src/Wire/Store/Hooks.purs b/src/Wire/Store/React.purs similarity index 87% rename from src/Wire/Store/Hooks.purs rename to src/Wire/Store/React.purs index 1b23970..bdce3f5 100644 --- a/src/Wire/Store/Hooks.purs +++ b/src/Wire/Store/React.purs @@ -10,8 +10,8 @@ import React.Basic.Hooks (Hook, UseEffect, UseState) import React.Basic.Hooks as React import Wire.Event as Event import Wire.Signal (Signal) -import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom.Class as Atom +import Wire.React.Class (class Atom) +import Wire.React.Class as Class newtype UseSignal a hooks = UseSignal (UseEffect Unit (UseState a hooks)) @@ -33,9 +33,9 @@ derive instance newtypeUseAtom :: Newtype (UseAtom a hooks) _ useAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ ((a -> a) -> Effect Unit)) useAtom atom = React.coerceHook React.do - value /\ setValue <- React.useState' $ unsafePerformEffect $ Atom.read atom - React.useEffectOnce $ Event.subscribe (Atom.signal atom).event setValue - pure $ value /\ flip Atom.modify atom + value /\ setValue <- React.useState' $ unsafePerformEffect $ Class.read atom + React.useEffectOnce $ Event.subscribe (Class.signal atom).event setValue + pure $ value /\ flip Class.modify atom useAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useAtomValue atom = fst <$> useAtom atom @@ -49,7 +49,7 @@ useAtomReset :: forall atom a. Atom atom => atom a -> Hook (UseAtomReset a) (a / useAtomReset atom = React.coerceHook React.do React.useEffectOnce do - Atom.reset atom + Class.reset atom mempty useAtom atom diff --git a/src/Wire/Store/Atom/Async.purs b/src/Wire/Store/React/Async.purs similarity index 96% rename from src/Wire/Store/Atom/Async.purs rename to src/Wire/Store/React/Async.purs index dfc0e8d..93e80d4 100644 --- a/src/Wire/Store/Atom/Async.purs +++ b/src/Wire/Store/React/Async.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Async where +module Wire.React.Async where import Prelude import Data.Foldable (for_) @@ -12,7 +12,7 @@ import Effect.Unsafe (unsafePerformEffect) import Wire.Event as Event import Wire.Signal (Signal) import Wire.Signal as Signal -import Wire.Store.Atom.Class (class Atom) +import Wire.React.Class (class Atom) newtype Async a = Async diff --git a/src/Wire/Store/Atom/Class.purs b/src/Wire/Store/React/Class.purs similarity index 93% rename from src/Wire/Store/Atom/Class.purs rename to src/Wire/Store/React/Class.purs index e51f06a..af4eba5 100644 --- a/src/Wire/Store/Atom/Class.purs +++ b/src/Wire/Store/React/Class.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Class where +module Wire.React.Class where import Prelude import Effect (Effect) diff --git a/src/Wire/Store/Atom/Pure.purs b/src/Wire/Store/React/Pure.purs similarity index 91% rename from src/Wire/Store/Atom/Pure.purs rename to src/Wire/Store/React/Pure.purs index 4915b18..8449a96 100644 --- a/src/Wire/Store/Atom/Pure.purs +++ b/src/Wire/Store/React/Pure.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Pure where +module Wire.React.Pure where import Prelude import Effect (Effect) @@ -6,7 +6,7 @@ import Effect.Unsafe (unsafePerformEffect) import Wire.Event as Event import Wire.Signal (Signal) import Wire.Signal as Signal -import Wire.Store.Atom.Class (class Atom) +import Wire.React.Class (class Atom) newtype Pure a = Pure diff --git a/src/Wire/Store/Selector.purs b/src/Wire/Store/React/Selector.purs similarity index 86% rename from src/Wire/Store/Selector.purs rename to src/Wire/Store/React/Selector.purs index 1d99621..e3d457a 100644 --- a/src/Wire/Store/Selector.purs +++ b/src/Wire/Store/React/Selector.purs @@ -1,4 +1,4 @@ -module Wire.Store.Selector where +module Wire.React.Selector where import Prelude import Control.Monad.Free (Free, liftF, runFreeM) @@ -7,8 +7,8 @@ import Effect.Unsafe (unsafePerformEffect) import Wire.Event (Event) import Wire.Event as Event import Wire.Signal (Signal) -import Wire.Store.Atom.Class (class Atom) -import Wire.Store.Atom.Class as Atom +import Wire.React.Class (class Atom) +import Wire.React.Class as Class newtype Selector a = Selector @@ -60,7 +60,7 @@ runRead :: forall a. Free Select a -> Effect a runRead = runFreeM case _ of Select s -> s.read select :: forall value atom. Atom atom => atom value -> Free Select value -select = \atom -> liftF $ Select { event: (Atom.signal atom).event, read: Atom.read atom } +select = \atom -> liftF $ Select { event: (Class.signal atom).event, read: Class.read atom } data Update next = Update (Effect next) @@ -71,10 +71,10 @@ runUpdate :: forall a. Free Update a -> Effect a runUpdate = runFreeM case _ of Update next -> next read :: forall atom value. Atom atom => atom value -> Free Update value -read atom = liftF $ Update $ Atom.read atom +read atom = liftF $ Update $ Class.read atom modify :: forall atom value. Atom atom => (value -> value) -> atom value -> Free Update Unit -modify f atom = liftF $ Update $ Atom.modify f atom +modify f atom = liftF $ Update $ Class.modify f atom write :: forall atom value. Atom atom => value -> atom value -> Free Update Unit write = modify <<< const diff --git a/src/Wire/Store/Atom/Sync.purs b/src/Wire/Store/React/Sync.purs similarity index 93% rename from src/Wire/Store/Atom/Sync.purs rename to src/Wire/Store/React/Sync.purs index c38292b..93f6fad 100644 --- a/src/Wire/Store/Atom/Sync.purs +++ b/src/Wire/Store/React/Sync.purs @@ -1,4 +1,4 @@ -module Wire.Store.Atom.Sync where +module Wire.React.Sync where import Prelude import Effect (Effect) @@ -6,7 +6,7 @@ import Effect.Unsafe (unsafePerformEffect) import Wire.Event as Event import Wire.Signal (Signal) import Wire.Signal as Signal -import Wire.Store.Atom.Class (class Atom) +import Wire.React.Class (class Atom) newtype Sync a = Sync From 18ab4e0c4357c27b8b4861518b4cf01c05ae7cf4 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Thu, 9 Jul 2020 17:01:39 +0900 Subject: [PATCH 33/37] Missed old Store folder --- src/Wire/{Store => }/React.purs | 0 src/Wire/{Store => }/React/Async.purs | 0 src/Wire/{Store => }/React/Class.purs | 0 src/Wire/{Store => }/React/Pure.purs | 0 src/Wire/{Store => }/React/Selector.purs | 0 src/Wire/{Store => }/React/Sync.purs | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename src/Wire/{Store => }/React.purs (100%) rename src/Wire/{Store => }/React/Async.purs (100%) rename src/Wire/{Store => }/React/Class.purs (100%) rename src/Wire/{Store => }/React/Pure.purs (100%) rename src/Wire/{Store => }/React/Selector.purs (100%) rename src/Wire/{Store => }/React/Sync.purs (100%) diff --git a/src/Wire/Store/React.purs b/src/Wire/React.purs similarity index 100% rename from src/Wire/Store/React.purs rename to src/Wire/React.purs diff --git a/src/Wire/Store/React/Async.purs b/src/Wire/React/Async.purs similarity index 100% rename from src/Wire/Store/React/Async.purs rename to src/Wire/React/Async.purs diff --git a/src/Wire/Store/React/Class.purs b/src/Wire/React/Class.purs similarity index 100% rename from src/Wire/Store/React/Class.purs rename to src/Wire/React/Class.purs diff --git a/src/Wire/Store/React/Pure.purs b/src/Wire/React/Pure.purs similarity index 100% rename from src/Wire/Store/React/Pure.purs rename to src/Wire/React/Pure.purs diff --git a/src/Wire/Store/React/Selector.purs b/src/Wire/React/Selector.purs similarity index 100% rename from src/Wire/Store/React/Selector.purs rename to src/Wire/React/Selector.purs diff --git a/src/Wire/Store/React/Sync.purs b/src/Wire/React/Sync.purs similarity index 100% rename from src/Wire/Store/React/Sync.purs rename to src/Wire/React/Sync.purs From 11af47fdb60c0ccc8df4c891f19ec43bd9b5efa5 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Fri, 10 Jul 2020 00:44:00 +0900 Subject: [PATCH 34/37] Keep flip-flopping on Signal as a newtype --- src/Wire/Event.purs | 12 ++------ src/Wire/React.purs | 12 ++++---- src/Wire/React/Async.purs | 22 +++++++-------- src/Wire/React/Class.purs | 4 +-- src/Wire/React/Pure.purs | 14 ++++----- src/Wire/React/Selector.purs | 41 ++++++++++++--------------- src/Wire/React/Sync.purs | 18 ++++++------ src/Wire/Signal.purs | 55 +++++++++++++++++++++++++++++------- 8 files changed, 100 insertions(+), 78 deletions(-) diff --git a/src/Wire/Event.purs b/src/Wire/Event.purs index 7cf20d2..08a061b 100644 --- a/src/Wire/Event.purs +++ b/src/Wire/Event.purs @@ -6,7 +6,7 @@ import Control.Alternative (class Alternative, class Plus, empty) import Control.Apply (lift2) import Control.Monad.Rec.Class (class MonadRec, Step(..), tailRecM) import Data.Array as Array -import Data.Either (Either(..), either, hush) +import Data.Either (either, hush) import Data.Filterable (class Compactable, class Filterable, filterMap, partitionMap) import Data.Foldable (class Foldable, for_, sequence_, traverse_) import Data.Maybe (Maybe(..), fromJust, isJust) @@ -145,15 +145,7 @@ instance functorEvent :: Functor Event where map f (Event event) = Event \notify -> event (notify <<< f) instance applyEvent :: Apply Event where - apply eventF eventA = - alt (Left <$> eventF) (Right <$> eventA) - # fold - ( \{ left, right } -> case _ of - Left l -> { left: Just l, right } - Right r -> { left, right: Just r } - ) - { left: Nothing, right: Nothing } - # filterMap (\{ left, right } -> apply left right) + apply = ap instance applicativeEvent :: Applicative Event where pure a = Event \notify -> notify a *> mempty diff --git a/src/Wire/React.purs b/src/Wire/React.purs index bdce3f5..2c7a7f4 100644 --- a/src/Wire/React.purs +++ b/src/Wire/React.purs @@ -8,10 +8,10 @@ import Effect (Effect) import Effect.Unsafe (unsafePerformEffect) import React.Basic.Hooks (Hook, UseEffect, UseState) import React.Basic.Hooks as React -import Wire.Event as Event -import Wire.Signal (Signal) import Wire.React.Class (class Atom) import Wire.React.Class as Class +import Wire.Signal (Signal) +import Wire.Signal as Signal newtype UseSignal a hooks = UseSignal (UseEffect Unit (UseState a hooks)) @@ -21,8 +21,8 @@ derive instance newtypeUseSignal :: Newtype (UseSignal a hooks) _ useSignal :: forall a. Signal a -> Hook (UseSignal a) a useSignal signal = React.coerceHook React.do - value /\ setValue <- React.useState' $ unsafePerformEffect signal.read - React.useEffectOnce $ Event.subscribe signal.event setValue + value /\ setValue <- React.useState' $ unsafePerformEffect $ Signal.read signal + React.useEffectOnce $ Signal.subscribe signal setValue pure value newtype UseAtom a hooks @@ -34,8 +34,8 @@ useAtom :: forall atom a. Atom atom => atom a -> Hook (UseAtom a) (a /\ ((a -> a useAtom atom = React.coerceHook React.do value /\ setValue <- React.useState' $ unsafePerformEffect $ Class.read atom - React.useEffectOnce $ Event.subscribe (Class.signal atom).event setValue - pure $ value /\ flip Class.modify atom + React.useEffectOnce $ Signal.subscribe (Class.signal atom) setValue + pure $ value /\ Class.modify atom useAtomValue :: forall a atom. Atom atom => atom a -> Hook (UseAtom a) a useAtomValue atom = fst <$> useAtom atom diff --git a/src/Wire/React/Async.purs b/src/Wire/React/Async.purs index 93e80d4..e8b5885 100644 --- a/src/Wire/React/Async.purs +++ b/src/Wire/React/Async.purs @@ -9,10 +9,9 @@ import Effect.Aff as Aff import Effect.Class (liftEffect) import Effect.Ref as Ref import Effect.Unsafe (unsafePerformEffect) -import Wire.Event as Event +import Wire.React.Class (class Atom) import Wire.Signal (Signal) import Wire.Signal as Signal -import Wire.React.Class (class Atom) newtype Async a = Async @@ -20,6 +19,7 @@ newtype Async a , load :: Effect Unit , save :: a -> Effect Unit , signal :: Signal a + , modify :: (a -> a) -> Effect Unit } create :: @@ -30,7 +30,7 @@ create :: } -> Effect (Async a) create { initial, load, save } = do - signal <- Signal.create initial + { signal, modify } <- Signal.create initial loadFiber <- Ref.new Nothing saveFiber <- Ref.new Nothing let @@ -40,7 +40,7 @@ create { initial, load, save } = do fiber <- Aff.launchAff do value <- load - liftEffect $ signal.modify (const value) + liftEffect $ modify (const value) Ref.write (Just fiber) loadFiber save' value = do @@ -51,7 +51,7 @@ create { initial, load, save } = do fiber <- Aff.launchAff $ save value Ref.write (Just fiber) loadFiber load' - pure $ Async { initial, load: load', save: save', signal } + pure $ Async { initial, load: load', save: save', signal, modify } unsafeCreate :: forall a. @@ -64,12 +64,12 @@ unsafeCreate = unsafePerformEffect <<< create instance atomAsync :: Atom Async where default (Async atom) = atom.initial - read (Async atom) = atom.signal.read - modify f (Async atom) = do - atom.signal.modify f - atom.signal.read >>= atom.save + read (Async atom) = Signal.read atom.signal + modify (Async atom) f = do + atom.modify f + Signal.read atom.signal >>= atom.save reset (Async atom) = do - atom.signal.modify (const atom.initial) + atom.modify (const atom.initial) atom.load - subscribe notify (Async atom) = Event.subscribe atom.signal.event notify + subscribe (Async atom) = Signal.subscribe atom.signal signal (Async atom) = atom.signal diff --git a/src/Wire/React/Class.purs b/src/Wire/React/Class.purs index af4eba5..a3a2b47 100644 --- a/src/Wire/React/Class.purs +++ b/src/Wire/React/Class.purs @@ -7,7 +7,7 @@ import Wire.Signal (Signal) class Atom (atom :: Type -> Type) where default :: forall value. atom value -> value read :: forall value. atom value -> Effect value - modify :: forall value. (value -> value) -> atom value -> Effect Unit + modify :: forall value. atom value -> (value -> value) -> Effect Unit reset :: forall value. atom value -> Effect Unit - subscribe :: forall value. (value -> Effect Unit) -> atom value -> Effect (Effect Unit) + subscribe :: forall value. atom value -> (value -> Effect Unit) -> Effect (Effect Unit) signal :: forall value. atom value -> Signal value diff --git a/src/Wire/React/Pure.purs b/src/Wire/React/Pure.purs index 8449a96..252beb6 100644 --- a/src/Wire/React/Pure.purs +++ b/src/Wire/React/Pure.purs @@ -3,7 +3,6 @@ module Wire.React.Pure where import Prelude import Effect (Effect) import Effect.Unsafe (unsafePerformEffect) -import Wire.Event as Event import Wire.Signal (Signal) import Wire.Signal as Signal import Wire.React.Class (class Atom) @@ -12,20 +11,21 @@ newtype Pure a = Pure { initial :: a , signal :: Signal a + , modify :: (a -> a) -> Effect Unit } create :: forall a. a -> Effect (Pure a) create initial = do - signal <- Signal.create initial - pure $ Pure { initial, signal } + { signal, modify } <- Signal.create initial + pure $ Pure { initial, signal, modify } unsafeCreate :: forall a. a -> Pure a unsafeCreate = unsafePerformEffect <<< create instance atomPure :: Atom Pure where default (Pure atom) = atom.initial - read (Pure atom) = atom.signal.read - modify f (Pure atom) = atom.signal.modify f - reset (Pure atom) = atom.signal.modify (const atom.initial) - subscribe k (Pure atom) = Event.subscribe atom.signal.event k + read (Pure atom) = Signal.read atom.signal + modify (Pure atom) = atom.modify + reset (Pure atom) = atom.modify (const atom.initial) + subscribe (Pure atom) = Signal.subscribe atom.signal signal (Pure atom) = atom.signal diff --git a/src/Wire/React/Selector.purs b/src/Wire/React/Selector.purs index e3d457a..98bd635 100644 --- a/src/Wire/React/Selector.purs +++ b/src/Wire/React/Selector.purs @@ -4,16 +4,16 @@ import Prelude import Control.Monad.Free (Free, liftF, runFreeM) import Effect (Effect) import Effect.Unsafe (unsafePerformEffect) -import Wire.Event (Event) -import Wire.Event as Event -import Wire.Signal (Signal) import Wire.React.Class (class Atom) import Wire.React.Class as Class +import Wire.Signal (Signal) +import Wire.Signal as Signal newtype Selector a = Selector { initial :: a , signal :: Signal a + , modify :: (a -> a) -> Effect Unit } create :: @@ -24,13 +24,11 @@ create :: Effect (Selector a) create { select: select', update } = do let - event = runEvent select' + signal = runSelect select' - read' = runRead select' - - modify' f = read' >>= runUpdate <<< update <<< f - initial <- read' - pure $ Selector { initial, signal: { event, read: read', modify: modify' } } + modify' f = Signal.read signal >>= runUpdate <<< update <<< f + initial <- Signal.read signal + pure $ Selector { initial, signal, modify: modify' } unsafeCreate :: forall a. @@ -42,25 +40,22 @@ unsafeCreate = unsafePerformEffect <<< create instance atomSelector :: Atom Selector where default (Selector atom) = atom.initial - read (Selector atom) = atom.signal.read - modify f (Selector atom) = atom.signal.modify f + read (Selector atom) = Signal.read atom.signal + modify (Selector atom) = atom.modify reset _ = mempty - subscribe notify (Selector atom) = Event.subscribe atom.signal.event notify + subscribe (Selector atom) = Signal.subscribe atom.signal signal (Selector atom) = atom.signal newtype Select next - = Select { event :: Event next, read :: Effect next } + = Select (Signal next) derive instance functorSelect :: Functor Select -runEvent :: forall a. Free Select a -> Event a -runEvent = runFreeM case _ of Select s -> s.event - -runRead :: forall a. Free Select a -> Effect a -runRead = runFreeM case _ of Select s -> s.read +runSelect :: Free Select ~> Signal +runSelect = runFreeM case _ of Select s -> s select :: forall value atom. Atom atom => atom value -> Free Select value -select = \atom -> liftF $ Select { event: (Class.signal atom).event, read: Class.read atom } +select = \atom -> liftF $ Select $ Class.signal atom data Update next = Update (Effect next) @@ -73,8 +68,8 @@ runUpdate = runFreeM case _ of Update next -> next read :: forall atom value. Atom atom => atom value -> Free Update value read atom = liftF $ Update $ Class.read atom -modify :: forall atom value. Atom atom => (value -> value) -> atom value -> Free Update Unit -modify f atom = liftF $ Update $ Class.modify f atom +modify :: forall atom value. Atom atom => atom value -> (value -> value) -> Free Update Unit +modify atom f = liftF $ Update $ Class.modify atom f -write :: forall atom value. Atom atom => value -> atom value -> Free Update Unit -write = modify <<< const +write :: forall atom value. Atom atom => atom value -> value -> Free Update Unit +write atom a = modify atom (const a) diff --git a/src/Wire/React/Sync.purs b/src/Wire/React/Sync.purs index 93f6fad..9ceb1ab 100644 --- a/src/Wire/React/Sync.purs +++ b/src/Wire/React/Sync.purs @@ -3,7 +3,6 @@ module Wire.React.Sync where import Prelude import Effect (Effect) import Effect.Unsafe (unsafePerformEffect) -import Wire.Event as Event import Wire.Signal (Signal) import Wire.Signal as Signal import Wire.React.Class (class Atom) @@ -14,6 +13,7 @@ newtype Sync a , load :: Effect a , save :: a -> Effect Unit , signal :: Signal a + , modify :: (a -> a) -> Effect Unit } create :: @@ -24,8 +24,8 @@ create :: Effect (Sync a) create { load, save } = do initial <- load - signal <- Signal.create initial - pure $ Sync { initial, load, save, signal } + { signal, modify } <- Signal.create initial + pure $ Sync { initial, load, save, signal, modify } unsafeCreate :: forall a. @@ -37,12 +37,12 @@ unsafeCreate = unsafePerformEffect <<< create instance atomSync :: Atom Sync where default (Sync atom) = atom.initial - read (Sync atom) = atom.signal.read - modify f (Sync atom) = do - atom.signal.modify f - atom.signal.read >>= atom.save + read (Sync atom) = Signal.read atom.signal + modify (Sync atom) f = do + atom.modify f + Signal.read atom.signal >>= atom.save reset (Sync atom) = do value <- atom.load - atom.signal.modify (const value) - subscribe notify (Sync atom) = Event.subscribe atom.signal.event notify + atom.modify (const value) + subscribe (Sync atom) = Signal.subscribe atom.signal signal (Sync atom) = atom.signal diff --git a/src/Wire/Signal.purs b/src/Wire/Signal.purs index 85c27cb..604459d 100644 --- a/src/Wire/Signal.purs +++ b/src/Wire/Signal.purs @@ -1,29 +1,64 @@ module Wire.Signal where import Prelude +import Control.Monad.Rec.Class (class MonadRec, Step(..)) import Effect (Effect) import Effect.Ref as Ref import Wire.Event (Event) import Wire.Event as Event -type Signal a - = { event :: Event a - , read :: Effect a - , modify :: (a -> a) -> Effect Unit - } +newtype Signal a + = Signal + { event :: Event a + , read :: Effect a + } -create :: forall a. a -> Effect (Signal a) +create :: forall a. a -> Effect { signal :: Signal a, modify :: (a -> a) -> Effect Unit } create init = do value <- Ref.new init inner <- Event.create let - read = Ref.read value + read' = Ref.read value - event = + event' = Event.makeEvent \notify -> do unsubscribe <- Event.subscribe inner.event notify - read >>= notify + read' >>= notify pure unsubscribe modify f = Ref.modify f value >>= inner.push - pure { event, read, modify } + pure { signal: Signal { event: event', read: read' }, modify } + +subscribe :: forall b a. Signal a -> (a -> Effect b) -> Effect (Effect Unit) +subscribe (Signal s) notify = Event.subscribe s.event notify + +distinct :: forall a. Eq a => Signal a -> Signal a +distinct (Signal s) = Signal s { event = Event.distinct s.event } + +event :: Signal ~> Event +event (Signal s) = s.event + +read :: Signal ~> Effect +read (Signal s) = s.read + +derive instance functorSignal :: Functor Signal + +instance applySignal :: Apply Signal where + apply = ap + +instance applicativeSignal :: Applicative Signal where + pure a = Signal { event: pure a, read: pure a } + +instance bindSignal :: Bind Signal where + bind (Signal s) f = Signal { event: s.event >>= f >>> event, read: s.read >>= f >>> read } + +instance monadSignal :: Monad Signal + +instance monadRecSignal ∷ MonadRec Signal where + tailRecM k = go + where + go a = do + res ← k a + case res of + Done r → pure r + Loop b → go b From ab34a882b2272994c79328857ec8f3d122686fa6 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Fri, 10 Jul 2020 00:45:59 +0900 Subject: [PATCH 35/37] Natural transformations --- src/Wire/React/Class.purs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Wire/React/Class.purs b/src/Wire/React/Class.purs index a3a2b47..2e5b936 100644 --- a/src/Wire/React/Class.purs +++ b/src/Wire/React/Class.purs @@ -6,8 +6,8 @@ import Wire.Signal (Signal) class Atom (atom :: Type -> Type) where default :: forall value. atom value -> value - read :: forall value. atom value -> Effect value + read :: atom ~> Effect modify :: forall value. atom value -> (value -> value) -> Effect Unit reset :: forall value. atom value -> Effect Unit subscribe :: forall value. atom value -> (value -> Effect Unit) -> Effect (Effect Unit) - signal :: forall value. atom value -> Signal value + signal :: atom ~> Signal From 17f808c105aeae5dcd1d81b693f2304dbf2d8381 Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Fri, 10 Jul 2020 01:10:31 +0900 Subject: [PATCH 36/37] Clear old save fiber when complete --- src/Wire/React/Async.purs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Wire/React/Async.purs b/src/Wire/React/Async.purs index e8b5885..f1ec906 100644 --- a/src/Wire/React/Async.purs +++ b/src/Wire/React/Async.purs @@ -48,7 +48,10 @@ create { initial, load, save } = do when inProgress do oldFiber <- Ref.read saveFiber for_ oldFiber (Aff.launchAff_ <<< Aff.killFiber (Aff.error "New save triggered, cancelling save in progress")) - fiber <- Aff.launchAff $ save value + fiber <- + Aff.launchAff do + save value + liftEffect $ Ref.write Nothing loadFiber Ref.write (Just fiber) loadFiber load' pure $ Async { initial, load: load', save: save', signal, modify } From 4423a9df4cf7728c54de2652b3e04b725cc130cc Mon Sep 17 00:00:00 2001 From: Robert Porter Date: Fri, 10 Jul 2020 17:40:48 +0900 Subject: [PATCH 37/37] More natural transformations --- src/Wire/React/Selector.purs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Wire/React/Selector.purs b/src/Wire/React/Selector.purs index 98bd635..fc6c2cd 100644 --- a/src/Wire/React/Selector.purs +++ b/src/Wire/React/Selector.purs @@ -54,7 +54,7 @@ derive instance functorSelect :: Functor Select runSelect :: Free Select ~> Signal runSelect = runFreeM case _ of Select s -> s -select :: forall value atom. Atom atom => atom value -> Free Select value +select :: forall atom. Atom atom => atom ~> Free Select select = \atom -> liftF $ Select $ Class.signal atom data Update next @@ -62,10 +62,10 @@ data Update next derive instance functorUpdate :: Functor Update -runUpdate :: forall a. Free Update a -> Effect a +runUpdate :: Free Update ~> Effect runUpdate = runFreeM case _ of Update next -> next -read :: forall atom value. Atom atom => atom value -> Free Update value +read :: forall atom. Atom atom => atom ~> Free Update read atom = liftF $ Update $ Class.read atom modify :: forall atom value. Atom atom => atom value -> (value -> value) -> Free Update Unit