diff options
author | jloup <jean-loup.jamet@trainline.com> | 2018-02-14 14:19:09 +0100 |
---|---|---|
committer | jloup <jean-loup.jamet@trainline.com> | 2018-02-14 14:19:09 +0100 |
commit | 7a9e5112eaaea58d55f181d3e5296e4ff839921c (patch) | |
tree | 968ed193f42a1fad759cc89ad2f8ad5b0091291e | |
download | Front-7a9e5112eaaea58d55f181d3e5296e4ff839921c.tar.gz Front-7a9e5112eaaea58d55f181d3e5296e4ff839921c.tar.zst Front-7a9e5112eaaea58d55f181d3e5296e4ff839921c.zip |
initial commit
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 @@ | |||
1 | vendor/ | ||
2 | cmd/app/dist | ||
3 | cmd/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 @@ | |||
1 | install: | ||
2 | go get -u github.com/golang/dep/cmd/dep | ||
3 | dep ensure | ||
4 | go get github.com/aktau/github-release | ||
5 | |||
6 | clean: | ||
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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
4 | "net/http" | ||
5 | "unicode" | ||
6 | |||
7 | "github.com/gin-gonic/gin" | ||
8 | ) | ||
9 | |||
10 | type Error struct { | ||
11 | Code ErrorCode | ||
12 | UserMessage string | ||
13 | err error | ||
14 | } | ||
15 | |||
16 | func (e Error) Err() error { | ||
17 | if e.err != nil { | ||
18 | return e | ||
19 | } | ||
20 | |||
21 | return nil | ||
22 | } | ||
23 | |||
24 | func (e Error) Error() string { | ||
25 | if e.err != nil { | ||
26 | return e.err.Error() | ||
27 | } | ||
28 | |||
29 | return "" | ||
30 | } | ||
31 | |||
32 | func NewInternalError(err error) *Error { | ||
33 | return &Error{InternalError, "internal error", err} | ||
34 | } | ||
35 | |||
36 | func 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 | |||
51 | type 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 | |||
61 | func (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 | |||
71 | func ErrorResponse(code ErrorCode, message string) Response { | ||
72 | return Response{ | ||
73 | StatusCode: NOK, | ||
74 | ErrorCode: code, | ||
75 | Message: message, | ||
76 | } | ||
77 | } | ||
78 | |||
79 | func SuccessResponse(data interface{}) Response { | ||
80 | return Response{ | ||
81 | StatusCode: OK, | ||
82 | Response: data, | ||
83 | } | ||
84 | } | ||
85 | |||
86 | func WriteJsonResponse(response Response, c *gin.Context) { | ||
87 | response = response.populateStatus() | ||
88 | |||
89 | c.JSON(StatusToHttpCode(response.StatusCode, response.ErrorCode), response) | ||
90 | } | ||
91 | |||
92 | func WriteBinary(contentType string, b []byte, c *gin.Context) { | ||
93 | c.Data(http.StatusOK, contentType, b) | ||
94 | } | ||
95 | |||
96 | type Middleware func(*gin.Context) *Error | ||
97 | |||
98 | func 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 | |||
112 | type Query interface { | ||
113 | ValidateParams() *Error | ||
114 | Run() (interface{}, *Error) | ||
115 | } | ||
116 | |||
117 | func 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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
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. | ||
15 | var JWT_SECRET []byte | ||
16 | |||
17 | type JwtClaims struct { | ||
18 | Authorized bool `json:"authorized"` | ||
19 | Subject int64 `json:"sub,omitempty"` | ||
20 | jwt.StandardClaims | ||
21 | } | ||
22 | |||
23 | func SetJwtSecretKey(secret string) { | ||
24 | JWT_SECRET = []byte(secret) | ||
25 | } | ||
26 | |||
27 | func 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 | |||
49 | func 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 | |||
59 | func 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 | |||
71 | func 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 | |||
81 | func 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 | |||
103 | func 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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
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 | |||
13 | func 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 | |||
38 | type OtpEnrollmentQuery struct { | ||
39 | In struct { | ||
40 | User db.User | ||
41 | } | ||
42 | } | ||
43 | |||
44 | func (q OtpEnrollmentQuery) ValidateParams() *Error { | ||
45 | return nil | ||
46 | } | ||
47 | |||
48 | func (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 | |||
66 | type 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 | |||
78 | func (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 | |||
86 | func (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 | |||
109 | func 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 @@ | |||
1 | package api | ||
2 | |||
3 | import "net/http" | ||
4 | |||
5 | //go:generate stringer -type=Status,ErrorCode -output const_string.go | ||
6 | type Status uint32 | ||
7 | type ErrorCode uint32 | ||
8 | |||
9 | const ( | ||
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 | |||
28 | func 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 | |||
3 | package api | ||
4 | |||
5 | import "fmt" | ||
6 | |||
7 | const _Status_name = "OKNOK" | ||
8 | |||
9 | var _Status_index = [...]uint8{0, 2, 5} | ||
10 | |||
11 | func (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 | |||
18 | const _ErrorCode_name = "BadRequestEmailExistsInternalErrorInvalidCredentialsInvalidEmailInvalidOtpInvalidPasswordNeedOtpValidationNotAuthorizedNotFoundOtpAlreadySetupOtpNotSetupUserNotConfirmed" | ||
19 | |||
20 | var _ErrorCode_index = [...]uint8{0, 10, 21, 34, 52, 64, 74, 89, 106, 119, 127, 142, 153, 169} | ||
21 | |||
22 | func (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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
4 | "github.com/gin-gonic/gin" | ||
5 | "github.com/jloup/utils" | ||
6 | ) | ||
7 | |||
8 | var log = utils.StandardL().WithField("module", "api") | ||
9 | |||
10 | func 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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | |||
6 | "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db" | ||
7 | ) | ||
8 | |||
9 | type MarketConfigQuery struct { | ||
10 | In struct { | ||
11 | User db.User | ||
12 | Market string | ||
13 | } | ||
14 | } | ||
15 | |||
16 | func (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 | |||
24 | func (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 | |||
45 | type UpdateMarketConfigQuery struct { | ||
46 | In struct { | ||
47 | User db.User | ||
48 | Market string | ||
49 | Key string | ||
50 | Secret string | ||
51 | } | ||
52 | } | ||
53 | |||
54 | func (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 | |||
62 | func (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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
4 | "encoding/base64" | ||
5 | |||
6 | "github.com/gin-gonic/gin" | ||
7 | ) | ||
8 | |||
9 | type Route struct { | ||
10 | Method string | ||
11 | Handlers []gin.HandlerFunc | ||
12 | Path string | ||
13 | } | ||
14 | |||
15 | type Group struct { | ||
16 | Root string | ||
17 | Middlewares []Middleware | ||
18 | Routes []Route | ||
19 | } | ||
20 | |||
21 | var 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 | |||
48 | func 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 | |||
57 | func 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 | |||
66 | func 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 | |||
76 | func 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 | |||
105 | func 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 | |||
114 | func 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 @@ | |||
1 | package api | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | "regexp" | ||
6 | |||
7 | "github.com/gin-gonic/gin" | ||
8 | |||
9 | "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db" | ||
10 | ) | ||
11 | |||
12 | const ( | ||
13 | VALID_EMAIL_REGEX = `(?i)^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$` | ||
14 | ) | ||
15 | |||
16 | func IsValidEmailAddress(email string) bool { | ||
17 | r := regexp.MustCompile(VALID_EMAIL_REGEX) | ||
18 | |||
19 | return r.MatchString(email) | ||
20 | } | ||
21 | |||
22 | type SignParams struct { | ||
23 | Email string | ||
24 | Password string | ||
25 | } | ||
26 | |||
27 | type SignResult struct { | ||
28 | Token string `json:"token"` | ||
29 | } | ||
30 | |||
31 | func (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 | |||
43 | type SignupQuery struct { | ||
44 | In SignParams | ||
45 | } | ||
46 | |||
47 | func (q SignupQuery) ValidateParams() *Error { | ||
48 | return q.In.Validate() | ||
49 | } | ||
50 | |||
51 | func (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 | |||
80 | type SigninQuery struct { | ||
81 | In SignParams | ||
82 | } | ||
83 | |||
84 | func (q SigninQuery) ValidateParams() *Error { | ||
85 | return q.In.Validate() | ||
86 | } | ||
87 | |||
88 | func (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 | |||
115 | func 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 | |||
129 | func 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* | ||
2 | roles/nginx | ||
3 | roles/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] | ||
2 | inventory = hosts | ||
3 | roles_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 @@ | |||
1 | log_level="info" | ||
2 | mode="production" | ||
3 | log_out="/var/cryptoportfolio-app/app.log" | ||
4 | port="8080" | ||
5 | |||
6 | [db] | ||
7 | user="{{ postgres_user }}" | ||
8 | password="{{ postgres_password }}" | ||
9 | database="{{ postgres_database }}" | ||
10 | address="localhost:5432" | ||
11 | |||
12 | [api] | ||
13 | domain="{{ app_domain }}" | ||
14 | jwt_secret="{{ jwt_secret }}" | ||
15 | |||
16 | [app] | ||
17 | public_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] | ||
2 | Description=Cryptoportfolio app | ||
3 | |||
4 | [Service] | ||
5 | Type=simple | ||
6 | |||
7 | User={{ app_user }} | ||
8 | Group={{ app_user }} | ||
9 | UMask=007 | ||
10 | |||
11 | ExecStart=/usr/bin/cryptoportfolio-app -conf /var/cryptoportfolio-app/conf.toml | ||
12 | |||
13 | Restart=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] | ||
2 | jlj.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 | ||
2 | 63613535333830393037646665363566636635366534636261623839326130663431653839346266 | ||
3 | 3832643338623561313362663837323234663537663439350a313034326663383235663964626132 | ||
4 | 38343964396265323539396439383731336464393337383833653666643736303539626136383431 | ||
5 | 6536316338376538360a343862626636363031353037626462333364623433613861393137353336 | ||
6 | 37396664663030363530333364633266653862393538313835326138663465626638326363656561 | ||
7 | 30393836386664633834663838666432383836623432363936343635313835303166393531643966 | ||
8 | 33313361383565363232373066306534613465386534386266306564383365373762613361366365 | ||
9 | 61366530623863623336643531346463323233323539333139336335383439373132373233663031 | ||
10 | 39666535633362383135376534376532333663636136366130653762643164333436313261646137 | ||
11 | 37353139633361636163326366616234613466393731373631616138386263383131663537633533 | ||
12 | 31393763316561623134623063623735356334363833623939313437386330323837626131356332 | ||
13 | 30383863373535366137366138633832623566613061313138396539306536633763633934313562 | ||
14 | 35383763653532336539346632623935303634353866636264373262363839326439313837313765 | ||
15 | 36303539613734646238636432393166616438666665363363323331373437633362613838653564 | ||
16 | 64393639346661646333383466363162633638643838386666383564366665656266333836363435 | ||
17 | 35643231323362323566303535303561626139333830393538383635326631656666323166343863 | ||
18 | 31393566346531653535393738326166303261376238316532373833616432306638326139353234 | ||
19 | 32653132323764316231393634663262313765393230656232343833373438636430643663353965 | ||
20 | 36333931303731646333316430646534383531313264353936396565336338663530303434643036 | ||
21 | 34356663373533663137636235386164646334356262336464363862643332636661313339303531 | ||
22 | 35663833656564393331636139663738323834373862623436633666306661373166 | ||
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 | ||
2 | GOCMD=go | ||
3 | GOBUILD=$(GOCMD) build | ||
4 | GOCLEAN=$(GOCMD) clean | ||
5 | GOTEST=$(GOCMD) test | ||
6 | BINARY_NAME=cryptoportfolio-app | ||
7 | LINUX_ARCHES=amd64 386 | ||
8 | DIST_DIR ?= dist | ||
9 | |||
10 | build: | ||
11 | $(GOBUILD) -o $(BINARY_NAME) -v | ||
12 | |||
13 | test: | ||
14 | $(GOTEST) -v ./... | ||
15 | |||
16 | clean: | ||
17 | $(GOCLEAN) | ||
18 | rm -f $(BINARY_NAME) | ||
19 | rm -rf dist | ||
20 | |||
21 | run: 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 | |||
28 | release: $(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 @@ | |||
1 | log_level="info" | ||
2 | mode="dev" | ||
3 | log_out="stdout" | ||
4 | |||
5 | [db] | ||
6 | user="cryptoportfolio" | ||
7 | password="cryptoportfolio-dev" | ||
8 | database="cryptoportfolio" | ||
9 | address="localhost:5432" | ||
10 | |||
11 | [api] | ||
12 | domain="localhost" | ||
13 | jwt_secret="secret" | ||
14 | |||
15 | [app] | ||
16 | public_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 @@ | |||
1 | package main | ||
2 | |||
3 | import ( | ||
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 | |||
17 | var log = utils.StandardL().WithField("module", "api") | ||
18 | |||
19 | type AppConfig struct { | ||
20 | PublicDir string `toml:"public_dir"` | ||
21 | } | ||
22 | |||
23 | type ApiConfig struct { | ||
24 | Domain string `toml:"domain"` | ||
25 | JwtSecret string `toml:"jwt_secret"` | ||
26 | } | ||
27 | |||
28 | type 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 | |||
39 | func (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 | |||
55 | var C Config | ||
56 | |||
57 | func 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 | |||
78 | func 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 | |||
91 | func 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 | |||
110 | func 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 @@ | |||
1 | bower_components/ | ||
2 | node_modules/ | ||
3 | build/ | ||
4 | npm-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 @@ | |||
1 | SHELL=/bin/bash | ||
2 | ENV ?= dev | ||
3 | export PATH := $(PATH):./node_modules/.bin | ||
4 | |||
5 | SRC_DIR=js | ||
6 | BUILD_DIR=build/js | ||
7 | JSX_SRC= main.jsx signup.jsx signin.jsx otp.jsx poloniex.jsx | ||
8 | JS_SRC= cookies.js app.js api.js | ||
9 | JSX_OBJS=$(addprefix $(BUILD_DIR)/,$(JSX_SRC:.jsx=.js)) | ||
10 | JS_OBJS=$(addprefix $(BUILD_DIR)/,$(JS_SRC)) | ||
11 | STATIC_BUILD_DIR=build/static | ||
12 | |||
13 | install: | ||
14 | node --version | ||
15 | npm --version | ||
16 | yarn --version | ||
17 | yarn install | ||
18 | |||
19 | static: js $(STATIC_BUILD_DIR)/index.html $(STATIC_BUILD_DIR)/style.css | ||
20 | |||
21 | js: 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 | |||
40 | build/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 | |||
45 | build/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 | |||
48 | release: build/webapp.tar.gz | ||
49 | |||
50 | clean: | ||
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 @@ | |||
1 | API_HOST=localhost | ||
2 | API_PORT=8000 | ||
3 | API_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 @@ | |||
1 | API_HOST=jlj.am | ||
2 | API_PORT="" | ||
3 | API_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 | |||
3 | var App = require('./app.js'); | ||
4 | |||
5 | var Api = {}; | ||
6 | |||
7 | Api.API_HOST = process.env.API_HOST; | ||
8 | Api.API_PORT = process.env.API_PORT; | ||
9 | |||
10 | if (process.env.API_HTTPS === 'true') { | ||
11 | Api.API_ROOT = 'https://'; | ||
12 | } else { | ||
13 | Api.API_ROOT = 'http://'; | ||
14 | } | ||
15 | |||
16 | Api.API_ROOT += Api.API_HOST; | ||
17 | if (Api.API_PORT !== '80') { | ||
18 | Api.API_ROOT += ':' + Api.API_PORT; | ||
19 | } | ||
20 | |||
21 | Api.API_ROOT += '/api'; | ||
22 | |||
23 | var 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 | |||
88 | Api.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 | |||
123 | Api.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 | |||
135 | Api.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 | |||
175 | module.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 | |||
3 | var cookies = require('./cookies.js'); | ||
4 | var page = require('page'); | ||
5 | |||
6 | var App = {}; | ||
7 | var cookieExpire = 60 * 30; | ||
8 | |||
9 | App.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 | |||
28 | App.isUserSignedIn = function() { | ||
29 | return cookies.hasItem('jwt'); | ||
30 | }; | ||
31 | |||
32 | App.getUserToken = function() { | ||
33 | return cookies.getItem('jwt'); | ||
34 | }; | ||
35 | |||
36 | App.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 | |||
46 | App.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 | |||
56 | App.onUserSignUp = function(token) { | ||
57 | if (!token || token === '') { | ||
58 | page('/signin'); | ||
59 | return; | ||
60 | } | ||
61 | |||
62 | cookies.setItem('jwt', token, cookieExpire); | ||
63 | }; | ||
64 | |||
65 | App.getUserJWT = function() { | ||
66 | return cookies.getItem('jwt'); | ||
67 | }; | ||
68 | |||
69 | App.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 | |||
80 | App.go = function(path) { | ||
81 | page(path); | ||
82 | }; | ||
83 | |||
84 | App.start = function() { | ||
85 | page(); | ||
86 | }; | ||
87 | |||
88 | App.onInternNavigation = function(href, e) { | ||
89 | e.preventDefault(); | ||
90 | page(href); | ||
91 | }; | ||
92 | |||
93 | App.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 | |||
110 | App.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 | |||
121 | module.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 | |||
27 | module.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 @@ | |||
1 | var SignupForm = require('./signup.js').SignupForm; | ||
2 | var SigninForm = require('./signin.js').SigninForm; | ||
3 | var OtpEnrollForm = require('./otp.js').OtpEnrollForm; | ||
4 | var PoloniexForm = require('./poloniex.js').PoloniexForm; | ||
5 | var App = require('./app.js'); | ||
6 | var Api = require('./api.js').Api; | ||
7 | var cookies = require('./cookies.js'); | ||
8 | |||
9 | var Logo = React.createClass({ | ||
10 | render: function() { | ||
11 | return (<div id='logo'> | ||
12 | <a href='/'>Cryptoportfolio</a> | ||
13 | </div>); | ||
14 | } | ||
15 | }); | ||
16 | |||
17 | App.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 | |||
31 | App.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 | |||
45 | App.page('/signout', true, function(context) { | ||
46 | cookies.removeItem('jwt'); | ||
47 | |||
48 | App.go('/'); | ||
49 | }); | ||
50 | |||
51 | App.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 | |||
69 | App.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 | |||
86 | App.page('/otp/validate', true, function(context) { | ||
87 | App.mount( | ||
88 | <div> | ||
89 | <Logo /> | ||
90 | <OtpEnrollForm onSuccess={App.onUserValidateOtp} /> | ||
91 | </div> | ||
92 | ); | ||
93 | }); | ||
94 | |||
95 | App.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 @@ | |||
1 | var Api = require('./api.js').Api; | ||
2 | var App = require('./app.js'); | ||
3 | var classNames = require('classnames'); | ||
4 | |||
5 | var 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 | |||
16 | module.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 @@ | |||
1 | var Api = require('./api.js').Api; | ||
2 | var App = require('./app.js'); | ||
3 | var classNames = require('classnames'); | ||
4 | |||
5 | module.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 @@ | |||
1 | var Api = require('./api.js').Api; | ||
2 | var App = require('./app.js'); | ||
3 | var classNames = require('classnames'); | ||
4 | |||
5 | module.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 @@ | |||
1 | var Api = require('./api.js').Api; | ||
2 | var App = require('./app.js'); | ||
3 | var classNames = require('classnames'); | ||
4 | |||
5 | module.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 | |||
3 | body { | ||
4 | font-family: 'Fira Mono', 'Helvetica Neue', Arial, Helvetica, sans-serif; | ||
5 | background-color: rgb(246, 248, 251); | ||
6 | text-align: center; | ||
7 | } | ||
8 | |||
9 | ul { | ||
10 | list-style-type: none; | ||
11 | } | ||
12 | |||
13 | a { | ||
14 | text-decoration: none; | ||
15 | color: inherit; | ||
16 | } | ||
17 | |||
18 | a:hover { | ||
19 | text-decoration: none; | ||
20 | color: inherit; | ||
21 | } | ||
22 | |||
23 | a: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 | |||
11 | JSONStream@^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 | |||
22 | abbrev@1, abbrev@~1.0.4: | ||
23 | version "1.0.9" | ||
24 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" | ||
25 | |||
26 | acorn@^4.0.3: | ||
27 | version "4.0.13" | ||
28 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" | ||
29 | |||
30 | acorn@^5.2.1: | ||
31 | version "5.4.1" | ||
32 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" | ||
33 | |||
34 | ajv@^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 | |||
41 | amdefine@>=0.0.4: | ||
42 | version "1.0.1" | ||
43 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" | ||
44 | |||
45 | ansi-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 | |||
49 | ansi-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 | |||
53 | ansi-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 | |||
57 | ansi-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 | |||
61 | ansi-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 | |||
65 | ansi-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 | |||
69 | ansi-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 | |||
73 | anymatch@^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 | |||
80 | aproba@^1.0.3: | ||
81 | version "1.2.0" | ||
82 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" | ||
83 | |||
84 | archy@0.0.2: | ||
85 | version "0.0.2" | ||
86 | resolved "https://registry.yarnpkg.com/archy/-/archy-0.0.2.tgz#910f43bf66141fc335564597abc189df44b3d35e" | ||
87 | |||
88 | are-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 | |||
95 | argparse@^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 | |||
101 | arr-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 | |||
107 | arr-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 | |||
111 | array-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 | |||
115 | array-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 | |||
119 | array-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 | |||
123 | array-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 | |||
127 | asn1.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 | |||
135 | asn1@0.1.11: | ||
136 | version "0.1.11" | ||
137 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" | ||
138 | |||
139 | asn1@~0.2.3: | ||
140 | version "0.2.3" | ||
141 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" | ||
142 | |||
143 | assert-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 | |||
147 | assert-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 | |||
151 | assert-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 | |||
155 | assert@^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 | |||
161 | ast-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 | |||
165 | astw@^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 | |||
171 | async-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 | |||
175 | async@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 | |||
179 | async@^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 | |||
183 | asynckit@^0.4.0: | ||
184 | version "0.4.0" | ||
185 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" | ||
186 | |||
187 | aws-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 | |||
191 | aws-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 | |||
195 | aws4@^1.2.1: | ||
196 | version "1.6.0" | ||
197 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" | ||
198 | |||
199 | babel-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 | |||
220 | babel-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 | |||
228 | babel-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 | |||
252 | babel-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 | |||
265 | babel-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 | |||
273 | babel-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 | |||
281 | babel-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 | |||
290 | babel-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 | |||
299 | babel-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 | |||
307 | babel-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 | |||
317 | babel-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 | |||
324 | babel-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 | |||
331 | babel-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 | |||
338 | babel-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 | |||
346 | babel-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 | |||
356 | babel-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 | |||
367 | babel-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 | |||
374 | babel-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 | |||
380 | babel-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 | |||
386 | babel-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 | |||
390 | babel-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 | |||
394 | babel-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 | |||
398 | babel-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 | |||
402 | babel-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 | |||
406 | babel-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 | |||
414 | babel-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 | |||
420 | babel-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 | |||
426 | babel-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 | |||
436 | babel-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 | |||
450 | babel-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 | |||
457 | babel-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 | |||
463 | babel-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 | |||
470 | babel-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 | |||
476 | babel-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 | |||
484 | babel-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 | |||
490 | babel-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 | |||
498 | babel-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 | |||
507 | babel-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 | |||
515 | babel-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 | |||
523 | babel-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 | |||
530 | babel-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 | |||
541 | babel-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 | |||
548 | babel-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 | |||
554 | babel-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 | |||
562 | babel-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 | |||
568 | babel-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 | |||
574 | babel-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 | |||
582 | babel-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 | |||
590 | babel-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 | |||
597 | babel-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 | |||
603 | babel-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 | |||
610 | babel-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 | |||
617 | babel-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 | |||
625 | babel-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 | |||
631 | babel-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 | |||
638 | babel-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 | |||
646 | babel-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 | |||
681 | babel-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 | |||
687 | babel-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 | |||
698 | babel-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 | |||
710 | babel-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 | |||
717 | babel-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 | |||
727 | babel-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 | |||
741 | babel-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 | |||
750 | babylon@^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 | |||
754 | balanced-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 | |||
758 | base62@^1.1.0: | ||
759 | version "1.2.1" | ||
760 | resolved "https://registry.yarnpkg.com/base62/-/base62-1.2.1.tgz#95a5a22350b0a557f3f081247fc2c398803ecb0c" | ||
761 | |||
762 | base64-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 | |||
766 | bcrypt-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 | |||
772 | binary-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 | |||
776 | binary@~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 | |||
783 | bl@^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 | |||
789 | block-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 | |||
795 | bn.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 | |||
799 | boom@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 | |||
805 | boom@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 | |||
811 | bower-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 | |||
820 | bower-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 | |||
824 | bower-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 | |||
832 | bower-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 | |||
836 | bower-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 | |||
849 | bower@~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 | |||
895 | brace-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 | |||
902 | braces@^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 | |||
910 | brorand@^1.0.1: | ||
911 | version "1.1.0" | ||
912 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" | ||
913 | |||
914 | browser-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 | |||
925 | browser-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 | |||
931 | browserify-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 | |||
942 | browserify-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 | |||
950 | browserify-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 | |||
958 | browserify-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 | |||
965 | browserify-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 | |||
977 | browserify-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 | |||
983 | browserify@^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 | |||
1036 | browserslist@^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 | |||
1043 | buffer-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 | |||
1047 | buffer@^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 | |||
1054 | buffers@~0.1.1: | ||
1055 | version "0.1.1" | ||
1056 | resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" | ||
1057 | |||
1058 | builtin-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 | |||
1062 | cached-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 | |||
1066 | caniuse-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 | |||
1070 | cardinal@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 | |||
1076 | caseless@~0.12.0: | ||
1077 | version "0.12.0" | ||
1078 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" | ||
1079 | |||
1080 | caseless@~0.6.0: | ||
1081 | version "0.6.0" | ||
1082 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4" | ||
1083 | |||
1084 | caseless@~0.8.0: | ||
1085 | version "0.8.0" | ||
1086 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.8.0.tgz#5bca2881d41437f54b2407ebe34888c7b9ad4f7d" | ||
1087 | |||
1088 | chainsaw@~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 | |||
1094 | chalk@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 | |||
1104 | chalk@^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 | |||
1114 | chalk@^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 | |||
1124 | chalk@~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 | |||
1132 | chmodr@0.1.0: | ||
1133 | version "0.1.0" | ||
1134 | resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-0.1.0.tgz#e09215a1d51542db2a2576969765bcf6125583eb" | ||
1135 | |||
1136 | chokidar@^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 | |||
1151 | cipher-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 | |||
1158 | classnames@^2.2.5: | ||
1159 | version "2.2.5" | ||
1160 | resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" | ||
1161 | |||
1162 | cli-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 | |||
1171 | cli-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 | |||
1177 | cli@~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 | |||
1184 | co@^4.6.0: | ||
1185 | version "4.6.0" | ||
1186 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" | ||
1187 | |||
1188 | code-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 | |||
1192 | colors@0.6.x: | ||
1193 | version "0.6.2" | ||
1194 | resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" | ||
1195 | |||
1196 | colors@1.0.3: | ||
1197 | version "1.0.3" | ||
1198 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" | ||
1199 | |||
1200 | combine-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 | |||
1209 | combine-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 | |||
1218 | combined-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 | |||
1224 | combined-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 | |||
1230 | commander@2.5.0: | ||
1231 | version "2.5.0" | ||
1232 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.5.0.tgz#d777b6a4d847d423e5d475da864294ac1ff5aa9d" | ||
1233 | |||
1234 | commander@^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 | |||
1238 | commander@~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 | |||
1244 | comment-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 | |||
1250 | commoner@^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 | |||
1264 | concat-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 | |||
1268 | concat-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 | |||
1276 | concat-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 | |||
1284 | config-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 | |||
1291 | configstore@^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 | |||
1304 | console-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 | |||
1310 | console-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 | |||
1314 | constants-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 | |||
1318 | convert-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 | |||
1322 | convert-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 | |||
1326 | core-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 | |||
1330 | core-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 | |||
1334 | create-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 | |||
1341 | create-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 | |||
1350 | create-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 | |||
1361 | cryptiles@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 | |||
1367 | cryptiles@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 | |||
1373 | crypto-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 | |||
1389 | cst@^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 | |||
1397 | ctype@0.5.3: | ||
1398 | version "0.5.3" | ||
1399 | resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" | ||
1400 | |||
1401 | cycle@1.0.x: | ||
1402 | version "1.0.3" | ||
1403 | resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" | ||
1404 | |||
1405 | d@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 | |||
1411 | d@~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 | |||
1417 | dashdash@^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 | |||
1423 | date-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 | |||
1427 | debowerify@^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 | |||
1436 | debug@^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 | |||
1442 | decompress-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 | |||
1454 | deep-equal@*: | ||
1455 | version "1.0.1" | ||
1456 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" | ||
1457 | |||
1458 | deep-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 | |||
1462 | deep-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 | |||
1466 | defined@^1.0.0: | ||
1467 | version "1.0.0" | ||
1468 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" | ||
1469 | |||
1470 | delayed-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 | |||
1474 | delayed-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 | |||
1478 | delegates@^1.0.0: | ||
1479 | version "1.0.0" | ||
1480 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" | ||
1481 | |||
1482 | deps-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 | |||
1491 | des.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 | |||
1498 | detect-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 | |||
1504 | detect-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 | |||
1508 | detective@^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 | |||
1515 | detective@^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 | |||
1523 | diffie-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 | |||
1531 | dom-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 | |||
1538 | domain-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 | |||
1542 | domelementtype@1: | ||
1543 | version "1.3.0" | ||
1544 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" | ||
1545 | |||
1546 | domelementtype@~1.1.1: | ||
1547 | version "1.1.3" | ||
1548 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" | ||
1549 | |||
1550 | domhandler@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 | |||
1556 | domutils@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 | |||
1563 | duplexer2@^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 | |||
1569 | ecc-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 | |||
1575 | electron-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 | |||
1579 | elliptic@^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 | |||
1591 | end-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 | |||
1597 | entities@1.0: | ||
1598 | version "1.0.0" | ||
1599 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" | ||
1600 | |||
1601 | entities@~1.1.1: | ||
1602 | version "1.1.1" | ||
1603 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" | ||
1604 | |||
1605 | envify@^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 | |||
1612 | es5-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 | |||
1619 | es6-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 | |||
1627 | es6-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 | |||
1635 | es6-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 | |||
1642 | es6-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 | |||
1649 | es6-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 | |||
1658 | escape-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 | |||
1662 | esprima-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 | |||
1666 | esprima@^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 | |||
1670 | esprima@~1.0.4: | ||
1671 | version "1.0.4" | ||
1672 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" | ||
1673 | |||
1674 | esprima@~3.1.0: | ||
1675 | version "3.1.3" | ||
1676 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" | ||
1677 | |||
1678 | estraverse@^4.1.0: | ||
1679 | version "4.2.0" | ||
1680 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" | ||
1681 | |||
1682 | esutils@^2.0.2: | ||
1683 | version "2.0.2" | ||
1684 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" | ||
1685 | |||
1686 | event-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 | |||
1693 | events@~1.1.0: | ||
1694 | version "1.1.1" | ||
1695 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" | ||
1696 | |||
1697 | evp_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 | |||
1704 | exit@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 | |||
1708 | expand-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 | |||
1714 | expand-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 | |||
1720 | extend@~3.0.0: | ||
1721 | version "3.0.1" | ||
1722 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" | ||
1723 | |||
1724 | extglob@^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 | |||
1730 | extsprintf@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 | |||
1734 | eyes@0.1.x: | ||
1735 | version "0.1.8" | ||
1736 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" | ||
1737 | |||
1738 | figures@^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 | |||
1745 | filename-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 | |||
1749 | fill-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 | |||
1759 | for-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 | |||
1763 | for-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 | |||
1769 | forever-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 | |||
1773 | forever-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 | |||
1777 | form-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 | |||
1785 | form-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 | |||
1793 | form-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 | |||
1801 | fs-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 | |||
1805 | fs.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 | |||
1809 | fsevents@^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 | |||
1816 | fstream-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 | |||
1824 | fstream@^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 | |||
1833 | function-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 | |||
1837 | gauge@~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 | |||
1850 | getpass@^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 | |||
1856 | glob-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 | |||
1863 | glob-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 | |||
1869 | glob@^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 | |||
1879 | glob@^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 | |||
1890 | glob@~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 | |||
1899 | globals@^9.18.0: | ||
1900 | version "9.18.0" | ||
1901 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" | ||
1902 | |||
1903 | got@^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 | |||
1909 | graceful-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 | |||
1915 | graceful-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 | |||
1919 | graceful-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 | |||
1927 | handlebars@~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 | |||
1935 | har-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 | |||
1939 | har-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 | |||
1946 | has-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 | |||
1952 | has-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 | |||
1958 | has-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 | |||
1962 | has-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 | |||
1966 | has@^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 | |||
1972 | hash-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 | |||
1978 | hash-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 | |||
1985 | hash.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 | |||
1992 | hawk@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 | |||
2001 | hawk@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 | |||
2010 | hmac-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 | |||
2018 | hoek@0.9.x: | ||
2019 | version "0.9.1" | ||
2020 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" | ||
2021 | |||
2022 | hoek@2.x.x: | ||
2023 | version "2.16.3" | ||
2024 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" | ||
2025 | |||
2026 | home-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 | |||
2033 | htmlescape@^1.1.0: | ||
2034 | version "1.1.1" | ||
2035 | resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" | ||
2036 | |||
2037 | htmlparser2@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 | |||
2047 | http-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 | |||
2055 | http-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 | |||
2063 | https-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 | |||
2067 | i@0.3.x: | ||
2068 | version "0.3.6" | ||
2069 | resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" | ||
2070 | |||
2071 | iconv-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 | |||
2075 | ieee754@^1.1.4: | ||
2076 | version "1.1.8" | ||
2077 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" | ||
2078 | |||
2079 | indexof@0.0.1: | ||
2080 | version "0.0.1" | ||
2081 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" | ||
2082 | |||
2083 | inflight@^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 | |||
2090 | inherit@^2.2.2: | ||
2091 | version "2.2.6" | ||
2092 | resolved "https://registry.yarnpkg.com/inherit/-/inherit-2.2.6.tgz#f1614b06c8544e8128e4229c86347db73ad9788d" | ||
2093 | |||
2094 | inherits@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 | |||
2098 | inherits@2.0.1: | ||
2099 | version "2.0.1" | ||
2100 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" | ||
2101 | |||
2102 | ini@^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 | |||
2106 | inline-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 | |||
2112 | inquirer@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 | |||
2125 | inquirer@^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 | |||
2137 | insert-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 | |||
2150 | insight@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 | |||
2164 | intersect@~0.0.3: | ||
2165 | version "0.0.3" | ||
2166 | resolved "https://registry.yarnpkg.com/intersect/-/intersect-0.0.3.tgz#c1a4a5e5eac6ede4af7504cc07e0ada7bc9f4920" | ||
2167 | |||
2168 | invariant@^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 | |||
2174 | is-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 | |||
2180 | is-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 | |||
2184 | is-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 | |||
2188 | is-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 | |||
2194 | is-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 | |||
2198 | is-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 | |||
2202 | is-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 | |||
2208 | is-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 | |||
2214 | is-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 | |||
2220 | is-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 | |||
2226 | is-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 | |||
2232 | is-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 | |||
2236 | is-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 | |||
2240 | is-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 | |||
2244 | is-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 | |||
2248 | is-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 | |||
2252 | isarray@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 | |||
2256 | isarray@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 | |||
2260 | isobject@^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 | |||
2266 | isstream@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 | |||
2270 | js-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 | |||
2274 | js-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 | |||
2282 | jsbn@~0.1.0: | ||
2283 | version "0.1.1" | ||
2284 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" | ||
2285 | |||
2286 | jscs-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 | |||
2293 | jscs-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 | |||
2297 | jscs@^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 | |||
2328 | jsdoctypeparser@~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 | |||
2334 | jsesc@^1.3.0: | ||
2335 | version "1.3.0" | ||
2336 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" | ||
2337 | |||
2338 | jsesc@~0.5.0: | ||
2339 | version "0.5.0" | ||
2340 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" | ||
2341 | |||
2342 | jshint@^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 | |||
2355 | json-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 | |||
2359 | json-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 | |||
2365 | json-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 | |||
2371 | json-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 | |||
2375 | json5@^0.5.1: | ||
2376 | version "0.5.1" | ||
2377 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" | ||
2378 | |||
2379 | jsonify@~0.0.0: | ||
2380 | version "0.0.0" | ||
2381 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" | ||
2382 | |||
2383 | jsonlint@~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 | |||
2390 | jsonparse@^1.2.0: | ||
2391 | version "1.3.1" | ||
2392 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" | ||
2393 | |||
2394 | jsprim@^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 | |||
2403 | jstransform@^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 | |||
2413 | junk@~1.0.0: | ||
2414 | version "1.0.3" | ||
2415 | resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592" | ||
2416 | |||
2417 | kind-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 | |||
2423 | kind-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 | |||
2429 | labeled-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 | |||
2437 | latest-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 | |||
2443 | lexical-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 | |||
2449 | localenv@^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 | |||
2455 | localenvify@^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 | |||
2462 | lockfile@~1.0.0: | ||
2463 | version "1.0.3" | ||
2464 | resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" | ||
2465 | |||
2466 | lodash._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 | |||
2470 | lodash._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 | |||
2474 | lodash.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 | |||
2482 | lodash.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 | |||
2486 | lodash.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 | |||
2492 | lodash.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 | |||
2496 | lodash.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 | |||
2502 | lodash@3.7.x: | ||
2503 | version "3.7.0" | ||
2504 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" | ||
2505 | |||
2506 | lodash@^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 | |||
2510 | lodash@^4.17.4: | ||
2511 | version "4.17.5" | ||
2512 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" | ||
2513 | |||
2514 | lodash@~2.4.1: | ||
2515 | version "2.4.2" | ||
2516 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" | ||
2517 | |||
2518 | loose-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 | |||
2524 | lru-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 | |||
2528 | lru-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 | |||
2532 | lru-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 | |||
2538 | md5.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 | |||
2545 | memoizee@~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 | |||
2557 | micromatch@^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 | |||
2575 | miller-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 | |||
2582 | mime-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 | |||
2586 | mime-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 | |||
2590 | mime-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 | |||
2596 | mime-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 | |||
2600 | mime-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 | |||
2606 | mime@~1.2.11: | ||
2607 | version "1.2.11" | ||
2608 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" | ||
2609 | |||
2610 | minimalistic-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 | |||
2614 | minimalistic-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 | |||
2624 | minimatch@^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 | |||
2631 | minimist@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 | |||
2635 | minimist@^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 | |||
2639 | mkdirp@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 | |||
2645 | mkdirp@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 | |||
2651 | mkdirp@~0.3.5: | ||
2652 | version "0.3.5" | ||
2653 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" | ||
2654 | |||
2655 | mkpath@~0.1.0: | ||
2656 | version "0.1.0" | ||
2657 | resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91" | ||
2658 | |||
2659 | module-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 | |||
2679 | mout@~0.9.0: | ||
2680 | version "0.9.1" | ||
2681 | resolved "https://registry.yarnpkg.com/mout/-/mout-0.9.1.tgz#84f0f3fd6acc7317f63de2affdcc0cee009b0477" | ||
2682 | |||
2683 | ms@2.0.0: | ||
2684 | version "2.0.0" | ||
2685 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" | ||
2686 | |||
2687 | mute-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 | |||
2691 | nan@^2.3.0: | ||
2692 | version "2.8.0" | ||
2693 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" | ||
2694 | |||
2695 | natives@^1.1.0: | ||
2696 | version "1.1.1" | ||
2697 | resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" | ||
2698 | |||
2699 | natural-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 | |||
2703 | ncp@0.4.x: | ||
2704 | version "0.4.2" | ||
2705 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" | ||
2706 | |||
2707 | next-tick@1: | ||
2708 | version "1.0.0" | ||
2709 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" | ||
2710 | |||
2711 | next-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 | |||
2715 | node-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 | |||
2731 | node-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 | |||
2742 | nopt@^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 | |||
2749 | nopt@~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 | |||
2755 | nopt@~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 | |||
2761 | nopt@~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 | |||
2767 | normalize-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 | |||
2773 | npmconf@^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 | |||
2787 | npmlog@^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 | |||
2796 | number-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 | |||
2800 | oauth-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 | |||
2804 | oauth-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 | |||
2808 | oauth-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 | |||
2812 | object-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 | |||
2816 | object-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 | |||
2820 | object-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 | |||
2824 | object-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 | |||
2828 | object.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 | |||
2835 | once@^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 | |||
2841 | once@~1.2.0: | ||
2842 | version "1.2.0" | ||
2843 | resolved "https://registry.yarnpkg.com/once/-/once-1.2.0.tgz#de1905c636af874a8fba862d9aabddd1f920461c" | ||
2844 | |||
2845 | once@~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 | |||
2851 | opn@~1.0.0: | ||
2852 | version "1.0.2" | ||
2853 | resolved "https://registry.yarnpkg.com/opn/-/opn-1.0.2.tgz#b909643346d00a1abc977a8b96f3ce3c53d5cf5f" | ||
2854 | |||
2855 | optimist@~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 | |||
2861 | optimist@~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 | |||
2868 | ordered-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 | |||
2874 | ordered-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 | |||
2878 | os-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 | |||
2882 | os-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 | |||
2886 | os-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 | |||
2893 | os-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 | |||
2897 | osenv@0.0.3: | ||
2898 | version "0.0.3" | ||
2899 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.0.3.tgz#cd6ad8ddb290915ad9e22765576025d411f29cb6" | ||
2900 | |||
2901 | osenv@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 | |||
2905 | osenv@^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 | |||
2912 | osx-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 | |||
2918 | output-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 | |||
2926 | p-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 | |||
2932 | package-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 | |||
2939 | page@^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 | |||
2945 | pako@~1.0.5: | ||
2946 | version "1.0.6" | ||
2947 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" | ||
2948 | |||
2949 | parents@^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 | |||
2955 | parse-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 | |||
2965 | parse-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 | |||
2974 | path-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 | |||
2978 | path-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 | |||
2982 | path-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 | |||
2986 | path-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 | |||
2990 | path-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 | |||
2996 | path-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 | |||
3002 | pathval@~0.1.1: | ||
3003 | version "0.1.1" | ||
3004 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-0.1.1.tgz#08f911cdca9cce5942880da7817bc0b723b66d82" | ||
3005 | |||
3006 | pbkdf2@^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 | |||
3016 | performance-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 | |||
3020 | pkginfo@0.3.x: | ||
3021 | version "0.3.1" | ||
3022 | resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" | ||
3023 | |||
3024 | pkginfo@0.x.x: | ||
3025 | version "0.4.1" | ||
3026 | resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" | ||
3027 | |||
3028 | preserve@^0.2.0: | ||
3029 | version "0.2.0" | ||
3030 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" | ||
3031 | |||
3032 | private@^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 | |||
3036 | process-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 | |||
3040 | process@~0.11.0: | ||
3041 | version "0.11.10" | ||
3042 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" | ||
3043 | |||
3044 | prompt@~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 | |||
3054 | promptly@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 | |||
3060 | proto-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 | |||
3064 | public-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 | |||
3074 | pump@^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 | |||
3081 | punycode@1.3.2: | ||
3082 | version "1.3.2" | ||
3083 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" | ||
3084 | |||
3085 | punycode@>=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 | |||
3089 | q@^1.1.2: | ||
3090 | version "1.5.1" | ||
3091 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" | ||
3092 | |||
3093 | q@~0.9.2: | ||
3094 | version "0.9.7" | ||
3095 | resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75" | ||
3096 | |||
3097 | q@~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 | |||
3101 | qs@~1.2.0: | ||
3102 | version "1.2.2" | ||
3103 | resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88" | ||
3104 | |||
3105 | qs@~2.3.1: | ||
3106 | version "2.3.3" | ||
3107 | resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" | ||
3108 | |||
3109 | qs@~6.4.0: | ||
3110 | version "6.4.0" | ||
3111 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" | ||
3112 | |||
3113 | querystring-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 | |||
3117 | querystring@0.2.0: | ||
3118 | version "0.2.0" | ||
3119 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" | ||
3120 | |||
3121 | randomatic@^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 | |||
3128 | randombytes@^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 | |||
3134 | randomfill@^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 | |||
3141 | rc@^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 | |||
3150 | read-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 | |||
3156 | read@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 | |||
3162 | readable-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 | |||
3171 | readable-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 | |||
3183 | readable-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 | |||
3192 | readable-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 | |||
3203 | readdirp@^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 | |||
3212 | readline2@~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 | |||
3219 | recast@^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 | |||
3228 | redeyed@~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 | |||
3234 | regenerate@^1.2.1: | ||
3235 | version "1.3.3" | ||
3236 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" | ||
3237 | |||
3238 | regenerator-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 | |||
3242 | regenerator-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 | |||
3246 | regenerator-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 | |||
3254 | regex-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 | |||
3260 | regexpu-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 | |||
3268 | registry-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 | |||
3274 | regjsgen@^0.2.0: | ||
3275 | version "0.2.0" | ||
3276 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" | ||
3277 | |||
3278 | regjsparser@^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 | |||
3284 | remove-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 | |||
3288 | repeat-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 | |||
3292 | repeat-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 | |||
3296 | repeating@^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 | |||
3302 | request-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 | |||
3308 | request-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 | |||
3314 | request@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 | |||
3341 | request@^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 | |||
3362 | request@~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 | |||
3383 | reserved-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 | |||
3387 | resolve@1.1.7: | ||
3388 | version "1.1.7" | ||
3389 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" | ||
3390 | |||
3391 | resolve@^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 | |||
3397 | retry@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 | |||
3401 | revalidator@0.1.x: | ||
3402 | version "0.1.8" | ||
3403 | resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" | ||
3404 | |||
3405 | rimraf@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 | |||
3409 | rimraf@^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 | |||
3415 | ripemd160@^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 | |||
3422 | rx@^2.2.27: | ||
3423 | version "2.5.3" | ||
3424 | resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566" | ||
3425 | |||
3426 | safe-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 | |||
3430 | semver-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 | |||
3440 | semver@^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 | |||
3444 | set-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 | |||
3448 | set-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 | |||
3452 | sha.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 | |||
3459 | shasum@^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 | |||
3466 | shell-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 | |||
3475 | shell-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 | |||
3484 | shelljs@0.3.x: | ||
3485 | version "0.3.0" | ||
3486 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" | ||
3487 | |||
3488 | sigmund@~1.0.0: | ||
3489 | version "1.0.1" | ||
3490 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" | ||
3491 | |||
3492 | signal-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 | |||
3496 | slash@^1.0.0: | ||
3497 | version "1.0.0" | ||
3498 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" | ||
3499 | |||
3500 | sntp@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 | |||
3506 | sntp@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 | |||
3512 | source-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 | |||
3518 | source-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 | |||
3524 | source-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 | |||
3528 | source-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 | |||
3534 | sprintf-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 | |||
3538 | sshpk@^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 | |||
3552 | stack-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 | |||
3556 | stream-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 | |||
3563 | stream-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 | |||
3570 | stream-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 | |||
3580 | stream-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 | |||
3587 | string-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 | |||
3593 | string-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 | |||
3601 | string_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 | |||
3605 | string_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 | |||
3611 | stringify-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 | |||
3615 | stringstream@~0.0.4: | ||
3616 | version "0.0.5" | ||
3617 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" | ||
3618 | |||
3619 | strip-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 | |||
3625 | strip-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 | |||
3631 | strip-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 | |||
3637 | strip-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 | |||
3643 | strip-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 | |||
3647 | strip-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 | |||
3653 | strip-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 | |||
3657 | strip-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 | |||
3661 | subarg@^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 | |||
3667 | supports-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 | |||
3671 | supports-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 | |||
3675 | syntax-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 | |||
3681 | tar-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 | |||
3689 | tar-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 | |||
3702 | tar-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 | |||
3711 | tar@^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 | |||
3719 | throttleit@~0.0.2: | ||
3720 | version "0.0.2" | ||
3721 | resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" | ||
3722 | |||
3723 | through2@^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 | |||
3734 | timers-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 | |||
3740 | timers-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 | |||
3747 | tmp@0.0.23: | ||
3748 | version "0.0.23" | ||
3749 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.23.tgz#de874aa5e974a85f0a32cdfdbd74663cb3bd9c74" | ||
3750 | |||
3751 | to-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 | |||
3755 | to-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 | |||
3759 | to-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 | |||
3763 | to-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 | |||
3767 | touch@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 | |||
3773 | tough-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 | |||
3779 | tough-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 | |||
3789 | trim-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 | |||
3793 | tty-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 | |||
3797 | tunnel-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 | |||
3803 | tunnel-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 | |||
3807 | tweetnacl@^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 | |||
3811 | typedarray@^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 | |||
3815 | uglify-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 | |||
3823 | uid-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 | |||
3827 | uid-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 | |||
3831 | umd@^3.0.0: | ||
3832 | version "3.0.1" | ||
3833 | resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" | ||
3834 | |||
3835 | underscore@~1.6.0: | ||
3836 | version "1.6.0" | ||
3837 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" | ||
3838 | |||
3839 | update-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 | |||
3849 | url@~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 | |||
3856 | user-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 | |||
3860 | util-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 | |||
3864 | util@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 | |||
3870 | utile@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 | |||
3881 | uuid@^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 | |||
3885 | uuid@^3.0.0: | ||
3886 | version "3.2.1" | ||
3887 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" | ||
3888 | |||
3889 | v8flags@^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 | |||
3895 | verror@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 | |||
3903 | vm-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 | |||
3909 | vow-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 | |||
3918 | vow-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 | |||
3924 | vow@^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 | |||
3928 | which@~1.0.5: | ||
3929 | version "1.0.9" | ||
3930 | resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" | ||
3931 | |||
3932 | wide-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 | |||
3938 | win-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 | |||
3944 | winston@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 | |||
3956 | wordwrap@~0.0.2: | ||
3957 | version "0.0.3" | ||
3958 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" | ||
3959 | |||
3960 | wrappy@1: | ||
3961 | version "1.0.2" | ||
3962 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" | ||
3963 | |||
3964 | xdg-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 | |||
3970 | xmlbuilder@^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 | |||
3976 | xtend@^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 @@ | |||
1 | package db | ||
2 | |||
3 | import ( | ||
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 | |||
12 | var DB *pg.DB | ||
13 | |||
14 | var log = utils.StandardL().WithField("module", "db") | ||
15 | |||
16 | type DBConfig struct { | ||
17 | Address string | ||
18 | Database string | ||
19 | User string | ||
20 | Password string | ||
21 | } | ||
22 | |||
23 | func 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 | |||
39 | func 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 | |||
48 | func 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 | |||
58 | func 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 @@ | |||
1 | package db | ||
2 | |||
3 | import "testing" | ||
4 | |||
5 | func TestInit(t *testing.T) { | ||
6 | Init(DBConfig{"localhost:5432", "cryptoportfolio", "cryptoportfolio", "cryptoportfolio-dev"}) | ||
7 | } | ||
8 | |||
9 | func 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 | |||
19 | func 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 @@ | |||
1 | package db | ||
2 | |||
3 | import ( | ||
4 | "strings" | ||
5 | |||
6 | "github.com/go-pg/pg" | ||
7 | ) | ||
8 | |||
9 | func PGCode(err error) string { | ||
10 | if _, ok := err.(pg.Error); !ok { | ||
11 | return "" | ||
12 | } | ||
13 | |||
14 | return err.(pg.Error).Field('C') | ||
15 | } | ||
16 | |||
17 | func IsDup(err error) bool { | ||
18 | return PGCode(err) == "23505" | ||
19 | } | ||
20 | |||
21 | func 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 @@ | |||
1 | package db | ||
2 | |||
3 | import "github.com/go-pg/pg" | ||
4 | |||
5 | type MarketConfig struct { | ||
6 | Id int64 | ||
7 | MarketName string `sql:",notnull"` | ||
8 | UserId int64 `sql:",notnull"` | ||
9 | Config map[string]string | ||
10 | } | ||
11 | |||
12 | func InsertMarketConfig(config *MarketConfig) error { | ||
13 | return DB.Insert(config) | ||
14 | } | ||
15 | |||
16 | func 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 | |||
32 | func 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 @@ | |||
1 | package db | ||
2 | |||
3 | import ( | ||
4 | "golang.org/x/crypto/bcrypt" | ||
5 | ) | ||
6 | |||
7 | type UserStatus uint8 | ||
8 | |||
9 | const ( | ||
10 | Confirmed UserStatus = iota + 1 | ||
11 | AwaitingConfirmation | ||
12 | ) | ||
13 | |||
14 | type 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 | |||
23 | func HashPassword(password string) (string, error) { | ||
24 | b, err := bcrypt.GenerateFromPassword([]byte(password), 10) | ||
25 | |||
26 | return string(b), err | ||
27 | } | ||
28 | |||
29 | func ValidatePassword(password string, hash string) error { | ||
30 | return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) | ||
31 | } | ||
32 | |||
33 | func InsertUser(user *User) error { | ||
34 | return DB.Insert(user) | ||
35 | } | ||
36 | |||
37 | func ConfirmUserByEmail(email string) error { | ||
38 | _, err := DB.Model(&User{}).Set("status=?", Confirmed).Where("email=?", email).Returning("*").Update() | ||
39 | |||
40 | return err | ||
41 | } | ||
42 | |||
43 | func GetUserById(id int64) (*User, error) { | ||
44 | user := User{Id: id} | ||
45 | |||
46 | err := DB.Select(&user) | ||
47 | |||
48 | return &user, err | ||
49 | } | ||
50 | |||
51 | func 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 | |||
67 | func SetOtpSecret(user *User, secret string, temporary bool) error { | ||
68 | user.OtpSecret = secret | ||
69 | user.IsOtpSetup = !temporary | ||
70 | |||
71 | return DB.Update(user) | ||
72 | } | ||