aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjloup <jean-loup.jamet@trainline.com>2018-02-14 14:19:09 +0100
committerjloup <jean-loup.jamet@trainline.com>2018-02-14 14:19:09 +0100
commit7a9e5112eaaea58d55f181d3e5296e4ff839921c (patch)
tree968ed193f42a1fad759cc89ad2f8ad5b0091291e
downloadFront-7a9e5112eaaea58d55f181d3e5296e4ff839921c.tar.gz
Front-7a9e5112eaaea58d55f181d3e5296e4ff839921c.tar.zst
Front-7a9e5112eaaea58d55f181d3e5296e4ff839921c.zip
initial commit
-rw-r--r--.gitignore3
-rw-r--r--Gopkg.lock143
-rw-r--r--Gopkg.toml58
-rw-r--r--Makefile7
-rw-r--r--README.md1
-rw-r--r--api/api.go130
-rw-r--r--api/auth_jwt.go107
-rw-r--r--api/auth_otp.go122
-rw-r--r--api/const.go51
-rw-r--r--api/const_string.go28
-rw-r--r--api/logger.go27
-rw-r--r--api/market_config.go77
-rw-r--r--api/routes.go123
-rw-r--r--api/user.go133
-rw-r--r--cmd/ansible/.gitignore3
-rw-r--r--cmd/ansible/ansible.cfg3
-rw-r--r--cmd/ansible/conf.toml.j217
-rw-r--r--cmd/ansible/cryptoportfolio-app.j213
-rw-r--r--cmd/ansible/deploy.yml105
-rw-r--r--cmd/ansible/hosts15
-rw-r--r--cmd/ansible/release.yml59
-rw-r--r--cmd/ansible/requirements.yml7
-rw-r--r--cmd/ansible/vars.yml22
-rw-r--r--cmd/app/Makefile30
-rw-r--r--cmd/app/conf.toml16
-rw-r--r--cmd/app/main.go155
-rw-r--r--cmd/web/.babelrc3
-rw-r--r--cmd/web/.gitignore4
-rw-r--r--cmd/web/.jscsrc5
-rw-r--r--cmd/web/.jshintrc16
-rw-r--r--cmd/web/Makefile52
-rw-r--r--cmd/web/env/dev.env4
-rw-r--r--cmd/web/env/prod.env4
-rw-r--r--cmd/web/js/api.js176
-rw-r--r--cmd/web/js/app.js121
-rw-r--r--cmd/web/js/cookies.js65
-rw-r--r--cmd/web/js/main.jsx101
-rw-r--r--cmd/web/js/otp.jsx70
-rw-r--r--cmd/web/js/poloniex.jsx49
-rw-r--r--cmd/web/js/signin.jsx52
-rw-r--r--cmd/web/js/signup.jsx56
-rw-r--r--cmd/web/package.json26
-rw-r--r--cmd/web/static/index.html31
-rw-r--r--cmd/web/static/style.css100
-rw-r--r--cmd/web/yarn.lock3978
-rw-r--r--db/db.go75
-rw-r--r--db/db_test.go35
-rw-r--r--db/errors.go23
-rw-r--r--db/market_config.go45
-rw-r--r--db/user.go72
50 files changed, 6618 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ad02220
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
1vendor/
2cmd/app/dist
3cmd/app/cryptoportfolio-app \ No newline at end of file
diff --git a/Gopkg.lock b/Gopkg.lock
new file mode 100644
index 0000000..7f0f166
--- /dev/null
+++ b/Gopkg.lock
@@ -0,0 +1,143 @@
1# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
2
3
4[[projects]]
5 name = "github.com/BurntSushi/toml"
6 packages = ["."]
7 revision = "b26d9c308763d68093482582cea63d69be07a0f0"
8 version = "v0.3.0"
9
10[[projects]]
11 name = "github.com/Sirupsen/logrus"
12 packages = ["."]
13 revision = "d682213848ed68c0a260ca37d6dd5ace8423f5ba"
14 version = "v1.0.4"
15
16[[projects]]
17 name = "github.com/boombuler/barcode"
18 packages = [
19 ".",
20 "qr",
21 "utils"
22 ]
23 revision = "3cfea5ab600ae37946be2b763b8ec2c1cf2d272d"
24 version = "v1.0.0"
25
26[[projects]]
27 name = "github.com/dgrijalva/jwt-go"
28 packages = ["."]
29 revision = "dbeaa9332f19a944acb5736b4456cfcc02140e29"
30 version = "v3.1.0"
31
32[[projects]]
33 name = "github.com/gin-contrib/cors"
34 packages = ["."]
35 revision = "cf4846e6a636a76237a28d9286f163c132e841bc"
36 version = "v1.2"
37
38[[projects]]
39 branch = "master"
40 name = "github.com/gin-contrib/sse"
41 packages = ["."]
42 revision = "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae"
43
44[[projects]]
45 name = "github.com/gin-gonic/gin"
46 packages = [
47 ".",
48 "binding",
49 "render"
50 ]
51 revision = "d459835d2b077e44f7c9b453505ee29881d5d12d"
52 version = "v1.2"
53
54[[projects]]
55 name = "github.com/go-pg/pg"
56 packages = [
57 ".",
58 "internal",
59 "internal/parser",
60 "internal/pool",
61 "orm",
62 "types"
63 ]
64 revision = "eff1632b1caea7c554b174d5551ff2791021810c"
65 version = "v6.9.3"
66
67[[projects]]
68 name = "github.com/golang/protobuf"
69 packages = ["proto"]
70 revision = "925541529c1fa6821df4e44ce2723319eb2be768"
71 version = "v1.0.0"
72
73[[projects]]
74 branch = "master"
75 name = "github.com/jinzhu/inflection"
76 packages = ["."]
77 revision = "1c35d901db3da928c72a72d8458480cc9ade058f"
78
79[[projects]]
80 branch = "master"
81 name = "github.com/jloup/utils"
82 packages = ["."]
83 revision = "6055a8f761d5892502228aa62249e122f8bd392d"
84
85[[projects]]
86 name = "github.com/mattn/go-isatty"
87 packages = ["."]
88 revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
89 version = "v0.0.3"
90
91[[projects]]
92 name = "github.com/pquerna/otp"
93 packages = [
94 ".",
95 "hotp",
96 "totp"
97 ]
98 revision = "b7b89250c468c06871d3837bee02e2d5c155ae19"
99 version = "v1.0.0"
100
101[[projects]]
102 name = "github.com/ugorji/go"
103 packages = ["codec"]
104 revision = "9831f2c3ac1068a78f50999a30db84270f647af6"
105 version = "v1.1"
106
107[[projects]]
108 branch = "master"
109 name = "golang.org/x/crypto"
110 packages = [
111 "bcrypt",
112 "blowfish",
113 "ssh/terminal"
114 ]
115 revision = "650f4a345ab4e5b245a3034b110ebc7299e68186"
116
117[[projects]]
118 branch = "master"
119 name = "golang.org/x/sys"
120 packages = [
121 "unix",
122 "windows"
123 ]
124 revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd"
125
126[[projects]]
127 name = "gopkg.in/go-playground/validator.v8"
128 packages = ["."]
129 revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf"
130 version = "v8.18.2"
131
132[[projects]]
133 branch = "v2"
134 name = "gopkg.in/yaml.v2"
135 packages = ["."]
136 revision = "d670f9405373e636a5a2765eea47fac0c9bc91a4"
137
138[solve-meta]
139 analyzer-name = "dep"
140 analyzer-version = 1
141 inputs-digest = "c9af022a586632799c6259f6c48eef8dad7080e36b96e8cb5cb905b316c4cb9b"
142 solver-name = "gps-cdcl"
143 solver-version = 1
diff --git a/Gopkg.toml b/Gopkg.toml
new file mode 100644
index 0000000..f4686b5
--- /dev/null
+++ b/Gopkg.toml
@@ -0,0 +1,58 @@
1# Gopkg.toml example
2#
3# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
4# for detailed Gopkg.toml documentation.
5#
6# required = ["github.com/user/thing/cmd/thing"]
7# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
8#
9# [[constraint]]
10# name = "github.com/user/project"
11# version = "1.0.0"
12#
13# [[constraint]]
14# name = "github.com/user/project2"
15# branch = "dev"
16# source = "github.com/myfork/project2"
17#
18# [[override]]
19# name = "github.com/x/y"
20# version = "2.4.0"
21#
22# [prune]
23# non-go = false
24# go-tests = true
25# unused-packages = true
26
27
28[[constraint]]
29 name = "github.com/dgrijalva/jwt-go"
30 version = "3.1.0"
31
32[[constraint]]
33 name = "github.com/gin-contrib/cors"
34 version = "1.2.0"
35
36[[constraint]]
37 name = "github.com/gin-gonic/gin"
38 version = "1.2.0"
39
40[[constraint]]
41 name = "github.com/go-pg/pg"
42 version = "6.9.3"
43
44[[constraint]]
45 branch = "master"
46 name = "github.com/jloup/utils"
47
48[[constraint]]
49 name = "github.com/pquerna/otp"
50 version = "1.0.0"
51
52[[constraint]]
53 branch = "master"
54 name = "golang.org/x/crypto"
55
56[prune]
57 go-tests = true
58 unused-packages = true
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d7fe209
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
1install:
2 go get -u github.com/golang/dep/cmd/dep
3 dep ensure
4 go get github.com/aktau/github-release
5
6clean:
7 rm -rf vendor
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..84e6304
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
# Crypto
diff --git a/api/api.go b/api/api.go
new file mode 100644
index 0000000..7b7be49
--- /dev/null
+++ b/api/api.go
@@ -0,0 +1,130 @@
1package api
2
3import (
4 "net/http"
5 "unicode"
6
7 "github.com/gin-gonic/gin"
8)
9
10type Error struct {
11 Code ErrorCode
12 UserMessage string
13 err error
14}
15
16func (e Error) Err() error {
17 if e.err != nil {
18 return e
19 }
20
21 return nil
22}
23
24func (e Error) Error() string {
25 if e.err != nil {
26 return e.err.Error()
27 }
28
29 return ""
30}
31
32func NewInternalError(err error) *Error {
33 return &Error{InternalError, "internal error", err}
34}
35
36func ToSnake(in string) string {
37 runes := []rune(in)
38 length := len(runes)
39
40 var out []rune
41 for i := 0; i < length; i++ {
42 if i > 0 && unicode.IsUpper(runes[i]) && ((i+1 < length && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) {
43 out = append(out, '_')
44 }
45 out = append(out, unicode.ToLower(runes[i]))
46 }
47
48 return string(out)
49}
50
51type Response struct {
52 StatusCode Status `json:"-"`
53 ErrorCode ErrorCode `json:"-"`
54
55 Status string `json:"status"`
56 Code string `json:"code,omitempty"`
57 Response interface{} `json:"response,omitempty"`
58 Message string `json:"message,omitempty"`
59}
60
61func (r Response) populateStatus() Response {
62 r.Status = ToSnake(r.StatusCode.String())
63
64 if r.ErrorCode != 0 {
65 r.Code = ToSnake(r.ErrorCode.String())
66 }
67
68 return r
69}
70
71func ErrorResponse(code ErrorCode, message string) Response {
72 return Response{
73 StatusCode: NOK,
74 ErrorCode: code,
75 Message: message,
76 }
77}
78
79func SuccessResponse(data interface{}) Response {
80 return Response{
81 StatusCode: OK,
82 Response: data,
83 }
84}
85
86func WriteJsonResponse(response Response, c *gin.Context) {
87 response = response.populateStatus()
88
89 c.JSON(StatusToHttpCode(response.StatusCode, response.ErrorCode), response)
90}
91
92func WriteBinary(contentType string, b []byte, c *gin.Context) {
93 c.Data(http.StatusOK, contentType, b)
94}
95
96type Middleware func(*gin.Context) *Error
97
98func M(handler Middleware) gin.HandlerFunc {
99 return func(c *gin.Context) {
100 err := handler(c)
101
102 if err != nil {
103 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
104 c.Error(err)
105 c.Abort()
106 } else {
107 c.Next()
108 }
109 }
110}
111
112type Query interface {
113 ValidateParams() *Error
114 Run() (interface{}, *Error)
115}
116
117func RunQuery(query Query, c *gin.Context) {
118 if err := query.ValidateParams(); err != nil {
119 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
120 c.Error(err)
121 return
122 }
123
124 if out, err := query.Run(); err != nil {
125 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
126 c.Error(err)
127 } else {
128 WriteJsonResponse(SuccessResponse(out), c)
129 }
130}
diff --git a/api/auth_jwt.go b/api/auth_jwt.go
new file mode 100644
index 0000000..f713f4e
--- /dev/null
+++ b/api/auth_jwt.go
@@ -0,0 +1,107 @@
1package api
2
3import (
4 "fmt"
5 "strings"
6 "time"
7
8 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
9
10 "github.com/dgrijalva/jwt-go"
11 "github.com/gin-gonic/gin"
12)
13
14// Static secret.
15var JWT_SECRET []byte
16
17type JwtClaims struct {
18 Authorized bool `json:"authorized"`
19 Subject int64 `json:"sub,omitempty"`
20 jwt.StandardClaims
21}
22
23func SetJwtSecretKey(secret string) {
24 JWT_SECRET = []byte(secret)
25}
26
27func VerifyJwtToken(token string) (JwtClaims, error) {
28 if len(JWT_SECRET) == 0 {
29 return JwtClaims{}, fmt.Errorf("not initialized jwt secret")
30 }
31
32 t, err := jwt.ParseWithClaims(token, &JwtClaims{}, func(t *jwt.Token) (interface{}, error) {
33 if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
34 return nil, fmt.Errorf("Unexpected signing method: %v", t.Header["alg"])
35 }
36
37 return JWT_SECRET, nil
38 })
39
40 claims, ok := t.Claims.(*JwtClaims)
41
42 if !ok || !t.Valid || err != nil {
43 return JwtClaims{}, fmt.Errorf("invalid token (err: %v, claimsok: %v)", err, ok)
44 }
45
46 return *claims, nil
47}
48
49func SignJwt(claims JwtClaims) (string, error) {
50 if len(JWT_SECRET) == 0 {
51 return "", fmt.Errorf("not initialized jwt secret")
52 }
53
54 token := jwt.NewWithClaims(jwt.SigningMethodHS256, &claims)
55
56 return token.SignedString(JWT_SECRET)
57}
58
59func CreateJwtToken(userId int64) (string, error) {
60 claims := JwtClaims{
61 false,
62 userId,
63 jwt.StandardClaims{
64 ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
65 },
66 }
67
68 return SignJwt(claims)
69}
70
71func GetBearerToken(header string) (string, error) {
72 const prefix = "Bearer "
73
74 if !strings.HasPrefix(header, prefix) {
75 return "", fmt.Errorf("invalid authorization token")
76 }
77
78 return header[len(prefix):], nil
79}
80
81func JwtAuth(c *gin.Context) *Error {
82 token, err := GetBearerToken(c.GetHeader("Authorization"))
83 if err != nil {
84 return &Error{NotAuthorized, "not authorized", err}
85 }
86
87 claims, err := VerifyJwtToken(token)
88 if err != nil {
89 return &Error{NotAuthorized, "not authorized", err}
90 }
91
92 user, err := db.GetUserById(claims.Subject)
93 if err != nil {
94 return &Error{NotAuthorized, "not authorized", err}
95 }
96
97 c.Set("user", *user)
98 c.Set("claims", claims)
99
100 return nil
101}
102
103func GetClaims(c *gin.Context) JwtClaims {
104 claims, _ := c.Get("claims")
105
106 return claims.(JwtClaims)
107}
diff --git a/api/auth_otp.go b/api/auth_otp.go
new file mode 100644
index 0000000..de1cf24
--- /dev/null
+++ b/api/auth_otp.go
@@ -0,0 +1,122 @@
1package api
2
3import (
4 "bytes"
5 "fmt"
6 "image/png"
7
8 "github.com/gin-gonic/gin"
9 "github.com/pquerna/otp/totp"
10 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
11)
12
13func GenerateSecret(user db.User) (bytes.Buffer, string, error) {
14 var buf bytes.Buffer
15 key, err := totp.Generate(totp.GenerateOpts{
16 Issuer: "cryptoportfolio",
17 AccountName: user.Email,
18 Period: 30,
19 })
20
21 if err != nil {
22 return buf, "", err
23 }
24
25 qrImage, err := key.Image(200, 200)
26 if err != nil {
27 return buf, "", err
28 }
29
30 png.Encode(&buf, qrImage)
31 if err != nil {
32 return buf, "", err
33 }
34
35 return buf, key.Secret(), nil
36}
37
38type OtpEnrollmentQuery struct {
39 In struct {
40 User db.User
41 }
42}
43
44func (q OtpEnrollmentQuery) ValidateParams() *Error {
45 return nil
46}
47
48func (q OtpEnrollmentQuery) Run() (*bytes.Buffer, string, *Error) {
49 if q.In.User.OtpSecret != "" && q.In.User.IsOtpSetup == true {
50 return nil, "", &Error{OtpAlreadySetup, "otp is already setup", fmt.Errorf("otp already setup")}
51 }
52
53 buf, secret, err := GenerateSecret(q.In.User)
54 if err != nil {
55 return nil, "", NewInternalError(err)
56 }
57
58 err = db.SetOtpSecret(&q.In.User, secret, true)
59 if err != nil {
60 return nil, "", NewInternalError(err)
61 }
62
63 return &buf, secret, nil
64}
65
66type OtpValidateQuery struct {
67 In struct {
68 Pass string
69 User db.User
70 Claims JwtClaims
71 }
72
73 Out struct {
74 Token string `json:"token"`
75 }
76}
77
78func (q OtpValidateQuery) ValidateParams() *Error {
79 if q.In.Pass == "" {
80 return &Error{InvalidOtp, "invalid otp", fmt.Errorf("invalid otp '%v'", q.In.Pass)}
81 }
82
83 return nil
84}
85
86func (q OtpValidateQuery) Run() (interface{}, *Error) {
87 var err error
88
89 if q.In.User.OtpSecret == "" {
90 return nil, &Error{OtpNotSetup, "otp is not setup", fmt.Errorf("otp is not setup")}
91 }
92
93 if !totp.Validate(q.In.Pass, q.In.User.OtpSecret) {
94 return nil, &Error{InvalidOtp, "invalid otp", fmt.Errorf("invalid otp '%v'", q.In.Pass)}
95
96 } else if err := db.SetOtpSecret(&q.In.User, q.In.User.OtpSecret, false); err != nil {
97 return nil, NewInternalError(err)
98 }
99
100 q.In.Claims.Authorized = true
101 q.Out.Token, err = SignJwt(q.In.Claims)
102 if err != nil {
103 return nil, NewInternalError(err)
104 }
105
106 return q.Out, nil
107}
108
109func OtpAuth(c *gin.Context) *Error {
110 claims := GetClaims(c)
111 user := GetUser(c)
112
113 if user.IsOtpSetup == false || user.OtpSecret == "" {
114 return &Error{OtpNotSetup, "otp is not setup", fmt.Errorf("otp is not setup")}
115 }
116
117 if !claims.Authorized {
118 return &Error{NeedOtpValidation, "not authorized", fmt.Errorf("otp not authorized")}
119 }
120
121 return nil
122}
diff --git a/api/const.go b/api/const.go
new file mode 100644
index 0000000..2edd6f4
--- /dev/null
+++ b/api/const.go
@@ -0,0 +1,51 @@
1package api
2
3import "net/http"
4
5//go:generate stringer -type=Status,ErrorCode -output const_string.go
6type Status uint32
7type ErrorCode uint32
8
9const (
10 OK Status = iota
11 NOK
12
13 BadRequest ErrorCode = iota + 1
14 EmailExists
15 InternalError
16 InvalidCredentials
17 InvalidEmail
18 InvalidOtp
19 InvalidPassword
20 NeedOtpValidation
21 NotAuthorized
22 NotFound
23 OtpAlreadySetup
24 OtpNotSetup
25 UserNotConfirmed
26)
27
28func StatusToHttpCode(status Status, code ErrorCode) int {
29 if status == OK {
30 return http.StatusOK
31 }
32
33 switch code {
34 case BadRequest, InvalidPassword, InvalidEmail:
35 return http.StatusBadRequest
36
37 case InvalidCredentials, InvalidOtp:
38 return http.StatusUnauthorized
39
40 case UserNotConfirmed, NotAuthorized, OtpAlreadySetup, OtpNotSetup, NeedOtpValidation:
41 return http.StatusForbidden
42
43 case EmailExists:
44 return http.StatusConflict
45
46 case NotFound:
47 return http.StatusNotFound
48 }
49
50 return http.StatusInternalServerError
51}
diff --git a/api/const_string.go b/api/const_string.go
new file mode 100644
index 0000000..611db40
--- /dev/null
+++ b/api/const_string.go
@@ -0,0 +1,28 @@
1// Code generated by "stringer -type=Status,ErrorCode -output const_string.go"; DO NOT EDIT
2
3package api
4
5import "fmt"
6
7const _Status_name = "OKNOK"
8
9var _Status_index = [...]uint8{0, 2, 5}
10
11func (i Status) String() string {
12 if i >= Status(len(_Status_index)-1) {
13 return fmt.Sprintf("Status(%d)", i)
14 }
15 return _Status_name[_Status_index[i]:_Status_index[i+1]]
16}
17
18const _ErrorCode_name = "BadRequestEmailExistsInternalErrorInvalidCredentialsInvalidEmailInvalidOtpInvalidPasswordNeedOtpValidationNotAuthorizedNotFoundOtpAlreadySetupOtpNotSetupUserNotConfirmed"
19
20var _ErrorCode_index = [...]uint8{0, 10, 21, 34, 52, 64, 74, 89, 106, 119, 127, 142, 153, 169}
21
22func (i ErrorCode) String() string {
23 i -= 3
24 if i >= ErrorCode(len(_ErrorCode_index)-1) {
25 return fmt.Sprintf("ErrorCode(%d)", i+3)
26 }
27 return _ErrorCode_name[_ErrorCode_index[i]:_ErrorCode_index[i+1]]
28}
diff --git a/api/logger.go b/api/logger.go
new file mode 100644
index 0000000..7057a30
--- /dev/null
+++ b/api/logger.go
@@ -0,0 +1,27 @@
1package api
2
3import (
4 "github.com/gin-gonic/gin"
5 "github.com/jloup/utils"
6)
7
8var log = utils.StandardL().WithField("module", "api")
9
10func Logger() gin.HandlerFunc {
11 return func(c *gin.Context) {
12 path := c.Request.URL.Path
13 rawQuery := c.Request.URL.RawQuery
14
15 c.Next()
16
17 for _, err := range c.Errors {
18 l := log.WithField("path", path)
19
20 if rawQuery != "" {
21 l = l.WithField("query", rawQuery)
22 }
23
24 l.Errorf("%s", err.Err)
25 }
26 }
27}
diff --git a/api/market_config.go b/api/market_config.go
new file mode 100644
index 0000000..3fd10ae
--- /dev/null
+++ b/api/market_config.go
@@ -0,0 +1,77 @@
1package api
2
3import (
4 "fmt"
5
6 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
7)
8
9type MarketConfigQuery struct {
10 In struct {
11 User db.User
12 Market string
13 }
14}
15
16func (q MarketConfigQuery) ValidateParams() *Error {
17 if q.In.Market != "poloniex" {
18 return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)}
19 }
20
21 return nil
22}
23
24func (q MarketConfigQuery) Run() (interface{}, *Error) {
25 config, err := db.GetUserMarketConfig(q.In.User.Id, q.In.Market)
26 if err != nil {
27 return nil, NewInternalError(err)
28 }
29
30 if config == nil {
31 configMap := make(map[string]string)
32 configMap["key"] = ""
33 configMap["secret"] = ""
34
35 config, err = db.SetUserMarketConfig(q.In.User.Id, q.In.Market, configMap)
36 if err != nil {
37 return nil, NewInternalError(err)
38 }
39
40 }
41
42 return config.Config, nil
43}
44
45type UpdateMarketConfigQuery struct {
46 In struct {
47 User db.User
48 Market string
49 Key string
50 Secret string
51 }
52}
53
54func (q UpdateMarketConfigQuery) ValidateParams() *Error {
55 if q.In.Market == "" {
56 return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)}
57 }
58
59 return nil
60}
61
62func (q UpdateMarketConfigQuery) Run() (interface{}, *Error) {
63 configMap := make(map[string]string)
64 if q.In.Key != "" {
65 configMap["key"] = q.In.Key
66 }
67 if q.In.Secret != "" {
68 configMap["secret"] = q.In.Secret
69 }
70
71 _, err := db.SetUserMarketConfig(q.In.User.Id, q.In.Market, configMap)
72 if err != nil {
73 return nil, NewInternalError(err)
74 }
75
76 return nil, nil
77}
diff --git a/api/routes.go b/api/routes.go
new file mode 100644
index 0000000..d7e712c
--- /dev/null
+++ b/api/routes.go
@@ -0,0 +1,123 @@
1package api
2
3import (
4 "encoding/base64"
5
6 "github.com/gin-gonic/gin"
7)
8
9type Route struct {
10 Method string
11 Handlers []gin.HandlerFunc
12 Path string
13}
14
15type Group struct {
16 Root string
17 Middlewares []Middleware
18 Routes []Route
19}
20
21var Groups = []Group{
22 {
23 "",
24 nil,
25 []Route{
26 {"POST", []gin.HandlerFunc{Signup}, "/signup"},
27 {"POST", []gin.HandlerFunc{Signin}, "/signin"},
28 },
29 },
30 {
31 "/otp",
32 []Middleware{JwtAuth, UserConfirmed},
33 []Route{
34 {"GET", []gin.HandlerFunc{OtpEnrollment}, "/enroll"},
35 {"POST", []gin.HandlerFunc{OtpValidate}, "/validate"},
36 },
37 },
38 {
39 "/market",
40 []Middleware{JwtAuth, UserConfirmed, OtpAuth},
41 []Route{
42 {"GET", []gin.HandlerFunc{GetMarketConfig}, "/:name"},
43 {"POST", []gin.HandlerFunc{UpdateMarketConfig}, "/:name/update"},
44 },
45 },
46}
47
48func Signup(c *gin.Context) {
49 query := &SignupQuery{}
50
51 query.In.Email = c.PostForm("email")
52 query.In.Password = c.PostForm("password")
53
54 RunQuery(query, c)
55}
56
57func Signin(c *gin.Context) {
58 query := &SigninQuery{}
59
60 query.In.Email = c.PostForm("email")
61 query.In.Password = c.PostForm("password")
62
63 RunQuery(query, c)
64}
65
66func OtpValidate(c *gin.Context) {
67 query := &OtpValidateQuery{}
68
69 query.In.Pass = c.PostForm("pass")
70 query.In.User = GetUser(c)
71 query.In.Claims = GetClaims(c)
72
73 RunQuery(query, c)
74}
75
76func OtpEnrollment(c *gin.Context) {
77 query := &OtpEnrollmentQuery{}
78
79 query.In.User = GetUser(c)
80
81 qrPng, secret, err := query.Run()
82 if err != nil {
83 WriteJsonResponse(ErrorResponse(err.Code, err.UserMessage), c)
84 c.Error(err)
85 return
86 }
87
88 if c.Query("format") == "png" {
89 c.Header("X-OTP-Secret", secret)
90 WriteBinary("image/png", qrPng.Bytes(), c)
91 } else {
92 response := struct {
93 Base64img string `json:"base64img"`
94 OtpSecret string `json:"secret"`
95 }{
96 base64.StdEncoding.EncodeToString(qrPng.Bytes()),
97 secret,
98 }
99
100 WriteJsonResponse(SuccessResponse(response), c)
101 }
102
103}
104
105func GetMarketConfig(c *gin.Context) {
106 query := &MarketConfigQuery{}
107
108 query.In.User = GetUser(c)
109 query.In.Market = c.Param("name")
110
111 RunQuery(query, c)
112}
113
114func UpdateMarketConfig(c *gin.Context) {
115 query := &UpdateMarketConfigQuery{}
116
117 query.In.User = GetUser(c)
118 query.In.Market = c.Param("name")
119 query.In.Key = c.PostForm("key")
120 query.In.Secret = c.PostForm("secret")
121
122 RunQuery(query, c)
123}
diff --git a/api/user.go b/api/user.go
new file mode 100644
index 0000000..4d4edba
--- /dev/null
+++ b/api/user.go
@@ -0,0 +1,133 @@
1package api
2
3import (
4 "fmt"
5 "regexp"
6
7 "github.com/gin-gonic/gin"
8
9 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
10)
11
12const (
13 VALID_EMAIL_REGEX = `(?i)^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$`
14)
15
16func IsValidEmailAddress(email string) bool {
17 r := regexp.MustCompile(VALID_EMAIL_REGEX)
18
19 return r.MatchString(email)
20}
21
22type SignParams struct {
23 Email string
24 Password string
25}
26
27type SignResult struct {
28 Token string `json:"token"`
29}
30
31func (s SignParams) Validate() *Error {
32 if !IsValidEmailAddress(s.Email) {
33 return &Error{InvalidEmail, "invalid email", fmt.Errorf("'%v' is not a valid email", s.Email)}
34 }
35
36 if s.Password == "" {
37 return &Error{InvalidPassword, "invalid password", fmt.Errorf("invalid password")}
38 }
39
40 return nil
41}
42
43type SignupQuery struct {
44 In SignParams
45}
46
47func (q SignupQuery) ValidateParams() *Error {
48 return q.In.Validate()
49}
50
51func (q SignupQuery) Run() (interface{}, *Error) {
52 user, err := db.GetUserByEmail(q.In.Email)
53 if err != nil {
54 return nil, NewInternalError(err)
55 }
56
57 if user != nil {
58 return nil, &Error{EmailExists, "email already taken", fmt.Errorf("'%v' is already registered '%v'", q.In.Email, user)}
59 }
60
61 newUser := db.User{Email: q.In.Email, Status: db.AwaitingConfirmation}
62 newUser.PasswordHash, err = db.HashPassword(q.In.Password)
63 if err != nil {
64 return nil, NewInternalError(err)
65 }
66
67 err = db.InsertUser(&newUser)
68 if err != nil {
69 return nil, NewInternalError(err)
70 }
71
72 token, err := CreateJwtToken(newUser.Id)
73 if err != nil {
74 return nil, NewInternalError(fmt.Errorf("cannot create jwt token %v", err))
75 }
76
77 return SignResult{token}, nil
78}
79
80type SigninQuery struct {
81 In SignParams
82}
83
84func (q SigninQuery) ValidateParams() *Error {
85 return q.In.Validate()
86}
87
88func (q SigninQuery) Run() (interface{}, *Error) {
89 user, err := db.GetUserByEmail(q.In.Email)
90 if err != nil {
91 return nil, NewInternalError(err)
92 }
93
94 if user == nil {
95 return nil, &Error{InvalidCredentials, "invalid credentials", fmt.Errorf("no email '%v' found", q.In.Email)}
96 }
97
98 err = db.ValidatePassword(q.In.Password, user.PasswordHash)
99 if err != nil {
100 return nil, &Error{InvalidCredentials, "invalid credentials", err}
101 }
102
103 if user.Status != db.Confirmed {
104 return nil, &Error{UserNotConfirmed, "user awaiting admin validation", fmt.Errorf("user '%v' not confirmed", user)}
105 }
106
107 token, err := CreateJwtToken(user.Id)
108 if err != nil {
109 return nil, NewInternalError(err)
110 }
111
112 return SignResult{token}, nil
113}
114
115func UserConfirmed(c *gin.Context) *Error {
116 user, exists := c.Get("user")
117
118 if !exists {
119 return &Error{NotAuthorized, "not authorized", fmt.Errorf("no user key in context")}
120 }
121
122 if user.(db.User).Status != db.Confirmed {
123 return &Error{UserNotConfirmed, "user awaiting admin validation", fmt.Errorf("user '%v' not confirmed", user)}
124 }
125
126 return nil
127}
128
129func GetUser(c *gin.Context) db.User {
130 user, _ := c.Get("user")
131
132 return user.(db.User)
133}
diff --git a/cmd/ansible/.gitignore b/cmd/ansible/.gitignore
new file mode 100644
index 0000000..eeb2d6a
--- /dev/null
+++ b/cmd/ansible/.gitignore
@@ -0,0 +1,3 @@
1*.retry*
2roles/nginx
3roles/certbot
diff --git a/cmd/ansible/ansible.cfg b/cmd/ansible/ansible.cfg
new file mode 100644
index 0000000..d48a88f
--- /dev/null
+++ b/cmd/ansible/ansible.cfg
@@ -0,0 +1,3 @@
1[defaults]
2inventory = hosts
3roles_path = roles/
diff --git a/cmd/ansible/conf.toml.j2 b/cmd/ansible/conf.toml.j2
new file mode 100644
index 0000000..5f08a26
--- /dev/null
+++ b/cmd/ansible/conf.toml.j2
@@ -0,0 +1,17 @@
1log_level="info"
2mode="production"
3log_out="/var/cryptoportfolio-app/app.log"
4port="8080"
5
6[db]
7user="{{ postgres_user }}"
8password="{{ postgres_password }}"
9database="{{ postgres_database }}"
10address="localhost:5432"
11
12[api]
13domain="{{ app_domain }}"
14jwt_secret="{{ jwt_secret }}"
15
16[app]
17public_dir="/var/cryptoportfolio-app/static"
diff --git a/cmd/ansible/cryptoportfolio-app.j2 b/cmd/ansible/cryptoportfolio-app.j2
new file mode 100644
index 0000000..40979d6
--- /dev/null
+++ b/cmd/ansible/cryptoportfolio-app.j2
@@ -0,0 +1,13 @@
1[Unit]
2Description=Cryptoportfolio app
3
4[Service]
5Type=simple
6
7User={{ app_user }}
8Group={{ app_user }}
9UMask=007
10
11ExecStart=/usr/bin/cryptoportfolio-app -conf /var/cryptoportfolio-app/conf.toml
12
13Restart=on-failure
diff --git a/cmd/ansible/deploy.yml b/cmd/ansible/deploy.yml
new file mode 100644
index 0000000..b56c581
--- /dev/null
+++ b/cmd/ansible/deploy.yml
@@ -0,0 +1,105 @@
1---
2- hosts: jloup-home
3
4 tasks:
5 - include_vars: vars.yml
6
7 - name: install myservice systemd unit file
8 template: src=cryptoportfolio-app.j2 dest=/etc/systemd/system/cryptoportfolio-app.service
9 become: yes
10
11 - name: stop cryptoportfolio-app
12 systemd: state=stopped name=cryptoportfolio-app
13 become: yes
14
15 - name: Creates cryptoportfolio-app directory
16 file: path=/var/cryptoportfolio-app state=directory owner={{ app_user }}
17 become: yes
18
19 - name: Set log file.
20 file: path=/var/cryptoportfolio-app/app.log owner={{ app_user }} state=touch
21 become: yes
22
23 - name: Copy server app binary from github 'https://github.com/jloup/dist/releases/download/crypto-v{{ version }}/cryptoportfolio-linux-{{ linux_arch }}'.
24 get_url:
25 url: "https://github.com/jloup/dist/releases/download/crypto-v{{ version }}/cryptoportfolio-linux-{{ linux_arch }}"
26 dest: /usr/bin/cryptoportfolio-app
27 owner: "{{ app_user }}"
28 mode: "u=rwx,g=r,o=r"
29 become: yes
30
31 - name: Copy server app configuration file.
32 template:
33 src: conf.toml.j2
34 dest: /var/cryptoportfolio-app/conf.toml
35 owner: "{{ app_user }}"
36 become: yes
37
38 - name: Create webapp directory.
39 file: path=/var/cryptoportfolio-app/static state=directory owner={{ app_user }}
40 become: yes
41
42 - name: Copy webapp files from github 'https://github.com/jloup/dist/releases/download/crypto-v{{ version }}/webapp.tar.gz'.
43 unarchive:
44 src: "https://github.com/jloup/dist/releases/download/crypto-v{{ version }}/webapp.tar.gz"
45 dest: /var/cryptoportfolio-app/static
46 remote_src: yes
47 owner: "{{ app_user }}"
48 mode: "u=rwx,g=r,o=r"
49 become: yes
50
51 - import_role:
52 name: nginx
53 become: yes
54 vars:
55 nginx_vhosts:
56 - listen: "443 ssl"
57 server_name: "{{ app_domain }}"
58 filename: "{{ app_domain }}.443.conf"
59 extra_parameters: |
60 ssl_certificate /etc/letsencrypt/live/{{ app_domain }}/fullchain.pem;
61 ssl_certificate_key /etc/letsencrypt/live/{{ app_domain }}/privkey.pem;
62 location / {
63 proxy_pass "http://127.0.0.1:8080";
64 }
65
66 - listen: "80"
67 server_name: "{{ app_domain }}"
68 filename: "{{ app_domain}}.80.conf"
69 return: "301 https://{{ app_domain }}$request_uri"
70
71 - import_role:
72 name: certbot
73 become: yes
74 vars:
75 certbot_admin_email: jeanloup.jamet@gmail.com
76 certbot_create_if_missing: yes
77 certbot_create_standalone_stop_services: []
78 certbot_create_method: standalone
79 certbot_certs:
80 - domains:
81 - "{{ app_domain }}"
82
83 - name: Create postgres user.
84 user: name=postgres
85
86 - name: Add cryptoportfolio database.
87 postgresql_db: name={{ postgres_database }}
88 become: yes
89 become_user: postgres
90 vars:
91 ansible_ssh_pipelining: true
92
93 - name: Add cryptoportfolio user.
94 postgresql_user: user={{ postgres_user }} db={{ postgres_database }} password={{ postgres_password }}
95 become: yes
96 become_user: postgres
97 vars:
98 ansible_ssh_pipelining: true
99
100 - file: path=/www/{{ app_user }} state=directory owner={{ app_user }}
101 become: yes
102
103 - name: start cryptoportfolio-app
104 systemd: state=started name=cryptoportfolio-app daemon_reload=yes
105 become: yes
diff --git a/cmd/ansible/hosts b/cmd/ansible/hosts
new file mode 100644
index 0000000..64969e8
--- /dev/null
+++ b/cmd/ansible/hosts
@@ -0,0 +1,15 @@
1[jloup-home]
2jlj.am
3
4[jloup-home:vars]
5 ansible_port=21
6 ansible_user=ansible-deploy
7
8 app_user=jloup
9 app_domain=jlj.am
10
11 postgres_database=cryptoportfolio
12 postgres_user=cryptoportfolio
13 postgres_password=cryptoportfolio-dev
14
15 linux_arch=386 \ No newline at end of file
diff --git a/cmd/ansible/release.yml b/cmd/ansible/release.yml
new file mode 100644
index 0000000..4cd005c
--- /dev/null
+++ b/cmd/ansible/release.yml
@@ -0,0 +1,59 @@
1---
2- name: Release to github repo
3 hosts: 127.0.0.1
4 connection: local
5 tasks:
6 - include_vars: vars.yml
7
8 # Create release.
9 - github_release:
10 token: "{{ github_release_token }}"
11 user: jloup
12 repo: dist
13 action: create_release
14 tag: "crypto-v{{ version }}"
15 target: master
16 name: Crypto Release
17 body: "NOTE: this repo does not include any source code."
18
19 # Build server app.
20 - make:
21 chdir: ../app
22 target: release
23 - shell:
24 github-release upload \
25 -s "{{ github_release_token }}" \
26 -u jloup \
27 -r dist \
28 -t crypto-v{{ version }} \
29 -n "cryptoportfolio-linux-amd64" \
30 -l "cryptoportfolio binary (linux amd64)" \
31 -R \
32 -f ../app/dist/linux_amd64/cryptoportfolio-app
33 - shell:
34 github-release upload \
35 -s "{{ github_release_token }}" \
36 -u jloup \
37 -r dist \
38 -t crypto-v{{ version }} \
39 -n "cryptoportfolio-linux-386" \
40 -l "cryptoportfolio binary (linux 386)" \
41 -R \
42 -f ../app/dist/linux_386/cryptoportfolio-app
43
44 # Build webapp.
45 - make:
46 chdir: ../web
47 target: release
48 params:
49 ENV: prod
50 - shell:
51 github-release upload \
52 -s "{{ github_release_token }}" \
53 -u jloup \
54 -r dist \
55 -t crypto-v{{ version }} \
56 -n "webapp.tar.gz" \
57 -R \
58 -f ../web/build/webapp.tar.gz
59
diff --git a/cmd/ansible/requirements.yml b/cmd/ansible/requirements.yml
new file mode 100644
index 0000000..bacd7a8
--- /dev/null
+++ b/cmd/ansible/requirements.yml
@@ -0,0 +1,7 @@
1- src: geerlingguy.nginx
2 name: nginx
3 version: 2.5.0
4
5- src: geerlingguy.certbot
6 name: certbot
7 version: 3.0.0
diff --git a/cmd/ansible/vars.yml b/cmd/ansible/vars.yml
new file mode 100644
index 0000000..1de7413
--- /dev/null
+++ b/cmd/ansible/vars.yml
@@ -0,0 +1,22 @@
1$ANSIBLE_VAULT;1.1;AES256
263613535333830393037646665363566636635366534636261623839326130663431653839346266
33832643338623561313362663837323234663537663439350a313034326663383235663964626132
438343964396265323539396439383731336464393337383833653666643736303539626136383431
56536316338376538360a343862626636363031353037626462333364623433613861393137353336
637396664663030363530333364633266653862393538313835326138663465626638326363656561
730393836386664633834663838666432383836623432363936343635313835303166393531643966
833313361383565363232373066306534613465386534386266306564383365373762613361366365
961366530623863623336643531346463323233323539333139336335383439373132373233663031
1039666535633362383135376534376532333663636136366130653762643164333436313261646137
1137353139633361636163326366616234613466393731373631616138386263383131663537633533
1231393763316561623134623063623735356334363833623939313437386330323837626131356332
1330383863373535366137366138633832623566613061313138396539306536633763633934313562
1435383763653532336539346632623935303634353866636264373262363839326439313837313765
1536303539613734646238636432393166616438666665363363323331373437633362613838653564
1664393639346661646333383466363162633638643838386666383564366665656266333836363435
1735643231323362323566303535303561626139333830393538383635326631656666323166343863
1831393566346531653535393738326166303261376238316532373833616432306638326139353234
1932653132323764316231393634663262313765393230656232343833373438636430643663353965
2036333931303731646333316430646534383531313264353936396565336338663530303434643036
2134356663373533663137636235386164646334356262336464363862643332636661313339303531
2235663833656564393331636139663738323834373862623436633666306661373166
diff --git a/cmd/app/Makefile b/cmd/app/Makefile
new file mode 100644
index 0000000..628910f
--- /dev/null
+++ b/cmd/app/Makefile
@@ -0,0 +1,30 @@
1# Go parameters
2GOCMD=go
3GOBUILD=$(GOCMD) build
4GOCLEAN=$(GOCMD) clean
5GOTEST=$(GOCMD) test
6BINARY_NAME=cryptoportfolio-app
7LINUX_ARCHES=amd64 386
8DIST_DIR ?= dist
9
10build:
11 $(GOBUILD) -o $(BINARY_NAME) -v
12
13test:
14 $(GOTEST) -v ./...
15
16clean:
17 $(GOCLEAN)
18 rm -f $(BINARY_NAME)
19 rm -rf dist
20
21run: build
22 ./$(BINARY_NAME)
23
24$(addprefix $(DIST_DIR)/linux_, $(LINUX_ARCHES)):
25 mkdir -p $(@)
26 CGO_ENABLED=0 GOOS=linux GOARCH=$(subst linux_,,$(notdir $@)) $(GOBUILD) -o $@/$(BINARY_NAME) -v
27
28release: $(addprefix $(DIST_DIR)/linux_, $(LINUX_ARCHES))
29
30.PHONY: clean release
diff --git a/cmd/app/conf.toml b/cmd/app/conf.toml
new file mode 100644
index 0000000..47964b4
--- /dev/null
+++ b/cmd/app/conf.toml
@@ -0,0 +1,16 @@
1log_level="info"
2mode="dev"
3log_out="stdout"
4
5[db]
6user="cryptoportfolio"
7password="cryptoportfolio-dev"
8database="cryptoportfolio"
9address="localhost:5432"
10
11[api]
12domain="localhost"
13jwt_secret="secret"
14
15[app]
16public_dir="../web/build/static"
diff --git a/cmd/app/main.go b/cmd/app/main.go
new file mode 100644
index 0000000..e769401
--- /dev/null
+++ b/cmd/app/main.go
@@ -0,0 +1,155 @@
1package main
2
3import (
4 "fmt"
5 "path"
6 "strings"
7 "time"
8
9 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/api"
10 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
11
12 "github.com/gin-contrib/cors"
13 "github.com/gin-gonic/gin"
14 "github.com/jloup/utils"
15)
16
17var log = utils.StandardL().WithField("module", "api")
18
19type AppConfig struct {
20 PublicDir string `toml:"public_dir"`
21}
22
23type ApiConfig struct {
24 Domain string `toml:"domain"`
25 JwtSecret string `toml:"jwt_secret"`
26}
27
28type Config struct {
29 App AppConfig
30 Api ApiConfig
31 Db db.DBConfig
32
33 utils.LogConfiguration
34 Address string
35 Port string
36 Mode string
37}
38
39func (c *Config) SetToDefaults() {
40 *c = Config{
41 Address: "localhost",
42 Port: "8000",
43 Mode: "dev",
44 App: AppConfig{
45 PublicDir: "./public",
46 },
47 Api: ApiConfig{
48 JwtSecret: "secret",
49 },
50 }
51
52 c.LogConfiguration.SetToDefaults()
53}
54
55var C Config
56
57func init() {
58 utils.MustParseStdConfigFile(&C)
59
60 err := utils.ConfigureStdLogger(C.LogConfiguration)
61 if err != nil {
62 panic(err)
63 }
64
65 api.SetJwtSecretKey(C.Api.JwtSecret)
66
67 db.Init(C.Db)
68
69 if C.Mode == "production" {
70 gin.SetMode(gin.ReleaseMode)
71 }
72
73 log.Infof("CONFIG:")
74 log.Infof("LISTEN: %s", strings.Join([]string{C.Address, C.Port}, ":"))
75 log.Infof("PUBLIC_DIR: %s", C.App.PublicDir)
76}
77
78func SetApiRoute(router *gin.RouterGroup, route api.Route) {
79 switch route.Method {
80 case "GET":
81 router.GET(route.Path, route.Handlers...)
82 case "POST":
83 router.POST(route.Path, route.Handlers...)
84 case "OPTIONS":
85 router.OPTIONS(route.Path, route.Handlers...)
86 default:
87 panic(fmt.Errorf("%s method not handled", route.Method))
88 }
89}
90
91func SetGroup(router *gin.RouterGroup, group api.Group) {
92 var r *gin.RouterGroup
93 if group.Root == "" {
94 r = router
95 } else {
96 r = router.Group(group.Root)
97 }
98
99 if group.Middlewares != nil {
100 for _, middleware := range group.Middlewares {
101 r.Use(api.M(middleware))
102 }
103 }
104
105 for _, route := range group.Routes {
106 SetApiRoute(r, route)
107 }
108}
109
110func main() {
111 engine := gin.New()
112
113 apiGroup := engine.Group("/api")
114 appGroup := engine
115
116 engine.Use(gin.Recovery())
117
118 if C.Mode == "production" {
119 engine.Use(api.Logger())
120 apiGroup.Use(api.Logger())
121 } else {
122 engine.Use(gin.Logger())
123 apiGroup.Use(gin.Logger())
124 }
125
126 apiGroup.Use(cors.New(cors.Config{
127 AllowOrigins: []string{fmt.Sprintf("https://%s", C.Api.Domain)},
128 AllowMethods: []string{"POST", "GET", "OPTIONS"},
129 AllowHeaders: []string{"Authorization"},
130 ExposeHeaders: []string{"Authorization"},
131 AllowCredentials: true,
132 MaxAge: 12 * time.Hour,
133 }))
134
135 for _, group := range api.Groups {
136 SetGroup(apiGroup, group)
137 }
138
139 appGroup.Static("/public", C.App.PublicDir)
140 availableRoutes := []string{
141 "/",
142 "/signup",
143 "/signin",
144 "/signout",
145 "/me",
146 "/otp/enroll",
147 "/otp/validate",
148 }
149
150 for _, route := range availableRoutes {
151 appGroup.StaticFile(route, path.Join(C.App.PublicDir, "/index.html"))
152 }
153
154 engine.Run(strings.Join([]string{C.Address, C.Port}, ":"))
155}
diff --git a/cmd/web/.babelrc b/cmd/web/.babelrc
new file mode 100644
index 0000000..4ffef06
--- /dev/null
+++ b/cmd/web/.babelrc
@@ -0,0 +1,3 @@
1{
2 "presets": ["env", "react"]
3}
diff --git a/cmd/web/.gitignore b/cmd/web/.gitignore
new file mode 100644
index 0000000..7a7ecee
--- /dev/null
+++ b/cmd/web/.gitignore
@@ -0,0 +1,4 @@
1bower_components/
2node_modules/
3build/
4npm-debug.log
diff --git a/cmd/web/.jscsrc b/cmd/web/.jscsrc
new file mode 100644
index 0000000..4ee5db6
--- /dev/null
+++ b/cmd/web/.jscsrc
@@ -0,0 +1,5 @@
1{
2 "preset": "google",
3 "maximumLineLength": null,
4 "requireUseStrict": false
5}
diff --git a/cmd/web/.jshintrc b/cmd/web/.jshintrc
new file mode 100644
index 0000000..8e41200
--- /dev/null
+++ b/cmd/web/.jshintrc
@@ -0,0 +1,16 @@
1{
2 "eqeqeq": true,
3 "undef": true,
4 "unused": "vars",
5 "globals": {
6 "React": true,
7 "ReactDOM": true,
8 "Modernizr": true,
9 "$": true,
10 "ga": true
11 },
12 "browser": true,
13 "strict": "true",
14 "browserify": true,
15 "devel": true
16}
diff --git a/cmd/web/Makefile b/cmd/web/Makefile
new file mode 100644
index 0000000..1d98085
--- /dev/null
+++ b/cmd/web/Makefile
@@ -0,0 +1,52 @@
1SHELL=/bin/bash
2ENV ?= dev
3export PATH := $(PATH):./node_modules/.bin
4
5SRC_DIR=js
6BUILD_DIR=build/js
7JSX_SRC= main.jsx signup.jsx signin.jsx otp.jsx poloniex.jsx
8JS_SRC= cookies.js app.js api.js
9JSX_OBJS=$(addprefix $(BUILD_DIR)/,$(JSX_SRC:.jsx=.js))
10JS_OBJS=$(addprefix $(BUILD_DIR)/,$(JS_SRC))
11STATIC_BUILD_DIR=build/static
12
13install:
14 node --version
15 npm --version
16 yarn --version
17 yarn install
18
19static: js $(STATIC_BUILD_DIR)/index.html $(STATIC_BUILD_DIR)/style.css
20
21js: build/static/main.js
22
23$(STATIC_BUILD_DIR)/index.html: static/index.html
24 cp static/index.html $@
25
26$(STATIC_BUILD_DIR)/style.css: static/style.css
27 cp static/style.css $@
28
29$(BUILD_DIR)/%.js: $(SRC_DIR)/%.jsx
30 mkdir -p $(@D)
31 jscs --fix $<
32 babel $< -o $@
33 jshint $@
34
35$(BUILD_DIR)/%.js: $(SRC_DIR)/%.js
36 jscs --fix $<
37 cp $< $@
38 jshint $@
39
40build/static/main.js: $(JSX_OBJS) $(JS_OBJS) env/$(ENV).env
41 browserify -t [ localenvify --envfile env/$(ENV).env ] \
42 -t [ debowerify ] \
43 $(BUILD_DIR)/main.js -o $@
44
45build/webapp.tar.gz: $(STATIC_BUILD_DIR)/main.js $(STATIC_BUILD_DIR)/index.html $(STATIC_BUILD_DIR)/style.css
46 tar czf $@ --directory=$(dir $<) $(notdir $^)
47
48release: build/webapp.tar.gz
49
50clean:
51 rm -rf build
52 rm -rf node_modules \ No newline at end of file
diff --git a/cmd/web/env/dev.env b/cmd/web/env/dev.env
new file mode 100644
index 0000000..6b87b74
--- /dev/null
+++ b/cmd/web/env/dev.env
@@ -0,0 +1,4 @@
1API_HOST=localhost
2API_PORT=8000
3API_HTTPS=false
4
diff --git a/cmd/web/env/prod.env b/cmd/web/env/prod.env
new file mode 100644
index 0000000..9b056c1
--- /dev/null
+++ b/cmd/web/env/prod.env
@@ -0,0 +1,4 @@
1API_HOST=jlj.am
2API_PORT=""
3API_HTTPS=true
4
diff --git a/cmd/web/js/api.js b/cmd/web/js/api.js
new file mode 100644
index 0000000..e2acd1d
--- /dev/null
+++ b/cmd/web/js/api.js
@@ -0,0 +1,176 @@
1'use strict';
2
3var App = require('./app.js');
4
5var Api = {};
6
7Api.API_HOST = process.env.API_HOST;
8Api.API_PORT = process.env.API_PORT;
9
10if (process.env.API_HTTPS === 'true') {
11 Api.API_ROOT = 'https://';
12} else {
13 Api.API_ROOT = 'http://';
14}
15
16Api.API_ROOT += Api.API_HOST;
17if (Api.API_PORT !== '80') {
18 Api.API_ROOT += ':' + Api.API_PORT;
19}
20
21Api.API_ROOT += '/api';
22
23var ApiEndpoints = {
24 'SIGNUP': {
25 'type': 'POST',
26 'auth': false,
27 'parameters': [
28 {'name': 'email', 'mandatory': true, 'inquery': true},
29 {'name': 'password', 'mandatory': true, 'inquery': true}
30 ],
31 'buildUrl': function(params) {
32 return '/signup';
33 }
34 },
35 'SIGNIN': {
36 'type': 'POST',
37 'auth': false,
38 'parameters': [
39 {'name': 'email', 'mandatory': true, 'inquery': true},
40 {'name': 'password', 'mandatory': true, 'inquery': true}
41 ],
42 'buildUrl': function(params) {
43 return '/signin';
44 }
45 },
46 'MARKET': {
47 'type': 'GET',
48 'auth': true,
49 'parameters': [
50 {'name': 'name', 'mandatory': true, 'inquery': false},
51 ],
52 'buildUrl': function(params) {
53 return '/market/' + params.name;
54 }
55 },
56 'UPDATE_MARKET': {
57 'type': 'POST',
58 'auth': true,
59 'parameters': [
60 {'name': 'name', 'mandatory': true, 'inquery': false},
61 {'name': 'key', 'mandatory': true, 'inquery': true},
62 {'name': 'secret', 'mandatory': true, 'inquery': true},
63 ],
64 'buildUrl': function(params) {
65 return '/market/' + params.name + '/update';
66 }
67 },
68 'OTP_ENROLL': {
69 'type': 'GET',
70 'auth': true,
71 'parameters': [],
72 'buildUrl': function(params) {
73 return '/otp/enroll';
74 }
75 },
76 'OTP_VALIDATE': {
77 'type': 'POST',
78 'auth': true,
79 'parameters': [
80 {'name': 'pass', 'mandatory': true, 'inquery': true},
81 ],
82 'buildUrl': function(params) {
83 return '/otp/validate';
84 }
85 },
86};
87
88Api.BuildRequest = function(endpointId, params) {
89 var endpoint = ApiEndpoints[endpointId];
90 var query = {};
91 var url = '';
92 var headers = {};
93 var jwt = App.getUserToken();
94
95 if (endpoint === undefined) {
96 return {'err': 'cannot find endpoint ' + endpointId};
97 }
98
99 if (endpoint.auth === true && (jwt === undefined || jwt === null)) {
100 return {'err': 'this endpoint needs auth'};
101 }
102
103 if (jwt !== undefined && jwt !== null) {
104 headers.Authorization = 'Bearer ' + jwt;
105 }
106
107 for (var i = 0; i < endpoint.parameters.length; i++) {
108 var parameter = endpoint.parameters[i];
109 if (parameter.mandatory === true && params[parameter.name] === undefined) {
110 return {'err': 'parameter \'' + parameter.name + '\' is mandatory'};
111 }
112
113 if (parameter.inquery === true) {
114 query[parameter.name] = params[parameter.name];
115 }
116 }
117
118 url = endpoint.buildUrl(params);
119
120 return {'err': null, 'url': Api.API_ROOT + url, 'headers': headers, 'params': query, 'type': endpoint.type};
121};
122
123Api.Call = function(endpointId, params, fn) {
124 var request = Api.BuildRequest(endpointId, params);
125
126 if (request.err !== null) {
127 console.error('Api BuildRequest error', request.err);
128 fn({'err': request.err}, -1, {});
129 return null;
130 }
131
132 return Api.DoRequest(request.type, request.url, request.params, request.headers, fn);
133};
134
135Api.DoRequest = function(type, url, params, headers, callback) {
136 return $.ajax({
137 data: params,
138 headers: headers,
139 timeout: 30000,
140 dataType: 'json',
141 error: function(xhr, status, err) {
142 if (status === 'abort') {
143 return;
144 }
145
146 var apiStatus = null;
147 var apiResponse = null;
148 var apiCode = null;
149 if (xhr.responseJSON) {
150 apiStatus = xhr.responseJSON.status;
151 apiResponse = xhr.responseJSON.response;
152 apiCode = xhr.responseJSON.code;
153 }
154
155 if (xhr.status === 401 || xhr.status === 403) {
156 if (App.onUserNotAuthorized(xhr.status, apiCode) === false) {
157 return;
158 }
159 }
160
161 callback({'url': url, 'err': err, 'status': status, 'code': apiCode, 'xhr': xhr}, apiStatus, apiResponse);
162 },
163 success: function(data) {
164 var err = null;
165 if (data.status !== 'ok') {
166 err = {'url': url, 'status': status};
167 }
168 callback(err, data.status, data.response);
169 },
170 type: type,
171 url: url
172 });
173};
174
175module.exports.Api = Api;
176
diff --git a/cmd/web/js/app.js b/cmd/web/js/app.js
new file mode 100644
index 0000000..4946dcc
--- /dev/null
+++ b/cmd/web/js/app.js
@@ -0,0 +1,121 @@
1'use strict';
2
3var cookies = require('./cookies.js');
4var page = require('page');
5
6var App = {};
7var cookieExpire = 60 * 30;
8
9App.errorCodeToMessage = function(code) {
10 switch (code) {
11 case 'invalid_email':
12 return 'The email is not valid';
13 case 'invalid_password':
14 return 'The password is not valid';
15 case 'email_exists':
16 return 'This email is already registered';
17 case 'invalid_credentials':
18 return 'Invalid credentials';
19 case 'invalid_otp':
20 return 'Invalid code !';
21 case 'user_not_confirmed':
22 return 'Your account is being confirmed. Should be very soon !';
23 }
24
25 return code;
26};
27
28App.isUserSignedIn = function() {
29 return cookies.hasItem('jwt');
30};
31
32App.getUserToken = function() {
33 return cookies.getItem('jwt');
34};
35
36App.onUserSignIn = function(token) {
37 if (!token || token === '') {
38 page('/signin');
39 return;
40 }
41
42 cookies.setItem('jwt', token, cookieExpire);
43 page('/me');
44};
45
46App.onUserValidateOtp = function(token) {
47 if (!token || token === '') {
48 page('/signin');
49 return;
50 }
51
52 cookies.setItem('jwt', token, cookieExpire);
53 page('/me');
54};
55
56App.onUserSignUp = function(token) {
57 if (!token || token === '') {
58 page('/signin');
59 return;
60 }
61
62 cookies.setItem('jwt', token, cookieExpire);
63};
64
65App.getUserJWT = function() {
66 return cookies.getItem('jwt');
67};
68
69App.page = function(path, needsAuth, fn) {
70 page(path, function(context) {
71 if (needsAuth && !App.isUserSignedIn()) {
72 page('/signin');
73 return;
74 }
75
76 fn(context);
77 });
78};
79
80App.go = function(path) {
81 page(path);
82};
83
84App.start = function() {
85 page();
86};
87
88App.onInternNavigation = function(href, e) {
89 e.preventDefault();
90 page(href);
91};
92
93App.onUserNotAuthorized = function(httpCode, apiCode) {
94 switch (apiCode) {
95 case 'not_authorized':
96 cookies.removeItem('jwt');
97 page('/signin');
98 return false;
99 case 'otp_not_setup':
100 page('/otp/setup');
101 return false;
102 case 'need_otp_validation':
103 page('/otp/validate');
104 return false;
105 default:
106 return true;
107 }
108};
109
110App.mount = function(app) {
111 var root = React.createElement(
112 'div',
113 {className: 'container'},
114 app
115 );
116
117 ReactDOM.unmountComponentAtNode(document.getElementById('app'));
118 ReactDOM.render(root, document.getElementById('app'));
119};
120
121module.exports = App;
diff --git a/cmd/web/js/cookies.js b/cmd/web/js/cookies.js
new file mode 100644
index 0000000..9cc7ca9
--- /dev/null
+++ b/cmd/web/js/cookies.js
@@ -0,0 +1,65 @@
1'use strict';
2
3/*\
4|*|
5|*| :: cookies.js ::
6|*|
7|*| A complete cookies reader/writer framework with full unicode support.
8|*|
9|*| Revision #1 - September 4, 2014
10|*|
11|*| https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
12|*| https://developer.mozilla.org/User:fusionchess
13|*|
14|*| This framework is released under the GNU Public License, version 3 or later.
15|*| http://www.gnu.org/licenses/gpl-3.0-standalone.html
16|*|
17|*| Syntaxes:
18|*|
19|*| * docCookies.setItem(name, value[, end[, path[, domain[, secure]]]])
20|*| * docCookies.getItem(name)
21|*| * docCookies.removeItem(name[, path[, domain]])
22|*| * docCookies.hasItem(name)
23|*| * docCookies.keys()
24|*|
25\*/
26
27module.exports = {
28 getItem: function(sKey) {
29 if (!sKey) { return null; }
30 return decodeURIComponent(document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1')) || null;
31 },
32 setItem: function(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
33 if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; }
34 var sExpires = '';
35 if (vEnd) {
36 switch (vEnd.constructor) {
37 case Number:
38 sExpires = vEnd === Infinity ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT' : '; max-age=' + vEnd;
39 break;
40 case String:
41 sExpires = '; expires=' + vEnd;
42 break;
43 case Date:
44 sExpires = '; expires=' + vEnd.toUTCString();
45 break;
46 }
47 }
48 document.cookie = encodeURIComponent(sKey) + '=' + encodeURIComponent(sValue) + sExpires + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '') + (bSecure ? '; secure' : '');
49 return true;
50 },
51 removeItem: function(sKey, sPath, sDomain) {
52 if (!this.hasItem(sKey)) { return false; }
53 document.cookie = encodeURIComponent(sKey) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' + (sDomain ? '; domain=' + sDomain : '') + (sPath ? '; path=' + sPath : '');
54 return true;
55 },
56 hasItem: function(sKey) {
57 if (!sKey) { return false; }
58 return (new RegExp('(?:^|;\\s*)' + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, '\\$&') + '\\s*\\=')).test(document.cookie);
59 },
60 keys: function() {
61 var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, '').split(/\s*(?:\=[^;]*)?;\s*/);
62 for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); }
63 return aKeys;
64 }
65};
diff --git a/cmd/web/js/main.jsx b/cmd/web/js/main.jsx
new file mode 100644
index 0000000..eb53057
--- /dev/null
+++ b/cmd/web/js/main.jsx
@@ -0,0 +1,101 @@
1var SignupForm = require('./signup.js').SignupForm;
2var SigninForm = require('./signin.js').SigninForm;
3var OtpEnrollForm = require('./otp.js').OtpEnrollForm;
4var PoloniexForm = require('./poloniex.js').PoloniexForm;
5var App = require('./app.js');
6var Api = require('./api.js').Api;
7var cookies = require('./cookies.js');
8
9var Logo = React.createClass({
10 render: function() {
11 return (<div id='logo'>
12 <a href='/'>Cryptoportfolio</a>
13 </div>);
14 }
15});
16
17App.page('/signup', false, function(context) {
18 if (App.isUserSignedIn()) {
19 App.go('/me');
20 return;
21 }
22
23 App.mount(
24 <div>
25 <Logo />
26 <SignupForm onSuccess={App.onUserSignUp}/>
27 </div>
28 );
29});
30
31App.page('/signin', false, function(context) {
32 if (App.isUserSignedIn()) {
33 App.go('/me');
34 return;
35 }
36
37 App.mount(
38 <div>
39 <Logo />
40 <SigninForm onSuccess={App.onUserSignIn}/>
41 </div>
42 );
43});
44
45App.page('/signout', true, function(context) {
46 cookies.removeItem('jwt');
47
48 App.go('/');
49});
50
51App.page('/me', true, function(context) {
52 Api.Call('MARKET', {'name': 'poloniex'}, function(err, status, data) {
53 if (err) {
54 console.error(err, data);
55 return;
56 }
57
58 App.mount(
59 <div>
60 <Logo />
61 <p>Poloniex</p>
62 <PoloniexForm apiKey={data.key} apiSecret={data.secret}/>
63 </div>
64 );
65
66 }.bind(this));
67});
68
69App.page('/otp/setup', true, function(context) {
70 Api.Call('OTP_ENROLL', {}, function(err, status, data) {
71 if (err) {
72 console.error(err, data);
73 return;
74 }
75
76 App.mount(
77 <div>
78 <Logo />
79 <OtpEnrollForm onSuccess={App.onUserValidateOtp} img={'data:image/png;base64,' + data.base64img} secret={data.secret}/>
80 </div>
81 );
82
83 }.bind(this));
84});
85
86App.page('/otp/validate', true, function(context) {
87 App.mount(
88 <div>
89 <Logo />
90 <OtpEnrollForm onSuccess={App.onUserValidateOtp} />
91 </div>
92 );
93});
94
95App.page('/', false, function(context) {
96 App.go('/me');
97});
98
99$(document).ready(function() {
100 App.start();
101});
diff --git a/cmd/web/js/otp.jsx b/cmd/web/js/otp.jsx
new file mode 100644
index 0000000..2717d9f
--- /dev/null
+++ b/cmd/web/js/otp.jsx
@@ -0,0 +1,70 @@
1var Api = require('./api.js').Api;
2var App = require('./app.js');
3var classNames = require('classnames');
4
5var OtpQrCode = React.createClass({
6 render: function() {
7 return (
8 <div>
9 <img src={this.props.img} />
10 <p>{this.props.secret}</p>
11 </div>
12 );
13 }
14});
15
16module.exports.OtpEnrollForm = React.createClass({
17 getInitialState: function() {
18 return {'hideMsg': true, 'msg': '', 'msgOk': false, 'pass': ''};
19 },
20 handleSubmit: function(e) {
21 Api.Call('OTP_VALIDATE', {'pass': this.state.pass}, function(err, status, data) {
22 if (err) {
23 console.error(err, data);
24 this.displayMessage(App.errorCodeToMessage(err.code), false);
25 return;
26 }
27
28 this.displayMessage('OK', true);
29 this.props.onSuccess(data.token);
30
31 }.bind(this));
32
33 e.preventDefault();
34 },
35 handlePassChange: function(event) {
36 this.setState({'pass': event.target.value});
37 },
38 hideMessage: function() {
39 this.setState({'hideMsg': true});
40 },
41 displayMessage: function(msg, ok) {
42 this.setState({'msg': msg, 'msgOk': ok, 'hideMsg': false});
43 },
44 render: function() {
45 var cName = classNames('form-message', {'hidden': this.state.hideMsg, 'message-ok': this.state.msgOk});
46 var qrCode = null;
47
48 if (this.props.img) {
49 qrCode = (
50 <div className='row justify-content-center'>
51 <OtpQrCode img={this.props.img} secret={this.props.secret} />
52 </div>
53 );
54 }
55 return (
56 <div className='row otp-enroll justify-content-center'>
57 <div className='col-lg-offset-4 col-lg-4 col-md-offset-4 col-md-4 col-sm-offset-4 col-sm-4 col-xs-offset-1 col-xs-10'>
58 {qrCode}
59 <div className='row justify-content-center'>
60 <form role='form' onSubmit={this.handleSubmit}>
61 <input className='form-control' type='pass' placeholder='pass' onChange={this.handlePassChange} />
62 <input className='form-control submit' type='submit' value='Validate' />
63 <div className={cName} ref='message'>{this.state.msg}</div>
64 </form>
65 </div>
66 </div>
67 </div>
68 );
69 }
70});
diff --git a/cmd/web/js/poloniex.jsx b/cmd/web/js/poloniex.jsx
new file mode 100644
index 0000000..877198d
--- /dev/null
+++ b/cmd/web/js/poloniex.jsx
@@ -0,0 +1,49 @@
1var Api = require('./api.js').Api;
2var App = require('./app.js');
3var classNames = require('classnames');
4
5module.exports.PoloniexForm = React.createClass({
6 getInitialState: function() {
7 return {'hideMsg': true, 'msg': '', 'msgOk': false, 'apiSecret': this.props.apiSecret, 'apiKey': this.props.apiKey};
8 },
9 handleSubmit: function(e) {
10 Api.Call('UPDATE_MARKET', {'key': this.state.apiKey, 'secret': this.state.apiSecret, 'name': 'poloniex'}, function(err, status, data) {
11 if (err) {
12 console.error(err, data);
13 this.displayMessage(App.errorCodeToMessage(err.code), false);
14 return;
15 }
16
17 this.displayMessage('OK', true);
18
19 }.bind(this));
20 e.preventDefault();
21 },
22 handleApiKeyChange: function(event) {
23 this.setState({'apiKey': event.target.value});
24 },
25 handleApiSecretChange: function(event) {
26 this.setState({'apiSecret': event.target.value});
27 },
28 hideMessage: function() {
29 this.setState({'hideMsg': true});
30 },
31 displayMessage: function(msg, ok) {
32 this.setState({'msg': msg, 'msgOk': ok, 'hideMsg': false});
33 },
34 render: function() {
35 var cName = classNames('form-message', {'hidden': this.state.hideMsg, 'message-ok': this.state.msgOk});
36 return (
37 <div className='row justify-content-center api-credentials-form'>
38 <div className='col-lg-offset-4 col-lg-4 col-md-offset-4 col-md-4 col-sm-offset-4 col-sm-4 col-xs-offset-1 col-xs-10'>
39 <form role='form' onSubmit={this.handleSubmit}>
40 <input className='form-control' type='text' placeholder='apiKey' value={this.state.apiKey} onChange={this.handleApiKeyChange} />
41 <input className='form-control' type='text' placeholder='apiSecret' value={this.state.apiSecret} onChange={this.handleApiSecretChange} />
42 <input className='form-control submit' type='submit' value='Save' />
43 <div className={cName} ref='message'>{this.state.msg}</div>
44 </form>
45 </div>
46 </div>
47 );
48 }
49});
diff --git a/cmd/web/js/signin.jsx b/cmd/web/js/signin.jsx
new file mode 100644
index 0000000..443a461
--- /dev/null
+++ b/cmd/web/js/signin.jsx
@@ -0,0 +1,52 @@
1var Api = require('./api.js').Api;
2var App = require('./app.js');
3var classNames = require('classnames');
4
5module.exports.SigninForm = React.createClass({
6 getInitialState: function() {
7 return {'hideMsg': true, 'msg': '', 'msgOk': false, 'password': '', 'email': ''};
8 },
9 handleSubmit: function(e) {
10 Api.Call('SIGNIN', {'password': this.state.password, 'email': this.state.email}, function(err, status, data) {
11 if (err) {
12 console.error(err, data);
13 this.displayMessage(App.errorCodeToMessage(err.code), false);
14 return;
15 }
16
17 this.displayMessage('OK', true);
18 this.props.onSuccess(data.token);
19
20 }.bind(this));
21 e.preventDefault();
22 },
23 handlePasswordChange: function(event) {
24 this.setState({'password': event.target.value});
25 },
26 handleEmailChange: function(event) {
27 this.setState({'email': event.target.value});
28 },
29 hideMessage: function() {
30 this.setState({'hideMsg': true});
31 },
32 displayMessage: function(msg, ok) {
33 this.setState({'msg': msg, 'msgOk': ok, 'hideMsg': false});
34 },
35 render: function() {
36 var cName = classNames('form-message', {'hidden': this.state.hideMsg, 'message-ok': this.state.msgOk});
37 return (
38 <div className='row justify-content-center sign-in'>
39 <div className='col-lg-offset-4 col-lg-4 col-md-offset-4 col-md-4 col-sm-offset-4 col-sm-4 col-xs-offset-1 col-xs-10'>
40 <form role='form' onSubmit={this.handleSubmit}>
41 <input className='form-control' type='email' placeholder='email' onChange={this.handleEmailChange} />
42 <input className='form-control' type='password' placeholder='password' onChange={this.handlePasswordChange} />
43 <input className='form-control submit' type='submit' value='Sign In' />
44 <div className={cName} ref='message'>{this.state.msg}</div>
45 </form>
46 <a href='#' onClick={App.onInternNavigation.bind(this, '/signup')}><u>Sign up</u></a>
47 </div>
48 </div>
49 );
50 }
51});
52
diff --git a/cmd/web/js/signup.jsx b/cmd/web/js/signup.jsx
new file mode 100644
index 0000000..149125a
--- /dev/null
+++ b/cmd/web/js/signup.jsx
@@ -0,0 +1,56 @@
1var Api = require('./api.js').Api;
2var App = require('./app.js');
3var classNames = require('classnames');
4
5module.exports.SignupForm = React.createClass({
6 getInitialState: function() {
7 return {'hideMsg': true, 'msg': '', 'msgOk': false, 'password': '', 'email': ''};
8 },
9 handleSubmit: function(e) {
10 Api.Call('SIGNUP',
11 {
12 'password': this.state.password,
13 'email': this.state.email
14 },
15 function(err, status, data) {
16 if (err) {
17 console.error(err, data);
18 this.displayMessage(App.errorCodeToMessage(err.code), false);
19 return;
20 }
21
22 this.displayMessage('Thank You. Your account is being confirmed. Check your mailbox soon', true);
23 this.props.onSuccess(data.token);
24
25 }.bind(this));
26 e.preventDefault();
27 },
28 handlePasswordChange: function(event) {
29 this.setState({'password': event.target.value});
30 },
31 handleEmailChange: function(event) {
32 this.setState({'email': event.target.value});
33 },
34 hideMessage: function() {
35 this.setState({'hideMsg': true});
36 },
37 displayMessage: function(msg, ok) {
38 this.setState({'msg': msg, 'msgOk': ok, 'hideMsg': false});
39 },
40 render: function() {
41 var cName = classNames('form-message', {'hidden': this.state.hideMsg, 'message-ok': this.state.msgOk});
42 return (
43 <div className='row justify-content-center sign-in'>
44 <div className='col-lg-offset-4 col-lg-4 col-md-offset-4 col-md-4 col-sm-offset-4 col-sm-4 col-xs-offset-1 col-xs-10'>
45 <form role='form' onSubmit={this.handleSubmit}>
46 <input className='form-control' type='email' placeholder='email' onChange={this.handleEmailChange} />
47 <input className='form-control' type='password' placeholder='password' onChange={this.handlePasswordChange} />
48 <input className='form-control submit' type='submit' value='Sign Up' />
49 <div className={cName} ref='message'>{this.state.msg}</div>
50 <a href='#' onClick={App.onInternNavigation.bind(this, '/signin')}><u>Sign In</u></a>
51 </form>
52 </div>
53 </div>
54 );
55 }
56});
diff --git a/cmd/web/package.json b/cmd/web/package.json
new file mode 100644
index 0000000..84aac37
--- /dev/null
+++ b/cmd/web/package.json
@@ -0,0 +1,26 @@
1{
2 "name": "cryptoportfolio",
3 "version": "0.1",
4 "description": "cryptoportfolio js",
5 "main": "main.js",
6 "scripts": {
7 "test": "echo \"Error: no test specified\" && exit 1"
8 },
9 "author": "jloup",
10 "license": "ISC",
11 "dependencies": {
12 "classnames": "^2.2.5",
13 "debowerify": "^1.3.1",
14 "localenvify": "^1.0.1",
15 "page": "^1.8.3",
16 "path-to-regexp": "^1.2.1"
17 },
18 "devDependencies": {
19 "babel-cli": "^6.26.0",
20 "babel-preset-env": "^1.6.1",
21 "babel-preset-react": "^6.24.1",
22 "browserify": "^15.2.0",
23 "jscs": "^3.0.3",
24 "jshint": "^2.9.2"
25 }
26}
diff --git a/cmd/web/static/index.html b/cmd/web/static/index.html
new file mode 100644
index 0000000..9a70074
--- /dev/null
+++ b/cmd/web/static/index.html
@@ -0,0 +1,31 @@
1<!DOCTYPE html>
2<html>
3 <head>
4 <meta charset=utf-8 />
5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7 <!-- <meta name="theme-color" content="#FF6D50" /> -->
8 <!-- <link rel="shortcut icon" href="/favicon.ico"> -->
9 <!-- <link rel="icon" href="/favicon.ico"> -->
10
11 <title>Cryptoportfolio</title>
12 <link href='https://fonts.googleapis.com/css?family=Fira+Mono' rel='stylesheet' type='text/css'>
13 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
14 <link rel="stylesheet" type="text/css" href="/public/style.css"/>
15 <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
16 <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
17 <!--[if lt IE 9]>
18 <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
19 <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
20 <![endif]-->
21
22 </head>
23 <body>
24 <div id="app"><div>
25 <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
26 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
27 <script src="https://fb.me/react-0.14.0.js"></script>
28 <script src="https://fb.me/react-dom-0.14.0.js"></script>
29 <script src="/public/main.js"></script>
30 </body>
31</html>
diff --git a/cmd/web/static/style.css b/cmd/web/static/style.css
new file mode 100644
index 0000000..12af379
--- /dev/null
+++ b/cmd/web/static/style.css
@@ -0,0 +1,100 @@
1@charset "UTF-8";
2
3body {
4 font-family: 'Fira Mono', 'Helvetica Neue', Arial, Helvetica, sans-serif;
5 background-color: rgb(246, 248, 251);
6 text-align: center;
7}
8
9ul {
10 list-style-type: none;
11}
12
13a {
14 text-decoration: none;
15 color: inherit;
16}
17
18a:hover {
19 text-decoration: none;
20 color: inherit;
21}
22
23a:focus {
24 text-decoration: none;
25 color: inherit;
26}
27
28#logo {
29 text-align: center;
30 display: inline-block;
31 color: white;
32 font-size: 28px;
33 background-color: rgb(20, 20, 20);
34 border-radius: 4px;
35 font-weight: bold;
36 padding: 10px 10px 10px 10px;
37 vertical-align: middle;
38 margin-bottom: 30px;
39 margin-top: 20px;
40}
41
42.sign-in .form-control {
43 margin-bottom: 20px;
44 border-radius: 2px;
45 border: none;
46 background-color: white;
47}
48
49.sign-in .submit {
50 background-color: rgb(20, 20, 20);
51 color: white;
52}
53
54.api-credentials-form .form-control {
55 margin-bottom: 20px;
56 border-radius: 2px;
57 border: none;
58 background-color: white;
59}
60
61.api-credentials-form .submit {
62 background-color: rgb(20, 20, 20);
63 color: white;
64}
65
66.otp-enroll .form-control {
67 margin-bottom: 20px;
68 border-radius: 2px;
69 border: none;
70 background-color: white;
71}
72
73.otp-enroll .submit {
74 background-color: rgb(20, 20, 20);
75 color: white;
76}
77.form-message {
78 background-color: rgba(255, 6, 6, .33);
79 border-radius: 2px;
80 line-height: 50px;
81}
82
83.form-message.message-ok {
84 background-color: rgba(33, 255, 72, .33);
85}
86
87#main {
88 padding-top: 100px;
89}
90
91.box {
92 position: relative;
93 background-color: rgb(250, 250, 250);
94 box-shadow: 0 2px 6px 2px rgba(0,0,0,.05);
95 border-radius: 4px;
96}
97
98.box:hover {
99 box-shadow: 0 4px 15px 2px rgba(0,0,0,.20);
100}
diff --git a/cmd/web/yarn.lock b/cmd/web/yarn.lock
new file mode 100644
index 0000000..e8d57da
--- /dev/null
+++ b/cmd/web/yarn.lock
@@ -0,0 +1,3978 @@
1# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2# yarn lockfile v1
3
4
5"@browserify/acorn5-object-spread@^5.0.1":
6 version "5.0.1"
7 resolved "https://registry.yarnpkg.com/@browserify/acorn5-object-spread/-/acorn5-object-spread-5.0.1.tgz#92e9b37f97beac9ec429a3cc479ded380297540c"
8 dependencies:
9 acorn "^5.2.1"
10
11JSONStream@^1.0.3:
12 version "1.3.2"
13 resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
14 dependencies:
15 jsonparse "^1.2.0"
16 through ">=2.2.7 <3"
17
18"JSV@>= 4.0.x":
19 version "4.0.2"
20 resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57"
21
22abbrev@1, abbrev@~1.0.4:
23 version "1.0.9"
24 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
25
26acorn@^4.0.3:
27 version "4.0.13"
28 resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
29
30acorn@^5.2.1:
31 version "5.4.1"
32 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102"
33
34ajv@^4.9.1:
35 version "4.11.8"
36 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
37 dependencies:
38 co "^4.6.0"
39 json-stable-stringify "^1.0.1"
40
41amdefine@>=0.0.4:
42 version "1.0.1"
43 resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
44
45ansi-regex@^0.1.0:
46 version "0.1.0"
47 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.1.0.tgz#55ca60db6900857c423ae9297980026f941ed903"
48
49ansi-regex@^0.2.0, ansi-regex@^0.2.1:
50 version "0.2.1"
51 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
52
53ansi-regex@^1.0.0:
54 version "1.1.1"
55 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d"
56
57ansi-regex@^2.0.0:
58 version "2.1.1"
59 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
60
61ansi-styles@^1.1.0:
62 version "1.1.0"
63 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de"
64
65ansi-styles@^2.2.1:
66 version "2.2.1"
67 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
68
69ansi-styles@~1.0.0:
70 version "1.0.0"
71 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
72
73anymatch@^1.3.0:
74 version "1.3.2"
75 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
76 dependencies:
77 micromatch "^2.1.5"
78 normalize-path "^2.0.0"
79
80aproba@^1.0.3:
81 version "1.2.0"
82 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
83
84archy@0.0.2:
85 version "0.0.2"
86 resolved "https://registry.yarnpkg.com/archy/-/archy-0.0.2.tgz#910f43bf66141fc335564597abc189df44b3d35e"
87
88are-we-there-yet@~1.1.2:
89 version "1.1.4"
90 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
91 dependencies:
92 delegates "^1.0.0"
93 readable-stream "^2.0.6"
94
95argparse@^1.0.2:
96 version "1.0.9"
97 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
98 dependencies:
99 sprintf-js "~1.0.2"
100
101arr-diff@^2.0.0:
102 version "2.0.0"
103 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
104 dependencies:
105 arr-flatten "^1.0.1"
106
107arr-flatten@^1.0.1:
108 version "1.1.0"
109 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
110
111array-filter@~0.0.0:
112 version "0.0.1"
113 resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
114
115array-map@~0.0.0:
116 version "0.0.0"
117 resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
118
119array-reduce@~0.0.0:
120 version "0.0.0"
121 resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
122
123array-unique@^0.2.1:
124 version "0.2.1"
125 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
126
127asn1.js@^4.0.0:
128 version "4.9.2"
129 resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a"
130 dependencies:
131 bn.js "^4.0.0"
132 inherits "^2.0.1"
133 minimalistic-assert "^1.0.0"
134
135asn1@0.1.11:
136 version "0.1.11"
137 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7"
138
139asn1@~0.2.3:
140 version "0.2.3"
141 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
142
143assert-plus@1.0.0, assert-plus@^1.0.0:
144 version "1.0.0"
145 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
146
147assert-plus@^0.1.5:
148 version "0.1.5"
149 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160"
150
151assert-plus@^0.2.0:
152 version "0.2.0"
153 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
154
155assert@^1.4.0:
156 version "1.4.1"
157 resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
158 dependencies:
159 util "0.10.3"
160
161ast-types@0.9.6:
162 version "0.9.6"
163 resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
164
165astw@^2.0.0:
166 version "2.2.0"
167 resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
168 dependencies:
169 acorn "^4.0.3"
170
171async-each@^1.0.0:
172 version "1.0.1"
173 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
174
175async@0.2.x, async@~0.2.6, async@~0.2.8, async@~0.2.9:
176 version "0.2.10"
177 resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
178
179async@^0.9.0, async@~0.9.0:
180 version "0.9.2"
181 resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
182
183asynckit@^0.4.0:
184 version "0.4.0"
185 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
186
187aws-sign2@~0.5.0:
188 version "0.5.0"
189 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63"
190
191aws-sign2@~0.6.0:
192 version "0.6.0"
193 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
194
195aws4@^1.2.1:
196 version "1.6.0"
197 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
198
199babel-cli@^6.26.0:
200 version "6.26.0"
201 resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1"
202 dependencies:
203 babel-core "^6.26.0"
204 babel-polyfill "^6.26.0"
205 babel-register "^6.26.0"
206 babel-runtime "^6.26.0"
207 commander "^2.11.0"
208 convert-source-map "^1.5.0"
209 fs-readdir-recursive "^1.0.0"
210 glob "^7.1.2"
211 lodash "^4.17.4"
212 output-file-sync "^1.1.2"
213 path-is-absolute "^1.0.1"
214 slash "^1.0.0"
215 source-map "^0.5.6"
216 v8flags "^2.1.1"
217 optionalDependencies:
218 chokidar "^1.6.1"
219
220babel-code-frame@^6.26.0:
221 version "6.26.0"
222 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
223 dependencies:
224 chalk "^1.1.3"
225 esutils "^2.0.2"
226 js-tokens "^3.0.2"
227
228babel-core@^6.26.0:
229 version "6.26.0"
230 resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
231 dependencies:
232 babel-code-frame "^6.26.0"
233 babel-generator "^6.26.0"
234 babel-helpers "^6.24.1"
235 babel-messages "^6.23.0"
236 babel-register "^6.26.0"
237 babel-runtime "^6.26.0"
238 babel-template "^6.26.0"
239 babel-traverse "^6.26.0"
240 babel-types "^6.26.0"
241 babylon "^6.18.0"
242 convert-source-map "^1.5.0"
243 debug "^2.6.8"
244 json5 "^0.5.1"
245 lodash "^4.17.4"
246 minimatch "^3.0.4"
247 path-is-absolute "^1.0.1"
248 private "^0.1.7"
249 slash "^1.0.0"
250 source-map "^0.5.6"
251
252babel-generator@^6.26.0:
253 version "6.26.1"
254 resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
255 dependencies:
256 babel-messages "^6.23.0"
257 babel-runtime "^6.26.0"
258 babel-types "^6.26.0"
259 detect-indent "^4.0.0"
260 jsesc "^1.3.0"
261 lodash "^4.17.4"
262 source-map "^0.5.7"
263 trim-right "^1.0.1"
264
265babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
266 version "6.24.1"
267 resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
268 dependencies:
269 babel-helper-explode-assignable-expression "^6.24.1"
270 babel-runtime "^6.22.0"
271 babel-types "^6.24.1"
272
273babel-helper-builder-react-jsx@^6.24.1:
274 version "6.26.0"
275 resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
276 dependencies:
277 babel-runtime "^6.26.0"
278 babel-types "^6.26.0"
279 esutils "^2.0.2"
280
281babel-helper-call-delegate@^6.24.1:
282 version "6.24.1"
283 resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
284 dependencies:
285 babel-helper-hoist-variables "^6.24.1"
286 babel-runtime "^6.22.0"
287 babel-traverse "^6.24.1"
288 babel-types "^6.24.1"
289
290babel-helper-define-map@^6.24.1:
291 version "6.26.0"
292 resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
293 dependencies:
294 babel-helper-function-name "^6.24.1"
295 babel-runtime "^6.26.0"
296 babel-types "^6.26.0"
297 lodash "^4.17.4"
298
299babel-helper-explode-assignable-expression@^6.24.1:
300 version "6.24.1"
301 resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
302 dependencies:
303 babel-runtime "^6.22.0"
304 babel-traverse "^6.24.1"
305 babel-types "^6.24.1"
306
307babel-helper-function-name@^6.24.1:
308 version "6.24.1"
309 resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
310 dependencies:
311 babel-helper-get-function-arity "^6.24.1"
312 babel-runtime "^6.22.0"
313 babel-template "^6.24.1"
314 babel-traverse "^6.24.1"
315 babel-types "^6.24.1"
316
317babel-helper-get-function-arity@^6.24.1:
318 version "6.24.1"
319 resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
320 dependencies:
321 babel-runtime "^6.22.0"
322 babel-types "^6.24.1"
323
324babel-helper-hoist-variables@^6.24.1:
325 version "6.24.1"
326 resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
327 dependencies:
328 babel-runtime "^6.22.0"
329 babel-types "^6.24.1"
330
331babel-helper-optimise-call-expression@^6.24.1:
332 version "6.24.1"
333 resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
334 dependencies:
335 babel-runtime "^6.22.0"
336 babel-types "^6.24.1"
337
338babel-helper-regex@^6.24.1:
339 version "6.26.0"
340 resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
341 dependencies:
342 babel-runtime "^6.26.0"
343 babel-types "^6.26.0"
344 lodash "^4.17.4"
345
346babel-helper-remap-async-to-generator@^6.24.1:
347 version "6.24.1"
348 resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
349 dependencies:
350 babel-helper-function-name "^6.24.1"
351 babel-runtime "^6.22.0"
352 babel-template "^6.24.1"
353 babel-traverse "^6.24.1"
354 babel-types "^6.24.1"
355
356babel-helper-replace-supers@^6.24.1:
357 version "6.24.1"
358 resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
359 dependencies:
360 babel-helper-optimise-call-expression "^6.24.1"
361 babel-messages "^6.23.0"
362 babel-runtime "^6.22.0"
363 babel-template "^6.24.1"
364 babel-traverse "^6.24.1"
365 babel-types "^6.24.1"
366
367babel-helpers@^6.24.1:
368 version "6.24.1"
369 resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
370 dependencies:
371 babel-runtime "^6.22.0"
372 babel-template "^6.24.1"
373
374babel-messages@^6.23.0:
375 version "6.23.0"
376 resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
377 dependencies:
378 babel-runtime "^6.22.0"
379
380babel-plugin-check-es2015-constants@^6.22.0:
381 version "6.22.0"
382 resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
383 dependencies:
384 babel-runtime "^6.22.0"
385
386babel-plugin-syntax-async-functions@^6.8.0:
387 version "6.13.0"
388 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
389
390babel-plugin-syntax-exponentiation-operator@^6.8.0:
391 version "6.13.0"
392 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
393
394babel-plugin-syntax-flow@^6.18.0:
395 version "6.18.0"
396 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
397
398babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
399 version "6.18.0"
400 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
401
402babel-plugin-syntax-trailing-function-commas@^6.22.0:
403 version "6.22.0"
404 resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
405
406babel-plugin-transform-async-to-generator@^6.22.0:
407 version "6.24.1"
408 resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
409 dependencies:
410 babel-helper-remap-async-to-generator "^6.24.1"
411 babel-plugin-syntax-async-functions "^6.8.0"
412 babel-runtime "^6.22.0"
413
414babel-plugin-transform-es2015-arrow-functions@^6.22.0:
415 version "6.22.0"
416 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
417 dependencies:
418 babel-runtime "^6.22.0"
419
420babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
421 version "6.22.0"
422 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
423 dependencies:
424 babel-runtime "^6.22.0"
425
426babel-plugin-transform-es2015-block-scoping@^6.23.0:
427 version "6.26.0"
428 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
429 dependencies:
430 babel-runtime "^6.26.0"
431 babel-template "^6.26.0"
432 babel-traverse "^6.26.0"
433 babel-types "^6.26.0"
434 lodash "^4.17.4"
435
436babel-plugin-transform-es2015-classes@^6.23.0:
437 version "6.24.1"
438 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
439 dependencies:
440 babel-helper-define-map "^6.24.1"
441 babel-helper-function-name "^6.24.1"
442 babel-helper-optimise-call-expression "^6.24.1"
443 babel-helper-replace-supers "^6.24.1"
444 babel-messages "^6.23.0"
445 babel-runtime "^6.22.0"
446 babel-template "^6.24.1"
447 babel-traverse "^6.24.1"
448 babel-types "^6.24.1"
449
450babel-plugin-transform-es2015-computed-properties@^6.22.0:
451 version "6.24.1"
452 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
453 dependencies:
454 babel-runtime "^6.22.0"
455 babel-template "^6.24.1"
456
457babel-plugin-transform-es2015-destructuring@^6.23.0:
458 version "6.23.0"
459 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
460 dependencies:
461 babel-runtime "^6.22.0"
462
463babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
464 version "6.24.1"
465 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
466 dependencies:
467 babel-runtime "^6.22.0"
468 babel-types "^6.24.1"
469
470babel-plugin-transform-es2015-for-of@^6.23.0:
471 version "6.23.0"
472 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
473 dependencies:
474 babel-runtime "^6.22.0"
475
476babel-plugin-transform-es2015-function-name@^6.22.0:
477 version "6.24.1"
478 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
479 dependencies:
480 babel-helper-function-name "^6.24.1"
481 babel-runtime "^6.22.0"
482 babel-types "^6.24.1"
483
484babel-plugin-transform-es2015-literals@^6.22.0:
485 version "6.22.0"
486 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
487 dependencies:
488 babel-runtime "^6.22.0"
489
490babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
491 version "6.24.1"
492 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
493 dependencies:
494 babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
495 babel-runtime "^6.22.0"
496 babel-template "^6.24.1"
497
498babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
499 version "6.26.0"
500 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
501 dependencies:
502 babel-plugin-transform-strict-mode "^6.24.1"
503 babel-runtime "^6.26.0"
504 babel-template "^6.26.0"
505 babel-types "^6.26.0"
506
507babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
508 version "6.24.1"
509 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
510 dependencies:
511 babel-helper-hoist-variables "^6.24.1"
512 babel-runtime "^6.22.0"
513 babel-template "^6.24.1"
514
515babel-plugin-transform-es2015-modules-umd@^6.23.0:
516 version "6.24.1"
517 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
518 dependencies:
519 babel-plugin-transform-es2015-modules-amd "^6.24.1"
520 babel-runtime "^6.22.0"
521 babel-template "^6.24.1"
522
523babel-plugin-transform-es2015-object-super@^6.22.0:
524 version "6.24.1"
525 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
526 dependencies:
527 babel-helper-replace-supers "^6.24.1"
528 babel-runtime "^6.22.0"
529
530babel-plugin-transform-es2015-parameters@^6.23.0:
531 version "6.24.1"
532 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
533 dependencies:
534 babel-helper-call-delegate "^6.24.1"
535 babel-helper-get-function-arity "^6.24.1"
536 babel-runtime "^6.22.0"
537 babel-template "^6.24.1"
538 babel-traverse "^6.24.1"
539 babel-types "^6.24.1"
540
541babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
542 version "6.24.1"
543 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
544 dependencies:
545 babel-runtime "^6.22.0"
546 babel-types "^6.24.1"
547
548babel-plugin-transform-es2015-spread@^6.22.0:
549 version "6.22.0"
550 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
551 dependencies:
552 babel-runtime "^6.22.0"
553
554babel-plugin-transform-es2015-sticky-regex@^6.22.0:
555 version "6.24.1"
556 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
557 dependencies:
558 babel-helper-regex "^6.24.1"
559 babel-runtime "^6.22.0"
560 babel-types "^6.24.1"
561
562babel-plugin-transform-es2015-template-literals@^6.22.0:
563 version "6.22.0"
564 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
565 dependencies:
566 babel-runtime "^6.22.0"
567
568babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
569 version "6.23.0"
570 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
571 dependencies:
572 babel-runtime "^6.22.0"
573
574babel-plugin-transform-es2015-unicode-regex@^6.22.0:
575 version "6.24.1"
576 resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
577 dependencies:
578 babel-helper-regex "^6.24.1"
579 babel-runtime "^6.22.0"
580 regexpu-core "^2.0.0"
581
582babel-plugin-transform-exponentiation-operator@^6.22.0:
583 version "6.24.1"
584 resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
585 dependencies:
586 babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
587 babel-plugin-syntax-exponentiation-operator "^6.8.0"
588 babel-runtime "^6.22.0"
589
590babel-plugin-transform-flow-strip-types@^6.22.0:
591 version "6.22.0"
592 resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
593 dependencies:
594 babel-plugin-syntax-flow "^6.18.0"
595 babel-runtime "^6.22.0"
596
597babel-plugin-transform-react-display-name@^6.23.0:
598 version "6.25.0"
599 resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
600 dependencies:
601 babel-runtime "^6.22.0"
602
603babel-plugin-transform-react-jsx-self@^6.22.0:
604 version "6.22.0"
605 resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
606 dependencies:
607 babel-plugin-syntax-jsx "^6.8.0"
608 babel-runtime "^6.22.0"
609
610babel-plugin-transform-react-jsx-source@^6.22.0:
611 version "6.22.0"
612 resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
613 dependencies:
614 babel-plugin-syntax-jsx "^6.8.0"
615 babel-runtime "^6.22.0"
616
617babel-plugin-transform-react-jsx@^6.24.1:
618 version "6.24.1"
619 resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
620 dependencies:
621 babel-helper-builder-react-jsx "^6.24.1"
622 babel-plugin-syntax-jsx "^6.8.0"
623 babel-runtime "^6.22.0"
624
625babel-plugin-transform-regenerator@^6.22.0:
626 version "6.26.0"
627 resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
628 dependencies:
629 regenerator-transform "^0.10.0"
630
631babel-plugin-transform-strict-mode@^6.24.1:
632 version "6.24.1"
633 resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
634 dependencies:
635 babel-runtime "^6.22.0"
636 babel-types "^6.24.1"
637
638babel-polyfill@^6.26.0:
639 version "6.26.0"
640 resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
641 dependencies:
642 babel-runtime "^6.26.0"
643 core-js "^2.5.0"
644 regenerator-runtime "^0.10.5"
645
646babel-preset-env@^1.6.1:
647 version "1.6.1"
648 resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
649 dependencies:
650 babel-plugin-check-es2015-constants "^6.22.0"
651 babel-plugin-syntax-trailing-function-commas "^6.22.0"
652 babel-plugin-transform-async-to-generator "^6.22.0"
653 babel-plugin-transform-es2015-arrow-functions "^6.22.0"
654 babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
655 babel-plugin-transform-es2015-block-scoping "^6.23.0"
656 babel-plugin-transform-es2015-classes "^6.23.0"
657 babel-plugin-transform-es2015-computed-properties "^6.22.0"
658 babel-plugin-transform-es2015-destructuring "^6.23.0"
659 babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
660 babel-plugin-transform-es2015-for-of "^6.23.0"
661 babel-plugin-transform-es2015-function-name "^6.22.0"
662 babel-plugin-transform-es2015-literals "^6.22.0"
663 babel-plugin-transform-es2015-modules-amd "^6.22.0"
664 babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
665 babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
666 babel-plugin-transform-es2015-modules-umd "^6.23.0"
667 babel-plugin-transform-es2015-object-super "^6.22.0"
668 babel-plugin-transform-es2015-parameters "^6.23.0"
669 babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
670 babel-plugin-transform-es2015-spread "^6.22.0"
671 babel-plugin-transform-es2015-sticky-regex "^6.22.0"
672 babel-plugin-transform-es2015-template-literals "^6.22.0"
673 babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
674 babel-plugin-transform-es2015-unicode-regex "^6.22.0"
675 babel-plugin-transform-exponentiation-operator "^6.22.0"
676 babel-plugin-transform-regenerator "^6.22.0"
677 browserslist "^2.1.2"
678 invariant "^2.2.2"
679 semver "^5.3.0"
680
681babel-preset-flow@^6.23.0:
682 version "6.23.0"
683 resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
684 dependencies:
685 babel-plugin-transform-flow-strip-types "^6.22.0"
686
687babel-preset-react@^6.24.1:
688 version "6.24.1"
689 resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
690 dependencies:
691 babel-plugin-syntax-jsx "^6.3.13"
692 babel-plugin-transform-react-display-name "^6.23.0"
693 babel-plugin-transform-react-jsx "^6.24.1"
694 babel-plugin-transform-react-jsx-self "^6.22.0"
695 babel-plugin-transform-react-jsx-source "^6.22.0"
696 babel-preset-flow "^6.23.0"
697
698babel-register@^6.26.0:
699 version "6.26.0"
700 resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
701 dependencies:
702 babel-core "^6.26.0"
703 babel-runtime "^6.26.0"
704 core-js "^2.5.0"
705 home-or-tmp "^2.0.0"
706 lodash "^4.17.4"
707 mkdirp "^0.5.1"
708 source-map-support "^0.4.15"
709
710babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
711 version "6.26.0"
712 resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
713 dependencies:
714 core-js "^2.4.0"
715 regenerator-runtime "^0.11.0"
716
717babel-template@^6.24.1, babel-template@^6.26.0:
718 version "6.26.0"
719 resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
720 dependencies:
721 babel-runtime "^6.26.0"
722 babel-traverse "^6.26.0"
723 babel-types "^6.26.0"
724 babylon "^6.18.0"
725 lodash "^4.17.4"
726
727babel-traverse@^6.24.1, babel-traverse@^6.26.0:
728 version "6.26.0"
729 resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
730 dependencies:
731 babel-code-frame "^6.26.0"
732 babel-messages "^6.23.0"
733 babel-runtime "^6.26.0"
734 babel-types "^6.26.0"
735 babylon "^6.18.0"
736 debug "^2.6.8"
737 globals "^9.18.0"
738 invariant "^2.2.2"
739 lodash "^4.17.4"
740
741babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
742 version "6.26.0"
743 resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
744 dependencies:
745 babel-runtime "^6.26.0"
746 esutils "^2.0.2"
747 lodash "^4.17.4"
748 to-fast-properties "^1.0.3"
749
750babylon@^6.18.0, babylon@^6.8.1:
751 version "6.18.0"
752 resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
753
754balanced-match@^1.0.0:
755 version "1.0.0"
756 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
757
758base62@^1.1.0:
759 version "1.2.1"
760 resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.1.tgz#95a5a22350b0a557f3f081247fc2c398803ecb0c"
761
762base64-js@^1.0.2:
763 version "1.2.1"
764 resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
765
766bcrypt-pbkdf@^1.0.0:
767 version "1.0.1"
768 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
769 dependencies:
770 tweetnacl "^0.14.3"
771
772binary-extensions@^1.0.0:
773 version "1.11.0"
774 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
775
776binary@~0.3.0:
777 version "0.3.0"
778 resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
779 dependencies:
780 buffers "~0.1.1"
781 chainsaw "~0.1.0"
782
783bl@^0.9.0, bl@~0.9.0:
784 version "0.9.5"
785 resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054"
786 dependencies:
787 readable-stream "~1.0.26"
788
789block-stream@*:
790 version "0.0.9"
791 resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
792 dependencies:
793 inherits "~2.0.0"
794
795bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
796 version "4.11.8"
797 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
798
799boom@0.4.x:
800 version "0.4.2"
801 resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b"
802 dependencies:
803 hoek "0.9.x"
804
805boom@2.x.x:
806 version "2.10.1"
807 resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
808 dependencies:
809 hoek "2.x.x"
810
811bower-config@~0.5.0, bower-config@~0.5.2:
812 version "0.5.3"
813 resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-0.5.3.tgz#98fc5b41a87870ef9cbb9297635cf81f5505fdb1"
814 dependencies:
815 graceful-fs "~2.0.0"
816 mout "~0.9.0"
817 optimist "~0.6.0"
818 osenv "0.0.3"
819
820bower-endpoint-parser@~0.2.2:
821 version "0.2.2"
822 resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6"
823
824bower-json@~0.4.0:
825 version "0.4.0"
826 resolved "https://registry.yarnpkg.com/bower-json/-/bower-json-0.4.0.tgz#a99c3ccf416ef0590ed0ded252c760f1c6d93766"
827 dependencies:
828 deep-extend "~0.2.5"
829 graceful-fs "~2.0.0"
830 intersect "~0.0.3"
831
832bower-logger@~0.2.2:
833 version "0.2.2"
834 resolved "https://registry.yarnpkg.com/bower-logger/-/bower-logger-0.2.2.tgz#39be07e979b2fc8e03a94634205ed9422373d381"
835
836bower-registry-client@~0.2.0:
837 version "0.2.4"
838 resolved "https://registry.yarnpkg.com/bower-registry-client/-/bower-registry-client-0.2.4.tgz#269fc7e898b627fb939d1144a593254d7fbbeebc"
839 dependencies:
840 async "~0.2.8"
841 bower-config "~0.5.0"
842 graceful-fs "~2.0.0"
843 lru-cache "~2.3.0"
844 mkdirp "~0.3.5"
845 request "~2.51.0"
846 request-replay "~0.2.0"
847 rimraf "~2.2.0"
848
849bower@~1.3.12:
850 version "1.3.12"
851 resolved "https://registry.yarnpkg.com/bower/-/bower-1.3.12.tgz#37de0edb3904baf90aee13384a1a379a05ee214c"
852 dependencies:
853 abbrev "~1.0.4"
854 archy "0.0.2"
855 bower-config "~0.5.2"
856 bower-endpoint-parser "~0.2.2"
857 bower-json "~0.4.0"
858 bower-logger "~0.2.2"
859 bower-registry-client "~0.2.0"
860 cardinal "0.4.0"
861 chalk "0.5.0"
862 chmodr "0.1.0"
863 decompress-zip "0.0.8"
864 fstream "~1.0.2"
865 fstream-ignore "~1.0.1"
866 glob "~4.0.2"
867 graceful-fs "~3.0.1"
868 handlebars "~2.0.0"
869 inquirer "0.7.1"
870 insight "0.4.3"
871 is-root "~1.0.0"
872 junk "~1.0.0"
873 lockfile "~1.0.0"
874 lru-cache "~2.5.0"
875 mkdirp "0.5.0"
876 mout "~0.9.0"
877 nopt "~3.0.0"
878 opn "~1.0.0"
879 osenv "0.1.0"
880 p-throttler "0.1.0"
881 promptly "0.2.0"
882 q "~1.0.1"
883 request "~2.42.0"
884 request-progress "0.3.0"
885 retry "0.6.0"
886 rimraf "~2.2.0"
887 semver "~2.3.0"
888 shell-quote "~1.4.1"
889 stringify-object "~1.0.0"
890 tar-fs "0.5.2"
891 tmp "0.0.23"
892 update-notifier "0.2.0"
893 which "~1.0.5"
894
895brace-expansion@^1.1.7:
896 version "1.1.8"
897 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
898 dependencies:
899 balanced-match "^1.0.0"
900 concat-map "0.0.1"
901
902braces@^1.8.2:
903 version "1.8.5"
904 resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
905 dependencies:
906 expand-range "^1.8.1"
907 preserve "^0.2.0"
908 repeat-element "^1.1.2"
909
910brorand@^1.0.1:
911 version "1.1.0"
912 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
913
914browser-pack@^6.0.1:
915 version "6.0.3"
916 resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.3.tgz#91ca96518583ef580ab063a309de62e407767a39"
917 dependencies:
918 JSONStream "^1.0.3"
919 combine-source-map "~0.8.0"
920 defined "^1.0.0"
921 safe-buffer "^5.1.1"
922 through2 "^2.0.0"
923 umd "^3.0.0"
924
925browser-resolve@^1.11.0, browser-resolve@^1.7.0:
926 version "1.11.2"
927 resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
928 dependencies:
929 resolve "1.1.7"
930
931browserify-aes@^1.0.0, browserify-aes@^1.0.4:
932 version "1.1.1"
933 resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
934 dependencies:
935 buffer-xor "^1.0.3"
936 cipher-base "^1.0.0"
937 create-hash "^1.1.0"
938 evp_bytestokey "^1.0.3"
939 inherits "^2.0.1"
940 safe-buffer "^5.0.1"
941
942browserify-cipher@^1.0.0:
943 version "1.0.0"
944 resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
945 dependencies:
946 browserify-aes "^1.0.4"
947 browserify-des "^1.0.0"
948 evp_bytestokey "^1.0.0"
949
950browserify-des@^1.0.0:
951 version "1.0.0"
952 resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
953 dependencies:
954 cipher-base "^1.0.1"
955 des.js "^1.0.0"
956 inherits "^2.0.1"
957
958browserify-rsa@^4.0.0:
959 version "4.0.1"
960 resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
961 dependencies:
962 bn.js "^4.1.0"
963 randombytes "^2.0.1"
964
965browserify-sign@^4.0.0:
966 version "4.0.4"
967 resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
968 dependencies:
969 bn.js "^4.1.1"
970 browserify-rsa "^4.0.0"
971 create-hash "^1.1.0"
972 create-hmac "^1.1.2"
973 elliptic "^6.0.0"
974 inherits "^2.0.1"
975 parse-asn1 "^5.0.0"
976
977browserify-zlib@~0.2.0:
978 version "0.2.0"
979 resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
980 dependencies:
981 pako "~1.0.5"
982
983browserify@^15.2.0:
984 version "15.2.0"
985 resolved "https://registry.yarnpkg.com/browserify/-/browserify-15.2.0.tgz#1e121ba1fa72cf9fd2d8df002f8674b68b45df89"
986 dependencies:
987 JSONStream "^1.0.3"
988 assert "^1.4.0"
989 browser-pack "^6.0.1"
990 browser-resolve "^1.11.0"
991 browserify-zlib "~0.2.0"
992 buffer "^5.0.2"
993 cached-path-relative "^1.0.0"
994 concat-stream "~1.5.1"
995 console-browserify "^1.1.0"
996 constants-browserify "~1.0.0"
997 crypto-browserify "^3.0.0"
998 defined "^1.0.0"
999 deps-sort "^2.0.0"
1000 domain-browser "~1.1.0"
1001 duplexer2 "~0.1.2"
1002 events "~1.1.0"
1003 glob "^7.1.0"
1004 has "^1.0.0"
1005 htmlescape "^1.1.0"
1006 https-browserify "^1.0.0"
1007 inherits "~2.0.1"
1008 insert-module-globals "^7.0.0"
1009 labeled-stream-splicer "^2.0.0"
1010 mkdirp "^0.5.0"
1011 module-deps "^5.0.1"
1012 os-browserify "~0.3.0"
1013 parents "^1.0.1"
1014 path-browserify "~0.0.0"
1015 process "~0.11.0"
1016 punycode "^1.3.2"
1017 querystring-es3 "~0.2.0"
1018 read-only-stream "^2.0.0"
1019 readable-stream "^2.0.2"
1020 resolve "^1.1.4"
1021 shasum "^1.0.0"
1022 shell-quote "^1.6.1"
1023 stream-browserify "^2.0.0"
1024 stream-http "^2.0.0"
1025 string_decoder "~1.0.0"
1026 subarg "^1.0.0"
1027 syntax-error "^1.1.1"
1028 through2 "^2.0.0"
1029 timers-browserify "^1.0.1"
1030 tty-browserify "~0.0.0"
1031 url "~0.11.0"
1032 util "~0.10.1"
1033 vm-browserify "~0.0.1"
1034 xtend "^4.0.0"
1035
1036browserslist@^2.1.2:
1037 version "2.11.3"
1038 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
1039 dependencies:
1040 caniuse-lite "^1.0.30000792"
1041 electron-to-chromium "^1.3.30"
1042
1043buffer-xor@^1.0.3:
1044 version "1.0.3"
1045 resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
1046
1047buffer@^5.0.2:
1048 version "5.0.8"
1049 resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.8.tgz#84daa52e7cf2fa8ce4195bc5cf0f7809e0930b24"
1050 dependencies:
1051 base64-js "^1.0.2"
1052 ieee754 "^1.1.4"
1053
1054buffers@~0.1.1:
1055 version "0.1.1"
1056 resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
1057
1058builtin-status-codes@^3.0.0:
1059 version "3.0.0"
1060 resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
1061
1062cached-path-relative@^1.0.0:
1063 version "1.0.1"
1064 resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
1065
1066caniuse-lite@^1.0.30000792:
1067 version "1.0.30000803"
1068 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000803.tgz#9939c37149d38d5f4540430490d240c03106a0f5"
1069
1070cardinal@0.4.0:
1071 version "0.4.0"
1072 resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-0.4.0.tgz#7d10aafb20837bde043c45e43a0c8c28cdaae45e"
1073 dependencies:
1074 redeyed "~0.4.0"
1075
1076caseless@~0.12.0:
1077 version "0.12.0"
1078 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
1079
1080caseless@~0.6.0:
1081 version "0.6.0"
1082 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4"
1083
1084caseless@~0.8.0:
1085 version "0.8.0"
1086 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.8.0.tgz#5bca2881d41437f54b2407ebe34888c7b9ad4f7d"
1087
1088chainsaw@~0.1.0:
1089 version "0.1.0"
1090 resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
1091 dependencies:
1092 traverse ">=0.3.0 <0.4"
1093
1094chalk@0.5.0:
1095 version "0.5.0"
1096 resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.0.tgz#375dfccbc21c0a60a8b61bc5b78f3dc2a55c212f"
1097 dependencies:
1098 ansi-styles "^1.1.0"
1099 escape-string-regexp "^1.0.0"
1100 has-ansi "^0.1.0"
1101 strip-ansi "^0.3.0"
1102 supports-color "^0.2.0"
1103
1104chalk@^0.5.0, chalk@^0.5.1:
1105 version "0.5.1"
1106 resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174"
1107 dependencies:
1108 ansi-styles "^1.1.0"
1109 escape-string-regexp "^1.0.0"
1110 has-ansi "^0.1.0"
1111 strip-ansi "^0.3.0"
1112 supports-color "^0.2.0"
1113
1114chalk@^1.1.3, chalk@~1.1.0:
1115 version "1.1.3"
1116 resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
1117 dependencies:
1118 ansi-styles "^2.2.1"
1119 escape-string-regexp "^1.0.2"
1120 has-ansi "^2.0.0"
1121 strip-ansi "^3.0.0"
1122 supports-color "^2.0.0"
1123
1124chalk@~0.4.0:
1125 version "0.4.0"
1126 resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
1127 dependencies:
1128 ansi-styles "~1.0.0"
1129 has-color "~0.1.0"
1130 strip-ansi "~0.1.0"
1131
1132chmodr@0.1.0:
1133 version "0.1.0"
1134 resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-0.1.0.tgz#e09215a1d51542db2a2576969765bcf6125583eb"
1135
1136chokidar@^1.6.1:
1137 version "1.7.0"
1138 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
1139 dependencies:
1140 anymatch "^1.3.0"
1141 async-each "^1.0.0"
1142 glob-parent "^2.0.0"
1143 inherits "^2.0.1"
1144 is-binary-path "^1.0.0"
1145 is-glob "^2.0.0"
1146 path-is-absolute "^1.0.0"
1147 readdirp "^2.0.0"
1148 optionalDependencies:
1149 fsevents "^1.0.0"
1150
1151cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
1152 version "1.0.4"
1153 resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
1154 dependencies:
1155 inherits "^2.0.1"
1156 safe-buffer "^5.0.1"
1157
1158classnames@^2.2.5:
1159 version "2.2.5"
1160 resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
1161
1162cli-color@~0.3.2:
1163 version "0.3.3"
1164 resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.3.3.tgz#12d5bdd158ff8a0b0db401198913c03df069f6f5"
1165 dependencies:
1166 d "~0.1.1"
1167 es5-ext "~0.10.6"
1168 memoizee "~0.3.8"
1169 timers-ext "0.1"
1170
1171cli-table@~0.3.1:
1172 version "0.3.1"
1173 resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
1174 dependencies:
1175 colors "1.0.3"
1176
1177cli@~1.0.0:
1178 version "1.0.1"
1179 resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14"
1180 dependencies:
1181 exit "0.1.2"
1182 glob "^7.1.1"
1183
1184co@^4.6.0:
1185 version "4.6.0"
1186 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
1187
1188code-point-at@^1.0.0:
1189 version "1.1.0"
1190 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
1191
1192colors@0.6.x:
1193 version "0.6.2"
1194 resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc"
1195
1196colors@1.0.3:
1197 version "1.0.3"
1198 resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
1199
1200combine-source-map@~0.7.1:
1201 version "0.7.2"
1202 resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
1203 dependencies:
1204 convert-source-map "~1.1.0"
1205 inline-source-map "~0.6.0"
1206 lodash.memoize "~3.0.3"
1207 source-map "~0.5.3"
1208
1209combine-source-map@~0.8.0:
1210 version "0.8.0"
1211 resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
1212 dependencies:
1213 convert-source-map "~1.1.0"
1214 inline-source-map "~0.6.0"
1215 lodash.memoize "~3.0.3"
1216 source-map "~0.5.3"
1217
1218combined-stream@^1.0.5, combined-stream@~1.0.5:
1219 version "1.0.5"
1220 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
1221 dependencies:
1222 delayed-stream "~1.0.0"
1223
1224combined-stream@~0.0.4, combined-stream@~0.0.5:
1225 version "0.0.7"
1226 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f"
1227 dependencies:
1228 delayed-stream "0.0.5"
1229
1230commander@2.5.0:
1231 version "2.5.0"
1232 resolved "https://registry.yarnpkg.com/commander/-/commander-2.5.0.tgz#d777b6a4d847d423e5d475da864294ac1ff5aa9d"
1233
1234commander@^2.11.0, commander@^2.5.0:
1235 version "2.14.0"
1236 resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.0.tgz#7b25325963e6aace20d3a9285b09379b0c2208b5"
1237
1238commander@~2.9.0:
1239 version "2.9.0"
1240 resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
1241 dependencies:
1242 graceful-readlink ">= 1.0.0"
1243
1244comment-parser@^0.3.1:
1245 version "0.3.2"
1246 resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.3.2.tgz#3c03f0776b86a36dfd9a0a2c97c6307f332082fe"
1247 dependencies:
1248 readable-stream "^2.0.4"
1249
1250commoner@^0.10.1:
1251 version "0.10.8"
1252 resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5"
1253 dependencies:
1254 commander "^2.5.0"
1255 detective "^4.3.1"
1256 glob "^5.0.15"
1257 graceful-fs "^4.1.2"
1258 iconv-lite "^0.4.5"
1259 mkdirp "^0.5.0"
1260 private "^0.1.6"
1261 q "^1.1.2"
1262 recast "^0.11.17"
1263
1264concat-map@0.0.1:
1265 version "0.0.1"
1266 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
1267
1268concat-stream@~1.5.1:
1269 version "1.5.2"
1270 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
1271 dependencies:
1272 inherits "~2.0.1"
1273 readable-stream "~2.0.0"
1274 typedarray "~0.0.5"
1275
1276concat-stream@~1.6.0:
1277 version "1.6.0"
1278 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
1279 dependencies:
1280 inherits "^2.0.3"
1281 readable-stream "^2.2.2"
1282 typedarray "^0.0.6"
1283
1284config-chain@~1.1.8:
1285 version "1.1.11"
1286 resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
1287 dependencies:
1288 ini "^1.3.4"
1289 proto-list "~1.2.1"
1290
1291configstore@^0.3.0, configstore@^0.3.1:
1292 version "0.3.2"
1293 resolved "https://registry.yarnpkg.com/configstore/-/configstore-0.3.2.tgz#25e4c16c3768abf75c5a65bc61761f495055b459"
1294 dependencies:
1295 graceful-fs "^3.0.1"
1296 js-yaml "^3.1.0"
1297 mkdirp "^0.5.0"
1298 object-assign "^2.0.0"
1299 osenv "^0.1.0"
1300 user-home "^1.0.0"
1301 uuid "^2.0.1"
1302 xdg-basedir "^1.0.0"
1303
1304console-browserify@1.1.x, console-browserify@^1.1.0:
1305 version "1.1.0"
1306 resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
1307 dependencies:
1308 date-now "^0.1.4"
1309
1310console-control-strings@^1.0.0, console-control-strings@~1.1.0:
1311 version "1.1.0"
1312 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
1313
1314constants-browserify@~1.0.0:
1315 version "1.0.0"
1316 resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
1317
1318convert-source-map@^1.5.0:
1319 version "1.5.1"
1320 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
1321
1322convert-source-map@~1.1.0:
1323 version "1.1.3"
1324 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
1325
1326core-js@^2.4.0, core-js@^2.5.0:
1327 version "2.5.3"
1328 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
1329
1330core-util-is@1.0.2, core-util-is@~1.0.0:
1331 version "1.0.2"
1332 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
1333
1334create-ecdh@^4.0.0:
1335 version "4.0.0"
1336 resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
1337 dependencies:
1338 bn.js "^4.1.0"
1339 elliptic "^6.0.0"
1340
1341create-hash@^1.1.0, create-hash@^1.1.2:
1342 version "1.1.3"
1343 resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
1344 dependencies:
1345 cipher-base "^1.0.1"
1346 inherits "^2.0.1"
1347 ripemd160 "^2.0.0"
1348 sha.js "^2.4.0"
1349
1350create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
1351 version "1.1.6"
1352 resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
1353 dependencies:
1354 cipher-base "^1.0.3"
1355 create-hash "^1.1.0"
1356 inherits "^2.0.1"
1357 ripemd160 "^2.0.0"
1358 safe-buffer "^5.0.1"
1359 sha.js "^2.4.8"
1360
1361cryptiles@0.2.x:
1362 version "0.2.2"
1363 resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c"
1364 dependencies:
1365 boom "0.4.x"
1366
1367cryptiles@2.x.x:
1368 version "2.0.5"
1369 resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
1370 dependencies:
1371 boom "2.x.x"
1372
1373crypto-browserify@^3.0.0:
1374 version "3.12.0"
1375 resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
1376 dependencies:
1377 browserify-cipher "^1.0.0"
1378 browserify-sign "^4.0.0"
1379 create-ecdh "^4.0.0"
1380 create-hash "^1.1.0"
1381 create-hmac "^1.1.0"
1382 diffie-hellman "^5.0.0"
1383 inherits "^2.0.1"
1384 pbkdf2 "^3.0.3"
1385 public-encrypt "^4.0.0"
1386 randombytes "^2.0.0"
1387 randomfill "^1.0.3"
1388
1389cst@^0.4.3:
1390 version "0.4.10"
1391 resolved "https://registry.yarnpkg.com/cst/-/cst-0.4.10.tgz#9c05c825290a762f0a85c0aabb8c0fe035ae8516"
1392 dependencies:
1393 babel-runtime "^6.9.2"
1394 babylon "^6.8.1"
1395 source-map-support "^0.4.0"
1396
1397ctype@0.5.3:
1398 version "0.5.3"
1399 resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f"
1400
1401cycle@1.0.x:
1402 version "1.0.3"
1403 resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
1404
1405d@1:
1406 version "1.0.0"
1407 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
1408 dependencies:
1409 es5-ext "^0.10.9"
1410
1411d@~0.1.1:
1412 version "0.1.1"
1413 resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309"
1414 dependencies:
1415 es5-ext "~0.10.2"
1416
1417dashdash@^1.12.0:
1418 version "1.14.1"
1419 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
1420 dependencies:
1421 assert-plus "^1.0.0"
1422
1423date-now@^0.1.4:
1424 version "0.1.4"
1425 resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
1426
1427debowerify@^1.3.1:
1428 version "1.5.0"
1429 resolved "https://registry.yarnpkg.com/debowerify/-/debowerify-1.5.0.tgz#0813bd5b8fee8f5fb77ebafd62e2979a17dcdaff"
1430 dependencies:
1431 bower "~1.3.12"
1432 esprima "^2.0.0"
1433 ordered-ast-traverse "^1.1.1"
1434 through "~2.3.4"
1435
1436debug@^2.2.0, debug@^2.6.8:
1437 version "2.6.9"
1438 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
1439 dependencies:
1440 ms "2.0.0"
1441
1442decompress-zip@0.0.8:
1443 version "0.0.8"
1444 resolved "https://registry.yarnpkg.com/decompress-zip/-/decompress-zip-0.0.8.tgz#4a265b22c7b209d7b24fa66f2b2dfbced59044f3"
1445 dependencies:
1446 binary "~0.3.0"
1447 graceful-fs "~3.0.0"
1448 mkpath "~0.1.0"
1449 nopt "~2.2.0"
1450 q "~1.0.0"
1451 readable-stream "~1.1.8"
1452 touch "0.0.2"
1453
1454deep-equal@*:
1455 version "1.0.1"
1456 resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
1457
1458deep-extend@~0.2.5:
1459 version "0.2.11"
1460 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.2.11.tgz#7a16ba69729132340506170494bc83f7076fe08f"
1461
1462deep-extend@~0.4.0:
1463 version "0.4.2"
1464 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
1465
1466defined@^1.0.0:
1467 version "1.0.0"
1468 resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
1469
1470delayed-stream@0.0.5:
1471 version "0.0.5"
1472 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f"
1473
1474delayed-stream@~1.0.0:
1475 version "1.0.0"
1476 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
1477
1478delegates@^1.0.0:
1479 version "1.0.0"
1480 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
1481
1482deps-sort@^2.0.0:
1483 version "2.0.0"
1484 resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
1485 dependencies:
1486 JSONStream "^1.0.3"
1487 shasum "^1.0.0"
1488 subarg "^1.0.0"
1489 through2 "^2.0.0"
1490
1491des.js@^1.0.0:
1492 version "1.0.0"
1493 resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
1494 dependencies:
1495 inherits "^2.0.1"
1496 minimalistic-assert "^1.0.0"
1497
1498detect-indent@^4.0.0:
1499 version "4.0.0"
1500 resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
1501 dependencies:
1502 repeating "^2.0.0"
1503
1504detect-libc@^1.0.2:
1505 version "1.0.3"
1506 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
1507
1508detective@^4.3.1:
1509 version "4.7.1"
1510 resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
1511 dependencies:
1512 acorn "^5.2.1"
1513 defined "^1.0.0"
1514
1515detective@^5.0.2:
1516 version "5.0.2"
1517 resolved "https://registry.yarnpkg.com/detective/-/detective-5.0.2.tgz#84ec2e1c581e74211e2ae4ffce1edf52c3263f84"
1518 dependencies:
1519 "@browserify/acorn5-object-spread" "^5.0.1"
1520 acorn "^5.2.1"
1521 defined "^1.0.0"
1522
1523diffie-hellman@^5.0.0:
1524 version "5.0.2"
1525 resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
1526 dependencies:
1527 bn.js "^4.1.0"
1528 miller-rabin "^4.0.0"
1529 randombytes "^2.0.0"
1530
1531dom-serializer@0:
1532 version "0.1.0"
1533 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
1534 dependencies:
1535 domelementtype "~1.1.1"
1536 entities "~1.1.1"
1537
1538domain-browser@~1.1.0:
1539 version "1.1.7"
1540 resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
1541
1542domelementtype@1:
1543 version "1.3.0"
1544 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
1545
1546domelementtype@~1.1.1:
1547 version "1.1.3"
1548 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
1549
1550domhandler@2.3:
1551 version "2.3.0"
1552 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738"
1553 dependencies:
1554 domelementtype "1"
1555
1556domutils@1.5:
1557 version "1.5.1"
1558 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
1559 dependencies:
1560 dom-serializer "0"
1561 domelementtype "1"
1562
1563duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
1564 version "0.1.4"
1565 resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
1566 dependencies:
1567 readable-stream "^2.0.2"
1568
1569ecc-jsbn@~0.1.1:
1570 version "0.1.1"
1571 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
1572 dependencies:
1573 jsbn "~0.1.0"
1574
1575electron-to-chromium@^1.3.30:
1576 version "1.3.32"
1577 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz#11d0684c0840e003c4be8928f8ac5f35dbc2b4e6"
1578
1579elliptic@^6.0.0:
1580 version "6.4.0"
1581 resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
1582 dependencies:
1583 bn.js "^4.4.0"
1584 brorand "^1.0.1"
1585 hash.js "^1.0.0"
1586 hmac-drbg "^1.0.0"
1587 inherits "^2.0.1"
1588 minimalistic-assert "^1.0.0"
1589 minimalistic-crypto-utils "^1.0.0"
1590
1591end-of-stream@^1.0.0, end-of-stream@~1.0.0:
1592 version "1.0.0"
1593 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e"
1594 dependencies:
1595 once "~1.3.0"
1596
1597entities@1.0:
1598 version "1.0.0"
1599 resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
1600
1601entities@~1.1.1:
1602 version "1.1.1"
1603 resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
1604
1605envify@^3.2.0:
1606 version "3.4.1"
1607 resolved "https://registry.yarnpkg.com/envify/-/envify-3.4.1.tgz#d7122329e8df1688ba771b12501917c9ce5cbce8"
1608 dependencies:
1609 jstransform "^11.0.3"
1610 through "~2.3.4"
1611
1612es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6:
1613 version "0.10.38"
1614 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3"
1615 dependencies:
1616 es6-iterator "~2.0.3"
1617 es6-symbol "~3.1.1"
1618
1619es6-iterator@~0.1.3:
1620 version "0.1.3"
1621 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e"
1622 dependencies:
1623 d "~0.1.1"
1624 es5-ext "~0.10.5"
1625 es6-symbol "~2.0.1"
1626
1627es6-iterator@~2.0.3:
1628 version "2.0.3"
1629 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
1630 dependencies:
1631 d "1"
1632 es5-ext "^0.10.35"
1633 es6-symbol "^3.1.1"
1634
1635es6-symbol@^3.1.1, es6-symbol@~3.1.1:
1636 version "3.1.1"
1637 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
1638 dependencies:
1639 d "1"
1640 es5-ext "~0.10.14"
1641
1642es6-symbol@~2.0.1:
1643 version "2.0.1"
1644 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3"
1645 dependencies:
1646 d "~0.1.1"
1647 es5-ext "~0.10.5"
1648
1649es6-weak-map@~0.1.4:
1650 version "0.1.4"
1651 resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228"
1652 dependencies:
1653 d "~0.1.1"
1654 es5-ext "~0.10.6"
1655 es6-iterator "~0.1.3"
1656 es6-symbol "~2.0.1"
1657
1658escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
1659 version "1.0.5"
1660 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1661
1662esprima-fb@^15001.1.0-dev-harmony-fb:
1663 version "15001.1.0-dev-harmony-fb"
1664 resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901"
1665
1666esprima@^2.0.0, esprima@^2.6.0:
1667 version "2.7.3"
1668 resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
1669
1670esprima@~1.0.4:
1671 version "1.0.4"
1672 resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad"
1673
1674esprima@~3.1.0:
1675 version "3.1.3"
1676 resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
1677
1678estraverse@^4.1.0:
1679 version "4.2.0"
1680 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
1681
1682esutils@^2.0.2:
1683 version "2.0.2"
1684 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
1685
1686event-emitter@~0.3.4:
1687 version "0.3.5"
1688 resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
1689 dependencies:
1690 d "1"
1691 es5-ext "~0.10.14"
1692
1693events@~1.1.0:
1694 version "1.1.1"
1695 resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
1696
1697evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
1698 version "1.0.3"
1699 resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
1700 dependencies:
1701 md5.js "^1.3.4"
1702 safe-buffer "^5.1.1"
1703
1704exit@0.1.2, exit@0.1.x, exit@~0.1.2:
1705 version "0.1.2"
1706 resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
1707
1708expand-brackets@^0.1.4:
1709 version "0.1.5"
1710 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
1711 dependencies:
1712 is-posix-bracket "^0.1.0"
1713
1714expand-range@^1.8.1:
1715 version "1.8.2"
1716 resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
1717 dependencies:
1718 fill-range "^2.1.0"
1719
1720extend@~3.0.0:
1721 version "3.0.1"
1722 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
1723
1724extglob@^0.3.1:
1725 version "0.3.2"
1726 resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
1727 dependencies:
1728 is-extglob "^1.0.0"
1729
1730extsprintf@1.3.0, extsprintf@^1.2.0:
1731 version "1.3.0"
1732 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
1733
1734eyes@0.1.x:
1735 version "0.1.8"
1736 resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
1737
1738figures@^1.3.2:
1739 version "1.7.0"
1740 resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
1741 dependencies:
1742 escape-string-regexp "^1.0.5"
1743 object-assign "^4.1.0"
1744
1745filename-regex@^2.0.0:
1746 version "2.0.1"
1747 resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
1748
1749fill-range@^2.1.0:
1750 version "2.2.3"
1751 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
1752 dependencies:
1753 is-number "^2.1.0"
1754 isobject "^2.0.0"
1755 randomatic "^1.1.3"
1756 repeat-element "^1.1.2"
1757 repeat-string "^1.5.2"
1758
1759for-in@^1.0.1:
1760 version "1.0.2"
1761 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
1762
1763for-own@^0.1.4:
1764 version "0.1.5"
1765 resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
1766 dependencies:
1767 for-in "^1.0.1"
1768
1769forever-agent@~0.5.0:
1770 version "0.5.2"
1771 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130"
1772
1773forever-agent@~0.6.1:
1774 version "0.6.1"
1775 resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
1776
1777form-data@~0.1.0:
1778 version "0.1.4"
1779 resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12"
1780 dependencies:
1781 async "~0.9.0"
1782 combined-stream "~0.0.4"
1783 mime "~1.2.11"
1784
1785form-data@~0.2.0:
1786 version "0.2.0"
1787 resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.2.0.tgz#26f8bc26da6440e299cbdcfb69035c4f77a6e466"
1788 dependencies:
1789 async "~0.9.0"
1790 combined-stream "~0.0.4"
1791 mime-types "~2.0.3"
1792
1793form-data@~2.1.1:
1794 version "2.1.4"
1795 resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
1796 dependencies:
1797 asynckit "^0.4.0"
1798 combined-stream "^1.0.5"
1799 mime-types "^2.1.12"
1800
1801fs-readdir-recursive@^1.0.0:
1802 version "1.1.0"
1803 resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
1804
1805fs.realpath@^1.0.0:
1806 version "1.0.0"
1807 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1808
1809fsevents@^1.0.0:
1810 version "1.1.3"
1811 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
1812 dependencies:
1813 nan "^2.3.0"
1814 node-pre-gyp "^0.6.39"
1815
1816fstream-ignore@^1.0.5, fstream-ignore@~1.0.1:
1817 version "1.0.5"
1818 resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
1819 dependencies:
1820 fstream "^1.0.0"
1821 inherits "2"
1822 minimatch "^3.0.0"
1823
1824fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2, fstream@~1.0.2:
1825 version "1.0.11"
1826 resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
1827 dependencies:
1828 graceful-fs "^4.1.2"
1829 inherits "~2.0.0"
1830 mkdirp ">=0.5 0"
1831 rimraf "2"
1832
1833function-bind@^1.0.2:
1834 version "1.1.1"
1835 resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1836
1837gauge@~2.7.3:
1838 version "2.7.4"
1839 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
1840 dependencies:
1841 aproba "^1.0.3"
1842 console-control-strings "^1.0.0"
1843 has-unicode "^2.0.0"
1844 object-assign "^4.1.0"
1845 signal-exit "^3.0.0"
1846 string-width "^1.0.1"
1847 strip-ansi "^3.0.1"
1848 wide-align "^1.1.0"
1849
1850getpass@^0.1.1:
1851 version "0.1.7"
1852 resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
1853 dependencies:
1854 assert-plus "^1.0.0"
1855
1856glob-base@^0.3.0:
1857 version "0.3.0"
1858 resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
1859 dependencies:
1860 glob-parent "^2.0.0"
1861 is-glob "^2.0.0"
1862
1863glob-parent@^2.0.0:
1864 version "2.0.0"
1865 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
1866 dependencies:
1867 is-glob "^2.0.0"
1868
1869glob@^5.0.1, glob@^5.0.15:
1870 version "5.0.15"
1871 resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
1872 dependencies:
1873 inflight "^1.0.4"
1874 inherits "2"
1875 minimatch "2 || 3"
1876 once "^1.3.0"
1877 path-is-absolute "^1.0.0"
1878
1879glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2:
1880 version "7.1.2"
1881 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
1882 dependencies:
1883 fs.realpath "^1.0.0"
1884 inflight "^1.0.4"
1885 inherits "2"
1886 minimatch "^3.0.4"
1887 once "^1.3.0"
1888 path-is-absolute "^1.0.0"
1889
1890glob@~4.0.2:
1891 version "4.0.6"
1892 resolved "https://registry.yarnpkg.com/glob/-/glob-4.0.6.tgz#695c50bdd4e2fb5c5d370b091f388d3707e291a7"
1893 dependencies:
1894 graceful-fs "^3.0.2"
1895 inherits "2"
1896 minimatch "^1.0.0"
1897 once "^1.3.0"
1898
1899globals@^9.18.0:
1900 version "9.18.0"
1901 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
1902
1903got@^0.3.0:
1904 version "0.3.0"
1905 resolved "https://registry.yarnpkg.com/got/-/got-0.3.0.tgz#888ec66ca4bc735ab089dbe959496d0f79485493"
1906 dependencies:
1907 object-assign "^0.3.0"
1908
1909graceful-fs@^3.0.1, graceful-fs@^3.0.2, graceful-fs@~3.0.0, graceful-fs@~3.0.1:
1910 version "3.0.11"
1911 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
1912 dependencies:
1913 natives "^1.1.0"
1914
1915graceful-fs@^4.1.2, graceful-fs@^4.1.4:
1916 version "4.1.11"
1917 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1918
1919graceful-fs@~2.0.0:
1920 version "2.0.3"
1921 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0"
1922
1923"graceful-readlink@>= 1.0.0":
1924 version "1.0.1"
1925 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
1926
1927handlebars@~2.0.0:
1928 version "2.0.0"
1929 resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-2.0.0.tgz#6e9d7f8514a3467fa5e9f82cc158ecfc1d5ac76f"
1930 dependencies:
1931 optimist "~0.3"
1932 optionalDependencies:
1933 uglify-js "~2.3"
1934
1935har-schema@^1.0.5:
1936 version "1.0.5"
1937 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
1938
1939har-validator@~4.2.1:
1940 version "4.2.1"
1941 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
1942 dependencies:
1943 ajv "^4.9.1"
1944 har-schema "^1.0.5"
1945
1946has-ansi@^0.1.0:
1947 version "0.1.0"
1948 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e"
1949 dependencies:
1950 ansi-regex "^0.2.0"
1951
1952has-ansi@^2.0.0:
1953 version "2.0.0"
1954 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1955 dependencies:
1956 ansi-regex "^2.0.0"
1957
1958has-color@~0.1.0:
1959 version "0.1.7"
1960 resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
1961
1962has-unicode@^2.0.0:
1963 version "2.0.1"
1964 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1965
1966has@^1.0.0:
1967 version "1.0.1"
1968 resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
1969 dependencies:
1970 function-bind "^1.0.2"
1971
1972hash-base@^2.0.0:
1973 version "2.0.2"
1974 resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
1975 dependencies:
1976 inherits "^2.0.1"
1977
1978hash-base@^3.0.0:
1979 version "3.0.4"
1980 resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
1981 dependencies:
1982 inherits "^2.0.1"
1983 safe-buffer "^5.0.1"
1984
1985hash.js@^1.0.0, hash.js@^1.0.3:
1986 version "1.1.3"
1987 resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
1988 dependencies:
1989 inherits "^2.0.3"
1990 minimalistic-assert "^1.0.0"
1991
1992hawk@1.1.1:
1993 version "1.1.1"
1994 resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9"
1995 dependencies:
1996 boom "0.4.x"
1997 cryptiles "0.2.x"
1998 hoek "0.9.x"
1999 sntp "0.2.x"
2000
2001hawk@3.1.3, hawk@~3.1.3:
2002 version "3.1.3"
2003 resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
2004 dependencies:
2005 boom "2.x.x"
2006 cryptiles "2.x.x"
2007 hoek "2.x.x"
2008 sntp "1.x.x"
2009
2010hmac-drbg@^1.0.0:
2011 version "1.0.1"
2012 resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
2013 dependencies:
2014 hash.js "^1.0.3"
2015 minimalistic-assert "^1.0.0"
2016 minimalistic-crypto-utils "^1.0.1"
2017
2018hoek@0.9.x:
2019 version "0.9.1"
2020 resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505"
2021
2022hoek@2.x.x:
2023 version "2.16.3"
2024 resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
2025
2026home-or-tmp@^2.0.0:
2027 version "2.0.0"
2028 resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
2029 dependencies:
2030 os-homedir "^1.0.0"
2031 os-tmpdir "^1.0.1"
2032
2033htmlescape@^1.1.0:
2034 version "1.1.1"
2035 resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
2036
2037htmlparser2@3.8.3, htmlparser2@3.8.x:
2038 version "3.8.3"
2039 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068"
2040 dependencies:
2041 domelementtype "1"
2042 domhandler "2.3"
2043 domutils "1.5"
2044 entities "1.0"
2045 readable-stream "1.1"
2046
2047http-signature@~0.10.0:
2048 version "0.10.1"
2049 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66"
2050 dependencies:
2051 asn1 "0.1.11"
2052 assert-plus "^0.1.5"
2053 ctype "0.5.3"
2054
2055http-signature@~1.1.0:
2056 version "1.1.1"
2057 resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
2058 dependencies:
2059 assert-plus "^0.2.0"
2060 jsprim "^1.2.2"
2061 sshpk "^1.7.0"
2062
2063https-browserify@^1.0.0:
2064 version "1.0.0"
2065 resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
2066
2067i@0.3.x:
2068 version "0.3.6"
2069 resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
2070
2071iconv-lite@^0.4.5:
2072 version "0.4.19"
2073 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
2074
2075ieee754@^1.1.4:
2076 version "1.1.8"
2077 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
2078
2079indexof@0.0.1:
2080 version "0.0.1"
2081 resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
2082
2083inflight@^1.0.4:
2084 version "1.0.6"
2085 resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
2086 dependencies:
2087 once "^1.3.0"
2088 wrappy "1"
2089
2090inherit@^2.2.2:
2091 version "2.2.6"
2092 resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.6.tgz#f1614b06c8544e8128e4229c86347db73ad9788d"
2093
2094inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
2095 version "2.0.3"
2096 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
2097
2098inherits@2.0.1:
2099 version "2.0.1"
2100 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
2101
2102ini@^1.2.0, ini@^1.3.4, ini@~1.3.0:
2103 version "1.3.5"
2104 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
2105
2106inline-source-map@~0.6.0:
2107 version "0.6.2"
2108 resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
2109 dependencies:
2110 source-map "~0.5.3"
2111
2112inquirer@0.7.1:
2113 version "0.7.1"
2114 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.7.1.tgz#b8acf140165bd581862ed1198fb6d26430091fac"
2115 dependencies:
2116 chalk "^0.5.0"
2117 cli-color "~0.3.2"
2118 figures "^1.3.2"
2119 lodash "~2.4.1"
2120 mute-stream "0.0.4"
2121 readline2 "~0.1.0"
2122 rx "^2.2.27"
2123 through "~2.3.4"
2124
2125inquirer@^0.6.0:
2126 version "0.6.0"
2127 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.6.0.tgz#614d7bb3e48f9e6a8028e94a0c38f23ef29823d3"
2128 dependencies:
2129 chalk "^0.5.0"
2130 cli-color "~0.3.2"
2131 lodash "~2.4.1"
2132 mute-stream "0.0.4"
2133 readline2 "~0.1.0"
2134 rx "^2.2.27"
2135 through "~2.3.4"
2136
2137insert-module-globals@^7.0.0:
2138 version "7.0.1"
2139 resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3"
2140 dependencies:
2141 JSONStream "^1.0.3"
2142 combine-source-map "~0.7.1"
2143 concat-stream "~1.5.1"
2144 is-buffer "^1.1.0"
2145 lexical-scope "^1.2.0"
2146 process "~0.11.0"
2147 through2 "^2.0.0"
2148 xtend "^4.0.0"
2149
2150insight@0.4.3:
2151 version "0.4.3"
2152 resolved "https://registry.yarnpkg.com/insight/-/insight-0.4.3.tgz#76d653c5c0d8048b03cdba6385a6948f74614af0"
2153 dependencies:
2154 async "^0.9.0"
2155 chalk "^0.5.1"
2156 configstore "^0.3.1"
2157 inquirer "^0.6.0"
2158 lodash.debounce "^2.4.1"
2159 object-assign "^1.0.0"
2160 os-name "^1.0.0"
2161 request "^2.40.0"
2162 tough-cookie "^0.12.1"
2163
2164intersect@~0.0.3:
2165 version "0.0.3"
2166 resolved "https://registry.yarnpkg.com/intersect/-/intersect-0.0.3.tgz#c1a4a5e5eac6ede4af7504cc07e0ada7bc9f4920"
2167
2168invariant@^2.2.2:
2169 version "2.2.2"
2170 resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
2171 dependencies:
2172 loose-envify "^1.0.0"
2173
2174is-binary-path@^1.0.0:
2175 version "1.0.1"
2176 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
2177 dependencies:
2178 binary-extensions "^1.0.0"
2179
2180is-buffer@^1.1.0, is-buffer@^1.1.5:
2181 version "1.1.6"
2182 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
2183
2184is-dotfile@^1.0.0:
2185 version "1.0.3"
2186 resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
2187
2188is-equal-shallow@^0.1.3:
2189 version "0.1.3"
2190 resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
2191 dependencies:
2192 is-primitive "^2.0.0"
2193
2194is-extendable@^0.1.1:
2195 version "0.1.1"
2196 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
2197
2198is-extglob@^1.0.0:
2199 version "1.0.0"
2200 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
2201
2202is-finite@^1.0.0:
2203 version "1.0.2"
2204 resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
2205 dependencies:
2206 number-is-nan "^1.0.0"
2207
2208is-fullwidth-code-point@^1.0.0:
2209 version "1.0.0"
2210 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
2211 dependencies:
2212 number-is-nan "^1.0.0"
2213
2214is-glob@^2.0.0, is-glob@^2.0.1:
2215 version "2.0.1"
2216 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
2217 dependencies:
2218 is-extglob "^1.0.0"
2219
2220is-number@^2.1.0:
2221 version "2.1.0"
2222 resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
2223 dependencies:
2224 kind-of "^3.0.2"
2225
2226is-number@^3.0.0:
2227 version "3.0.0"
2228 resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
2229 dependencies:
2230 kind-of "^3.0.2"
2231
2232is-posix-bracket@^0.1.0:
2233 version "0.1.1"
2234 resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
2235
2236is-primitive@^2.0.0:
2237 version "2.0.0"
2238 resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
2239
2240is-root@~1.0.0:
2241 version "1.0.0"
2242 resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5"
2243
2244is-typedarray@~1.0.0:
2245 version "1.0.0"
2246 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
2247
2248is-utf8@^0.2.0:
2249 version "0.2.1"
2250 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
2251
2252isarray@0.0.1, isarray@~0.0.1:
2253 version "0.0.1"
2254 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
2255
2256isarray@1.0.0, isarray@~1.0.0:
2257 version "1.0.0"
2258 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
2259
2260isobject@^2.0.0:
2261 version "2.1.0"
2262 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
2263 dependencies:
2264 isarray "1.0.0"
2265
2266isstream@0.1.x, isstream@~0.1.2:
2267 version "0.1.2"
2268 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
2269
2270js-tokens@^3.0.0, js-tokens@^3.0.2:
2271 version "3.0.2"
2272 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
2273
2274js-yaml@^3.1.0, js-yaml@~3.4.0:
2275 version "3.4.6"
2276 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.6.tgz#6be1b23f6249f53d293370fd4d1aaa63ce1b4eb0"
2277 dependencies:
2278 argparse "^1.0.2"
2279 esprima "^2.6.0"
2280 inherit "^2.2.2"
2281
2282jsbn@~0.1.0:
2283 version "0.1.1"
2284 resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
2285
2286jscs-jsdoc@^2.0.0:
2287 version "2.0.0"
2288 resolved "https://registry.yarnpkg.com/jscs-jsdoc/-/jscs-jsdoc-2.0.0.tgz#f53ebce029aa3125bd88290ba50d64d4510a4871"
2289 dependencies:
2290 comment-parser "^0.3.1"
2291 jsdoctypeparser "~1.2.0"
2292
2293jscs-preset-wikimedia@~1.0.0:
2294 version "1.0.0"
2295 resolved "https://registry.yarnpkg.com/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz#fff563342038fc2e8826b7bb7309c3ae3406fc7e"
2296
2297jscs@^3.0.3:
2298 version "3.0.7"
2299 resolved "https://registry.yarnpkg.com/jscs/-/jscs-3.0.7.tgz#7141b4dff5b86e32d0e99d764b836767c30d201a"
2300 dependencies:
2301 chalk "~1.1.0"
2302 cli-table "~0.3.1"
2303 commander "~2.9.0"
2304 cst "^0.4.3"
2305 estraverse "^4.1.0"
2306 exit "~0.1.2"
2307 glob "^5.0.1"
2308 htmlparser2 "3.8.3"
2309 js-yaml "~3.4.0"
2310 jscs-jsdoc "^2.0.0"
2311 jscs-preset-wikimedia "~1.0.0"
2312 jsonlint "~1.6.2"
2313 lodash "~3.10.0"
2314 minimatch "~3.0.0"
2315 natural-compare "~1.2.2"
2316 pathval "~0.1.1"
2317 prompt "~0.2.14"
2318 reserved-words "^0.1.1"
2319 resolve "^1.1.6"
2320 strip-bom "^2.0.0"
2321 strip-json-comments "~1.0.2"
2322 to-double-quotes "^2.0.0"
2323 to-single-quotes "^2.0.0"
2324 vow "~0.4.8"
2325 vow-fs "~0.3.4"
2326 xmlbuilder "^3.1.0"
2327
2328jsdoctypeparser@~1.2.0:
2329 version "1.2.0"
2330 resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz#e7dedc153a11849ffc5141144ae86a7ef0c25392"
2331 dependencies:
2332 lodash "^3.7.0"
2333
2334jsesc@^1.3.0:
2335 version "1.3.0"
2336 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
2337
2338jsesc@~0.5.0:
2339 version "0.5.0"
2340 resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
2341
2342jshint@^2.9.2:
2343 version "2.9.5"
2344 resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.5.tgz#1e7252915ce681b40827ee14248c46d34e9aa62c"
2345 dependencies:
2346 cli "~1.0.0"
2347 console-browserify "1.1.x"
2348 exit "0.1.x"
2349 htmlparser2 "3.8.x"
2350 lodash "3.7.x"
2351 minimatch "~3.0.2"
2352 shelljs "0.3.x"
2353 strip-json-comments "1.0.x"
2354
2355json-schema@0.2.3:
2356 version "0.2.3"
2357 resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
2358
2359json-stable-stringify@^1.0.1:
2360 version "1.0.1"
2361 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
2362 dependencies:
2363 jsonify "~0.0.0"
2364
2365json-stable-stringify@~0.0.0:
2366 version "0.0.1"
2367 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
2368 dependencies:
2369 jsonify "~0.0.0"
2370
2371json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1:
2372 version "5.0.1"
2373 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
2374
2375json5@^0.5.1:
2376 version "0.5.1"
2377 resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
2378
2379jsonify@~0.0.0:
2380 version "0.0.0"
2381 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
2382
2383jsonlint@~1.6.2:
2384 version "1.6.2"
2385 resolved "https://registry.yarnpkg.com/jsonlint/-/jsonlint-1.6.2.tgz#5737045085f55eb455c68b1ff4ebc01bd50e8830"
2386 dependencies:
2387 JSV ">= 4.0.x"
2388 nomnom ">= 1.5.x"
2389
2390jsonparse@^1.2.0:
2391 version "1.3.1"
2392 resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
2393
2394jsprim@^1.2.2:
2395 version "1.4.1"
2396 resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
2397 dependencies:
2398 assert-plus "1.0.0"
2399 extsprintf "1.3.0"
2400 json-schema "0.2.3"
2401 verror "1.10.0"
2402
2403jstransform@^11.0.3:
2404 version "11.0.3"
2405 resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223"
2406 dependencies:
2407 base62 "^1.1.0"
2408 commoner "^0.10.1"
2409 esprima-fb "^15001.1.0-dev-harmony-fb"
2410 object-assign "^2.0.0"
2411 source-map "^0.4.2"
2412
2413junk@~1.0.0:
2414 version "1.0.3"
2415 resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592"
2416
2417kind-of@^3.0.2:
2418 version "3.2.2"
2419 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
2420 dependencies:
2421 is-buffer "^1.1.5"
2422
2423kind-of@^4.0.0:
2424 version "4.0.0"
2425 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
2426 dependencies:
2427 is-buffer "^1.1.5"
2428
2429labeled-stream-splicer@^2.0.0:
2430 version "2.0.0"
2431 resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
2432 dependencies:
2433 inherits "^2.0.1"
2434 isarray "~0.0.1"
2435 stream-splicer "^2.0.0"
2436
2437latest-version@^0.2.0:
2438 version "0.2.0"
2439 resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-0.2.0.tgz#adaf898d5f22380d3f9c45386efdff0a1b5b7501"
2440 dependencies:
2441 package-json "^0.2.0"
2442
2443lexical-scope@^1.2.0:
2444 version "1.2.0"
2445 resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
2446 dependencies:
2447 astw "^2.0.0"
2448
2449localenv@^0.2.2:
2450 version "0.2.2"
2451 resolved "https://registry.yarnpkg.com/localenv/-/localenv-0.2.2.tgz#c508f29d3485bdc9341d3ead17f61c5abd1b0bab"
2452 dependencies:
2453 commander "2.5.0"
2454
2455localenvify@^1.0.1:
2456 version "1.0.1"
2457 resolved "https://registry.yarnpkg.com/localenvify/-/localenvify-1.0.1.tgz#0db4aa46d55628dfd24e438fbb0627b275968943"
2458 dependencies:
2459 envify "^3.2.0"
2460 localenv "^0.2.2"
2461
2462lockfile@~1.0.0:
2463 version "1.0.3"
2464 resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79"
2465
2466lodash._isnative@~2.4.1:
2467 version "2.4.1"
2468 resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c"
2469
2470lodash._objecttypes@~2.4.1:
2471 version "2.4.1"
2472 resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11"
2473
2474lodash.debounce@^2.4.1:
2475 version "2.4.1"
2476 resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-2.4.1.tgz#d8cead246ec4b926e8b85678fc396bfeba8cc6fc"
2477 dependencies:
2478 lodash.isfunction "~2.4.1"
2479 lodash.isobject "~2.4.1"
2480 lodash.now "~2.4.1"
2481
2482lodash.isfunction@~2.4.1:
2483 version "2.4.1"
2484 resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz#2cfd575c73e498ab57e319b77fa02adef13a94d1"
2485
2486lodash.isobject@~2.4.1:
2487 version "2.4.1"
2488 resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5"
2489 dependencies:
2490 lodash._objecttypes "~2.4.1"
2491
2492lodash.memoize@~3.0.3:
2493 version "3.0.4"
2494 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
2495
2496lodash.now@~2.4.1:
2497 version "2.4.1"
2498 resolved "https://registry.yarnpkg.com/lodash.now/-/lodash.now-2.4.1.tgz#6872156500525185faf96785bb7fe7fe15b562c6"
2499 dependencies:
2500 lodash._isnative "~2.4.1"
2501
2502lodash@3.7.x:
2503 version "3.7.0"
2504 resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45"
2505
2506lodash@^3.5.0, lodash@^3.7.0, lodash@~3.10.0:
2507 version "3.10.1"
2508 resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
2509
2510lodash@^4.17.4:
2511 version "4.17.5"
2512 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
2513
2514lodash@~2.4.1:
2515 version "2.4.2"
2516 resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
2517
2518loose-envify@^1.0.0:
2519 version "1.3.1"
2520 resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
2521 dependencies:
2522 js-tokens "^3.0.0"
2523
2524lru-cache@2, lru-cache@~2.5.0:
2525 version "2.5.2"
2526 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.5.2.tgz#1fddad938aae1263ce138680be1b3f591c0ab41c"
2527
2528lru-cache@~2.3.0:
2529 version "2.3.1"
2530 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.3.1.tgz#b3adf6b3d856e954e2c390e6cef22081245a53d6"
2531
2532lru-queue@0.1:
2533 version "0.1.0"
2534 resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
2535 dependencies:
2536 es5-ext "~0.10.2"
2537
2538md5.js@^1.3.4:
2539 version "1.3.4"
2540 resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
2541 dependencies:
2542 hash-base "^3.0.0"
2543 inherits "^2.0.1"
2544
2545memoizee@~0.3.8:
2546 version "0.3.10"
2547 resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f"
2548 dependencies:
2549 d "~0.1.1"
2550 es5-ext "~0.10.11"
2551 es6-weak-map "~0.1.4"
2552 event-emitter "~0.3.4"
2553 lru-queue "0.1"
2554 next-tick "~0.2.2"
2555 timers-ext "0.1"
2556
2557micromatch@^2.1.5:
2558 version "2.3.11"
2559 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
2560 dependencies:
2561 arr-diff "^2.0.0"
2562 array-unique "^0.2.1"
2563 braces "^1.8.2"
2564 expand-brackets "^0.1.4"
2565 extglob "^0.3.1"
2566 filename-regex "^2.0.0"
2567 is-extglob "^1.0.0"
2568 is-glob "^2.0.1"
2569 kind-of "^3.0.2"
2570 normalize-path "^2.0.1"
2571 object.omit "^2.0.0"
2572 parse-glob "^3.0.4"
2573 regex-cache "^0.4.2"
2574
2575miller-rabin@^4.0.0:
2576 version "4.0.1"
2577 resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
2578 dependencies:
2579 bn.js "^4.0.0"
2580 brorand "^1.0.1"
2581
2582mime-db@~1.12.0:
2583 version "1.12.0"
2584 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7"
2585
2586mime-db@~1.30.0:
2587 version "1.30.0"
2588 resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
2589
2590mime-types@^2.1.12, mime-types@~2.1.7:
2591 version "2.1.17"
2592 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
2593 dependencies:
2594 mime-db "~1.30.0"
2595
2596mime-types@~1.0.1:
2597 version "1.0.2"
2598 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce"
2599
2600mime-types@~2.0.3:
2601 version "2.0.14"
2602 resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6"
2603 dependencies:
2604 mime-db "~1.12.0"
2605
2606mime@~1.2.11:
2607 version "1.2.11"
2608 resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10"
2609
2610minimalistic-assert@^1.0.0:
2611 version "1.0.0"
2612 resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
2613
2614minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
2615 version "1.0.1"
2616 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
2617
2618"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.0, minimatch@~3.0.2:
2619 version "3.0.4"
2620 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
2621 dependencies:
2622 brace-expansion "^1.1.7"
2623
2624minimatch@^1.0.0:
2625 version "1.0.0"
2626 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d"
2627 dependencies:
2628 lru-cache "2"
2629 sigmund "~1.0.0"
2630
2631minimist@0.0.8, minimist@~0.0.1:
2632 version "0.0.8"
2633 resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
2634
2635minimist@^1.1.0, minimist@^1.2.0:
2636 version "1.2.0"
2637 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
2638
2639mkdirp@0.5.0:
2640 version "0.5.0"
2641 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
2642 dependencies:
2643 minimist "0.0.8"
2644
2645mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1:
2646 version "0.5.1"
2647 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
2648 dependencies:
2649 minimist "0.0.8"
2650
2651mkdirp@~0.3.5:
2652 version "0.3.5"
2653 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
2654
2655mkpath@~0.1.0:
2656 version "0.1.0"
2657 resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91"
2658
2659module-deps@^5.0.1:
2660 version "5.0.1"
2661 resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-5.0.1.tgz#3bc47c14b0a6d925aff2ec4a177b456a96ae0396"
2662 dependencies:
2663 JSONStream "^1.0.3"
2664 browser-resolve "^1.7.0"
2665 cached-path-relative "^1.0.0"
2666 concat-stream "~1.6.0"
2667 defined "^1.0.0"
2668 detective "^5.0.2"
2669 duplexer2 "^0.1.2"
2670 inherits "^2.0.1"
2671 parents "^1.0.0"
2672 readable-stream "^2.0.2"
2673 resolve "^1.1.3"
2674 stream-combiner2 "^1.1.1"
2675 subarg "^1.0.0"
2676 through2 "^2.0.0"
2677 xtend "^4.0.0"
2678
2679mout@~0.9.0:
2680 version "0.9.1"
2681 resolved "https://registry.yarnpkg.com/mout/-/mout-0.9.1.tgz#84f0f3fd6acc7317f63de2affdcc0cee009b0477"
2682
2683ms@2.0.0:
2684 version "2.0.0"
2685 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
2686
2687mute-stream@0.0.4, mute-stream@~0.0.4:
2688 version "0.0.4"
2689 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.4.tgz#a9219960a6d5d5d046597aee51252c6655f7177e"
2690
2691nan@^2.3.0:
2692 version "2.8.0"
2693 resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
2694
2695natives@^1.1.0:
2696 version "1.1.1"
2697 resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574"
2698
2699natural-compare@~1.2.2:
2700 version "1.2.2"
2701 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.2.2.tgz#1f96d60e3141cac1b6d05653ce0daeac763af6aa"
2702
2703ncp@0.4.x:
2704 version "0.4.2"
2705 resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574"
2706
2707next-tick@1:
2708 version "1.0.0"
2709 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
2710
2711next-tick@~0.2.2:
2712 version "0.2.2"
2713 resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d"
2714
2715node-pre-gyp@^0.6.39:
2716 version "0.6.39"
2717 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
2718 dependencies:
2719 detect-libc "^1.0.2"
2720 hawk "3.1.3"
2721 mkdirp "^0.5.1"
2722 nopt "^4.0.1"
2723 npmlog "^4.0.2"
2724 rc "^1.1.7"
2725 request "2.81.0"
2726 rimraf "^2.6.1"
2727 semver "^5.3.0"
2728 tar "^2.2.1"
2729 tar-pack "^3.4.0"
2730
2731node-uuid@~1.4.0:
2732 version "1.4.8"
2733 resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
2734
2735"nomnom@>= 1.5.x":
2736 version "1.8.1"
2737 resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
2738 dependencies:
2739 chalk "~0.4.0"
2740 underscore "~1.6.0"
2741
2742nopt@^4.0.1:
2743 version "4.0.1"
2744 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
2745 dependencies:
2746 abbrev "1"
2747 osenv "^0.1.4"
2748
2749nopt@~1.0.10:
2750 version "1.0.10"
2751 resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
2752 dependencies:
2753 abbrev "1"
2754
2755nopt@~2.2.0:
2756 version "2.2.1"
2757 resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.2.1.tgz#2aa09b7d1768487b3b89a9c5aa52335bff0baea7"
2758 dependencies:
2759 abbrev "1"
2760
2761nopt@~3.0.0, nopt@~3.0.1:
2762 version "3.0.6"
2763 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
2764 dependencies:
2765 abbrev "1"
2766
2767normalize-path@^2.0.0, normalize-path@^2.0.1:
2768 version "2.1.1"
2769 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
2770 dependencies:
2771 remove-trailing-separator "^1.0.1"
2772
2773npmconf@^2.0.1:
2774 version "2.1.2"
2775 resolved "https://registry.yarnpkg.com/npmconf/-/npmconf-2.1.2.tgz#66606a4a736f1e77a059aa071a79c94ab781853a"
2776 dependencies:
2777 config-chain "~1.1.8"
2778 inherits "~2.0.0"
2779 ini "^1.2.0"
2780 mkdirp "^0.5.0"
2781 nopt "~3.0.1"
2782 once "~1.3.0"
2783 osenv "^0.1.0"
2784 semver "2 || 3 || 4"
2785 uid-number "0.0.5"
2786
2787npmlog@^4.0.2:
2788 version "4.1.2"
2789 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
2790 dependencies:
2791 are-we-there-yet "~1.1.2"
2792 console-control-strings "~1.1.0"
2793 gauge "~2.7.3"
2794 set-blocking "~2.0.0"
2795
2796number-is-nan@^1.0.0:
2797 version "1.0.1"
2798 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
2799
2800oauth-sign@~0.4.0:
2801 version "0.4.0"
2802 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.4.0.tgz#f22956f31ea7151a821e5f2fb32c113cad8b9f69"
2803
2804oauth-sign@~0.5.0:
2805 version "0.5.0"
2806 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.5.0.tgz#d767f5169325620eab2e087ef0c472e773db6461"
2807
2808oauth-sign@~0.8.1:
2809 version "0.8.2"
2810 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
2811
2812object-assign@^0.3.0:
2813 version "0.3.1"
2814 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-0.3.1.tgz#060e2a2a27d7c0d77ec77b78f11aa47fd88008d2"
2815
2816object-assign@^1.0.0:
2817 version "1.0.0"
2818 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-1.0.0.tgz#e65dc8766d3b47b4b8307465c8311da030b070a6"
2819
2820object-assign@^2.0.0:
2821 version "2.1.1"
2822 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
2823
2824object-assign@^4.1.0:
2825 version "4.1.1"
2826 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
2827
2828object.omit@^2.0.0:
2829 version "2.0.1"
2830 resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
2831 dependencies:
2832 for-own "^0.1.4"
2833 is-extendable "^0.1.1"
2834
2835once@^1.3.0, once@^1.3.3:
2836 version "1.4.0"
2837 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
2838 dependencies:
2839 wrappy "1"
2840
2841once@~1.2.0:
2842 version "1.2.0"
2843 resolved "https://registry.yarnpkg.com/once/-/once-1.2.0.tgz#de1905c636af874a8fba862d9aabddd1f920461c"
2844
2845once@~1.3.0:
2846 version "1.3.3"
2847 resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
2848 dependencies:
2849 wrappy "1"
2850
2851opn@~1.0.0:
2852 version "1.0.2"
2853 resolved "https://registry.yarnpkg.com/opn/-/opn-1.0.2.tgz#b909643346d00a1abc977a8b96f3ce3c53d5cf5f"
2854
2855optimist@~0.3, optimist@~0.3.5:
2856 version "0.3.7"
2857 resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9"
2858 dependencies:
2859 wordwrap "~0.0.2"
2860
2861optimist@~0.6.0:
2862 version "0.6.1"
2863 resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
2864 dependencies:
2865 minimist "~0.0.1"
2866 wordwrap "~0.0.2"
2867
2868ordered-ast-traverse@^1.1.1:
2869 version "1.1.1"
2870 resolved "https://registry.yarnpkg.com/ordered-ast-traverse/-/ordered-ast-traverse-1.1.1.tgz#6843a170bc0eee8b520cc8ddc1ddd3aa30fa057c"
2871 dependencies:
2872 ordered-esprima-props "~1.1.0"
2873
2874ordered-esprima-props@~1.1.0:
2875 version "1.1.0"
2876 resolved "https://registry.yarnpkg.com/ordered-esprima-props/-/ordered-esprima-props-1.1.0.tgz#a9827086df5f010aa60e9bd02b6e0335cea2ffcb"
2877
2878os-browserify@~0.3.0:
2879 version "0.3.0"
2880 resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
2881
2882os-homedir@^1.0.0:
2883 version "1.0.2"
2884 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
2885
2886os-name@^1.0.0:
2887 version "1.0.3"
2888 resolved "https://registry.yarnpkg.com/os-name/-/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf"
2889 dependencies:
2890 osx-release "^1.0.0"
2891 win-release "^1.0.0"
2892
2893os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
2894 version "1.0.2"
2895 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
2896
2897osenv@0.0.3:
2898 version "0.0.3"
2899 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.0.3.tgz#cd6ad8ddb290915ad9e22765576025d411f29cb6"
2900
2901osenv@0.1.0, osenv@^0.1.0:
2902 version "0.1.0"
2903 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.0.tgz#61668121eec584955030b9f470b1d2309504bfcb"
2904
2905osenv@^0.1.4:
2906 version "0.1.4"
2907 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
2908 dependencies:
2909 os-homedir "^1.0.0"
2910 os-tmpdir "^1.0.0"
2911
2912osx-release@^1.0.0:
2913 version "1.1.0"
2914 resolved "https://registry.yarnpkg.com/osx-release/-/osx-release-1.1.0.tgz#f217911a28136949af1bf9308b241e2737d3cd6c"
2915 dependencies:
2916 minimist "^1.1.0"
2917
2918output-file-sync@^1.1.2:
2919 version "1.1.2"
2920 resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
2921 dependencies:
2922 graceful-fs "^4.1.4"
2923 mkdirp "^0.5.1"
2924 object-assign "^4.1.0"
2925
2926p-throttler@0.1.0:
2927 version "0.1.0"
2928 resolved "https://registry.yarnpkg.com/p-throttler/-/p-throttler-0.1.0.tgz#1b16907942c333e6f1ddeabcb3479204b8c417c4"
2929 dependencies:
2930 q "~0.9.2"
2931
2932package-json@^0.2.0:
2933 version "0.2.0"
2934 resolved "https://registry.yarnpkg.com/package-json/-/package-json-0.2.0.tgz#0316e177b8eb149985d34f706b4a5543b274bec5"
2935 dependencies:
2936 got "^0.3.0"
2937 registry-url "^0.1.0"
2938
2939page@^1.8.3:
2940 version "1.8.3"
2941 resolved "https://registry.yarnpkg.com/page/-/page-1.8.3.tgz#cc46fd6e614f5a60ebc68d0e0e3570301dae7c0e"
2942 dependencies:
2943 path-to-regexp "~1.2.1"
2944
2945pako@~1.0.5:
2946 version "1.0.6"
2947 resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
2948
2949parents@^1.0.0, parents@^1.0.1:
2950 version "1.0.1"
2951 resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
2952 dependencies:
2953 path-platform "~0.11.15"
2954
2955parse-asn1@^5.0.0:
2956 version "5.1.0"
2957 resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
2958 dependencies:
2959 asn1.js "^4.0.0"
2960 browserify-aes "^1.0.0"
2961 create-hash "^1.1.0"
2962 evp_bytestokey "^1.0.0"
2963 pbkdf2 "^3.0.3"
2964
2965parse-glob@^3.0.4:
2966 version "3.0.4"
2967 resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
2968 dependencies:
2969 glob-base "^0.3.0"
2970 is-dotfile "^1.0.0"
2971 is-extglob "^1.0.0"
2972 is-glob "^2.0.0"
2973
2974path-browserify@~0.0.0:
2975 version "0.0.0"
2976 resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
2977
2978path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
2979 version "1.0.1"
2980 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
2981
2982path-parse@^1.0.5:
2983 version "1.0.5"
2984 resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
2985
2986path-platform@~0.11.15:
2987 version "0.11.15"
2988 resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
2989
2990path-to-regexp@^1.2.1:
2991 version "1.7.0"
2992 resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
2993 dependencies:
2994 isarray "0.0.1"
2995
2996path-to-regexp@~1.2.1:
2997 version "1.2.1"
2998 resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.2.1.tgz#b33705c140234d873c8721c7b9fd8b541ed3aff9"
2999 dependencies:
3000 isarray "0.0.1"
3001
3002pathval@~0.1.1:
3003 version "0.1.1"
3004 resolved "https://registry.yarnpkg.com/pathval/-/pathval-0.1.1.tgz#08f911cdca9cce5942880da7817bc0b723b66d82"
3005
3006pbkdf2@^3.0.3:
3007 version "3.0.14"
3008 resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
3009 dependencies:
3010 create-hash "^1.1.2"
3011 create-hmac "^1.1.4"
3012 ripemd160 "^2.0.1"
3013 safe-buffer "^5.0.1"
3014 sha.js "^2.4.8"
3015
3016performance-now@^0.2.0:
3017 version "0.2.0"
3018 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
3019
3020pkginfo@0.3.x:
3021 version "0.3.1"
3022 resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
3023
3024pkginfo@0.x.x:
3025 version "0.4.1"
3026 resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
3027
3028preserve@^0.2.0:
3029 version "0.2.0"
3030 resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
3031
3032private@^0.1.6, private@^0.1.7, private@~0.1.5:
3033 version "0.1.8"
3034 resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
3035
3036process-nextick-args@~1.0.6:
3037 version "1.0.7"
3038 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
3039
3040process@~0.11.0:
3041 version "0.11.10"
3042 resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
3043
3044prompt@~0.2.14:
3045 version "0.2.14"
3046 resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc"
3047 dependencies:
3048 pkginfo "0.x.x"
3049 read "1.0.x"
3050 revalidator "0.1.x"
3051 utile "0.2.x"
3052 winston "0.8.x"
3053
3054promptly@0.2.0:
3055 version "0.2.0"
3056 resolved "https://registry.yarnpkg.com/promptly/-/promptly-0.2.0.tgz#73ef200fa8329d5d3a8df41798950b8646ca46d9"
3057 dependencies:
3058 read "~1.0.4"
3059
3060proto-list@~1.2.1:
3061 version "1.2.4"
3062 resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
3063
3064public-encrypt@^4.0.0:
3065 version "4.0.0"
3066 resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
3067 dependencies:
3068 bn.js "^4.1.0"
3069 browserify-rsa "^4.0.0"
3070 create-hash "^1.1.0"
3071 parse-asn1 "^5.0.0"
3072 randombytes "^2.0.1"
3073
3074pump@^0.3.5:
3075 version "0.3.5"
3076 resolved "https://registry.yarnpkg.com/pump/-/pump-0.3.5.tgz#ae5ff8c1f93ed87adc6530a97565b126f585454b"
3077 dependencies:
3078 end-of-stream "~1.0.0"
3079 once "~1.2.0"
3080
3081punycode@1.3.2:
3082 version "1.3.2"
3083 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
3084
3085punycode@>=0.2.0, punycode@^1.3.2, punycode@^1.4.1:
3086 version "1.4.1"
3087 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
3088
3089q@^1.1.2:
3090 version "1.5.1"
3091 resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
3092
3093q@~0.9.2:
3094 version "0.9.7"
3095 resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
3096
3097q@~1.0.0, q@~1.0.1:
3098 version "1.0.1"
3099 resolved "https://registry.yarnpkg.com/q/-/q-1.0.1.tgz#11872aeedee89268110b10a718448ffb10112a14"
3100
3101qs@~1.2.0:
3102 version "1.2.2"
3103 resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88"
3104
3105qs@~2.3.1:
3106 version "2.3.3"
3107 resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404"
3108
3109qs@~6.4.0:
3110 version "6.4.0"
3111 resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
3112
3113querystring-es3@~0.2.0:
3114 version "0.2.1"
3115 resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
3116
3117querystring@0.2.0:
3118 version "0.2.0"
3119 resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
3120
3121randomatic@^1.1.3:
3122 version "1.1.7"
3123 resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
3124 dependencies:
3125 is-number "^3.0.0"
3126 kind-of "^4.0.0"
3127
3128randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
3129 version "2.0.6"
3130 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
3131 dependencies:
3132 safe-buffer "^5.1.0"
3133
3134randomfill@^1.0.3:
3135 version "1.0.3"
3136 resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62"
3137 dependencies:
3138 randombytes "^2.0.5"
3139 safe-buffer "^5.1.0"
3140
3141rc@^1.1.7:
3142 version "1.2.5"
3143 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd"
3144 dependencies:
3145 deep-extend "~0.4.0"
3146 ini "~1.3.0"
3147 minimist "^1.2.0"
3148 strip-json-comments "~2.0.1"
3149
3150read-only-stream@^2.0.0:
3151 version "2.0.0"
3152 resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
3153 dependencies:
3154 readable-stream "^2.0.2"
3155
3156read@1.0.x, read@~1.0.4:
3157 version "1.0.7"
3158 resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
3159 dependencies:
3160 mute-stream "~0.0.4"
3161
3162readable-stream@1.1, readable-stream@^1.0.27-1, readable-stream@~1.1.8:
3163 version "1.1.13"
3164 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e"
3165 dependencies:
3166 core-util-is "~1.0.0"
3167 inherits "~2.0.1"
3168 isarray "0.0.1"
3169 string_decoder "~0.10.x"
3170
3171readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3:
3172 version "2.3.3"
3173 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
3174 dependencies:
3175 core-util-is "~1.0.0"
3176 inherits "~2.0.3"
3177 isarray "~1.0.0"
3178 process-nextick-args "~1.0.6"
3179 safe-buffer "~5.1.1"
3180 string_decoder "~1.0.3"
3181 util-deprecate "~1.0.1"
3182
3183readable-stream@~1.0.26:
3184 version "1.0.34"
3185 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
3186 dependencies:
3187 core-util-is "~1.0.0"
3188 inherits "~2.0.1"
3189 isarray "0.0.1"
3190 string_decoder "~0.10.x"
3191
3192readable-stream@~2.0.0:
3193 version "2.0.6"
3194 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
3195 dependencies:
3196 core-util-is "~1.0.0"
3197 inherits "~2.0.1"
3198 isarray "~1.0.0"
3199 process-nextick-args "~1.0.6"
3200 string_decoder "~0.10.x"
3201 util-deprecate "~1.0.1"
3202
3203readdirp@^2.0.0:
3204 version "2.1.0"
3205 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
3206 dependencies:
3207 graceful-fs "^4.1.2"
3208 minimatch "^3.0.2"
3209 readable-stream "^2.0.2"
3210 set-immediate-shim "^1.0.1"
3211
3212readline2@~0.1.0:
3213 version "0.1.1"
3214 resolved "https://registry.yarnpkg.com/readline2/-/readline2-0.1.1.tgz#99443ba6e83b830ef3051bfd7dc241a82728d568"
3215 dependencies:
3216 mute-stream "0.0.4"
3217 strip-ansi "^2.0.1"
3218
3219recast@^0.11.17:
3220 version "0.11.23"
3221 resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
3222 dependencies:
3223 ast-types "0.9.6"
3224 esprima "~3.1.0"
3225 private "~0.1.5"
3226 source-map "~0.5.0"
3227
3228redeyed@~0.4.0:
3229 version "0.4.4"
3230 resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-0.4.4.tgz#37e990a6f2b21b2a11c2e6a48fd4135698cba97f"
3231 dependencies:
3232 esprima "~1.0.4"
3233
3234regenerate@^1.2.1:
3235 version "1.3.3"
3236 resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
3237
3238regenerator-runtime@^0.10.5:
3239 version "0.10.5"
3240 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
3241
3242regenerator-runtime@^0.11.0:
3243 version "0.11.1"
3244 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
3245
3246regenerator-transform@^0.10.0:
3247 version "0.10.1"
3248 resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
3249 dependencies:
3250 babel-runtime "^6.18.0"
3251 babel-types "^6.19.0"
3252 private "^0.1.6"
3253
3254regex-cache@^0.4.2:
3255 version "0.4.4"
3256 resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
3257 dependencies:
3258 is-equal-shallow "^0.1.3"
3259
3260regexpu-core@^2.0.0:
3261 version "2.0.0"
3262 resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
3263 dependencies:
3264 regenerate "^1.2.1"
3265 regjsgen "^0.2.0"
3266 regjsparser "^0.1.4"
3267
3268registry-url@^0.1.0:
3269 version "0.1.1"
3270 resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-0.1.1.tgz#1739427b81b110b302482a1c7cd727ffcc82d5be"
3271 dependencies:
3272 npmconf "^2.0.1"
3273
3274regjsgen@^0.2.0:
3275 version "0.2.0"
3276 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
3277
3278regjsparser@^0.1.4:
3279 version "0.1.5"
3280 resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
3281 dependencies:
3282 jsesc "~0.5.0"
3283
3284remove-trailing-separator@^1.0.1:
3285 version "1.1.0"
3286 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
3287
3288repeat-element@^1.1.2:
3289 version "1.1.2"
3290 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
3291
3292repeat-string@^1.5.2:
3293 version "1.6.1"
3294 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
3295
3296repeating@^2.0.0:
3297 version "2.0.1"
3298 resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
3299 dependencies:
3300 is-finite "^1.0.0"
3301
3302request-progress@0.3.0:
3303 version "0.3.0"
3304 resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-0.3.0.tgz#bdf2062bfc197c5d492500d44cb3aff7865b492e"
3305 dependencies:
3306 throttleit "~0.0.2"
3307
3308request-replay@~0.2.0:
3309 version "0.2.0"
3310 resolved "https://registry.yarnpkg.com/request-replay/-/request-replay-0.2.0.tgz#9b693a5d118b39f5c596ead5ed91a26444057f60"
3311 dependencies:
3312 retry "~0.6.0"
3313
3314request@2.81.0:
3315 version "2.81.0"
3316 resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
3317 dependencies:
3318 aws-sign2 "~0.6.0"
3319 aws4 "^1.2.1"
3320 caseless "~0.12.0"
3321 combined-stream "~1.0.5"
3322 extend "~3.0.0"
3323 forever-agent "~0.6.1"
3324 form-data "~2.1.1"
3325 har-validator "~4.2.1"
3326 hawk "~3.1.3"
3327 http-signature "~1.1.0"
3328 is-typedarray "~1.0.0"
3329 isstream "~0.1.2"
3330 json-stringify-safe "~5.0.1"
3331 mime-types "~2.1.7"
3332 oauth-sign "~0.8.1"
3333 performance-now "^0.2.0"
3334 qs "~6.4.0"
3335 safe-buffer "^5.0.1"
3336 stringstream "~0.0.4"
3337 tough-cookie "~2.3.0"
3338 tunnel-agent "^0.6.0"
3339 uuid "^3.0.0"
3340
3341request@^2.40.0, request@~2.51.0:
3342 version "2.51.0"
3343 resolved "https://registry.yarnpkg.com/request/-/request-2.51.0.tgz#35d00bbecc012e55f907b1bd9e0dbd577bfef26e"
3344 dependencies:
3345 aws-sign2 "~0.5.0"
3346 bl "~0.9.0"
3347 caseless "~0.8.0"
3348 combined-stream "~0.0.5"
3349 forever-agent "~0.5.0"
3350 form-data "~0.2.0"
3351 hawk "1.1.1"
3352 http-signature "~0.10.0"
3353 json-stringify-safe "~5.0.0"
3354 mime-types "~1.0.1"
3355 node-uuid "~1.4.0"
3356 oauth-sign "~0.5.0"
3357 qs "~2.3.1"
3358 stringstream "~0.0.4"
3359 tough-cookie ">=0.12.0"
3360 tunnel-agent "~0.4.0"
3361
3362request@~2.42.0:
3363 version "2.42.0"
3364 resolved "https://registry.yarnpkg.com/request/-/request-2.42.0.tgz#572bd0148938564040ac7ab148b96423a063304a"
3365 dependencies:
3366 bl "~0.9.0"
3367 caseless "~0.6.0"
3368 forever-agent "~0.5.0"
3369 json-stringify-safe "~5.0.0"
3370 mime-types "~1.0.1"
3371 node-uuid "~1.4.0"
3372 qs "~1.2.0"
3373 tunnel-agent "~0.4.0"
3374 optionalDependencies:
3375 aws-sign2 "~0.5.0"
3376 form-data "~0.1.0"
3377 hawk "1.1.1"
3378 http-signature "~0.10.0"
3379 oauth-sign "~0.4.0"
3380 stringstream "~0.0.4"
3381 tough-cookie ">=0.12.0"
3382
3383reserved-words@^0.1.1:
3384 version "0.1.2"
3385 resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
3386
3387resolve@1.1.7:
3388 version "1.1.7"
3389 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
3390
3391resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6:
3392 version "1.5.0"
3393 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
3394 dependencies:
3395 path-parse "^1.0.5"
3396
3397retry@0.6.0, retry@~0.6.0:
3398 version "0.6.0"
3399 resolved "https://registry.yarnpkg.com/retry/-/retry-0.6.0.tgz#1c010713279a6fd1e8def28af0c3ff1871caa537"
3400
3401revalidator@0.1.x:
3402 version "0.1.8"
3403 resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
3404
3405rimraf@2, rimraf@2.x.x, rimraf@~2.2.0:
3406 version "2.2.8"
3407 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
3408
3409rimraf@^2.5.1, rimraf@^2.6.1:
3410 version "2.6.2"
3411 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
3412 dependencies:
3413 glob "^7.0.5"
3414
3415ripemd160@^2.0.0, ripemd160@^2.0.1:
3416 version "2.0.1"
3417 resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
3418 dependencies:
3419 hash-base "^2.0.0"
3420 inherits "^2.0.1"
3421
3422rx@^2.2.27:
3423 version "2.5.3"
3424 resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566"
3425
3426safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
3427 version "5.1.1"
3428 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
3429
3430semver-diff@^0.1.0:
3431 version "0.1.0"
3432 resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-0.1.0.tgz#4f6057ca3eba23cc484b51f64aaf88b131a3855d"
3433 dependencies:
3434 semver "^2.2.1"
3435
3436"semver@2 || 3 || 4", semver@^2.2.1, semver@~2.3.0:
3437 version "2.3.2"
3438 resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52"
3439
3440semver@^5.0.1, semver@^5.3.0:
3441 version "5.5.0"
3442 resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
3443
3444set-blocking@~2.0.0:
3445 version "2.0.0"
3446 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
3447
3448set-immediate-shim@^1.0.1:
3449 version "1.0.1"
3450 resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
3451
3452sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
3453 version "2.4.10"
3454 resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
3455 dependencies:
3456 inherits "^2.0.1"
3457 safe-buffer "^5.0.1"
3458
3459shasum@^1.0.0:
3460 version "1.0.2"
3461 resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
3462 dependencies:
3463 json-stable-stringify "~0.0.0"
3464 sha.js "~2.4.4"
3465
3466shell-quote@^1.6.1:
3467 version "1.6.1"
3468 resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
3469 dependencies:
3470 array-filter "~0.0.0"
3471 array-map "~0.0.0"
3472 array-reduce "~0.0.0"
3473 jsonify "~0.0.0"
3474
3475shell-quote@~1.4.1:
3476 version "1.4.3"
3477 resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.4.3.tgz#952c44e0b1ed9013ef53958179cc643e8777466b"
3478 dependencies:
3479 array-filter "~0.0.0"
3480 array-map "~0.0.0"
3481 array-reduce "~0.0.0"
3482 jsonify "~0.0.0"
3483
3484shelljs@0.3.x:
3485 version "0.3.0"
3486 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
3487
3488sigmund@~1.0.0:
3489 version "1.0.1"
3490 resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
3491
3492signal-exit@^3.0.0:
3493 version "3.0.2"
3494 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
3495
3496slash@^1.0.0:
3497 version "1.0.0"
3498 resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
3499
3500sntp@0.2.x:
3501 version "0.2.4"
3502 resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900"
3503 dependencies:
3504 hoek "0.9.x"
3505
3506sntp@1.x.x:
3507 version "1.0.9"
3508 resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
3509 dependencies:
3510 hoek "2.x.x"
3511
3512source-map-support@^0.4.0, source-map-support@^0.4.15:
3513 version "0.4.18"
3514 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
3515 dependencies:
3516 source-map "^0.5.6"
3517
3518source-map@^0.4.2:
3519 version "0.4.4"
3520 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
3521 dependencies:
3522 amdefine ">=0.0.4"
3523
3524source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0, source-map@~0.5.3:
3525 version "0.5.7"
3526 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
3527
3528source-map@~0.1.7:
3529 version "0.1.43"
3530 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
3531 dependencies:
3532 amdefine ">=0.0.4"
3533
3534sprintf-js@~1.0.2:
3535 version "1.0.3"
3536 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
3537
3538sshpk@^1.7.0:
3539 version "1.13.1"
3540 resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
3541 dependencies:
3542 asn1 "~0.2.3"
3543 assert-plus "^1.0.0"
3544 dashdash "^1.12.0"
3545 getpass "^0.1.1"
3546 optionalDependencies:
3547 bcrypt-pbkdf "^1.0.0"
3548 ecc-jsbn "~0.1.1"
3549 jsbn "~0.1.0"
3550 tweetnacl "~0.14.0"
3551
3552stack-trace@0.0.x:
3553 version "0.0.10"
3554 resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
3555
3556stream-browserify@^2.0.0:
3557 version "2.0.1"
3558 resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
3559 dependencies:
3560 inherits "~2.0.1"
3561 readable-stream "^2.0.2"
3562
3563stream-combiner2@^1.1.1:
3564 version "1.1.1"
3565 resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
3566 dependencies:
3567 duplexer2 "~0.1.0"
3568 readable-stream "^2.0.2"
3569
3570stream-http@^2.0.0:
3571 version "2.8.0"
3572 resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10"
3573 dependencies:
3574 builtin-status-codes "^3.0.0"
3575 inherits "^2.0.1"
3576 readable-stream "^2.3.3"
3577 to-arraybuffer "^1.0.0"
3578 xtend "^4.0.0"
3579
3580stream-splicer@^2.0.0:
3581 version "2.0.0"
3582 resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
3583 dependencies:
3584 inherits "^2.0.1"
3585 readable-stream "^2.0.2"
3586
3587string-length@^0.1.2:
3588 version "0.1.2"
3589 resolved "https://registry.yarnpkg.com/string-length/-/string-length-0.1.2.tgz#ab04bb33867ee74beed7fb89bb7f089d392780f2"
3590 dependencies:
3591 strip-ansi "^0.2.1"
3592
3593string-width@^1.0.1, string-width@^1.0.2:
3594 version "1.0.2"
3595 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
3596 dependencies:
3597 code-point-at "^1.0.0"
3598 is-fullwidth-code-point "^1.0.0"
3599 strip-ansi "^3.0.0"
3600
3601string_decoder@~0.10.x:
3602 version "0.10.31"
3603 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
3604
3605string_decoder@~1.0.0, string_decoder@~1.0.3:
3606 version "1.0.3"
3607 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
3608 dependencies:
3609 safe-buffer "~5.1.0"
3610
3611stringify-object@~1.0.0:
3612 version "1.0.1"
3613 resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-1.0.1.tgz#86d35e7dbfbce9aa45637d7ecdd7847e159db8a2"
3614
3615stringstream@~0.0.4:
3616 version "0.0.5"
3617 resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
3618
3619strip-ansi@^0.2.1:
3620 version "0.2.2"
3621 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.2.2.tgz#854d290c981525fc8c397a910b025ae2d54ffc08"
3622 dependencies:
3623 ansi-regex "^0.1.0"
3624
3625strip-ansi@^0.3.0:
3626 version "0.3.0"
3627 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220"
3628 dependencies:
3629 ansi-regex "^0.2.1"
3630
3631strip-ansi@^2.0.1:
3632 version "2.0.1"
3633 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e"
3634 dependencies:
3635 ansi-regex "^1.0.0"
3636
3637strip-ansi@^3.0.0, strip-ansi@^3.0.1:
3638 version "3.0.1"
3639 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
3640 dependencies:
3641 ansi-regex "^2.0.0"
3642
3643strip-ansi@~0.1.0:
3644 version "0.1.1"
3645 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
3646
3647strip-bom@^2.0.0:
3648 version "2.0.0"
3649 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
3650 dependencies:
3651 is-utf8 "^0.2.0"
3652
3653strip-json-comments@1.0.x, strip-json-comments@~1.0.2:
3654 version "1.0.4"
3655 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
3656
3657strip-json-comments@~2.0.1:
3658 version "2.0.1"
3659 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
3660
3661subarg@^1.0.0:
3662 version "1.0.0"
3663 resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
3664 dependencies:
3665 minimist "^1.1.0"
3666
3667supports-color@^0.2.0:
3668 version "0.2.0"
3669 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a"
3670
3671supports-color@^2.0.0:
3672 version "2.0.0"
3673 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
3674
3675syntax-error@^1.1.1:
3676 version "1.3.0"
3677 resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1"
3678 dependencies:
3679 acorn "^4.0.3"
3680
3681tar-fs@0.5.2:
3682 version "0.5.2"
3683 resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-0.5.2.tgz#0f59424be7eeee45232316e302f66d3f6ea6db3e"
3684 dependencies:
3685 mkdirp "^0.5.0"
3686 pump "^0.3.5"
3687 tar-stream "^0.4.6"
3688
3689tar-pack@^3.4.0:
3690 version "3.4.1"
3691 resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
3692 dependencies:
3693 debug "^2.2.0"
3694 fstream "^1.0.10"
3695 fstream-ignore "^1.0.5"
3696 once "^1.3.3"
3697 readable-stream "^2.1.4"
3698 rimraf "^2.5.1"
3699 tar "^2.2.1"
3700 uid-number "^0.0.6"
3701
3702tar-stream@^0.4.6:
3703 version "0.4.7"
3704 resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd"
3705 dependencies:
3706 bl "^0.9.0"
3707 end-of-stream "^1.0.0"
3708 readable-stream "^1.0.27-1"
3709 xtend "^4.0.0"
3710
3711tar@^2.2.1:
3712 version "2.2.1"
3713 resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
3714 dependencies:
3715 block-stream "*"
3716 fstream "^1.0.2"
3717 inherits "2"
3718
3719throttleit@~0.0.2:
3720 version "0.0.2"
3721 resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf"
3722
3723through2@^2.0.0:
3724 version "2.0.3"
3725 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
3726 dependencies:
3727 readable-stream "^2.1.5"
3728 xtend "~4.0.1"
3729
3730"through@>=2.2.7 <3", through@~2.3.4:
3731 version "2.3.8"
3732 resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
3733
3734timers-browserify@^1.0.1:
3735 version "1.4.2"
3736 resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
3737 dependencies:
3738 process "~0.11.0"
3739
3740timers-ext@0.1:
3741 version "0.1.2"
3742 resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.2.tgz#61cc47a76c1abd3195f14527f978d58ae94c5204"
3743 dependencies:
3744 es5-ext "~0.10.14"
3745 next-tick "1"
3746
3747tmp@0.0.23:
3748 version "0.0.23"
3749 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.23.tgz#de874aa5e974a85f0a32cdfdbd74663cb3bd9c74"
3750
3751to-arraybuffer@^1.0.0:
3752 version "1.0.1"
3753 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
3754
3755to-double-quotes@^2.0.0:
3756 version "2.0.0"
3757 resolved "https://registry.yarnpkg.com/to-double-quotes/-/to-double-quotes-2.0.0.tgz#aaf231d6fa948949f819301bbab4484d8588e4a7"
3758
3759to-fast-properties@^1.0.3:
3760 version "1.0.3"
3761 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
3762
3763to-single-quotes@^2.0.0:
3764 version "2.0.1"
3765 resolved "https://registry.yarnpkg.com/to-single-quotes/-/to-single-quotes-2.0.1.tgz#7cc29151f0f5f2c41946f119f5932fe554170125"
3766
3767touch@0.0.2:
3768 version "0.0.2"
3769 resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.2.tgz#a65a777795e5cbbe1299499bdc42281ffb21b5f4"
3770 dependencies:
3771 nopt "~1.0.10"
3772
3773tough-cookie@>=0.12.0, tough-cookie@^0.12.1:
3774 version "0.12.1"
3775 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-0.12.1.tgz#8220c7e21abd5b13d96804254bd5a81ebf2c7d62"
3776 dependencies:
3777 punycode ">=0.2.0"
3778
3779tough-cookie@~2.3.0:
3780 version "2.3.3"
3781 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
3782 dependencies:
3783 punycode "^1.4.1"
3784
3785"traverse@>=0.3.0 <0.4":
3786 version "0.3.9"
3787 resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
3788
3789trim-right@^1.0.1:
3790 version "1.0.1"
3791 resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
3792
3793tty-browserify@~0.0.0:
3794 version "0.0.1"
3795 resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
3796
3797tunnel-agent@^0.6.0:
3798 version "0.6.0"
3799 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
3800 dependencies:
3801 safe-buffer "^5.0.1"
3802
3803tunnel-agent@~0.4.0:
3804 version "0.4.3"
3805 resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
3806
3807tweetnacl@^0.14.3, tweetnacl@~0.14.0:
3808 version "0.14.5"
3809 resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
3810
3811typedarray@^0.0.6, typedarray@~0.0.5:
3812 version "0.0.6"
3813 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
3814
3815uglify-js@~2.3:
3816 version "2.3.6"
3817 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.3.6.tgz#fa0984770b428b7a9b2a8058f46355d14fef211a"
3818 dependencies:
3819 async "~0.2.6"
3820 optimist "~0.3.5"
3821 source-map "~0.1.7"
3822
3823uid-number@0.0.5:
3824 version "0.0.5"
3825 resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.5.tgz#5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e"
3826
3827uid-number@^0.0.6:
3828 version "0.0.6"
3829 resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
3830
3831umd@^3.0.0:
3832 version "3.0.1"
3833 resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
3834
3835underscore@~1.6.0:
3836 version "1.6.0"
3837 resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
3838
3839update-notifier@0.2.0:
3840 version "0.2.0"
3841 resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.2.0.tgz#a010c928adcf02090b8e0ce7fef6fb0a7cacc34a"
3842 dependencies:
3843 chalk "^0.5.0"
3844 configstore "^0.3.0"
3845 latest-version "^0.2.0"
3846 semver-diff "^0.1.0"
3847 string-length "^0.1.2"
3848
3849url@~0.11.0:
3850 version "0.11.0"
3851 resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
3852 dependencies:
3853 punycode "1.3.2"
3854 querystring "0.2.0"
3855
3856user-home@^1.0.0, user-home@^1.1.1:
3857 version "1.1.1"
3858 resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
3859
3860util-deprecate@~1.0.1:
3861 version "1.0.2"
3862 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
3863
3864util@0.10.3, util@~0.10.1:
3865 version "0.10.3"
3866 resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
3867 dependencies:
3868 inherits "2.0.1"
3869
3870utile@0.2.x:
3871 version "0.2.1"
3872 resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7"
3873 dependencies:
3874 async "~0.2.9"
3875 deep-equal "*"
3876 i "0.3.x"
3877 mkdirp "0.x.x"
3878 ncp "0.4.x"
3879 rimraf "2.x.x"
3880
3881uuid@^2.0.1, uuid@^2.0.2:
3882 version "2.0.3"
3883 resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
3884
3885uuid@^3.0.0:
3886 version "3.2.1"
3887 resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
3888
3889v8flags@^2.1.1:
3890 version "2.1.1"
3891 resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
3892 dependencies:
3893 user-home "^1.1.1"
3894
3895verror@1.10.0:
3896 version "1.10.0"
3897 resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
3898 dependencies:
3899 assert-plus "^1.0.0"
3900 core-util-is "1.0.2"
3901 extsprintf "^1.2.0"
3902
3903vm-browserify@~0.0.1:
3904 version "0.0.4"
3905 resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
3906 dependencies:
3907 indexof "0.0.1"
3908
3909vow-fs@~0.3.4:
3910 version "0.3.6"
3911 resolved "https://registry.yarnpkg.com/vow-fs/-/vow-fs-0.3.6.tgz#2d4c59be22e2bf2618ddf597ab4baa923be7200d"
3912 dependencies:
3913 glob "^7.0.5"
3914 uuid "^2.0.2"
3915 vow "^0.4.7"
3916 vow-queue "^0.4.1"
3917
3918vow-queue@^0.4.1:
3919 version "0.4.3"
3920 resolved "https://registry.yarnpkg.com/vow-queue/-/vow-queue-0.4.3.tgz#4ba8f64b56e9212c0dbe57f1405aeebd54cce78d"
3921 dependencies:
3922 vow "^0.4.17"
3923
3924vow@^0.4.17, vow@^0.4.7, vow@~0.4.8:
3925 version "0.4.17"
3926 resolved "https://registry.yarnpkg.com/vow/-/vow-0.4.17.tgz#b16e08fae58c52f3ebc6875f2441b26a92682904"
3927
3928which@~1.0.5:
3929 version "1.0.9"
3930 resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f"
3931
3932wide-align@^1.1.0:
3933 version "1.1.2"
3934 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
3935 dependencies:
3936 string-width "^1.0.2"
3937
3938win-release@^1.0.0:
3939 version "1.1.1"
3940 resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209"
3941 dependencies:
3942 semver "^5.0.1"
3943
3944winston@0.8.x:
3945 version "0.8.3"
3946 resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0"
3947 dependencies:
3948 async "0.2.x"
3949 colors "0.6.x"
3950 cycle "1.0.x"
3951 eyes "0.1.x"
3952 isstream "0.1.x"
3953 pkginfo "0.3.x"
3954 stack-trace "0.0.x"
3955
3956wordwrap@~0.0.2:
3957 version "0.0.3"
3958 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
3959
3960wrappy@1:
3961 version "1.0.2"
3962 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
3963
3964xdg-basedir@^1.0.0:
3965 version "1.0.1"
3966 resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-1.0.1.tgz#14ff8f63a4fdbcb05d5b6eea22b36f3033b9f04e"
3967 dependencies:
3968 user-home "^1.0.0"
3969
3970xmlbuilder@^3.1.0:
3971 version "3.1.0"
3972 resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-3.1.0.tgz#2c86888f2d4eade850fa38ca7f7223f7209516e1"
3973 dependencies:
3974 lodash "^3.5.0"
3975
3976xtend@^4.0.0, xtend@~4.0.1:
3977 version "4.0.1"
3978 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
diff --git a/db/db.go b/db/db.go
new file mode 100644
index 0000000..bc4b8b3
--- /dev/null
+++ b/db/db.go
@@ -0,0 +1,75 @@
1package db
2
3import (
4 "fmt"
5 "strings"
6
7 "github.com/go-pg/pg"
8 "github.com/go-pg/pg/orm"
9 "github.com/jloup/utils"
10)
11
12var DB *pg.DB
13
14var log = utils.StandardL().WithField("module", "db")
15
16type DBConfig struct {
17 Address string
18 Database string
19 User string
20 Password string
21}
22
23func Init(config DBConfig) {
24 var err error
25
26 DB = connect(config)
27
28 err = createSchema(DB)
29 if err != nil {
30 log.Errorf("cannot create schemas %v\n", err)
31 }
32
33 err = createIndexes(DB)
34 if err != nil {
35 log.Errorf("cannot create indexes %v\n", err)
36 }
37}
38
39func connect(config DBConfig) *pg.DB {
40 return pg.Connect(&pg.Options{
41 User: config.User,
42 Password: config.Password,
43 Database: config.Database,
44 Addr: config.Address,
45 })
46}
47
48func createSchema(db *pg.DB) error {
49 for _, model := range []interface{}{&User{}, &MarketConfig{}} {
50 err := db.CreateTable(model, &orm.CreateTableOptions{IfNotExists: true})
51 if err != nil {
52 return err
53 }
54 }
55 return nil
56}
57
58func createIndexes(db *pg.DB) error {
59 indexes := []struct {
60 TableName string
61 Name string
62 Columns []string
63 }{
64 {"market_configs", "market_name_user_id_idx", []string{"user_id", "market_name"}},
65 }
66
67 for _, index := range indexes {
68 _, err := db.Exec(fmt.Sprintf("CREATE UNIQUE INDEX IF NOT EXISTS %s ON %s (%s)", index.Name, index.TableName, strings.Join(index.Columns, ",")))
69 if err != nil {
70 return err
71 }
72 }
73
74 return nil
75}
diff --git a/db/db_test.go b/db/db_test.go
new file mode 100644
index 0000000..0481915
--- /dev/null
+++ b/db/db_test.go
@@ -0,0 +1,35 @@
1package db
2
3import "testing"
4
5func TestInit(t *testing.T) {
6 Init(DBConfig{"localhost:5432", "cryptoportfolio", "cryptoportfolio", "cryptoportfolio-dev"})
7}
8
9func TestUpdateUser(t *testing.T) {
10 Init(DBConfig{"localhost:5432", "cryptoportfolio", "cryptoportfolio", "cryptoportfolio-dev"})
11 t.Log(InsertUser(&User{Email: "j@test.com", PasswordHash: "yp"}))
12 err := InsertUser(&User{Email: "t2@test.com", PasswordHash: "yp"})
13
14 t.Log(err, IsDup(err))
15
16 t.Log(GetUserByEmail("testyo"))
17}
18
19func TestMarketConfig(t *testing.T) {
20 Init(DBConfig{"localhost:5432", "cryptoportfolio", "cryptoportfolio", "cryptoportfolio-dev"})
21
22 config := MarketConfig{UserId: 1, MarketName: "poloniex"}
23 config.Config = make(map[string]string)
24
25 config.Config["secret"] = "key"
26
27 t.Log(InsertMarketConfig(&config))
28 t.Log(config)
29
30 t.Log(GetUserMarketConfig(1, "poloniex"))
31
32 config.Config["secret2"] = "key2"
33 t.Log(SetUserMarketConfig(1, "poloniex", config.Config))
34 t.Log(SetUserMarketConfig(1, "bifinance", config.Config))
35}
diff --git a/db/errors.go b/db/errors.go
new file mode 100644
index 0000000..ed5f371
--- /dev/null
+++ b/db/errors.go
@@ -0,0 +1,23 @@
1package db
2
3import (
4 "strings"
5
6 "github.com/go-pg/pg"
7)
8
9func PGCode(err error) string {
10 if _, ok := err.(pg.Error); !ok {
11 return ""
12 }
13
14 return err.(pg.Error).Field('C')
15}
16
17func IsDup(err error) bool {
18 return PGCode(err) == "23505"
19}
20
21func IsSQLError(err error) bool {
22 return strings.HasPrefix(err.Error(), "ERROR #")
23}
diff --git a/db/market_config.go b/db/market_config.go
new file mode 100644
index 0000000..b26c092
--- /dev/null
+++ b/db/market_config.go
@@ -0,0 +1,45 @@
1package db
2
3import "github.com/go-pg/pg"
4
5type MarketConfig struct {
6 Id int64
7 MarketName string `sql:",notnull"`
8 UserId int64 `sql:",notnull"`
9 Config map[string]string
10}
11
12func InsertMarketConfig(config *MarketConfig) error {
13 return DB.Insert(config)
14}
15
16func GetUserMarketConfig(userId int64, market string) (*MarketConfig, error) {
17 var config MarketConfig
18
19 err := DB.Model(&config).Where("user_id = ?", userId).Where("market_name = ?", market).First()
20
21 if err != nil && err != pg.ErrNoRows {
22 return nil, err
23 }
24
25 if err == pg.ErrNoRows {
26 return nil, nil
27 } else {
28 return &config, nil
29 }
30}
31
32func SetUserMarketConfig(userId int64, market string, newConfig map[string]string) (*MarketConfig, error) {
33 config := MarketConfig{
34 UserId: userId,
35 MarketName: market,
36 Config: newConfig,
37 }
38
39 _, err := DB.Model(&config).
40 OnConflict("(user_id, market_name) DO UPDATE").
41 Set("config = ?", newConfig).
42 Insert()
43
44 return &config, err
45}
diff --git a/db/user.go b/db/user.go
new file mode 100644
index 0000000..aed0ac1
--- /dev/null
+++ b/db/user.go
@@ -0,0 +1,72 @@
1package db
2
3import (
4 "golang.org/x/crypto/bcrypt"
5)
6
7type UserStatus uint8
8
9const (
10 Confirmed UserStatus = iota + 1
11 AwaitingConfirmation
12)
13
14type User struct {
15 Id int64
16 Email string `sql:",unique,notnull"`
17 PasswordHash string `sql:",notnull"`
18 OtpSecret string
19 IsOtpSetup bool
20 Status UserStatus
21}
22
23func HashPassword(password string) (string, error) {
24 b, err := bcrypt.GenerateFromPassword([]byte(password), 10)
25
26 return string(b), err
27}
28
29func ValidatePassword(password string, hash string) error {
30 return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
31}
32
33func InsertUser(user *User) error {
34 return DB.Insert(user)
35}
36
37func ConfirmUserByEmail(email string) error {
38 _, err := DB.Model(&User{}).Set("status=?", Confirmed).Where("email=?", email).Returning("*").Update()
39
40 return err
41}
42
43func GetUserById(id int64) (*User, error) {
44 user := User{Id: id}
45
46 err := DB.Select(&user)
47
48 return &user, err
49}
50
51func GetUserByEmail(email string) (*User, error) {
52 var users []User
53
54 err := DB.Model(&users).Where("email = ?", email).Select()
55
56 if err != nil {
57 return nil, err
58 }
59
60 if len(users) == 0 {
61 return nil, nil
62 }
63
64 return &users[0], nil
65}
66
67func SetOtpSecret(user *User, secret string, temporary bool) error {
68 user.OtpSecret = secret
69 user.IsOtpSetup = !temporary
70
71 return DB.Update(user)
72}