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 [](https://circleci.com/gh/spicydonuts/purescript-react-basic-hooks)
+# react-basic-hooks [](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."