From b5067ba936f3a3ac822eacf71e1d64c546bfb5a4 Mon Sep 17 00:00:00 2001 From: Madeline Trotter Date: Fri, 5 Jun 2020 16:17:52 -0700 Subject: [PATCH] Updates for React.Basic 15 --- .circleci/config.yml | 12 - .travis.yml | 15 + Makefile | 27 - README.md | 35 +- bower.json | 19 +- examples/README.md | 11 - examples/aff/.gitignore | 4 - examples/aff/Makefile | 19 - examples/aff/html/index.html | 10 - examples/aff/src/Example.purs | 142 -- examples/aff/src/Main.purs | 21 - examples/component/.gitignore | 4 - examples/component/Makefile | 19 - examples/component/html/index.html | 10 - examples/component/src/Example.purs | 20 - examples/component/src/Main.purs | 21 - examples/component/src/ToggleButton.purs | 24 - examples/context/.gitignore | 4 - examples/context/Makefile | 19 - examples/context/html/index.html | 10 - examples/context/src/Example.purs | 46 - examples/context/src/Main.purs | 21 - examples/controlled-input/.gitignore | 4 - examples/controlled-input/Makefile | 19 - examples/controlled-input/html/index.html | 10 - examples/controlled-input/src/Example.purs | 49 - examples/controlled-input/src/Main.purs | 21 - examples/counter/.gitignore | 4 - examples/counter/Makefile | 19 - examples/counter/html/index.html | 10 - examples/counter/src/Example.purs | 23 - examples/counter/src/Main.purs | 21 - examples/memo-callback/.gitignore | 4 - examples/memo-callback/Makefile | 19 - examples/memo-callback/html/index.html | 10 - examples/memo-callback/src/Example.purs | 57 - examples/memo-callback/src/Main.purs | 21 - examples/reducer/.gitignore | 4 - examples/reducer/Makefile | 19 - examples/reducer/html/index.html | 10 - examples/reducer/src/Example.purs | 33 - examples/reducer/src/Main.purs | 21 - examples/refs/.gitignore | 4 - examples/refs/Makefile | 19 - examples/refs/html/index.html | 10 - examples/refs/src/Example.purs | 95 -- examples/refs/src/Main.purs | 21 - examples/suspense/.gitignore | 4 - examples/suspense/Makefile | 19 - examples/suspense/html/index.html | 10 - examples/suspense/src/Example.purs | 153 -- examples/suspense/src/Main.purs | 21 - examples/todo-app/.gitignore | 4 - examples/todo-app/Makefile | 19 - examples/todo-app/html/index.html | 10 - examples/todo-app/src/Example.purs | 166 -- examples/todo-app/src/Main.purs | 21 - package-lock.json | 1732 ++++++++++++++++++-- package.json | 32 + packages.dhall | 128 -- serve.json | 8 - spago.dhall | 19 - src/React/Basic/DOM/Concurrent.js | 7 - src/React/Basic/DOM/Concurrent.purs | 9 - src/React/Basic/Hooks.js | 77 +- src/React/Basic/Hooks.purs | 82 +- src/React/Basic/Hooks/Aff.purs | 57 +- src/React/Basic/Hooks/Internal.purs | 6 +- src/React/Basic/StrictMode.js | 5 - src/React/Basic/StrictMode.purs | 10 - test/Main.purs | 11 - 71 files changed, 1802 insertions(+), 1848 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .travis.yml delete mode 100644 Makefile delete mode 100644 examples/README.md delete mode 100644 examples/aff/.gitignore delete mode 100644 examples/aff/Makefile delete mode 100644 examples/aff/html/index.html delete mode 100644 examples/aff/src/Example.purs delete mode 100644 examples/aff/src/Main.purs delete mode 100644 examples/component/.gitignore delete mode 100644 examples/component/Makefile delete mode 100644 examples/component/html/index.html delete mode 100644 examples/component/src/Example.purs delete mode 100644 examples/component/src/Main.purs delete mode 100644 examples/component/src/ToggleButton.purs delete mode 100644 examples/context/.gitignore delete mode 100644 examples/context/Makefile delete mode 100644 examples/context/html/index.html delete mode 100644 examples/context/src/Example.purs delete mode 100644 examples/context/src/Main.purs delete mode 100644 examples/controlled-input/.gitignore delete mode 100644 examples/controlled-input/Makefile delete mode 100644 examples/controlled-input/html/index.html delete mode 100644 examples/controlled-input/src/Example.purs delete mode 100644 examples/controlled-input/src/Main.purs delete mode 100644 examples/counter/.gitignore delete mode 100644 examples/counter/Makefile delete mode 100644 examples/counter/html/index.html delete mode 100644 examples/counter/src/Example.purs delete mode 100644 examples/counter/src/Main.purs delete mode 100644 examples/memo-callback/.gitignore delete mode 100644 examples/memo-callback/Makefile delete mode 100644 examples/memo-callback/html/index.html delete mode 100644 examples/memo-callback/src/Example.purs delete mode 100644 examples/memo-callback/src/Main.purs delete mode 100644 examples/reducer/.gitignore delete mode 100644 examples/reducer/Makefile delete mode 100644 examples/reducer/html/index.html delete mode 100644 examples/reducer/src/Example.purs delete mode 100644 examples/reducer/src/Main.purs delete mode 100644 examples/refs/.gitignore delete mode 100644 examples/refs/Makefile delete mode 100644 examples/refs/html/index.html delete mode 100644 examples/refs/src/Example.purs delete mode 100644 examples/refs/src/Main.purs delete mode 100644 examples/suspense/.gitignore delete mode 100644 examples/suspense/Makefile delete mode 100644 examples/suspense/html/index.html delete mode 100644 examples/suspense/src/Example.purs delete mode 100644 examples/suspense/src/Main.purs delete mode 100644 examples/todo-app/.gitignore delete mode 100644 examples/todo-app/Makefile delete mode 100644 examples/todo-app/html/index.html delete mode 100644 examples/todo-app/src/Example.purs delete mode 100644 examples/todo-app/src/Main.purs create mode 100644 package.json delete mode 100644 packages.dhall delete mode 100644 serve.json delete mode 100644 spago.dhall delete mode 100644 src/React/Basic/DOM/Concurrent.js delete mode 100644 src/React/Basic/DOM/Concurrent.purs delete mode 100644 src/React/Basic/StrictMode.js delete mode 100644 src/React/Basic/StrictMode.purs delete mode 100644 test/Main.purs diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 38107c9..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: 2.1 -jobs: - build: - docker: - - image: node:12 - - steps: - - checkout - - - run: - name: Build - command: make diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0a66d6d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,15 @@ +dist: trusty +sudo: required +language: node_js +node_js: + - node + - "lts/*" + +cache: npm + +install: + - npm ci + - npx bower i + +script: + - npx pulp build diff --git a/Makefile b/Makefile deleted file mode 100644 index 931a939..0000000 --- a/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -TOPTARGETS := all clean - -EXAMPLES := $(wildcard examples/*/.) - -all: build $(EXAMPLES) - -build: output - -output: .spago node_modules - npx spago build - -.spago: node_modules - npx spago install - -node_modules: - npm i --no-save spago purescript bower pulp - -clean: $(EXAMPLES) - rm -rf node_modules bower_components .spago output - -$(EXAMPLES): - cd $@ && $(MAKE) $(MAKECMDGOALS) - -serve: - npx serve - -.PHONY: build clean $(TOPTARGETS) $(EXAMPLES) serve \ No newline at end of file diff --git a/README.md b/README.md index 56e66d5..cfbb29e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ -# react-basic-hooks [![CircleCI](https://circleci.com/gh/spicydonuts/purescript-react-basic-hooks.svg?style=svg)](https://circleci.com/gh/spicydonuts/purescript-react-basic-hooks) +# react-basic-hooks [![Build Status](https://travis-ci.com/spicydonuts/purescript-react-basic-hooks.svg?branch=main)](https://travis-ci.com/spicydonuts/purescript-react-basic-hooks) -`react-basic-hooks` adds React hook support to [react-basic](https://github.com/lumihq/purescript-react-basic)! +`react-basic-hooks` is a React hook API for [react-basic](https://github.com/lumihq/purescript-react-basic). For more info and guides, see the React Basic [docs](https://react-basic-starter.github.io/)! (work in progress) -_Note:_ This API relies on recent React versions (>= 16.8.0). -For more info on hooks, see [React's documentation](https://reactjs.org/docs/hooks-intro.html). +_Note:_ This API relies on React `>=16.8.0`. For more info on hooks, see [React's documentation](https://reactjs.org/docs/hooks-intro.html). I recommend using PureScript's "qualified do" syntax while using this library (it's used in the examples, the `React.do` bits). It became available in the `0.12.2` compiler release. @@ -15,28 +14,16 @@ If we prefer this API over the existing react-basic API, we may eventually repla ## Example ```purs -mkCounter :: Effect (ReactComponent {}) +mkCounter :: Component Int mkCounter = do - component "Counter" \props -> React.do - counter /\ setCounter <- useState 0 + component "Counter" \initialValue -> React.do + counter /\ setCounter <- useState initialValue pure $ R.button - { onClick: handler_ do - setCounter (_ + 1) - , children: - [ R.text $ "Increment: " <> show counter ] - } + { onClick: handler_ do + setCounter (_ + 1) + , children: + [ R.text $ "Increment: " <> show counter ] + } ``` - -More examples: - -- [Counter with an effect](./examples/counter/src/Example.purs) -- [Reducer/action-style](./examples/reducer/src/Example.purs) -- [Controlled inputs](./examples/controlled-input/src/Example.purs) -- Components: [Parent](./examples/component/src/Example.purs) and [Child](./examples/component/src/ToggleButton.purs) -- [Refs to DOM nodes](./examples/refs/src/Example.purs) (and extracting hook logic from a component for reuse) -- [A Todo App](./examples/todo-app/src/Example.purs) (components, inputs, state) -- [Context](./examples/context/src/Example.purs) (creating and consuming React context) -- [Aff](./examples/aff/src/Example.purs) (rendering async data, using error boundaries) -- [Suspense](./examples/suspense/src/Example.purs) (experimental, React Suspense demo -- similar to the Aff example, but the loading state is managed by the parent instead of the detail rendering component) diff --git a/bower.json b/bower.json index 095e386..dfade93 100644 --- a/bower.json +++ b/bower.json @@ -13,13 +13,20 @@ }, "dependencies": { "purescript-prelude": "^4.1.0", - "purescript-console": "^4.2.0", - "purescript-effect": "^2.0.0", - "purescript-react-basic": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0", - "purescript-indexed-monad": "^1.0.0", + "purescript-effect": "^2.0.1", + "purescript-aff": "^5.1.2", + "purescript-newtype": "^3.0.0", + "purescript-maybe": "^4.0.1", + "purescript-numbers": "^7.0.0", + "purescript-either": "^4.1.1", + "purescript-type-equality": "^3.0.0", + "purescript-datetime": "^4.1.1", + "purescript-web-html": "^2.3.0", + "purescript-aff-promise": "^2.1.0", "purescript-unsafe-reference": "^3.0.1", - "purescript-aff": "^5.1.1", - "purescript-aff-promise": "^2.1.0" + "purescript-indexed-monad": "^1.2.0", + "purescript-react-basic": "^15.0.0", + "purescript-unsafe-coerce": "^4.0.0" }, "devDependencies": { "purescript-psci-support": "^4.0.0" diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 30b54a6..0000000 --- a/examples/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Examples - -## Building an example - -In the example folder: - -```sh -make -``` - -Then open `html/index.html` in your browser. diff --git a/examples/aff/.gitignore b/examples/aff/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/aff/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/aff/Makefile b/examples/aff/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/aff/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/aff/html/index.html b/examples/aff/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/aff/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/aff/src/Example.purs b/examples/aff/src/Example.purs deleted file mode 100644 index d8c9e75..0000000 --- a/examples/aff/src/Example.purs +++ /dev/null @@ -1,142 +0,0 @@ -module Example where - -import Prelude -import Data.Foldable (find) -import Data.Maybe (Maybe(..)) -import Data.Newtype (class Newtype, un) -import Effect.Aff (Aff, Milliseconds(..), delay, error, message, throwError) -import React.Basic.DOM as R -import React.Basic.DOM.Events (capture_) -import React.Basic.Events (handler_) -import React.Basic.Hooks (Component, component, fragment, useState, (/\)) -import React.Basic.Hooks as React -import React.Basic.Hooks.Aff (useAff) -import React.Basic.Hooks.ErrorBoundary (mkErrorBoundary) - -mkExample :: Component Unit -mkExample = do - errorBoundary <- mkErrorBoundary "AffExErrorBoundary" - catDetails <- mkCatDetails - component "AffEx" \props -> React.do - catKey /\ setCatKey <- useState Nothing - let - reset = setCatKey \_ -> Nothing - pure - $ R.div_ - [ R.h2_ [ R.text "Cat chooser" ] - , errorBoundary \{ error, dismissError } -> case error of - Just e -> renderAppError e (reset *> dismissError) - Nothing -> - fragment - [ catKeyList catKey setCatKey - , case catKey of - Nothing -> mempty - Just k -> catDetails k - ] - ] - where - -- This component is the main `useAff` demo. It receives a key - -- as a prop and renders both the loading state and the final - -- result. - mkCatDetails :: Component (Key Cat) - mkCatDetails = do - component "CatDetails" \catKey -> React.do - catState <- useAff catKey $ fetch catKey - pure - $ R.p_ - [ case map entity catState of - Nothing -> R.text "Loading..." - Just (Cat { name }) -> R.text $ "A cat named " <> name - ] - - renderAppError error resetApp = - fragment - [ R.p_ [ R.text "Error!" ] - , R.p_ [ R.text $ message error ] - , R.button - { onClick: capture_ do resetApp - , children: [ R.text "Reset" ] - } - ] - - catKeyList selectedCatKey setCatKey = - let - cats = - fakeDb - <> [ Entity - (Key "error (choose to throw a React render error)") - (Cat { name: "" }) - ] - - catKeyRadioButton k = - R.div_ - [ R.label_ - [ R.input - { type: "radio" - , name: "cat-key" - , checked: Just k == selectedCatKey - , onChange: - handler_ do - setCatKey \_ -> Just k - } - , R.text $ " Cat " <> un Key k - ] - ] - in - fragment $ map (catKeyRadioButton <<< key) cats - --- --- The bits below this point aren't directly relevant to the example, --- just a slightly more interesting data model than returing a single --- string. --- --- --- --- Typed keys are a great way to tie entity-specific behavior --- to an ID. We can use this phantom type to write a class --- for generic, type-safe data fetching. -newtype Key entity - = Key String - -derive instance eqKey :: Eq (Key entity) - -derive instance ntKey :: Newtype (Key entity) _ - --- An entity wrapper. In a real app this would hold other metadata --- such as create and update dates. -data Entity entity - = Entity (Key entity) entity - -key :: forall entity. Entity entity -> Key entity -key (Entity k _) = k - -entity :: forall entity. Entity entity -> entity -entity (Entity _ e) = e - -class Fetch entity where - fetch :: Key entity -> Aff (Entity entity) - --- An example entity -newtype Cat - = Cat { name :: String } - -fakeDb :: Array (Entity Cat) -fakeDb = - [ Entity (Key "abc") (Cat { name: "Herb" }) - , Entity (Key "def") (Cat { name: "Maxi" }) - , Entity (Key "ghi") (Cat { name: "Chloe" }) - ] - -instance fetchCat :: Fetch Cat where - fetch k = do - delay $ Milliseconds 300.0 - -- pretend this happens on the server - case fakeDb # find (key >>> (_ == k)) of - Nothing -> - -- This should never happen in a normal application path - -- if only the server can generate keys :) - throwError - $ error - $ "DB error: Cat not found for key " - <> un Key k - Just e -> pure e diff --git a/examples/aff/src/Main.purs b/examples/aff/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/aff/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/component/.gitignore b/examples/component/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/component/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/component/Makefile b/examples/component/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/component/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/component/html/index.html b/examples/component/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/component/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/component/src/Example.purs b/examples/component/src/Example.purs deleted file mode 100644 index b27a0da..0000000 --- a/examples/component/src/Example.purs +++ /dev/null @@ -1,20 +0,0 @@ -module Example where - -import Prelude -import React.Basic.DOM as R -import React.Basic.Hooks (Component, component) -import ToggleButton (mkToggleButton) - -mkExample :: Component Unit -mkExample = do - -- create the child components this parent will use - toggleButton <- mkToggleButton - -- create the parent component - component "Container" \_ -> - pure - $ R.div - { children: - [ toggleButton { label: "A" } - , toggleButton { label: "B" } - ] - } diff --git a/examples/component/src/Main.purs b/examples/component/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/component/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/component/src/ToggleButton.purs b/examples/component/src/ToggleButton.purs deleted file mode 100644 index 38f5b4c..0000000 --- a/examples/component/src/ToggleButton.purs +++ /dev/null @@ -1,24 +0,0 @@ -module ToggleButton where - -import Prelude -import Effect.Console (log) -import React.Basic.DOM as R -import React.Basic.Events (handler_) -import React.Basic.Hooks (Component, component, useEffect, useState, (/\)) -import React.Basic.Hooks as React - -mkToggleButton :: Component { label :: String } -mkToggleButton = do - component "ToggleButton" \{ label } -> React.do - on /\ setOn <- useState false - useEffect on do - log $ "State: " <> if on then "On" else "Off" - pure (pure unit) - pure - $ R.button - { onClick: handler_ $ setOn not - , children: - [ R.text label - , R.text if on then " On" else " Off" - ] - } diff --git a/examples/context/.gitignore b/examples/context/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/context/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/context/Makefile b/examples/context/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/context/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/context/html/index.html b/examples/context/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/context/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/context/src/Example.purs b/examples/context/src/Example.purs deleted file mode 100644 index 41a1c96..0000000 --- a/examples/context/src/Example.purs +++ /dev/null @@ -1,46 +0,0 @@ -module Example where - -import Prelude -import Effect (Effect) -import React.Basic.DOM as R -import React.Basic.Events (handler_) -import React.Basic.Hooks (type (/\), JSX, ReactContext, Component, component, createContext, provider, useContext, useState, (/\)) -import React.Basic.Hooks as React - -mkExample :: Component Unit -mkExample = do - counterContext <- createContext (0 /\ pure unit) - store <- mkStore counterContext - counter <- mkCounter counterContext - component "Context" \_ -> React.do - pure - $ store - [ counter unit - , counter unit - , counter unit - ] - -mkStore :: - ReactContext (Int /\ (Effect Unit)) -> - Component (Array JSX) -mkStore context = do - component "Store" \content -> React.do - counter /\ setCounter <- useState 0 - let - increment = setCounter (_ + 1) - pure - $ provider context - (counter /\ increment) - content - -mkCounter :: - ReactContext (Int /\ (Effect Unit)) -> - Component Unit -mkCounter counterContext = do - component "Counter" \_ -> React.do - counter /\ increment <- useContext counterContext - pure - $ R.button - { onClick: handler_ increment - , children: [ R.text $ "Increment: " <> show counter ] - } diff --git a/examples/context/src/Main.purs b/examples/context/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/context/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/controlled-input/.gitignore b/examples/controlled-input/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/controlled-input/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/controlled-input/Makefile b/examples/controlled-input/Makefile deleted file mode 100644 index 760f56d..0000000 --- a/examples/controlled-input/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/controlled-input/html/index.html b/examples/controlled-input/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/controlled-input/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/controlled-input/src/Example.purs b/examples/controlled-input/src/Example.purs deleted file mode 100644 index 81853a3..0000000 --- a/examples/controlled-input/src/Example.purs +++ /dev/null @@ -1,49 +0,0 @@ -module Example where - -import Prelude -import Data.Maybe (Maybe(..), fromMaybe, maybe) -import React.Basic.DOM as R -import React.Basic.DOM.Events (preventDefault, stopPropagation, targetValue, timeStamp) -import React.Basic.Events (EventHandler, handler, merge) -import React.Basic.Hooks (Component, Hook, UseState, component, fragment, useState, (/\)) -import React.Basic.Hooks as React - -mkExample :: Component Unit -mkExample = do - component "ControlledInput" \_ -> React.do - firstName <- useInput "hello" - lastName <- useInput "world" - pure - $ R.form_ - [ renderInput firstName - , renderInput lastName - ] - where - renderInput input = - fragment - [ R.input { onChange: input.onChange, value: input.value } - , R.p_ [ R.text ("Current value = " <> show input.value) ] - , R.p_ [ R.text ("Changed at = " <> maybe "never" show input.lastChanged) ] - ] - -useInput :: - String -> - Hook - (UseState { value :: String, lastChanged :: Maybe Number }) - { onChange :: EventHandler - , value :: String - , lastChanged :: Maybe Number - } -useInput initialValue = React.do - { value, lastChanged } /\ replaceState <- useState { value: initialValue, lastChanged: Nothing } - pure - { onChange: - handler - (preventDefault >>> stopPropagation >>> merge { targetValue, timeStamp }) \{ timeStamp, targetValue } -> do - replaceState \_ -> - { value: fromMaybe "" targetValue - , lastChanged: Just timeStamp - } - , value - , lastChanged - } diff --git a/examples/controlled-input/src/Main.purs b/examples/controlled-input/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/controlled-input/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/counter/.gitignore b/examples/counter/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/counter/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/counter/Makefile b/examples/counter/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/counter/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/counter/html/index.html b/examples/counter/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/counter/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/counter/src/Example.purs b/examples/counter/src/Example.purs deleted file mode 100644 index ed1cafe..0000000 --- a/examples/counter/src/Example.purs +++ /dev/null @@ -1,23 +0,0 @@ -module Example where - -import Prelude -import Effect.Class.Console (log) -import React.Basic.DOM as R -import React.Basic.Events (handler_) -import React.Basic.Hooks (Component, component, fragment, useEffect, useState, (/\)) -import React.Basic.Hooks as React - -mkExample :: Component Unit -mkExample = do - component "Counter" \_ -> React.do - counter /\ setCounter <- useState 0 - useEffect counter do - log $ "Count: " <> show counter - pure mempty - pure - $ fragment - [ R.button - { onClick: handler_ $ setCounter (_ + 1) - , children: [ R.text $ "Increment: " <> show counter ] - } - ] diff --git a/examples/counter/src/Main.purs b/examples/counter/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/counter/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/memo-callback/.gitignore b/examples/memo-callback/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/memo-callback/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/memo-callback/Makefile b/examples/memo-callback/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/memo-callback/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/memo-callback/html/index.html b/examples/memo-callback/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/memo-callback/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/memo-callback/src/Example.purs b/examples/memo-callback/src/Example.purs deleted file mode 100644 index 78cc1a0..0000000 --- a/examples/memo-callback/src/Example.purs +++ /dev/null @@ -1,57 +0,0 @@ -module Example where - -import Prelude -import Data.Foldable (traverse_) -import Data.Int as Int -import Data.Maybe (Maybe(..)) -import Effect.Console (log) -import React.Basic.DOM as R -import React.Basic.DOM.Events (targetValue) -import React.Basic.Events (handler, handler_) -import React.Basic.Hooks (Component, UnsafeReference(..), component, fragment, useEffect, useLazy, useMemo, useState, (/\)) -import React.Basic.Hooks as React - -mkExample :: Component Unit -mkExample = do - component "MemoCallback" \_ -> React.do - initialValue /\ setInitialValue <- useState 0 - counter /\ setCounter <- useState initialValue - increment <- - useLazy - (UnsafeReference setCounter) \_ -> setCounter (_ + 1) - reset <- - useLazy - (initialValue /\ UnsafeReference setCounter) \_ -> setCounter \_ -> initialValue - useEffect (UnsafeReference increment) do - log "increment updated -- this should only get logged once!" - pure mempty - useEffect (UnsafeReference reset) do - log "reset updated -- this should only get logged when the 'initialValue' is changed!" - pure mempty - let - memoTestVal = Just 1 - memoTest <- useMemo memoTestVal - useEffect (UnsafeReference memoTest) do - log "memoTest updated -- this should only get logged once!" - pure mempty - pure - $ fragment - [ R.text "Change initial value:" - , R.div_ - [ R.input - { value: show initialValue - , onChange: - handler targetValue - $ (_ >>= Int.fromString) - >>> traverse_ (const >>> setInitialValue) - } - , R.button - { onClick: handler_ reset - , children: [ R.text "Reset" ] - } - ] - , R.button - { onClick: handler_ increment - , children: [ R.text $ "Increment: " <> show counter ] - } - ] diff --git a/examples/memo-callback/src/Main.purs b/examples/memo-callback/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/memo-callback/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/reducer/.gitignore b/examples/reducer/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/reducer/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/reducer/Makefile b/examples/reducer/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/reducer/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/reducer/html/index.html b/examples/reducer/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/reducer/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/reducer/src/Example.purs b/examples/reducer/src/Example.purs deleted file mode 100644 index 24c0457..0000000 --- a/examples/reducer/src/Example.purs +++ /dev/null @@ -1,33 +0,0 @@ -module Example where - -import Prelude -import React.Basic.DOM as R -import React.Basic.Events (handler_) -import React.Basic.Hooks (Component, component, fragment, useReducer, (/\)) -import React.Basic.Hooks as React - -data Action - = Increment - | Decrement - -mkExample :: Component Unit -mkExample = do - component "Reducer" \_ -> React.do - state /\ dispatch <- - useReducer { counter: 0 } \state -> case _ of - Increment -> state { counter = state.counter + 1 } - Decrement -> state { counter = state.counter - 1 } - pure - $ fragment - [ R.button - { onClick: handler_ $ dispatch Decrement - , children: [ R.text $ "Decrement" ] - } - , R.button - { onClick: handler_ $ dispatch Increment - , children: [ R.text $ "Increment" ] - } - , R.div_ - [ R.text $ show state.counter - ] - ] diff --git a/examples/reducer/src/Main.purs b/examples/reducer/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/reducer/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/refs/.gitignore b/examples/refs/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/refs/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/refs/Makefile b/examples/refs/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/refs/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/refs/html/index.html b/examples/refs/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/refs/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/refs/src/Example.purs b/examples/refs/src/Example.purs deleted file mode 100644 index 928c51a..0000000 --- a/examples/refs/src/Example.purs +++ /dev/null @@ -1,95 +0,0 @@ -module Example where - -import Prelude -import Data.Int (round) -import Data.Maybe (Maybe(..)) -import Data.Newtype (class Newtype) -import Data.Nullable (Nullable, null) -import Math (pow, sqrt) -import React.Basic.DOM as R -import React.Basic.Hooks (type (/\), Component, Hook, Ref, UseEffect, UseRef, UseState, coerceHook, component, fragment, readRefMaybe, useEffect, useRef, useState, (/\)) -import React.Basic.Hooks as React -import Unsafe.Coerce (unsafeCoerce) -import Web.DOM (Node) -import Web.Event.Event (EventType(..)) -import Web.Event.EventTarget (addEventListener, eventListener, removeEventListener) -import Web.HTML (window) -import Web.HTML.HTMLElement (getBoundingClientRect) -import Web.HTML.HTMLElement as HTMLElement -import Web.HTML.Window as Window - -mkExample :: Component Unit -mkExample = do - component "Refs" \_ -> React.do - mouseDistance1 /\ buttonRef1 <- useNodeDistanceFromMouse - mouseDistance2 /\ buttonRef2 <- useNodeDistanceFromMouse - mouseDistance3 /\ buttonRef3 <- useNodeDistanceFromMouse - pure - $ fragment - [ R.button - { ref: buttonRef1 - , children: [ R.text $ show mouseDistance1 <> "px" ] - , style: R.css { width: "100px", position: "absolute", top: "20px", left: "200px" } - } - , R.button - { ref: buttonRef2 - , children: [ R.text $ show mouseDistance2 <> "px" ] - , style: R.css { width: "100px", position: "absolute", top: "60px", left: "40px" } - } - , R.button - { ref: buttonRef3 - , children: [ R.text $ show mouseDistance3 <> "px" ] - , style: R.css { width: "100px", position: "absolute", top: "120px", left: "90px" } - } - ] - -newtype UseNodeDistance hooks - = UseNodeDistance (UseEffect Unit (UseState Int (UseRef (Nullable Node) hooks))) - -derive instance ntUseNodeDistance :: Newtype (UseNodeDistance hooks) _ - -useNodeDistanceFromMouse :: Hook UseNodeDistance (Int /\ (Ref (Nullable Node))) -useNodeDistanceFromMouse = - coerceHook React.do - elementRef <- useRef null - mouseDistance /\ setMouseDistance <- useState 0 - useEffect unit do - maybeElement <- map (HTMLElement.fromNode =<< _) (readRefMaybe elementRef) - case maybeElement of - Nothing -> pure (pure unit) - Just element -> do - mouseMoveListener <- - eventListener \e -> do - { top, bottom, left, right } <- getBoundingClientRect element - let - mouseX = (unsafeCoerce e).clientX - - mouseY = (unsafeCoerce e).clientY - - distanceX = - if mouseX # between left right then - 0.0 - else - if mouseX < left then - left - mouseX - else - mouseX - right - - distanceY = - if mouseY # between top bottom then - 0.0 - else - if mouseY < top then - top - mouseY - else - mouseY - bottom - - distance = sqrt ((distanceX `pow` 2.0) + (distanceY `pow` 2.0)) - setMouseDistance \_ -> round distance - let - mouseMoveEventType = EventType "mousemove" - windowEventTarget <- map Window.toEventTarget window - addEventListener mouseMoveEventType mouseMoveListener false windowEventTarget - pure do - removeEventListener mouseMoveEventType mouseMoveListener false windowEventTarget - pure (mouseDistance /\ elementRef) diff --git a/examples/refs/src/Main.purs b/examples/refs/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/refs/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/suspense/.gitignore b/examples/suspense/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/suspense/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/suspense/Makefile b/examples/suspense/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/suspense/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/suspense/html/index.html b/examples/suspense/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/suspense/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/suspense/src/Example.purs b/examples/suspense/src/Example.purs deleted file mode 100644 index 29d82d5..0000000 --- a/examples/suspense/src/Example.purs +++ /dev/null @@ -1,153 +0,0 @@ -module Example where - -import Prelude -import Data.Foldable (find) -import Data.Maybe (Maybe(..)) -import Data.Newtype (class Newtype, un) -import Data.Time.Duration (Seconds(..), fromDuration) -import Effect.Aff (Aff, Milliseconds(..), delay, error, message, throwError) -import React.Basic.DOM as R -import React.Basic.DOM.Events (capture_) -import React.Basic.Events (handler_) -import React.Basic.Hooks (Component, component, fragment, useState, (/\)) -import React.Basic.Hooks as React -import React.Basic.Hooks.ErrorBoundary (mkErrorBoundary) -import React.Basic.Hooks.Suspense (suspend, suspense) -import React.Basic.Hooks.Suspense.Store (SuspenseStore, get, mkSuspenseStore) - -mkExample :: Component Unit -mkExample = do - errorBoundary <- mkErrorBoundary "SuspenseExErrorBoundary" - catDetails <- mkCatDetails - component "SuspenseEx" \_ -> React.do - catKey /\ setCatKey <- useState Nothing - let - reset = setCatKey \_ -> Nothing - pure - $ R.div_ - [ R.h2_ [ R.text "Cat chooser" ] - , errorBoundary \{ error, dismissError } -> case error of - Just e -> renderAppError e (reset *> dismissError) - Nothing -> - fragment - [ catKeyList catKey setCatKey - , case catKey of - Nothing -> mempty - Just k -> - R.p_ - [ suspense - { fallback: R.text "Loading..." - , children: [ catDetails k ] - } - ] - ] - ] - where - -- This component is the main `suspense` demo (but don't forget the `suspense` - -- element above!). It receives a key as a prop and renders the result as though - -- it were synchronously available. - mkCatDetails :: Component (Key Cat) - mkCatDetails = do - catStore :: SuspenseStore (Key Cat) _ <- - mkSuspenseStore (Just $ fromDuration $ Seconds 10.0) fetch - component "CatDetails" \catKey -> React.do - cat <- suspend $ get catStore catKey - pure - $ R.p_ - [ case entity cat of - Cat { name } -> R.text $ "A cat named " <> name - ] - - renderAppError error resetApp = - fragment - [ R.p_ [ R.text "Error!" ] - , R.p_ [ R.text $ message error ] - , R.button - { onClick: capture_ do resetApp - , children: [ R.text "Reset" ] - } - ] - - catKeyList selectedCatKey setCatKey = - let - cats = - fakeDb - <> [ Entity - (Key "error (choose to throw a React render error)") - (Cat { name: "" }) - ] - - catKeyRadioButton k = - R.div_ - [ R.label_ - [ R.input - { type: "radio" - , name: "cat-key" - , checked: Just k == selectedCatKey - , onChange: - handler_ do - setCatKey \_ -> Just k - } - , R.text $ " Cat " <> un Key k - ] - ] - in - fragment $ map (catKeyRadioButton <<< key) cats - --- --- The bits below this point aren't directly relevant to the example, --- just a slightly more interesting data model than returing a single --- string. --- --- --- --- Typed keys are a great way to tie entity-specific behavior --- to an ID. We can use this phantom type to write a class --- for generic, type-safe data fetching. -newtype Key entity - = Key String - -derive instance eqKey :: Eq (Key entity) - -derive instance ordKey :: Ord (Key entity) - -derive instance ntKey :: Newtype (Key entity) _ - --- An entity wrapper. In a real app this would hold other metadata --- such as create and update dates. -data Entity entity - = Entity (Key entity) entity - -key :: forall entity. Entity entity -> Key entity -key (Entity k _) = k - -entity :: forall entity. Entity entity -> entity -entity (Entity _ e) = e - -class Fetch entity where - fetch :: Key entity -> Aff (Entity entity) - --- An example entity -newtype Cat - = Cat { name :: String } - -fakeDb :: Array (Entity Cat) -fakeDb = - [ Entity (Key "abc") (Cat { name: "Herb" }) - , Entity (Key "def") (Cat { name: "Maxi" }) - , Entity (Key "ghi") (Cat { name: "Chloe" }) - ] - -instance fetchCat :: Fetch Cat where - fetch k = do - delay $ Milliseconds 300.0 - -- pretend this happens on the server - case fakeDb # find (key >>> (_ == k)) of - Nothing -> - -- This should never happen in a normal application path - -- if only the server can generate keys :) - throwError - $ error - $ "DB error: Cat not found for key " - <> un Key k - Just e -> pure e diff --git a/examples/suspense/src/Main.purs b/examples/suspense/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/suspense/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/examples/todo-app/.gitignore b/examples/todo-app/.gitignore deleted file mode 100644 index 645684d..0000000 --- a/examples/todo-app/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -output -html/index.js -package-lock.json -node_modules diff --git a/examples/todo-app/Makefile b/examples/todo-app/Makefile deleted file mode 100644 index 8b28d39..0000000 --- a/examples/todo-app/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -parent_sources := $$(npx spago -x ../../spago.dhall sources | sed 's/^/..\/..\//' | tr '\n' ' ') - -all: output node_modules - npx purs bundle -m Main --main Main output/*/*.js > output/bundle.js - npx browserify output/bundle.js -o html/index.js - -output: node_modules - set -o noglob && \ - npx purs compile \ - src/**/*.purs \ - $(parent_sources) - -node_modules: - npm i --no-save purescript spago browserify react react-dom - -clean: - rm -rf node_modules output - -.PHONY: all output clean \ No newline at end of file diff --git a/examples/todo-app/html/index.html b/examples/todo-app/html/index.html deleted file mode 100644 index 6b93b7c..0000000 --- a/examples/todo-app/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - react-basic example - - -
- - - diff --git a/examples/todo-app/src/Example.purs b/examples/todo-app/src/Example.purs deleted file mode 100644 index a13c087..0000000 --- a/examples/todo-app/src/Example.purs +++ /dev/null @@ -1,166 +0,0 @@ -module Example where - -import Prelude -import Data.Array as Array -import Data.Foldable (traverse_) -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import React.Basic (keyed) -import React.Basic as RB -import React.Basic.DOM as R -import React.Basic.DOM.Events (preventDefault, stopPropagation, targetValue) -import React.Basic.Events (handler, handler_) -import React.Basic.Events as Events -import React.Basic.Hooks (Component, component, empty, useReducer, useState, (/\)) -import React.Basic.Hooks as React - -data Action - = CreateTodo String - | ToggleTodo Int - | DeleteTodo Int - | SetFilter TodoFilter - -data TodoFilter - = All - | Complete - | Incomplete - -derive instance eqTodoFilter :: Eq TodoFilter - -type Todo - = { task :: String - , isComplete :: Boolean - } - -type State - = { todos :: Array Todo - , filter :: TodoFilter - } - -reducer :: State -> Action -> State -reducer state = case _ of - CreateTodo task -> state { todos = Array.cons { task, isComplete: false } state.todos } - ToggleTodo index -> case Array.modifyAt index (\todo -> todo { isComplete = not todo.isComplete }) state.todos of - Just todos -> state { todos = todos } - Nothing -> state - DeleteTodo index -> case Array.deleteAt index state.todos of - Just todos -> state { todos = todos } - Nothing -> state - SetFilter filter -> state { filter = filter } - -mkExample :: Component Unit -mkExample = do - let - initialState = { todos: [], filter: All } - todoInput <- mkTodoInput - todoRow <- mkTodoRow - todoFilters <- mkTodoFilters - component "TodoApp" \_ -> React.do - state /\ dispatch <- useReducer initialState reducer - pure - $ R.div - { children: - [ todoInput { dispatch } - , R.div_ - $ flip Array.mapWithIndex state.todos \id todo -> - if state.filter == All - || (todo.isComplete && state.filter == Complete) - || (not todo.isComplete && state.filter == Incomplete) then - keyed (show id) $ todoRow { id, todo, dispatch } - else - empty - , todoFilters { filter: state.filter, dispatch } - ] - , style: - R.css - { maxWidth: "600px" - , margin: "auto" - , padding: "16px" - , fontFamily: "sans-serif" - , fontSize: "16px" - } - } - where - todoAppEl = RB.element $ R.unsafeCreateDOMComponent "todo-app" - -mkTodoInput :: Component { dispatch :: Action -> Effect Unit } -mkTodoInput = do - component "TodoInput" \props -> React.do - value /\ setValue <- useState "" - pure - $ R.form - { onSubmit: - handler (preventDefault >>> stopPropagation) \_ -> do - props.dispatch $ CreateTodo value - setValue $ const "" - , children: - [ R.input - { value - , onChange: - handler (preventDefault >>> stopPropagation >>> targetValue) - $ traverse_ (setValue <<< const) - , style: R.css { lineHeight: "32px", width: "100%", boxSizing: "border-box" } - , placeholder: "Enter a task" - } - ] - , style: R.css { marginBottom: "16px", width: "100%" } - } - -mkTodoRow :: Component { id :: Int, todo :: Todo, dispatch :: Action -> Effect Unit } -mkTodoRow = - component "Todo" \props -> React.do - pure - $ R.div - { children: - [ R.label - { children: - [ R.input - { type: "checkbox" - , checked: props.todo.isComplete - , onChange: Events.handler_ $ props.dispatch $ ToggleTodo props.id - , tabIndex: 0 - } - , R.text props.todo.task - ] - , style: R.css { lineHeight: "32px", fontSize: "24px", flex: "1 0 auto" } - } - , R.a - { children: [ R.text "❌" ] - , onClick: handler_ $ props.dispatch $ DeleteTodo props.id - , style: R.css { cursor: "pointer" } - } - ] - , style: - R.css - { display: "flex" - , flexFlow: "row" - , alignItems: "center" - } - } - -mkTodoFilters :: Component { filter :: TodoFilter, dispatch :: Action -> Effect Unit } -mkTodoFilters = - component "TodoFilters" \props -> React.do - let - filterLink f label = - R.a - { children: [ R.text label ] - , onClick: handler_ $ props.dispatch $ SetFilter f - , style: - if props.filter == f then - R.css { cursor: "pointer", fontWeight: "bold" } - else - R.css { cursor: "pointer" } - } - pure - $ R.div - { children: - [ R.hr { style: R.css { color: "lightgrey" } } - , filterLink All "All" - , R.text " / " - , filterLink Complete "Complete" - , R.text " / " - , filterLink Incomplete "Incomplete" - ] - , style: R.css { marginTop: "16px" } - } diff --git a/examples/todo-app/src/Main.purs b/examples/todo-app/src/Main.purs deleted file mode 100644 index edc6177..0000000 --- a/examples/todo-app/src/Main.purs +++ /dev/null @@ -1,21 +0,0 @@ -module Main where - -import Prelude -import Data.Maybe (Maybe(..)) -import Effect (Effect) -import Effect.Exception (throw) -import Example (mkExample) -import React.Basic.DOM (render) -import Web.DOM.NonElementParentNode (getElementById) -import Web.HTML (window) -import Web.HTML.HTMLDocument (toNonElementParentNode) -import Web.HTML.Window (document) - -main :: Effect Unit -main = do - container <- getElementById "container" =<< (map toNonElementParentNode $ document =<< window) - case container of - Nothing -> throw "Container element not found." - Just c -> do - ex <- mkExample - render (ex unit) c diff --git a/package-lock.json b/package-lock.json index b99ad87..bf36565 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,47 @@ { - "requires": true, + "name": "purescript-react-basic-hooks", + "version": "1.0.0", "lockfileVersion": 1, + "requires": true, "dependencies": { + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", + "dev": true + }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16,17 +52,20 @@ "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -34,50 +73,109 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", + "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", + "dev": true }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -85,31 +183,289 @@ "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "bower": { + "version": "1.8.8", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.8.tgz", + "integrity": "sha512-1SrJnXnkP9soITHptSO+ahx3QKp3cVzn8poI6ujqc5SeOkg5iqM1pK9H+DSc2OQ8SnO0jC/NG4Ur/UIwy7574A==", + "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserify": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", + "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "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-cache-api": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz", + "integrity": "sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI=", + "dev": true, + "requires": { + "async": "^1.5.2", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-incremental": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/browserify-incremental/-/browserify-incremental-3.1.1.tgz", + "integrity": "sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=", + "dev": true, + "requires": { + "JSONStream": "^0.10.0", + "browserify-cache-api": "^3.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", + "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", + "dev": true, + "requires": { + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + } + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + } + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true }, "byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true }, "cacache": { "version": "11.3.3", "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -127,15 +483,23 @@ "y18n": "^4.0.0" } }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -145,12 +509,24 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -159,6 +535,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -166,12 +543,32 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -179,12 +576,14 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -192,10 +591,29 @@ "typedarray": "^0.0.6" } }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -208,12 +626,51 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "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": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "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": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -224,34 +681,129 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } } } }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "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" + } + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -263,20 +815,38 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "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": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -284,17 +854,42 @@ "env-paths": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } }, "execa": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, "requires": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", @@ -310,37 +905,50 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true }, "filesize": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz", - "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==" + "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==", + "dev": true }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -349,12 +957,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -365,6 +975,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -374,6 +985,7 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, "requires": { "minipass": "^2.6.0" } @@ -382,6 +994,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -392,7 +1005,14 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "gaze": { "version": "1.1.3", @@ -403,10 +1023,17 @@ "globule": "^1.0.0" } }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, "requires": { "pump": "^3.0.0" } @@ -415,6 +1042,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -423,6 +1051,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -444,53 +1073,119 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -499,67 +1194,139 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -567,11 +1334,15 @@ "verror": "1.10.0" } }, - "keypress": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", - "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=", - "dev": true + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } }, "lodash": { "version": "4.17.15", @@ -579,10 +1350,17 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, "log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, "requires": { "chalk": "^2.4.2" } @@ -591,47 +1369,101 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz", "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==", + "dev": true, "requires": { "ansi-escapes": "^3.2.0", "cli-cursor": "^2.1.0", "wrap-ansi": "^5.0.0" } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "requires": { "yallist": "^3.0.2" } }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -639,12 +1471,14 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true }, "minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -654,6 +1488,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, "requires": { "minipass": "^2.9.0" } @@ -662,6 +1497,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -679,14 +1515,63 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, "requires": { "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", + "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==", + "dev": true + }, + "module-deps": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.2.tgz", + "integrity": "sha512-a9y6yDv5u5I4A+IPHTnqFxcaKr4p50/zxTjcQJaX2ws9tN/W6J6YXnEKhqRyPhl494dkcxx951onSKVezmI+3w==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "mold-source-map": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mold-source-map/-/mold-source-map-0.4.0.tgz", + "integrity": "sha1-z2fgsxxHq5uttcnCVlGGISe7gxc=", + "dev": true, + "requires": { + "convert-source-map": "^1.1.0", + "through": "~2.2.7" + }, + "dependencies": { + "through": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", + "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=", + "dev": true + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -699,12 +1584,31 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node-static": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz", + "integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==", + "dev": true, + "requires": { + "colors": ">=0.6.0", + "mime": "^1.2.9", + "optimist": ">=0.3.4" + } }, "npm-run-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, "requires": { "path-key": "^3.0.0" } @@ -712,12 +1616,19 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -726,82 +1637,236 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, "p-finally": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true }, "parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "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" } }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "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": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true }, - "pscid": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/pscid/-/pscid-2.9.0.tgz", - "integrity": "sha512-YktAYj/QmnJ12jh3smI/XkhBJyYF8wNjdLRdR3FcU8MRQE0ryrYM23vri9hTIBoA5Fv3AXt3l2bcpAZ8Ota3aA==", + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "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" + } + }, + "pulp": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/pulp/-/pulp-15.0.0.tgz", + "integrity": "sha512-JPzDiSjxwySAFOFnpevZO7YzzDgGdJP/SQap1UJbK0rsrfUVQC+zOHDkm7A8T3gR/0el4ft6KwB6fcDl2bTzVw==", "dev": true, "requires": { + "browserify": "^16.2.3", + "browserify-incremental": "^3.1.1", + "concat-stream": "^2.0.0", "gaze": "^1.1.3", - "glob": "^7.1.6", - "keypress": "^0.2.1", - "which": "^2.0.2" + "glob": "^7.1.3", + "mold-source-map": "^0.4.0", + "node-static": "^0.7.11", + "read": "^1.0.7", + "sorcery": "^0.10.0", + "temp": "^0.9.0", + "through": "^2.3.8", + "tree-kill": "^1.2.1", + "which": "^1.3.1", + "wordwrap": "1.0.0" }, "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { - "isexe": "^2.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -811,6 +1876,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -821,6 +1887,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -831,12 +1898,14 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "purescript": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.13.6.tgz", - "integrity": "sha512-PC93xqr0zDs5l5xnfTlptKzv5jBWbML+dwtpDCZkOOH7h9wgLusQfU4PNfHvdwrSmsBntalGm+Cbd6VrokN7Sg==", + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/purescript/-/purescript-0.13.8.tgz", + "integrity": "sha512-1ZyVEVFLgcEcjPXxJYeVEyYn66DF2DnOLTWzo/K/MrQUF2chdLSyZ8sJpcarWyrz2HxXaubYceYbo5KexKzynA==", + "dev": true, "requires": { "purescript-installer": "^0.2.0" } @@ -845,6 +1914,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/purescript-installer/-/purescript-installer-0.2.5.tgz", "integrity": "sha512-fQAWWP5a7scuchXecjpU4r4KEgSPuS6bBnaP01k9f71qqD28HaJ2m4PXHFkhkR4oATAxTPIGCtmTwtVoiBOHog==", + "dev": true, "requires": { "arch": "^2.1.1", "byline": "^5.0.0", @@ -871,12 +1941,89 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -891,6 +2038,7 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -914,10 +2062,20 @@ "uuid": "^3.3.2" } }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -926,12 +2084,14 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -942,14 +2102,26 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, "requires": { "glob": "^7.1.3" } }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, "requires": { "aproba": "^1.1.1" } @@ -957,17 +2129,70 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha1-dB4kXiMfB8r7b98PEzrfohalAq0=", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -975,26 +2200,56 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true }, - "spago": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/spago/-/spago-0.14.0.tgz", - "integrity": "sha512-nQMbxZkj5a9c1j36aUd7dp2BhlSByFkfu7/I4bA4nAnL39IAsoxz/p9B6FFs/TKCDcoaWjjjIvnOmei9G4j8SA==", + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, + "sorcery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.10.0.tgz", + "integrity": "sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=", + "dev": true, "requires": { - "request": "^2.88.0", - "tar": "^4.4.8" + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0", + "sourcemap-codec": "^1.3.0" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1011,28 +2266,87 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, "requires": { "figgy-pudding": "^3.5.1" } }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" } }, + "stream-http": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -1043,6 +2357,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -1051,6 +2366,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -1058,20 +2374,41 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -1082,28 +2419,78 @@ "yallist": "^3.0.3" } }, + "temp": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", + "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", + "dev": true, + "requires": { + "rimraf": "~2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -1111,17 +2498,39 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -1130,6 +2539,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, "requires": { "imurmurhash": "^0.1.4" } @@ -1138,42 +2548,95 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { "punycode": "^2.1.0" } }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "requires": { "isexe": "^2.0.0" } }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -1183,27 +2646,32 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "zen-observable": { "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", + "dev": true } } } diff --git a/package.json b/package.json new file mode 100644 index 0000000..9125d6e --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "purescript-react-basic-hooks", + "version": "1.0.0", + "description": "`react-basic-hooks` is a React hook API for [react-basic](https://github.com/lumihq/purescript-react-basic)!", + "main": "index.js", + "directories": { + "example": "examples" + }, + "dependencies": { + "react": "^16.13.1", + "react-dom": "^16.13.1" + }, + "devDependencies": { + "bower": "^1.8.8", + "pulp": "^15.0.0", + "purescript": "^0.13.8" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/spicydonuts/purescript-react-basic-hooks.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/spicydonuts/purescript-react-basic-hooks/issues" + }, + "homepage": "https://github.com/spicydonuts/purescript-react-basic-hooks#readme" +} diff --git a/packages.dhall b/packages.dhall deleted file mode 100644 index d293079..0000000 --- a/packages.dhall +++ /dev/null @@ -1,128 +0,0 @@ -{- -Welcome to your new Dhall package-set! - -Below are instructions for how to edit this file for most use -cases, so that you don't need to know Dhall to use it. - -## Warning: Don't Move This Top-Level Comment! - -Due to how `dhall format` currently works, this comment's -instructions cannot appear near corresponding sections below -because `dhall format` will delete the comment. However, -it will not delete a top-level comment like this one. - -## Use Cases - -Most will want to do one or both of these options: -1. Override/Patch a package's dependency -2. Add a package not already in the default package set - -This file will continue to work whether you use one or both options. -Instructions for each option are explained below. - -### Overriding/Patching a package - -Purpose: -- Change a package's dependency to a newer/older release than the - default package set's release -- Use your own modified version of some dependency that may - include new API, changed API, removed API by - using your custom git repo of the library rather than - the package set's repo - -Syntax: -Replace the overrides' "{=}" (an empty record) with the following idea -The "//" or "⫽" means "merge these two records and - when they have the same value, use the one on the right:" -------------------------------- -let overrides = - { packageName = - upstream.packageName // { updateEntity1 = "new value", updateEntity2 = "new value" } - , packageName = - upstream.packageName // { version = "v4.0.0" } - , packageName = - upstream.packageName // { repo = "https://www.example.com/path/to/new/repo.git" } - } -------------------------------- - -Example: -------------------------------- -let overrides = - { halogen = - upstream.halogen // { version = "master" } - , halogen-vdom = - upstream.halogen-vdom // { version = "v4.0.0" } - } -------------------------------- - -### Additions - -Purpose: -- Add packages that aren't already included in the default package set - -Syntax: -Replace the additions' "{=}" (an empty record) with the following idea: -------------------------------- -let additions = - { package-name = - { dependencies = - [ "dependency1" - , "dependency2" - ] - , repo = - "https://example.com/path/to/git/repo.git" - , version = - "tag ('v4.0.0') or branch ('master')" - } - , package-name = - { dependencies = - [ "dependency1" - , "dependency2" - ] - , repo = - "https://example.com/path/to/git/repo.git" - , version = - "tag ('v4.0.0') or branch ('master')" - } - , etc. - } -------------------------------- - -Example: -------------------------------- -let additions = - { benchotron = - { dependencies = - [ "arrays" - , "exists" - , "profunctor" - , "strings" - , "quickcheck" - , "lcg" - , "transformers" - , "foldable-traversable" - , "exceptions" - , "node-fs" - , "node-buffer" - , "node-readline" - , "datetime" - , "now" - ] - , repo = - "https://github.com/hdgarrood/purescript-benchotron.git" - , version = - "v7.0.0" - } - } -------------------------------- --} - - -let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.13.6-20200404/packages.dhall sha256:f239f2e215d0cbd5c203307701748581938f74c4c78f4aeffa32c11c131ef7b6 - -let overrides = {=} - -let additions = {=} - -in upstream // overrides // additions diff --git a/serve.json b/serve.json deleted file mode 100644 index 14a719d..0000000 --- a/serve.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "public": "examples", - "rewrites": [ - { "source": "/:ex", "destination": "/:ex/html/index.html" }, - { "source": "/:ex/index.js", "destination": "/:ex/html/index.js" } - ], - "unlisted": ["README.md"] -} diff --git a/spago.dhall b/spago.dhall deleted file mode 100644 index 73ac0df..0000000 --- a/spago.dhall +++ /dev/null @@ -1,19 +0,0 @@ -{- -Welcome to a Spago project! -You can edit this file as you like. --} -{ name = "react-basic-hooks" -, dependencies = - [ "aff" - , "aff-promise" - , "console" - , "effect" - , "indexed-monad" - , "prelude" - , "psci-support" - , "react-basic" - , "unsafe-reference" - ] -, packages = ./packages.dhall -, sources = [ "src/**/*.purs", "test/**/*.purs" ] -} diff --git a/src/React/Basic/DOM/Concurrent.js b/src/React/Basic/DOM/Concurrent.js deleted file mode 100644 index 3ca26d1..0000000 --- a/src/React/Basic/DOM/Concurrent.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -const ReactDOM = require("react-dom"); - -exports.renderConcurrentMode = (jsx) => (element) => () => { - return ReactDOM.createRoot(element).render(jsx); -}; diff --git a/src/React/Basic/DOM/Concurrent.purs b/src/React/Basic/DOM/Concurrent.purs deleted file mode 100644 index b671a24..0000000 --- a/src/React/Basic/DOM/Concurrent.purs +++ /dev/null @@ -1,9 +0,0 @@ --- TODO: move this file to `react-basic` -module React.Basic.DOM.Concurrent where - -import Prelude -import Effect (Effect) -import React.Basic (JSX) -import Web.DOM (Element) - -foreign import renderConcurrentMode :: JSX -> Element -> Effect Unit diff --git a/src/React/Basic/Hooks.js b/src/React/Basic/Hooks.js index d96896b..d77c463 100644 --- a/src/React/Basic/Hooks.js +++ b/src/React/Basic/Hooks.js @@ -1,96 +1,79 @@ "use strict"; -var React = require("react"); +const React = require("react"); -exports.reactChildrenToArray = function (children) { - return React.Children.toArray(children); -}; +exports.reactChildrenToArray = (children) => React.Children.toArray(children); exports.memo_ = React.memo; -exports.useState_ = function (tuple, initialState) { - var r = React.useState(initialState); - var state = r[0]; - var setState = r[1]; +exports.useState_ = (tuple, initialState) => { + const r = React.useState(initialState); + const state = r[0]; + const setState = r[1]; if (!setState.hasOwnProperty("$$reactBasicHooks$$cachedSetState")) { - setState.$$reactBasicHooks$$cachedSetState = function (update) { - return function () { - return setState(update); - }; - }; + setState.$$reactBasicHooks$$cachedSetState = (update) => () => + setState(update); } return tuple(state, setState.$$reactBasicHooks$$cachedSetState); }; -exports.useEffect_ = function (eq, deps, effect) { - var memoizedKey = exports.useMemo_(eq, deps); +exports.useEffect_ = (eq, deps, effect) => { + const memoizedKey = exports.useEqCache_(eq, deps); React.useEffect(effect, [memoizedKey]); }; -exports.useEffectAlways_ = function (effect) { - React.useEffect(effect); -}; +exports.useEffectAlways_ = (effect) => React.useEffect(effect); -exports.useLayoutEffect_ = function (eq, deps, effect) { - var memoizedKey = exports.useMemo_(eq, deps); +exports.useLayoutEffect_ = (eq, deps, effect) => { + const memoizedKey = exports.useEqCache_(eq, deps); React.useLayoutEffect(effect, [memoizedKey]); }; -exports.useLayoutEffectAlways_ = function (effect) { - React.useLayoutEffect(effect); -}; +exports.useLayoutEffectAlways_ = (effect) => React.useLayoutEffect(effect); -exports.useReducer_ = function (tuple, reducer, initialState, initialAction) { - var r = React.useReducer(reducer, initialState, initialAction); - var state = r[0]; - var dispatch = r[1]; +exports.useReducer_ = (tuple, reducer, initialState) => { + const r = React.useReducer(reducer, initialState); + const state = r[0]; + const dispatch = r[1]; if (!dispatch.hasOwnProperty("$$reactBasicHooks$$cachedDispatch")) { - dispatch.$$reactBasicHooks$$cachedDispatch = function (action) { - return function () { - return dispatch(action); - }; - }; + dispatch.$$reactBasicHooks$$cachedDispatch = (action) => () => + dispatch(action); } return tuple(state, dispatch.$$reactBasicHooks$$cachedDispatch); }; exports.useRef_ = React.useRef; -exports.readRef_ = function (ref) { - return ref.current; -}; +exports.readRef_ = (ref) => ref.current; -exports.writeRef_ = function (ref, a) { +exports.writeRef_ = (ref, a) => { ref.current = a; }; exports.useContext_ = React.useContext; -exports.useMemo_ = function (eq, a) { - var memoRef = React.useRef(a); +exports.useEqCache_ = function (eq, a) { + const memoRef = React.useRef(a); if (memoRef.current !== a && !eq(memoRef.current, a)) { memoRef.current = a; } return memoRef.current; }; -exports.useLazy_ = function (eq, deps, computeA) { - var memoizedKey = exports.useMemo_(eq, deps); +exports.useMemo_ = (eq, deps, computeA) => { + const memoizedKey = exports.useEqCache_(eq, deps); return React.useMemo(computeA, [memoizedKey]); }; exports.useDebugValue_ = React.useDebugValue; -exports.unsafeSetDisplayName = function (displayName, component) { +exports.unsafeSetDisplayName = (displayName, component) => { component.displayName = displayName; - component.toString = function () { - return displayName; - }; + component.toString = () => displayName; return component; }; -exports.displayName = function (component) { - return typeof component === "string" +exports.displayName = (component) => + typeof component === "string" ? component : component.displayName || "[unknown]"; -}; diff --git a/src/React/Basic/Hooks.purs b/src/React/Basic/Hooks.purs index ac0001e..3c1af09 100644 --- a/src/React/Basic/Hooks.purs +++ b/src/React/Basic/Hooks.purs @@ -5,6 +5,8 @@ module React.Basic.Hooks , reactComponentWithChildren , reactComponentFromHook , ReactChildren + , reactChildrenToArray + , reactChildrenFromArray , memo , useState , useState' @@ -17,21 +19,22 @@ module React.Basic.Hooks , useLayoutEffectOnce , useLayoutEffectAlways , UseLayoutEffect + , Reducer + , mkReducer + , runReducer , useReducer , UseReducer , readRef , readRefMaybe , writeRef - , reactChildrenFromArray - , reactChildrenToArray , useRef , UseRef , useContext , UseContext + , useEqCache + , UseEqCache , useMemo , UseMemo - , useLazy - , UseLazy , useDebugValue , UseDebugValue , UnsafeReference(..) @@ -43,7 +46,7 @@ module React.Basic.Hooks import Prelude hiding (bind, discard) import Data.Bifunctor (rmap) -import Data.Function.Uncurried (Fn2, mkFn2) +import Data.Function.Uncurried (Fn2, mkFn2, runFn2) import Data.Maybe (Maybe) import Data.Newtype (class Newtype) import Data.Nullable (Nullable, toMaybe) @@ -153,8 +156,8 @@ reactChildrenFromArray :: forall a. Array a -> ReactChildren a reactChildrenFromArray = unsafeCoerce -- | Prevents a component from re-rendering if its new props are referentially --- | equal to its old props (not value-based equality -- this is due to the underlying --- | React implementation). +-- | equal to its old props (not value-based equality -- this is due to the +-- | underlying React implementation). memo :: forall props. Effect (ReactComponent props) -> @@ -187,7 +190,9 @@ useEffect :: deps -> Effect (Effect Unit) -> Hook (UseEffect deps) Unit -useEffect deps effect = unsafeHook (runEffectFn3 useEffect_ (mkFn2 eq) deps effect) +useEffect deps effect = + unsafeHook do + runEffectFn3 useEffect_ (mkFn2 eq) deps effect -- | Like `useEffect`, but the effect is only performed a single time per component -- | instance. Prefer `useEffect` with a proper dependency list whenever possible! @@ -209,7 +214,7 @@ useLayoutEffect :: deps -> Effect (Effect Unit) -> Hook (UseLayoutEffect deps) Unit -useLayoutEffect keys effect = unsafeHook (runEffectFn3 useLayoutEffect_ (mkFn2 eq) keys effect) +useLayoutEffect deps effect = unsafeHook (runEffectFn3 useLayoutEffect_ (mkFn2 eq) deps effect) -- | Like `useLayoutEffect`, but the effect is only performed a single time per component -- | instance. Prefer `useLayoutEffect` with a proper dependency list whenever possible! @@ -223,16 +228,32 @@ useLayoutEffectAlways effect = unsafeHook (runEffectFn1 useLayoutEffectAlways_ e foreign import data UseLayoutEffect :: Type -> Type -> Type +newtype Reducer state action + = Reducer (Fn2 state action state) + +-- | Creating reducer functions for React is effectful because +-- | React uses the function instance's reference to optimise +-- | rendering behavior. +mkReducer :: forall state action. (state -> action -> state) -> Effect (Reducer state action) +mkReducer = pure <<< Reducer <<< mkFn2 + +-- | Run a wrapped `Reducer` function as a normal function (like `runFn2`). +-- | Useful for testing, simulating actions, or building more complicated +-- | hooks on top of `useReducer` +runReducer :: forall state action. Reducer state action -> state -> action -> state +runReducer (Reducer reducer) = runFn2 reducer + +-- | Use `mkReducer` to construct a reducer function. useReducer :: forall state action. state -> - (state -> action -> state) -> + Reducer state action -> Hook (UseReducer state action) (state /\ (action -> Effect Unit)) -useReducer initialState reducer = +useReducer initialState (Reducer reducer) = unsafeHook do runEffectFn3 useReducer_ (mkFn2 Tuple) - (mkFn2 reducer) + reducer initialState foreign import data UseReducer :: Type -> Type -> Type -> Type @@ -258,33 +279,34 @@ useContext context = unsafeHook (runEffectFn1 useContext_ context) foreign import data UseContext :: Type -> Type -> Type --- | Use this hook to memoize a value based on a set of deps. This is --- | useful when you need to take advantage of `memo` and need to pass --- | referentially equal values to a child component. This is purely --- | a performance optimization and shouldn't change the behavior of --- | your component. +-- | Cache an instance of a value, replacing it when `eq` returns `false`. -- | --- | If building a value of `a` is expensive, try `useLazy`. -useMemo :: +-- | This is a low-level performance optimization tool. It can be useful +-- | for optimizing a component's props for use with `memo`, where +-- | JavaScript instance equality matters. +useEqCache :: forall a. Eq a => a -> - Hook (UseMemo a) a -useMemo a = unsafeHook (runEffectFn2 useMemo_ (mkFn2 eq) a) + Hook (UseEqCache a) a +useEqCache a = + unsafeHook do + runEffectFn2 useEqCache_ (mkFn2 eq) a -foreign import data UseMemo :: Type -> Type -> Type +foreign import data UseEqCache :: Type -> Type -> Type --- | Lazily compute a value. The result is cached in the component --- | instance until the deps change. -useLazy :: +-- | Lazily compute a value. The result is cached until the `deps` change. +useMemo :: forall deps a. Eq deps => deps -> (Unit -> a) -> - Hook (UseLazy deps a) a -useLazy deps computeA = unsafeHook (runEffectFn3 useLazy_ (mkFn2 eq) deps computeA) + Hook (UseMemo deps a) a +useMemo deps computeA = + unsafeHook do + runEffectFn3 useMemo_ (mkFn2 eq) deps computeA -foreign import data UseLazy :: Type -> Type -> Type -> Type +foreign import data UseMemo :: Type -> Type -> Type -> Type -- | Use this hook to display a label for custom hooks in React DevTools useDebugValue :: forall a. a -> (a -> String) -> Hook (UseDebugValue a) Unit @@ -391,14 +413,14 @@ foreign import useContext_ :: (ReactContext a) a -foreign import useMemo_ :: +foreign import useEqCache_ :: forall a. EffectFn2 (Fn2 a a Boolean) a a -foreign import useLazy_ :: +foreign import useMemo_ :: forall deps a. EffectFn3 (Fn2 deps deps Boolean) diff --git a/src/React/Basic/Hooks/Aff.purs b/src/React/Basic/Hooks/Aff.purs index 340e0a0..9c02666 100644 --- a/src/React/Basic/Hooks/Aff.purs +++ b/src/React/Basic/Hooks/Aff.purs @@ -10,12 +10,14 @@ module React.Basic.Hooks.Aff import Prelude import Data.Either (Either(..)) import Data.Foldable (for_) +import Data.Function.Uncurried (Fn2, mkFn2, runFn2) import Data.Maybe (Maybe(..)) import Data.Newtype (class Newtype) import Effect (Effect) import Effect.Aff (Aff, Error, error, killFiber, launchAff, launchAff_, throwError, try) import Effect.Class (liftEffect) -import React.Basic.Hooks (type (/\), Hook, UnsafeReference(..), UseEffect, UseReducer, UseState, coerceHook, unsafeRenderEffect, useEffect, useReducer, useState, (/\)) +import Effect.Unsafe (unsafePerformEffect) +import React.Basic.Hooks (type (/\), Hook, Reducer, UnsafeReference(..), UseEffect, UseMemo, UseReducer, UseState, coerceHook, mkReducer, unsafeRenderEffect, useEffect, useMemo, useReducer, useState, (/\)) import React.Basic.Hooks as React -- | `useAff` is used for asynchronous effects or `Aff`. The asynchronous effect @@ -44,7 +46,7 @@ useAff deps aff = setResult \_ -> Just r pure do launchAff_ do - killFiber (error "Fiber cancelled for newer request") fiber + killFiber (error "Stale request cancelled") fiber unsafeRenderEffect case result of Just (Left err) -> throwError err Just (Right a) -> pure (Just a) @@ -78,10 +80,14 @@ useAffReducer :: state -> AffReducer state action -> Hook (UseAffReducer state action) (state /\ (action -> Effect Unit)) -useAffReducer initialState reducer = +useAffReducer initialState affReducer = coerceHook React.do + reducer' <- + useMemo (UnsafeReference affReducer) \_ -> + unsafePerformEffect do + mkReducer (\{ state } -> runAffReducer affReducer state) { state, effects } /\ dispatch <- - useReducer { state: initialState, effects: [] } (_.state >>> reducer) + useReducer { state: initialState, effects: [] } reducer' useEffect (UnsafeReference effects) do for_ effects \aff -> launchAff_ do @@ -90,12 +96,30 @@ useAffReducer initialState reducer = mempty pure (state /\ dispatch) -type AffReducer state action - = state -> - action -> - { state :: state - , effects :: Array (Aff (Array action)) - } +newtype AffReducer state action + = AffReducer + ( Fn2 + state + action + { state :: state, effects :: Array (Aff (Array action)) } + ) + +mkAffReducer :: + forall state action. + (state -> action -> { state :: state, effects :: Array (Aff (Array action)) }) -> + Effect (AffReducer state action) +mkAffReducer = pure <<< AffReducer <<< mkFn2 + +-- | Run a wrapped `Reducer` function as a normal function (like `runFn2`). +-- | Useful for testing, simulating actions, or building more complicated +-- | hooks on top of `useReducer` +runAffReducer :: + forall state action. + AffReducer state action -> + state -> + action -> + { state :: state, effects :: Array (Aff (Array action)) } +runAffReducer (AffReducer reducer) = runFn2 reducer noEffects :: forall state action. @@ -108,7 +132,18 @@ noEffects state = { state, effects: [] } newtype UseAffReducer state action hooks = UseAffReducer ( UseEffect (UnsafeReference (Array (Aff (Array action)))) - (UseReducer { state :: state, effects :: Array (Aff (Array action)) } action hooks) + ( UseReducer { state :: state, effects :: Array (Aff (Array action)) } action + ( UseMemo + (UnsafeReference (AffReducer state action)) + ( Reducer + { effects :: Array (Aff (Array action)) + , state :: state + } + action + ) + hooks + ) + ) ) derive instance ntUseAffReducer :: Newtype (UseAffReducer state action hooks) _ diff --git a/src/React/Basic/Hooks/Internal.purs b/src/React/Basic/Hooks/Internal.purs index cc3279d..e88be69 100644 --- a/src/React/Basic/Hooks/Internal.purs +++ b/src/React/Basic/Hooks/Internal.purs @@ -106,9 +106,9 @@ coerceHook (Render a) = Render a -- | ... -- | ``` -- | --- | The same applies to keys as they use `Eq` and a reorder --- | would allow React to pass incorrect types into the `eq` --- | function! +-- | The same applies to `deps` in these examples as they use +-- | `Eq` and a reorder would allow React to pass incorrect +-- | types into the `eq` function! unsafeHook :: forall newHook a. Effect a -> Hook newHook a diff --git a/src/React/Basic/StrictMode.js b/src/React/Basic/StrictMode.js deleted file mode 100644 index c0b58ae..0000000 --- a/src/React/Basic/StrictMode.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; - -const React = require("react"); - -exports.strictMode_ = React.StrictMode; diff --git a/src/React/Basic/StrictMode.purs b/src/React/Basic/StrictMode.purs deleted file mode 100644 index 88abb65..0000000 --- a/src/React/Basic/StrictMode.purs +++ /dev/null @@ -1,10 +0,0 @@ --- TODO: move this file to `react-basic` -module React.Basic.StrictMode where - -import Prelude -import React.Basic (JSX, ReactComponent, element) - -strictMode :: JSX -> JSX -strictMode = element strictMode_ <<< { children: _ } - -foreign import strictMode_ :: ReactComponent { children :: JSX } diff --git a/test/Main.purs b/test/Main.purs deleted file mode 100644 index f91f98c..0000000 --- a/test/Main.purs +++ /dev/null @@ -1,11 +0,0 @@ -module Test.Main where - -import Prelude - -import Effect (Effect) -import Effect.Class.Console (log) - -main :: Effect Unit -main = do - log "🍝" - log "You should add some tests."